From a27405a23724256b604fbf3ea9f05e4b53002201 Mon Sep 17 00:00:00 2001 From: MarSeventh <1193267292@qq.com> Date: Mon, 25 May 2026 13:05:05 +0800 Subject: [PATCH] feat: add upload trending in status page --- frontend-dist/css/369.149afd90.css | 1 + frontend-dist/css/369.149afd90.css.gz | Bin 0 -> 11084 bytes .../{365.953080b6.css => 731.953080b6.css} | 0 ...65.953080b6.css.gz => 731.953080b6.css.gz} | Bin frontend-dist/css/75.eb4ff77d.css | 1 - frontend-dist/css/75.eb4ff77d.css.gz | Bin 9266 -> 0 bytes frontend-dist/index.html | 2 +- frontend-dist/index.html.gz | Bin 520 -> 519 bytes frontend-dist/js/365.ae007b9b.js | 2 -- frontend-dist/js/365.ae007b9b.js.gz | Bin 24810 -> 0 bytes frontend-dist/js/365.ae007b9b.js.map | 1 - frontend-dist/js/365.ae007b9b.js.map.gz | Bin 67783 -> 0 bytes frontend-dist/js/369.df3ca2df.js | 23 ++++++++++++++++++ frontend-dist/js/369.df3ca2df.js.gz | Bin 0 -> 100294 bytes frontend-dist/js/369.df3ca2df.js.map | 1 + frontend-dist/js/369.df3ca2df.js.map.gz | Bin 0 -> 356448 bytes frontend-dist/js/731.90070be6.js | 2 ++ frontend-dist/js/731.90070be6.js.gz | Bin 0 -> 24756 bytes frontend-dist/js/731.90070be6.js.map | 1 + frontend-dist/js/731.90070be6.js.map.gz | Bin 0 -> 67833 bytes frontend-dist/js/75.75dccc00.js | 23 ------------------ frontend-dist/js/75.75dccc00.js.gz | Bin 94505 -> 0 bytes frontend-dist/js/75.75dccc00.js.map | 1 - frontend-dist/js/75.75dccc00.js.map.gz | Bin 337730 -> 0 bytes frontend-dist/js/app.164ae756.js | 2 -- frontend-dist/js/app.164ae756.js.gz | Bin 22751 -> 0 bytes frontend-dist/js/app.164ae756.js.map.gz | Bin 16637 -> 0 bytes frontend-dist/js/app.5a29ed6b.js | 2 ++ frontend-dist/js/app.5a29ed6b.js.gz | Bin 0 -> 23128 bytes ...pp.164ae756.js.map => app.5a29ed6b.js.map} | 2 +- frontend-dist/js/app.5a29ed6b.js.map.gz | Bin 0 -> 16631 bytes 31 files changed, 32 insertions(+), 32 deletions(-) create mode 100644 frontend-dist/css/369.149afd90.css create mode 100644 frontend-dist/css/369.149afd90.css.gz rename frontend-dist/css/{365.953080b6.css => 731.953080b6.css} (100%) rename frontend-dist/css/{365.953080b6.css.gz => 731.953080b6.css.gz} (100%) delete mode 100644 frontend-dist/css/75.eb4ff77d.css delete mode 100644 frontend-dist/css/75.eb4ff77d.css.gz delete mode 100644 frontend-dist/js/365.ae007b9b.js delete mode 100644 frontend-dist/js/365.ae007b9b.js.gz delete mode 100644 frontend-dist/js/365.ae007b9b.js.map delete mode 100644 frontend-dist/js/365.ae007b9b.js.map.gz create mode 100644 frontend-dist/js/369.df3ca2df.js create mode 100644 frontend-dist/js/369.df3ca2df.js.gz create mode 100644 frontend-dist/js/369.df3ca2df.js.map create mode 100644 frontend-dist/js/369.df3ca2df.js.map.gz create mode 100644 frontend-dist/js/731.90070be6.js create mode 100644 frontend-dist/js/731.90070be6.js.gz create mode 100644 frontend-dist/js/731.90070be6.js.map create mode 100644 frontend-dist/js/731.90070be6.js.map.gz delete mode 100644 frontend-dist/js/75.75dccc00.js delete mode 100644 frontend-dist/js/75.75dccc00.js.gz delete mode 100644 frontend-dist/js/75.75dccc00.js.map delete mode 100644 frontend-dist/js/75.75dccc00.js.map.gz delete mode 100644 frontend-dist/js/app.164ae756.js delete mode 100644 frontend-dist/js/app.164ae756.js.gz delete mode 100644 frontend-dist/js/app.164ae756.js.map.gz create mode 100644 frontend-dist/js/app.5a29ed6b.js create mode 100644 frontend-dist/js/app.5a29ed6b.js.gz rename frontend-dist/js/{app.164ae756.js.map => app.5a29ed6b.js.map} (72%) create mode 100644 frontend-dist/js/app.5a29ed6b.js.map.gz diff --git a/frontend-dist/css/369.149afd90.css b/frontend-dist/css/369.149afd90.css new file mode 100644 index 00000000..3c1bc4c0 --- /dev/null +++ b/frontend-dist/css/369.149afd90.css @@ -0,0 +1 @@ +.sidebar-container[data-v-2718059d]{display:flex;flex-direction:column;position:fixed;top:50%;left:8px;transform:translateY(-50%);z-index:2001;max-width:200px;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-2718059d]{width:56px}html.dark .sidebar-container[data-v-2718059d]{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-2718059d]: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-2718059d]: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-2718059d]{padding:8px}.menu-item[data-v-2718059d]{display:flex;align-items:center;justify-content:flex-start;padding:12px 12px 12px 0;height:42px;box-sizing:border-box;border-radius:10px;cursor:pointer;transition:background .2s ease,color .2s ease;color:var(--admin-container-color,#333);gap:0;overflow:hidden}.menu-item[data-v-2718059d]:hover{background:rgba(0,0,0,.06)}html.dark .menu-item[data-v-2718059d]:hover{background:hsla(0,0%,100%,.1)}.menu-item.is-active[data-v-2718059d]{background:linear-gradient(135deg,rgba(64,158,255,.15),rgba(56,189,248,.25));color:#409eff}html.dark .menu-item.is-active[data-v-2718059d]{background:linear-gradient(135deg,rgba(64,158,255,.2),rgba(56,189,248,.35))}.menu-icon[data-v-2718059d]{width:40px;min-width:40px;font-size:16px;flex-shrink:0;text-align:center}.menu-text[data-v-2718059d]{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;opacity:1;transition:opacity .2s ease .05s,max-width .25s ease}.sidebar-container.is-collapsed .menu-text[data-v-2718059d]{opacity:0;max-width:0;transition:opacity .1s ease,max-width .2s ease}.toggle-button[data-v-2718059d]{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-2718059d]{border-top:1px solid hsla(0,0%,100%,.08)}.toggle-button[data-v-2718059d]:hover{background:rgba(0,0,0,.04)}html.dark .toggle-button[data-v-2718059d]:hover{background:hsla(0,0%,100%,.06)}@media (max-width:768px){.sidebar-container[data-v-2718059d]{left:4px;max-width:170px}.sidebar-container.is-collapsed[data-v-2718059d]{width:50px}.menu-icon[data-v-2718059d]{width:34px;min-width:34px}}.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%}}: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}}.date-range-calendar[data-v-3bcfcbdb]{width:min(336px,100%);color:var(--admin-container-color);-webkit-user-select:none;-moz-user-select:none;user-select:none}.selected-range[data-v-3bcfcbdb]{margin-bottom:16px}.selected-range-inputs[data-v-3bcfcbdb]{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:8px}.date-input[data-v-3bcfcbdb]{width:100%;min-width:0;height:34px;box-sizing:border-box;border:1px solid var(--glass-border);border-radius:8px;padding:0 8px;background:var(--glass-bg);color:var(--admin-container-color);font-size:13px;outline:none;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.date-input[data-v-3bcfcbdb]:focus,.date-input[data-v-3bcfcbdb]:hover{border-color:var(--el-color-primary);box-shadow:0 0 0 2px rgba(64,158,255,.12)}.date-range-separator[data-v-3bcfcbdb]{color:#8a8f98;font-size:12px;font-weight:700}.calendar-header[data-v-3bcfcbdb]{display:grid;grid-template-columns:36px 1fr 36px;align-items:center;gap:8px;margin-bottom:14px}.calendar-title[data-v-3bcfcbdb]{text-align:center;font-size:16px;font-weight:700}.calendar-nav[data-v-3bcfcbdb]{width:36px;height:36px;border:1px solid var(--glass-border);border-radius:50%;background:var(--glass-bg);color:var(--admin-container-color);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:color .2s ease,border-color .2s ease,background-color .2s ease,box-shadow .2s ease}.calendar-nav[data-v-3bcfcbdb]:focus,.calendar-nav[data-v-3bcfcbdb]:hover{color:var(--el-color-primary);border-color:var(--el-color-primary);background:rgba(64,158,255,.08);box-shadow:0 2px 8px rgba(64,158,255,.18)}.calendar-grid[data-v-3bcfcbdb],.calendar-weekdays[data-v-3bcfcbdb]{display:grid;grid-template-columns:repeat(7,1fr)}.calendar-weekdays[data-v-3bcfcbdb]{margin-bottom:8px;color:#8a8f98;font-size:12px;font-weight:600;text-align:center}.calendar-weekdays span[data-v-3bcfcbdb]{height:24px;line-height:24px}.calendar-grid[data-v-3bcfcbdb]{gap:4px}.calendar-day[data-v-3bcfcbdb]{position:relative;height:38px;border:1px solid transparent;border-radius:50%;background:transparent;color:var(--admin-container-color);font-size:14px;font-weight:600;cursor:pointer;transition:color .18s ease,background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.calendar-day[data-v-3bcfcbdb]:focus,.calendar-day[data-v-3bcfcbdb]:hover{border-color:rgba(64,158,255,.45);background:rgba(64,158,255,.1);color:var(--el-color-primary)}.calendar-day.is-muted[data-v-3bcfcbdb]{color:#a8adb6;opacity:.62}.calendar-day.is-today[data-v-3bcfcbdb]{border-color:rgba(249,115,22,.7)}.calendar-day.is-in-range[data-v-3bcfcbdb]{border-radius:12px;background:rgba(64,158,255,.12);color:var(--el-color-primary)}.calendar-day.is-range-end[data-v-3bcfcbdb],.calendar-day.is-range-start[data-v-3bcfcbdb]{background:var(--el-color-primary);border-color:var(--el-color-primary);color:#fff;box-shadow:0 4px 10px rgba(64,158,255,.28)}html.dark .calendar-weekdays[data-v-3bcfcbdb]{color:#9ca3af}html.dark .calendar-day.is-muted[data-v-3bcfcbdb]{color:#737b88}.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;display:inline-flex;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}.el-radio-button{--el-radio-button-checked-bg-color:var(--el-color-primary);--el-radio-button-checked-text-color:var(--el-color-white);--el-radio-button-checked-border-color:var(--el-color-primary);--el-radio-button-disabled-checked-fill:var(--el-border-color-extra-light);display:inline-block;outline:none;position:relative}.el-radio-button__inner{-webkit-appearance:none;background:var(--el-button-bg-color,var(--el-fill-color-blank));border-radius:0;box-sizing:border-box;color:var(--el-button-text-color,var(--el-text-color-regular));cursor:pointer;display:inline-block;font-size:var(--el-font-size-base);font-weight:var(--el-button-font-weight,var(--el-font-weight-primary));line-height:1;margin:0;outline:var(--el-border);padding:8px 15px;position:relative;text-align:center;transition:var(--el-transition-all);-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.el-radio-button__inner.is-round{padding:8px 15px}.el-radio-button__inner:hover{color:var(--el-color-primary)}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);box-shadow:none!important}.el-radio-button.is-active .el-radio-button__original-radio:not(:disabled)+.el-radio-button__inner{background-color:var(--el-radio-button-checked-bg-color,var(--el-color-primary));border-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));box-shadow:-1px 0 0 0 var(--el-radio-button-checked-border-color,var(--el-color-primary));color:var(--el-radio-button-checked-text-color,var(--el-color-white))}.el-radio-button__original-radio{opacity:0;outline:none;position:absolute;z-index:-1}.el-radio-button__original-radio:focus-visible+.el-radio-button__inner{border-left:var(--el-border);border-left-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));border-radius:var(--el-border-radius-base);box-shadow:none;outline:2px solid var(--el-radio-button-checked-border-color);outline-offset:1px;z-index:2}.el-radio-button__original-radio:disabled+.el-radio-button__inner{background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));background-image:none;border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none;color:var(--el-disabled-text-color);cursor:not-allowed}.el-radio-button__original-radio:disabled:checked+.el-radio-button__inner{background-color:var(--el-radio-button-disabled-checked-fill)}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:var(--el-border-radius-base)}.el-radio-button--large .el-radio-button__inner{border-radius:0;font-size:var(--el-font-size-base);padding:12px 19px}.el-radio-button--large .el-radio-button__inner.is-round{padding:12px 19px}.el-radio-button--small .el-radio-button__inner{border-radius:0;font-size:12px;padding:5px 11px}.el-radio-button--small .el-radio-button__inner.is-round{padding:5px 11px}.status-panel[data-v-f8e4c870]{padding:20px;background:transparent;min-height:100vh}.overview-cards[data-v-f8e4c870]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:30px}.overview-card[data-v-f8e4c870]{background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:16px;padding:24px;display:flex;align-items:center;box-shadow:var(--glass-shadow);transition:all .3s ease;border:1px solid var(--glass-border);cursor:pointer}.overview-card[data-v-f8e4c870]:hover{transform:translateY(-2px);box-shadow:var(--glass-shadow-hover);background:var(--glass-bg-hover)}.card-icon[data-v-f8e4c870]{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,#60a5fa,#93c5fd);color:#fff}.card-content[data-v-f8e4c870]{flex:1}.card-title[data-v-f8e4c870]{font-size:14px;color:#666;margin-bottom:8px;font-weight:500}.card-value[data-v-f8e4c870]{font-size:28px;font-weight:700;color:var(--admin-container-color);line-height:1}.card-subtitle[data-v-f8e4c870]{font-size:11px;color:#999;margin-top:4px;opacity:.8}.charts-section[data-v-f8e4c870]{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:20px;margin-bottom:30px;overflow:visible}.chart-card[data-v-f8e4c870]{background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:16px;padding:24px;box-shadow:var(--glass-shadow);transition:all .3s ease;border:1px solid var(--glass-border)}.chart-card[data-v-f8e4c870]:hover{box-shadow:var(--glass-shadow-hover);background:var(--glass-bg-hover)}.chart-card[data-v-f8e4c870],.chart-content[data-v-f8e4c870],.pie-chart-container[data-v-f8e4c870],.pie-chart-wrapper[data-v-f8e4c870]{overflow:visible}.chart-header[data-v-f8e4c870]{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-f8e4c870]{margin-right:10px;color:var(--admin-purple)}.trend-chart-card[data-v-f8e4c870]{grid-column:1/-1}.trend-chart-header[data-v-f8e4c870]{justify-content:space-between;gap:14px;flex-wrap:wrap}.chart-title[data-v-f8e4c870]{display:flex;align-items:center;gap:8px}.trend-controls[data-v-f8e4c870]{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap}.trend-calendar-btn[data-v-f8e4c870]{width:32px;min-width:32px;height:32px;padding:0;display:inline-flex;align-items:center;justify-content:center;color:var(--admin-container-color);background:var(--glass-bg);border:1px solid var(--glass-border);transition:color .2s ease,border-color .2s ease,background-color .2s ease,box-shadow .2s ease}.trend-calendar-btn[data-v-f8e4c870]:focus,.trend-calendar-btn[data-v-f8e4c870]:hover{color:var(--el-color-primary);border-color:var(--el-color-primary);background:rgba(64,158,255,.08);box-shadow:0 2px 8px rgba(64,158,255,.18)}.trend-date-dialog[data-v-f8e4c870]{overflow:visible}.trend-date-dialog[data-v-f8e4c870] .el-dialog__body{overflow:visible;padding:16px 24px 24px}.trend-date-panel[data-v-f8e4c870]{width:100%;display:flex;justify-content:center;overflow:hidden}.trend-group-switch[data-v-f8e4c870]{flex-shrink:0;height:32px;display:flex}.trend-group-switch[data-v-f8e4c870] .el-radio-button__inner{height:32px;display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0 14px}.chart-content.trend-chart-content[data-v-f8e4c870]{min-height:320px;padding:0;margin:0}.line-chart-wrapper[data-v-f8e4c870]{position:relative;width:100%;height:320px}.trend-empty-state[data-v-f8e4c870]{height:320px}.chart-content[data-v-f8e4c870]{min-height:160px;padding:15px;margin:-5px}.empty-state[data-v-f8e4c870]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:160px;color:#999;font-size:14px}.empty-state .fa-icon[data-v-f8e4c870]{font-size:32px;margin-bottom:10px}.stats-list[data-v-f8e4c870]{display:flex;flex-direction:column;gap:16px}.stats-item[data-v-f8e4c870]{display:flex;align-items:center;gap:12px}.stats-label[data-v-f8e4c870]{min-width:80px;font-size:13px;color:#666;font-weight:500}.stats-bar[data-v-f8e4c870]{flex:1;height:8px;background:#f0f0f0;border-radius:4px;overflow:hidden}.stats-fill[data-v-f8e4c870]{height:100%;background:linear-gradient(90deg,var(--admin-purple),#e1bee7);border-radius:4px;transition:width .6s ease}.type-fill[data-v-f8e4c870]{background:linear-gradient(90deg,#4caf50,#81c784)}.stats-value[data-v-f8e4c870]{min-width:50px;text-align:right;font-size:13px;font-weight:600;color:var(--admin-container-color)}.pie-chart-container[data-v-f8e4c870]{display:flex;align-items:center;gap:24px;flex-wrap:wrap;justify-content:center}.pie-chart-wrapper[data-v-f8e4c870]{position:relative;width:180px;height:180px;flex-shrink:0;padding:15px;box-sizing:content-box;overflow:visible;isolation:isolate}.chart-center-text[data-v-f8e4c870]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;z-index:-1}.center-value[data-v-f8e4c870]{font-size:22px;font-weight:700;color:var(--admin-container-color);line-height:1.2}.center-label[data-v-f8e4c870]{font-size:11px;color:#888;margin-top:2px}.chart-legend[data-v-f8e4c870]{display:flex;flex-direction:column;gap:10px;flex:1;min-width:180px}.legend-item[data-v-f8e4c870]{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-f8e4c870]:hover{background:rgba(0,0,0,.06);transform:translateX(4px)}html.dark .legend-item[data-v-f8e4c870]{background:hsla(0,0%,100%,.05)}html.dark .legend-item[data-v-f8e4c870]:hover{background:hsla(0,0%,100%,.1)}.legend-color[data-v-f8e4c870]{width:12px;height:12px;border-radius:3px;flex-shrink:0}.legend-label[data-v-f8e4c870]{flex:1;font-size:13px;color:var(--admin-container-color);font-weight:500}.legend-value[data-v-f8e4c870]{font-size:13px;font-weight:600;color:var(--admin-container-color);min-width:50px;text-align:right}.legend-percent[data-v-f8e4c870]{font-size:12px;color:#888;min-width:40px;text-align:right}.actions-section[data-v-f8e4c870]{margin-bottom:30px}.action-card[data-v-f8e4c870]{background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:16px;padding:24px;box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);transition:all .3s ease}.action-card[data-v-f8e4c870]:hover{box-shadow:var(--glass-shadow-hover);background:var(--glass-bg-hover)}.action-header[data-v-f8e4c870]{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-f8e4c870]{margin-right:10px;color:var(--admin-purple)}.action-content[data-v-f8e4c870]{display:flex;justify-content:center;padding:20px 0}.action-buttons[data-v-f8e4c870]{display:flex;gap:20px;flex-wrap:wrap;justify-content:center;align-items:center;width:100%}.action-btn[data-v-f8e4c870]{border:none;border-radius:14px;padding:14px 28px;margin-left:0;font-weight:600;font-size:14px;transition:all .3s cubic-bezier(.4,0,.2,1);min-width:150px;width:150px;height:52px;position:relative;overflow:hidden;box-shadow:0 4px 12px rgba(0,0,0,.15)}@media (max-width:768px){.action-btn[data-v-f8e4c870]{flex:1;width:auto;min-width:0;height:auto}}.action-btn[data-v-f8e4c870]:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.2),transparent);transition:left .5s ease}.action-btn[data-v-f8e4c870]:hover:before{left:100%}.action-btn[data-v-f8e4c870]:hover{transform:translateY(-3px)}.action-btn[data-v-f8e4c870]:active{transform:translateY(-1px)}.action-btn .fa-icon[data-v-f8e4c870]{margin-right:10px;font-size:15px}.rebuild-btn[data-v-f8e4c870]{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}.rebuild-btn[data-v-f8e4c870]:hover{box-shadow:0 8px 24px rgba(102,126,234,.45);background:linear-gradient(135deg,#5a6fd6,#6a4190)}.backup-btn[data-v-f8e4c870]{background:linear-gradient(135deg,#11998e,#38ef7d);color:#fff}.backup-btn[data-v-f8e4c870]:hover{box-shadow:0 8px 24px rgba(17,153,142,.45);background:linear-gradient(135deg,#0f8a80,#32d970)}.restore-btn[data-v-f8e4c870]{background:linear-gradient(135deg,#f093fb,#f5576c);color:#fff}.restore-btn[data-v-f8e4c870]:hover{box-shadow:0 8px 24px rgba(245,87,108,.45);background:linear-gradient(135deg,#e085eb,#e04d61)}.restore-section[data-v-f8e4c870]{display:inline-block}@media (max-width:768px){.action-buttons>.el-tooltip[data-v-f8e4c870],.action-buttons>.restore-section[data-v-f8e4c870],.restore-section[data-v-f8e4c870]{flex:1;width:100%}.action-btn[data-v-f8e4c870]{width:100%!important;padding:10px 20px!important;box-sizing:border-box}}.file-info-section[data-v-f8e4c870]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;align-items:stretch}.file-info-card[data-v-f8e4c870]{position:relative;background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:16px;box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);transition:all .3s ease;height:300px;overflow:hidden;cursor:pointer}.card-bg-media[data-v-f8e4c870]{position:absolute;top:0;left:0;transition:transform .5s ease;display:block}.card-bg-media[data-v-f8e4c870],.card-bg-media[data-v-f8e4c870] .el-image__inner{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.card-bg-media[data-v-f8e4c870] .el-image__wrapper{width:100%;height:100%}.card-bg-fallback[data-v-f8e4c870]{position:absolute;top:0;left:0;width:100%;height:100%;background:var(--admin-dashborad-stats-bg-color);display:flex;align-items:center;justify-content:center}.fallback-icon[data-v-f8e4c870]{font-size:80px;color:var(--el-text-color-placeholder);opacity:.3}.file-card-header[data-v-f8e4c870]{position:absolute;top:0;left:0;right:0;display:flex;gap:8px;align-items:center;padding:12px 16px;font-size:14px;font-weight:600;color:#fff;background:linear-gradient(180deg,rgba(0,0,0,.6),transparent);z-index:2}.file-card-header .fa-icon[data-v-f8e4c870]{color:#60a5fa}.file-card-header.warning .fa-icon[data-v-f8e4c870]{color:#f59e0b}.info-card-footer[data-v-f8e4c870]{position:absolute;bottom:0;left:0;right:0;padding:12px 16px;background:linear-gradient(0deg,rgba(0,0,0,.7),transparent);text-align:center;z-index:2}.info-card-footer .file-name[data-v-f8e4c870]{font-size:14px;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)}.info-card-footer .file-meta[data-v-f8e4c870]{font-size:12px;color:hsla(0,0%,100%,.8);text-shadow:0 1px 2px rgba(0,0,0,.5)}@media (min-width:1200px){.file-info-card[data-v-f8e4c870]{height:400px}}@media (min-width:1600px){.file-info-card[data-v-f8e4c870]{height:450px}}.file-info-card[data-v-f8e4c870]:hover{transform:translateY(-2px);box-shadow:var(--glass-shadow-hover)}.file-info-card:hover .card-bg-media[data-v-f8e4c870]{transform:scale(1.05)}@media (max-width:768px){.status-panel[data-v-f8e4c870]{padding:15px}.charts-section[data-v-f8e4c870],.overview-cards[data-v-f8e4c870]{grid-template-columns:1fr;gap:15px}.trend-chart-header[data-v-f8e4c870]{align-items:stretch}.chart-title[data-v-f8e4c870]{width:100%}.trend-controls[data-v-f8e4c870]{width:100%;justify-content:stretch}.trend-date-dialog[data-v-f8e4c870]{width:92vw!important}.trend-date-dialog[data-v-f8e4c870] .el-dialog__body{padding:12px 14px 22px}.trend-group-switch[data-v-f8e4c870]{width:100%}.trend-group-switch[data-v-f8e4c870] .el-radio-button{flex:1}.trend-group-switch[data-v-f8e4c870] .el-radio-button__inner{width:100%;padding:0 10px}.line-chart-wrapper[data-v-f8e4c870],.trend-empty-state[data-v-f8e4c870]{height:280px}.file-info-section[data-v-f8e4c870]{grid-template-columns:1fr;gap:15px}.card-icon[data-v-f8e4c870]{width:50px;height:50px;font-size:20px;margin-right:15px}.card-value[data-v-f8e4c870]{font-size:24px}.action-buttons[data-v-f8e4c870]{flex-direction:column;gap:12px}.action-btn[data-v-f8e4c870]{width:100%;min-width:unset}}.stats-fill[data-v-f8e4c870]{animation:fillAnimation-f8e4c870 1s ease-out}@keyframes fillAnimation-f8e4c870{0%{width:0}}.progress-container[data-v-f8e4c870]{width:100%;padding:20px;text-align:center}.progress-header[data-v-f8e4c870]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-phase[data-v-f8e4c870]{font-size:16px;font-weight:600;color:var(--admin-container-color)}.progress-percentage[data-v-f8e4c870]{font-size:18px;font-weight:700;color:var(--admin-purple)}.progress-bar[data-v-f8e4c870]{margin-bottom:16px}.progress-bar[data-v-f8e4c870] .el-progress-bar__outer{background-color:rgba(139,92,246,.1);border-radius:6px}.progress-bar[data-v-f8e4c870] .el-progress-bar__inner{background:linear-gradient(90deg,var(--admin-purple),#e1bee7);border-radius:6px;transition:width .3s ease}.progress-details[data-v-f8e4c870]{display:flex;justify-content:center;gap:24px;margin-bottom:12px;flex-wrap:wrap}.progress-count[data-v-f8e4c870],.progress-time[data-v-f8e4c870]{display:flex;align-items:center;gap:6px;font-size:14px;color:#666}.progress-count .fa-icon[data-v-f8e4c870],.progress-time .fa-icon[data-v-f8e4c870]{color:var(--admin-purple);font-size:12px}.progress-message[data-v-f8e4c870]{font-size:13px;color:#888;margin-bottom:16px;min-height:20px}.cancel-btn[data-v-f8e4c870]{margin-top:12px;border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.3);color:#ef4444}.cancel-btn[data-v-f8e4c870]:hover{background:rgba(239,68,68,.2);border-color:rgba(239,68,68,.5);transform:translateY(-2px);box-shadow:0 4px 12px rgba(239,68,68,.25)}.cancel-btn .fa-icon[data-v-f8e4c870]{margin-right:8px}.error-container[data-v-f8e4c870]{width:100%;padding:20px;display:flex;flex-direction:column;align-items:center;gap:16px;background:rgba(239,68,68,.05);border-radius:12px;border:1px solid rgba(239,68,68,.2)}.error-icon[data-v-f8e4c870]{width:48px;height:48px;border-radius:50%;background:rgba(239,68,68,.1);display:flex;align-items:center;justify-content:center;color:#ef4444;font-size:24px}.error-content[data-v-f8e4c870]{text-align:center}.error-message[data-v-f8e4c870]{font-size:15px;font-weight:600;color:#ef4444;margin-bottom:8px}.error-suggestion[data-v-f8e4c870]{font-size:13px;color:#666}.error-actions[data-v-f8e4c870]{display:flex;gap:12px}.error-actions .el-button[data-v-f8e4c870]{border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);min-width:100px}.error-actions .el-button--primary[data-v-f8e4c870]{background:linear-gradient(135deg,#667eea,#764ba2);border:none;color:#fff}.error-actions .el-button--primary[data-v-f8e4c870]:hover{background:linear-gradient(135deg,#5a6fd6,#6a4190);transform:translateY(-2px);box-shadow:0 6px 16px rgba(102,126,234,.4)}.error-actions .el-button--default[data-v-f8e4c870]{background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.2);color:var(--el-text-color-regular)}.error-actions .el-button--default[data-v-f8e4c870]:hover{background:hsla(0,0%,100%,.15);border-color:hsla(0,0%,100%,.3);transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,.15)}.error-actions .fa-icon[data-v-f8e4c870]{margin-right:8px}html.dark .progress-count[data-v-f8e4c870],html.dark .progress-time[data-v-f8e4c870]{color:#aaa}html.dark .progress-message[data-v-f8e4c870]{color:#999}html.dark .error-container[data-v-f8e4c870]{background:rgba(239,68,68,.1);border-color:rgba(239,68,68,.3)}html.dark .error-suggestion[data-v-f8e4c870]{color:#aaa}@media (max-width:768px){.error-container[data-v-f8e4c870],.progress-container[data-v-f8e4c870]{padding:16px}.progress-header[data-v-f8e4c870]{flex-direction:column;gap:8px;text-align:center}.progress-details[data-v-f8e4c870]{flex-direction:column;gap:8px}.error-actions[data-v-f8e4c870]{flex-direction:column;width:100%}.error-actions .el-button[data-v-f8e4c870]{width:100%;margin:0}}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;color:var(--el-text-color-primary);font-size:var(--el-font-size-base)}.el-descriptions__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;font-size:14px;line-height:23px;text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{background:var(--el-descriptions-item-bordered-label-background);color:var(--el-text-color-regular);font-weight:700}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}.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-input-number{display:inline-flex}.el-input-number{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}.custom-select[data-v-55080c16]{position:relative}.custom-select-trigger[data-v-55080c16]{display:flex;align-items:center;justify-content:space-between;height:32px;padding:0 12px;background:var(--el-bg-color);border:1px solid var(--el-border-color);border-radius:8px;cursor:pointer;transition:all .2s ease;box-sizing:border-box}.custom-select-trigger[data-v-55080c16]:hover{border-color:var(--el-color-primary-light-5)}.custom-select.is-open .custom-select-trigger[data-v-55080c16]{border-color:var(--el-color-primary)}.custom-select-value[data-v-55080c16]{font-size:14px;color:var(--el-text-color-regular);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-select-arrow[data-v-55080c16],.custom-select-value.is-placeholder[data-v-55080c16]{color:var(--el-text-color-placeholder)}.custom-select-arrow[data-v-55080c16]{font-size:12px;transition:transform .2s ease;flex-shrink:0;margin-left:8px}.custom-select.is-open .custom-select-arrow[data-v-55080c16]{transform:rotate(180deg)}.custom-select-dropdown[data-v-55080c16]{position:absolute;top:calc(100% + 4px);left:0;width:100%;background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);border-radius:8px;box-shadow:var(--el-box-shadow-light);z-index:2000;overflow:hidden}.custom-select-option[data-v-55080c16]{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;font-size:14px;color:var(--el-text-color-regular);cursor:pointer;transition:background .2s ease}.custom-select-option[data-v-55080c16]:hover{background:var(--el-fill-color-light)}.custom-select-option.is-selected[data-v-55080c16]{color:var(--el-color-primary);font-weight:500}.option-icon[data-v-55080c16]{width:16px;height:16px;flex-shrink:0}.dropdown-fade-enter-active[data-v-55080c16],.dropdown-fade-leave-active[data-v-55080c16]{transition:opacity .2s ease,transform .2s ease}.dropdown-fade-enter-from[data-v-55080c16],.dropdown-fade-leave-to[data-v-55080c16]{opacity:0;transform:translateY(-8px)}.upload-settings[data-v-d225d330]{padding:20px;min-height:500px;overflow-x:hidden}.page-header[data-v-d225d330]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;flex-wrap:wrap;gap:12px}.first-title[data-v-d225d330]{display:flex;align-items:center;gap:8px;margin:0;font-size:20px;font-weight:600}.help-icon[data-v-d225d330]{cursor:pointer;color:var(--el-text-color-secondary);font-size:14px}.add-btn[data-v-d225d330]{border-radius:8px}.header-actions[data-v-d225d330]{display:flex;gap:12px}.header-actions[data-v-d225d330] .el-button{border-radius:8px}.channel-group[data-v-d225d330]{margin-bottom:32px;background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:12px;border:1px solid var(--glass-border);overflow:hidden;box-shadow:var(--glass-shadow);transition:all .3s ease}.channel-group[data-v-d225d330]:hover{box-shadow:var(--glass-shadow-hover)}.group-header[data-v-d225d330]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background:var(--glass-header-bg);border-bottom:1px solid var(--glass-header-border)}.group-title[data-v-d225d330]{display:flex;align-items:center;gap:10px;font-size:16px;font-weight:600;color:var(--el-text-color-primary)}.group-icon[data-v-d225d330]{font-size:18px;color:var(--el-color-primary)}.channel-count[data-v-d225d330]{font-size:12px}.load-balance-switch[data-v-d225d330]{display:flex;align-items:center;gap:8px}.switch-label[data-v-d225d330]{font-size:13px;color:var(--el-text-color-secondary)}.channel-cards[data-v-d225d330]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;padding:20px}.channel-card[data-v-d225d330]{background:var(--glass-bg);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-radius:10px;border:1px solid var(--glass-border);border-left:3px solid var(--el-border-color-light);transition:all .25s ease;overflow:hidden;position:relative;display:flex;flex-direction:column;box-shadow:0 4px 16px rgba(0,0,0,.08)}.card-glow[data-v-d225d330]{position:absolute;width:150px;height:150px;border-radius:50%;pointer-events:none;opacity:0;transform:translate(-50%,-50%);transition:opacity .3s ease;z-index:0;background:radial-gradient(circle,rgba(56,189,248,.15) 0,transparent 70%)}.channel-card.telegram .card-glow[data-v-d225d330]{background:radial-gradient(circle,rgba(84,169,235,.2) 0,transparent 70%)}.channel-card.cfr2 .card-glow[data-v-d225d330]{background:radial-gradient(circle,rgba(246,130,31,.2) 0,transparent 70%)}.channel-card.s3 .card-glow[data-v-d225d330]{background:radial-gradient(circle,rgba(86,154,49,.2) 0,transparent 70%)}.channel-card.discord .card-glow[data-v-d225d330]{background:radial-gradient(circle,rgba(88,101,242,.2) 0,transparent 70%)}.channel-card.huggingface .card-glow[data-v-d225d330]{background:radial-gradient(circle,rgba(255,210,30,.2) 0,transparent 70%)}.channel-card.webdav .card-glow[data-v-d225d330]{background:radial-gradient(circle,rgba(20,184,166,.2) 0,transparent 70%)}.channel-card[data-v-d225d330]:hover{border-color:var(--glass-border-hover);box-shadow:0 8px 24px rgba(0,0,0,.12);background:var(--glass-bg-hover)}.channel-card.disabled[data-v-d225d330]{opacity:.6;background:var(--el-fill-color-lighter)}.channel-card.telegram[data-v-d225d330]{border-left-color:#54a9eb}.channel-card.cfr2[data-v-d225d330]{border-left-color:#f6821f}.channel-card.s3[data-v-d225d330]{border-left-color:#569a31}.channel-card.discord[data-v-d225d330]{border-left-color:#5865f2}.channel-card.huggingface[data-v-d225d330]{border-left-color:#ffd21e}.channel-card.webdav[data-v-d225d330]{border-left-color:#14b8a6}.channel-card.fixed[data-v-d225d330]{border-left-width:3px;border-left-style:dashed}.card-header[data-v-d225d330]{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;background:var(--glass-header-bg);border-bottom:1px solid var(--glass-header-border)}.card-title[data-v-d225d330]{display:flex;align-items:center;gap:8px}.channel-name[data-v-d225d330]{font-weight:600;font-size:14px;color:var(--el-text-color-primary)}.card-body[data-v-d225d330]{padding:14px 16px;min-height:60px;text-align:left}.card-info[data-v-d225d330]{display:flex;flex-direction:column;gap:8px;align-items:flex-start;width:100%;overflow:hidden}.info-item[data-v-d225d330]{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--el-text-color-secondary);min-width:0;width:100%;max-width:100%}.info-text[data-v-d225d330]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;text-align:left}.info-icon[data-v-d225d330]{width:14px;flex-shrink:0;color:var(--el-text-color-placeholder)}.quota-mini[data-v-d225d330]{margin-top:12px;padding-top:12px;border-top:1px dashed var(--el-border-color-lighter)}.quota-mini[data-v-d225d330] .el-progress{margin-bottom:4px}.quota-text[data-v-d225d330]{font-size:11px;color:var(--el-text-color-secondary)}.card-actions[data-v-d225d330]{display:flex;justify-content:flex-end;gap:4px;padding:10px 16px;border-top:1px solid var(--glass-header-border);background:var(--glass-header-bg);margin-top:auto}.empty-tip[data-v-d225d330]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;color:var(--el-text-color-placeholder);gap:12px}.empty-icon[data-v-d225d330]{font-size:32px}.channel-warning[data-v-d225d330]{margin:0 20px 16px;padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning)}.select-option-icon[data-v-d225d330]{width:18px;margin-right:8px;text-align:center}.form-tip[data-v-d225d330]{margin-left:12px;font-size:12px;color:var(--el-text-color-secondary)}.form-warning[data-v-d225d330]{padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning);margin-top:8px}.quota-status[data-v-d225d330]{width:100%}.quota-status[data-v-d225d330] .el-progress{margin-bottom:8px}.quota-info[data-v-d225d330]{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-d225d330]{color:var(--el-color-danger);background:var(--el-color-danger-light-9);font-weight:500}.quota-label[data-v-d225d330]{display:inline-flex;align-items:center;gap:4px}.refresh-btn[data-v-d225d330]{padding:0!important;margin:0!important;height:auto!important;min-height:auto!important;vertical-align:middle}.refresh-btn .fa-spin[data-v-d225d330]{animation:fa-spin-d225d330 1s linear infinite}@keyframes fa-spin-d225d330{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@media (max-width:768px){.upload-settings[data-v-d225d330]{padding:12px}.page-header[data-v-d225d330]{flex-direction:column;align-items:flex-start}.channel-cards[data-v-d225d330]{grid-template-columns:1fr;padding:12px}.group-header[data-v-d225d330]{flex-direction:column;gap:12px;align-items:flex-start}}[data-v-d225d330] .channel-dialog{width:600px!important;max-width:90vw!important}@media (max-width:768px){[data-v-d225d330] .channel-dialog{width:90vw!important}}.el-checkbox-group{font-size:0;line-height:0}.floating-save-btn[data-v-53091626]{position:fixed;right:var(--floating-btn-right,24px);bottom:var(--floating-btn-bottom,24px);display:flex;align-items:center;gap:6px;padding:10px 18px;background:var(--floating-btn-bg);color:var(--floating-btn-color);border-radius:50px;cursor:pointer;box-shadow:var(--floating-btn-shadow);transition:all .3s cubic-bezier(.4,0,.2,1);z-index:100;font-weight:500;font-size:13px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.floating-save-btn[data-v-53091626]:hover{transform:translateY(-2px);box-shadow:var(--floating-btn-shadow-hover)}.floating-save-btn[data-v-53091626]:active{transform:translateY(-1px);box-shadow:var(--floating-btn-shadow)}.floating-save-btn.is-loading[data-v-53091626]{cursor:not-allowed;opacity:.8}.floating-save-btn.is-loading[data-v-53091626]:hover{transform:none}.floating-save-btn svg[data-v-53091626]{font-size:14px}.fade-up-enter-active[data-v-53091626]{transition:all .3s ease-out}.fade-up-leave-active[data-v-53091626]{transition:all .2s ease-in}.fade-up-enter-from[data-v-53091626]{opacity:0;transform:translateY(20px)}.fade-up-leave-to[data-v-53091626]{opacity:0;transform:translateY(10px)}@media (max-width:768px){.floating-save-btn[data-v-53091626]{right:16px;bottom:16px;padding:10px 16px;font-size:12px}.floating-save-btn svg[data-v-53091626]{font-size:12px}}@media (max-width:480px){.floating-save-btn[data-v-53091626]{right:12px;bottom:12px;padding:12px;border-radius:50%}.save-text[data-v-53091626]{display:none}.floating-save-btn svg[data-v-53091626]{font-size:16px}}.security-settings[data-v-2962b112]{padding:20px;min-height:500px}.first-settings[data-v-2962b112]{margin-bottom:40px}.first-title[data-v-2962b112]{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-2962b112]{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-2962b112] .el-form{padding:16px 20px;background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:12px;border:1px solid var(--glass-border);margin-bottom:20px;box-shadow:var(--glass-shadow);transition:all .3s ease}.first-settings[data-v-2962b112] .el-form:hover{box-shadow:var(--glass-shadow-hover);background:var(--glass-bg-hover)}.first-settings[data-v-2962b112] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-2962b112] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-2962b112] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-2962b112] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-2962b112] .el-input,.first-settings[data-v-2962b112] .el-select{width:100%}.first-settings[data-v-2962b112] .el-switch{--el-switch-on-color:var(--el-color-primary)}.form-item-hint[data-v-2962b112]{display:inline-block;margin-left:8px;font-size:14px;color:var(--el-text-color-regular);line-height:32px;vertical-align:middle}.token-title[data-v-2962b112]{display:flex;align-items:center;justify-content:space-between}.token-actions[data-v-2962b112]{margin-left:5px}.token-table-container[data-v-2962b112]{display:flex;justify-content:center;margin-top:20px;width:100%;overflow:hidden}.token-table[data-v-2962b112]{width:100%;border-radius:12px!important;overflow:hidden;box-shadow:var(--glass-shadow);background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--glass-border)}.token-table[data-v-2962b112] .el-table__header-wrapper{border-radius:12px 12px 0 0}.token-table[data-v-2962b112] .el-table__body-wrapper{border-radius:0 0 12px 12px}.token-table[data-v-2962b112] .el-table{border-radius:12px}.token-table[data-v-2962b112] .el-table__header{background-color:#f8f9fa}.token-table[data-v-2962b112] .el-table th{background-color:#f8f9fa!important;border-bottom:1px solid #ebeef5;text-align:center}.token-table[data-v-2962b112] .el-table td{border-bottom:1px solid #ebeef5}.token-table[data-v-2962b112] .el-table__row:last-child td{border-bottom:none}.table-cell-content[data-v-2962b112]{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:4px;padding:8px 4px;min-height:40px;text-align:center}.action-buttons[data-v-2962b112]{gap:8px}.action-button[data-v-2962b112]{margin-left:0}.permission-tag[data-v-2962b112]{margin:2px!important}.token-display[data-v-2962b112]{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-2962b112]{padding:15px;padding-bottom:80px}.first-settings[data-v-2962b112] .el-form{padding:12px 15px}.first-settings[data-v-2962b112] .el-form-item__content{max-width:100%}.token-table-container[data-v-2962b112]{padding:0 10px}.table-cell-content[data-v-2962b112]{padding:6px 2px;min-height:36px}.token-display[data-v-2962b112]{font-size:11px;padding:3px 6px}}@media (max-width:480px){.token-table-container[data-v-2962b112]{padding:0 5px}.table-cell-content[data-v-2962b112]{padding:4px 2px;min-height:32px;font-size:12px}.action-buttons .el-button[data-v-2962b112]{padding:4px 8px;font-size:12px}.permission-tag[data-v-2962b112]{font-size:11px;padding:0 4px;height:20px;line-height:20px}}.token-result[data-v-2962b112]{padding:10px 0}.token-result .el-form-item[data-v-2962b112]{margin-bottom:20px}.dialog-footer[data-v-2962b112]{display:flex;justify-content:flex-end;gap:10px}.fade-slide-enter-active[data-v-2962b112],.fade-slide-leave-active[data-v-2962b112]{transition:all .3s ease-in-out}.fade-slide-enter-from[data-v-2962b112],.fade-slide-leave-to[data-v-2962b112]{opacity:0;transform:translateY(-10px)}.fade-slide-enter-to[data-v-2962b112],.fade-slide-leave-from[data-v-2962b112]{opacity:1;transform:translateY(0)}[data-v-2962b112] .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-e4c3a742]{padding:20px;min-height:500px}.first-settings[data-v-e4c3a742]{margin-bottom:40px}.first-title[data-v-e4c3a742]{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-e4c3a742]{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-e4c3a742] .el-form{padding:16px 20px;background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:12px;border:1px solid var(--glass-border);box-shadow:var(--glass-shadow);transition:all .3s ease}.first-settings[data-v-e4c3a742] .el-form:hover{box-shadow:var(--glass-shadow-hover);background:var(--glass-bg-hover)}.first-settings[data-v-e4c3a742] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-e4c3a742] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-e4c3a742] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-e4c3a742] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-e4c3a742] .el-form-item:has(.el-textarea) .el-form-item__content{max-width:600px}.first-settings[data-v-e4c3a742] .el-input,.first-settings[data-v-e4c3a742] .el-select{width:100%}.first-settings[data-v-e4c3a742] .el-switch{--el-switch-on-color:var(--el-color-primary)}@media (max-width:768px){.page-settings[data-v-e4c3a742]{padding:15px;padding-bottom:80px}.first-settings[data-v-e4c3a742] .el-form{padding:12px 15px}.first-settings[data-v-e4c3a742] .el-form-item__content{max-width:100%}}.others-settings[data-v-67b1b002]{padding:20px;min-height:500px}.first-settings[data-v-67b1b002]{margin-bottom:40px}.first-title[data-v-67b1b002]{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-67b1b002]{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-67b1b002] .el-form{padding:16px 20px;background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:12px;border:1px solid var(--glass-border);margin-bottom:20px;box-shadow:var(--glass-shadow);transition:all .3s ease}.first-settings[data-v-67b1b002] .el-form:hover{box-shadow:var(--glass-shadow-hover);background:var(--glass-bg-hover)}.first-settings[data-v-67b1b002] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-67b1b002] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-67b1b002] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-67b1b002] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-67b1b002] .el-input{width:100%}.first-settings[data-v-67b1b002] .el-switch{--el-switch-on-color:var(--el-color-primary)}@media (max-width:768px){.others-settings[data-v-67b1b002]{padding:15px;padding-bottom:80px}.first-settings[data-v-67b1b002] .el-form{padding:12px 15px}.first-settings[data-v-67b1b002] .el-form-item__content{max-width:100%}}.container[data-v-7607b77d]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0;overflow-x:hidden}.header-content[data-v-7607b77d]{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-7607b77d]{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-7607b77d]{flex-direction:column;top:6px;width:calc(100% - 32px);border-radius:14px;padding:6px 12px;gap:4px}.header-icon[data-v-7607b77d]{font-size:.95em}}.header-content[data-v-7607b77d]: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-7607b77d]: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-7607b77d]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-7607b77d]:hover{color:#b39ddb;transform:scale(1.2)}.header-action[data-v-7607b77d]{display:flex;gap:10px}.main-container[data-v-7607b77d]{margin-top:60px;transition:margin-left .3s ease,width .3s ease;width:calc(100% - 280px);margin-left:170px}.main-container.collapsed[data-v-7607b77d]{width:calc(100% - 150px);margin-left:80px}@media (max-width:768px){.main-container.collapsed[data-v-7607b77d],.main-container[data-v-7607b77d]{width:auto;margin-left:65px;margin-right:15px;padding:0;min-height:calc(100vh - 60px);box-sizing:border-box}} \ No newline at end of file diff --git a/frontend-dist/css/369.149afd90.css.gz b/frontend-dist/css/369.149afd90.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..c1cf80ee17630e7e125c95dcdfd23f079ca6c306 GIT binary patch literal 11084 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 Su!8?E#J literal 0 HcmV?d00001 diff --git a/frontend-dist/css/365.953080b6.css b/frontend-dist/css/731.953080b6.css similarity index 100% rename from frontend-dist/css/365.953080b6.css rename to frontend-dist/css/731.953080b6.css diff --git a/frontend-dist/css/365.953080b6.css.gz b/frontend-dist/css/731.953080b6.css.gz similarity index 100% rename from frontend-dist/css/365.953080b6.css.gz rename to frontend-dist/css/731.953080b6.css.gz diff --git a/frontend-dist/css/75.eb4ff77d.css b/frontend-dist/css/75.eb4ff77d.css deleted file mode 100644 index b450bf73..00000000 --- a/frontend-dist/css/75.eb4ff77d.css +++ /dev/null @@ -1 +0,0 @@ -.sidebar-container[data-v-2718059d]{display:flex;flex-direction:column;position:fixed;top:50%;left:8px;transform:translateY(-50%);z-index:2001;max-width:200px;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-2718059d]{width:56px}html.dark .sidebar-container[data-v-2718059d]{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-2718059d]: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-2718059d]: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-2718059d]{padding:8px}.menu-item[data-v-2718059d]{display:flex;align-items:center;justify-content:flex-start;padding:12px 12px 12px 0;height:42px;box-sizing:border-box;border-radius:10px;cursor:pointer;transition:background .2s ease,color .2s ease;color:var(--admin-container-color,#333);gap:0;overflow:hidden}.menu-item[data-v-2718059d]:hover{background:rgba(0,0,0,.06)}html.dark .menu-item[data-v-2718059d]:hover{background:hsla(0,0%,100%,.1)}.menu-item.is-active[data-v-2718059d]{background:linear-gradient(135deg,rgba(64,158,255,.15),rgba(56,189,248,.25));color:#409eff}html.dark .menu-item.is-active[data-v-2718059d]{background:linear-gradient(135deg,rgba(64,158,255,.2),rgba(56,189,248,.35))}.menu-icon[data-v-2718059d]{width:40px;min-width:40px;font-size:16px;flex-shrink:0;text-align:center}.menu-text[data-v-2718059d]{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;opacity:1;transition:opacity .2s ease .05s,max-width .25s ease}.sidebar-container.is-collapsed .menu-text[data-v-2718059d]{opacity:0;max-width:0;transition:opacity .1s ease,max-width .2s ease}.toggle-button[data-v-2718059d]{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-2718059d]{border-top:1px solid hsla(0,0%,100%,.08)}.toggle-button[data-v-2718059d]:hover{background:rgba(0,0,0,.04)}html.dark .toggle-button[data-v-2718059d]:hover{background:hsla(0,0%,100%,.06)}@media (max-width:768px){.sidebar-container[data-v-2718059d]{left:4px;max-width:170px}.sidebar-container.is-collapsed[data-v-2718059d]{width:50px}.menu-icon[data-v-2718059d]{width:34px;min-width:34px}}.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%}}.status-panel[data-v-3cf4ee46]{padding:20px;background:transparent;min-height:100vh}.overview-cards[data-v-3cf4ee46]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-bottom:30px}.overview-card[data-v-3cf4ee46]{background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:16px;padding:24px;display:flex;align-items:center;box-shadow:var(--glass-shadow);transition:all .3s ease;border:1px solid var(--glass-border);cursor:pointer}.overview-card[data-v-3cf4ee46]:hover{transform:translateY(-2px);box-shadow:var(--glass-shadow-hover);background:var(--glass-bg-hover)}.card-icon[data-v-3cf4ee46]{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,#60a5fa,#93c5fd);color:#fff}.card-content[data-v-3cf4ee46]{flex:1}.card-title[data-v-3cf4ee46]{font-size:14px;color:#666;margin-bottom:8px;font-weight:500}.card-value[data-v-3cf4ee46]{font-size:28px;font-weight:700;color:var(--admin-container-color);line-height:1}.card-subtitle[data-v-3cf4ee46]{font-size:11px;color:#999;margin-top:4px;opacity:.8}.charts-section[data-v-3cf4ee46]{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:20px;margin-bottom:30px;overflow:visible}.chart-card[data-v-3cf4ee46]{background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:16px;padding:24px;box-shadow:var(--glass-shadow);transition:all .3s ease;border:1px solid var(--glass-border)}.chart-card[data-v-3cf4ee46]:hover{box-shadow:var(--glass-shadow-hover);background:var(--glass-bg-hover)}.chart-card[data-v-3cf4ee46],.chart-content[data-v-3cf4ee46],.pie-chart-container[data-v-3cf4ee46],.pie-chart-wrapper[data-v-3cf4ee46]{overflow:visible}.chart-header[data-v-3cf4ee46]{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-3cf4ee46]{margin-right:10px;color:var(--admin-purple)}.chart-content[data-v-3cf4ee46]{min-height:160px;padding:15px;margin:-5px}.empty-state[data-v-3cf4ee46]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:160px;color:#999;font-size:14px}.empty-state .fa-icon[data-v-3cf4ee46]{font-size:32px;margin-bottom:10px}.stats-list[data-v-3cf4ee46]{display:flex;flex-direction:column;gap:16px}.stats-item[data-v-3cf4ee46]{display:flex;align-items:center;gap:12px}.stats-label[data-v-3cf4ee46]{min-width:80px;font-size:13px;color:#666;font-weight:500}.stats-bar[data-v-3cf4ee46]{flex:1;height:8px;background:#f0f0f0;border-radius:4px;overflow:hidden}.stats-fill[data-v-3cf4ee46]{height:100%;background:linear-gradient(90deg,var(--admin-purple),#e1bee7);border-radius:4px;transition:width .6s ease}.type-fill[data-v-3cf4ee46]{background:linear-gradient(90deg,#4caf50,#81c784)}.stats-value[data-v-3cf4ee46]{min-width:50px;text-align:right;font-size:13px;font-weight:600;color:var(--admin-container-color)}.pie-chart-container[data-v-3cf4ee46]{display:flex;align-items:center;gap:24px;flex-wrap:wrap;justify-content:center}.pie-chart-wrapper[data-v-3cf4ee46]{position:relative;width:180px;height:180px;flex-shrink:0;padding:15px;box-sizing:content-box;overflow:visible;isolation:isolate}.chart-center-text[data-v-3cf4ee46]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;z-index:-1}.center-value[data-v-3cf4ee46]{font-size:22px;font-weight:700;color:var(--admin-container-color);line-height:1.2}.center-label[data-v-3cf4ee46]{font-size:11px;color:#888;margin-top:2px}.chart-legend[data-v-3cf4ee46]{display:flex;flex-direction:column;gap:10px;flex:1;min-width:180px}.legend-item[data-v-3cf4ee46]{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-3cf4ee46]:hover{background:rgba(0,0,0,.06);transform:translateX(4px)}html.dark .legend-item[data-v-3cf4ee46]{background:hsla(0,0%,100%,.05)}html.dark .legend-item[data-v-3cf4ee46]:hover{background:hsla(0,0%,100%,.1)}.legend-color[data-v-3cf4ee46]{width:12px;height:12px;border-radius:3px;flex-shrink:0}.legend-label[data-v-3cf4ee46]{flex:1;font-size:13px;color:var(--admin-container-color);font-weight:500}.legend-value[data-v-3cf4ee46]{font-size:13px;font-weight:600;color:var(--admin-container-color);min-width:50px;text-align:right}.legend-percent[data-v-3cf4ee46]{font-size:12px;color:#888;min-width:40px;text-align:right}.actions-section[data-v-3cf4ee46]{margin-bottom:30px}.action-card[data-v-3cf4ee46]{background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:16px;padding:24px;box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);transition:all .3s ease}.action-card[data-v-3cf4ee46]:hover{box-shadow:var(--glass-shadow-hover);background:var(--glass-bg-hover)}.action-header[data-v-3cf4ee46]{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-3cf4ee46]{margin-right:10px;color:var(--admin-purple)}.action-content[data-v-3cf4ee46]{display:flex;justify-content:center;padding:20px 0}.action-buttons[data-v-3cf4ee46]{display:flex;gap:20px;flex-wrap:wrap;justify-content:center;align-items:center;width:100%}.action-btn[data-v-3cf4ee46]{border:none;border-radius:14px;padding:14px 28px;margin-left:0;font-weight:600;font-size:14px;transition:all .3s cubic-bezier(.4,0,.2,1);min-width:150px;width:150px;height:52px;position:relative;overflow:hidden;box-shadow:0 4px 12px rgba(0,0,0,.15)}@media (max-width:768px){.action-btn[data-v-3cf4ee46]{flex:1;width:auto;min-width:0;height:auto}}.action-btn[data-v-3cf4ee46]:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.2),transparent);transition:left .5s ease}.action-btn[data-v-3cf4ee46]:hover:before{left:100%}.action-btn[data-v-3cf4ee46]:hover{transform:translateY(-3px)}.action-btn[data-v-3cf4ee46]:active{transform:translateY(-1px)}.action-btn .fa-icon[data-v-3cf4ee46]{margin-right:10px;font-size:15px}.rebuild-btn[data-v-3cf4ee46]{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}.rebuild-btn[data-v-3cf4ee46]:hover{box-shadow:0 8px 24px rgba(102,126,234,.45);background:linear-gradient(135deg,#5a6fd6,#6a4190)}.backup-btn[data-v-3cf4ee46]{background:linear-gradient(135deg,#11998e,#38ef7d);color:#fff}.backup-btn[data-v-3cf4ee46]:hover{box-shadow:0 8px 24px rgba(17,153,142,.45);background:linear-gradient(135deg,#0f8a80,#32d970)}.restore-btn[data-v-3cf4ee46]{background:linear-gradient(135deg,#f093fb,#f5576c);color:#fff}.restore-btn[data-v-3cf4ee46]:hover{box-shadow:0 8px 24px rgba(245,87,108,.45);background:linear-gradient(135deg,#e085eb,#e04d61)}.restore-section[data-v-3cf4ee46]{display:inline-block}@media (max-width:768px){.action-buttons>.el-tooltip[data-v-3cf4ee46],.action-buttons>.restore-section[data-v-3cf4ee46],.restore-section[data-v-3cf4ee46]{flex:1;width:100%}.action-btn[data-v-3cf4ee46]{width:100%!important;padding:10px 20px!important;box-sizing:border-box}}.file-info-section[data-v-3cf4ee46]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;align-items:stretch}.file-info-card[data-v-3cf4ee46]{position:relative;background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:16px;box-shadow:var(--glass-shadow);border:1px solid var(--glass-border);transition:all .3s ease;height:300px;overflow:hidden;cursor:pointer}.card-bg-media[data-v-3cf4ee46]{position:absolute;top:0;left:0;transition:transform .5s ease;display:block}.card-bg-media[data-v-3cf4ee46],.card-bg-media[data-v-3cf4ee46] .el-image__inner{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.card-bg-media[data-v-3cf4ee46] .el-image__wrapper{width:100%;height:100%}.card-bg-fallback[data-v-3cf4ee46]{position:absolute;top:0;left:0;width:100%;height:100%;background:var(--admin-dashborad-stats-bg-color);display:flex;align-items:center;justify-content:center}.fallback-icon[data-v-3cf4ee46]{font-size:80px;color:var(--el-text-color-placeholder);opacity:.3}.file-card-header[data-v-3cf4ee46]{position:absolute;top:0;left:0;right:0;display:flex;gap:8px;align-items:center;padding:12px 16px;font-size:14px;font-weight:600;color:#fff;background:linear-gradient(180deg,rgba(0,0,0,.6),transparent);z-index:2}.file-card-header .fa-icon[data-v-3cf4ee46]{color:#60a5fa}.file-card-header.warning .fa-icon[data-v-3cf4ee46]{color:#f59e0b}.info-card-footer[data-v-3cf4ee46]{position:absolute;bottom:0;left:0;right:0;padding:12px 16px;background:linear-gradient(0deg,rgba(0,0,0,.7),transparent);text-align:center;z-index:2}.info-card-footer .file-name[data-v-3cf4ee46]{font-size:14px;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)}.info-card-footer .file-meta[data-v-3cf4ee46]{font-size:12px;color:hsla(0,0%,100%,.8);text-shadow:0 1px 2px rgba(0,0,0,.5)}@media (min-width:1200px){.file-info-card[data-v-3cf4ee46]{height:400px}}@media (min-width:1600px){.file-info-card[data-v-3cf4ee46]{height:450px}}.file-info-card[data-v-3cf4ee46]:hover{transform:translateY(-2px);box-shadow:var(--glass-shadow-hover)}.file-info-card:hover .card-bg-media[data-v-3cf4ee46]{transform:scale(1.05)}@media (max-width:768px){.status-panel[data-v-3cf4ee46]{padding:15px}.charts-section[data-v-3cf4ee46],.file-info-section[data-v-3cf4ee46],.overview-cards[data-v-3cf4ee46]{grid-template-columns:1fr;gap:15px}.card-icon[data-v-3cf4ee46]{width:50px;height:50px;font-size:20px;margin-right:15px}.card-value[data-v-3cf4ee46]{font-size:24px}.action-buttons[data-v-3cf4ee46]{flex-direction:column;gap:12px}.action-btn[data-v-3cf4ee46]{width:100%;min-width:unset}}.stats-fill[data-v-3cf4ee46]{animation:fillAnimation-3cf4ee46 1s ease-out}@keyframes fillAnimation-3cf4ee46{0%{width:0}}.progress-container[data-v-3cf4ee46]{width:100%;padding:20px;text-align:center}.progress-header[data-v-3cf4ee46]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.progress-phase[data-v-3cf4ee46]{font-size:16px;font-weight:600;color:var(--admin-container-color)}.progress-percentage[data-v-3cf4ee46]{font-size:18px;font-weight:700;color:var(--admin-purple)}.progress-bar[data-v-3cf4ee46]{margin-bottom:16px}.progress-bar[data-v-3cf4ee46] .el-progress-bar__outer{background-color:rgba(139,92,246,.1);border-radius:6px}.progress-bar[data-v-3cf4ee46] .el-progress-bar__inner{background:linear-gradient(90deg,var(--admin-purple),#e1bee7);border-radius:6px;transition:width .3s ease}.progress-details[data-v-3cf4ee46]{display:flex;justify-content:center;gap:24px;margin-bottom:12px;flex-wrap:wrap}.progress-count[data-v-3cf4ee46],.progress-time[data-v-3cf4ee46]{display:flex;align-items:center;gap:6px;font-size:14px;color:#666}.progress-count .fa-icon[data-v-3cf4ee46],.progress-time .fa-icon[data-v-3cf4ee46]{color:var(--admin-purple);font-size:12px}.progress-message[data-v-3cf4ee46]{font-size:13px;color:#888;margin-bottom:16px;min-height:20px}.cancel-btn[data-v-3cf4ee46]{margin-top:12px;border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);background:rgba(239,68,68,.1);border:1px solid rgba(239,68,68,.3);color:#ef4444}.cancel-btn[data-v-3cf4ee46]:hover{background:rgba(239,68,68,.2);border-color:rgba(239,68,68,.5);transform:translateY(-2px);box-shadow:0 4px 12px rgba(239,68,68,.25)}.cancel-btn .fa-icon[data-v-3cf4ee46]{margin-right:8px}.error-container[data-v-3cf4ee46]{width:100%;padding:20px;display:flex;flex-direction:column;align-items:center;gap:16px;background:rgba(239,68,68,.05);border-radius:12px;border:1px solid rgba(239,68,68,.2)}.error-icon[data-v-3cf4ee46]{width:48px;height:48px;border-radius:50%;background:rgba(239,68,68,.1);display:flex;align-items:center;justify-content:center;color:#ef4444;font-size:24px}.error-content[data-v-3cf4ee46]{text-align:center}.error-message[data-v-3cf4ee46]{font-size:15px;font-weight:600;color:#ef4444;margin-bottom:8px}.error-suggestion[data-v-3cf4ee46]{font-size:13px;color:#666}.error-actions[data-v-3cf4ee46]{display:flex;gap:12px}.error-actions .el-button[data-v-3cf4ee46]{border-radius:10px;padding:10px 24px;font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);min-width:100px}.error-actions .el-button--primary[data-v-3cf4ee46]{background:linear-gradient(135deg,#667eea,#764ba2);border:none;color:#fff}.error-actions .el-button--primary[data-v-3cf4ee46]:hover{background:linear-gradient(135deg,#5a6fd6,#6a4190);transform:translateY(-2px);box-shadow:0 6px 16px rgba(102,126,234,.4)}.error-actions .el-button--default[data-v-3cf4ee46]{background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.2);color:var(--el-text-color-regular)}.error-actions .el-button--default[data-v-3cf4ee46]:hover{background:hsla(0,0%,100%,.15);border-color:hsla(0,0%,100%,.3);transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,.15)}.error-actions .fa-icon[data-v-3cf4ee46]{margin-right:8px}html.dark .progress-count[data-v-3cf4ee46],html.dark .progress-time[data-v-3cf4ee46]{color:#aaa}html.dark .progress-message[data-v-3cf4ee46]{color:#999}html.dark .error-container[data-v-3cf4ee46]{background:rgba(239,68,68,.1);border-color:rgba(239,68,68,.3)}html.dark .error-suggestion[data-v-3cf4ee46]{color:#aaa}@media (max-width:768px){.error-container[data-v-3cf4ee46],.progress-container[data-v-3cf4ee46]{padding:16px}.progress-header[data-v-3cf4ee46]{flex-direction:column;gap:8px;text-align:center}.progress-details[data-v-3cf4ee46]{flex-direction:column;gap:8px}.error-actions[data-v-3cf4ee46]{flex-direction:column;width:100%}.error-actions .el-button[data-v-3cf4ee46]{width:100%;margin:0}}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;color:var(--el-text-color-primary);font-size:var(--el-font-size-base)}.el-descriptions__header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;font-size:14px;line-height:23px;text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{background:var(--el-descriptions-item-bordered-label-background);color:var(--el-text-color-regular);font-weight:700}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}: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-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-input-number{display:inline-flex}.el-input-number{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}.custom-select[data-v-55080c16]{position:relative}.custom-select-trigger[data-v-55080c16]{display:flex;align-items:center;justify-content:space-between;height:32px;padding:0 12px;background:var(--el-bg-color);border:1px solid var(--el-border-color);border-radius:8px;cursor:pointer;transition:all .2s ease;box-sizing:border-box}.custom-select-trigger[data-v-55080c16]:hover{border-color:var(--el-color-primary-light-5)}.custom-select.is-open .custom-select-trigger[data-v-55080c16]{border-color:var(--el-color-primary)}.custom-select-value[data-v-55080c16]{font-size:14px;color:var(--el-text-color-regular);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-select-arrow[data-v-55080c16],.custom-select-value.is-placeholder[data-v-55080c16]{color:var(--el-text-color-placeholder)}.custom-select-arrow[data-v-55080c16]{font-size:12px;transition:transform .2s ease;flex-shrink:0;margin-left:8px}.custom-select.is-open .custom-select-arrow[data-v-55080c16]{transform:rotate(180deg)}.custom-select-dropdown[data-v-55080c16]{position:absolute;top:calc(100% + 4px);left:0;width:100%;background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);border-radius:8px;box-shadow:var(--el-box-shadow-light);z-index:2000;overflow:hidden}.custom-select-option[data-v-55080c16]{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;font-size:14px;color:var(--el-text-color-regular);cursor:pointer;transition:background .2s ease}.custom-select-option[data-v-55080c16]:hover{background:var(--el-fill-color-light)}.custom-select-option.is-selected[data-v-55080c16]{color:var(--el-color-primary);font-weight:500}.option-icon[data-v-55080c16]{width:16px;height:16px;flex-shrink:0}.dropdown-fade-enter-active[data-v-55080c16],.dropdown-fade-leave-active[data-v-55080c16]{transition:opacity .2s ease,transform .2s ease}.dropdown-fade-enter-from[data-v-55080c16],.dropdown-fade-leave-to[data-v-55080c16]{opacity:0;transform:translateY(-8px)}.upload-settings[data-v-d225d330]{padding:20px;min-height:500px;overflow-x:hidden}.page-header[data-v-d225d330]{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;flex-wrap:wrap;gap:12px}.first-title[data-v-d225d330]{display:flex;align-items:center;gap:8px;margin:0;font-size:20px;font-weight:600}.help-icon[data-v-d225d330]{cursor:pointer;color:var(--el-text-color-secondary);font-size:14px}.add-btn[data-v-d225d330]{border-radius:8px}.header-actions[data-v-d225d330]{display:flex;gap:12px}.header-actions[data-v-d225d330] .el-button{border-radius:8px}.channel-group[data-v-d225d330]{margin-bottom:32px;background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:12px;border:1px solid var(--glass-border);overflow:hidden;box-shadow:var(--glass-shadow);transition:all .3s ease}.channel-group[data-v-d225d330]:hover{box-shadow:var(--glass-shadow-hover)}.group-header[data-v-d225d330]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;background:var(--glass-header-bg);border-bottom:1px solid var(--glass-header-border)}.group-title[data-v-d225d330]{display:flex;align-items:center;gap:10px;font-size:16px;font-weight:600;color:var(--el-text-color-primary)}.group-icon[data-v-d225d330]{font-size:18px;color:var(--el-color-primary)}.channel-count[data-v-d225d330]{font-size:12px}.load-balance-switch[data-v-d225d330]{display:flex;align-items:center;gap:8px}.switch-label[data-v-d225d330]{font-size:13px;color:var(--el-text-color-secondary)}.channel-cards[data-v-d225d330]{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;padding:20px}.channel-card[data-v-d225d330]{background:var(--glass-bg);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-radius:10px;border:1px solid var(--glass-border);border-left:3px solid var(--el-border-color-light);transition:all .25s ease;overflow:hidden;position:relative;display:flex;flex-direction:column;box-shadow:0 4px 16px rgba(0,0,0,.08)}.card-glow[data-v-d225d330]{position:absolute;width:150px;height:150px;border-radius:50%;pointer-events:none;opacity:0;transform:translate(-50%,-50%);transition:opacity .3s ease;z-index:0;background:radial-gradient(circle,rgba(56,189,248,.15) 0,transparent 70%)}.channel-card.telegram .card-glow[data-v-d225d330]{background:radial-gradient(circle,rgba(84,169,235,.2) 0,transparent 70%)}.channel-card.cfr2 .card-glow[data-v-d225d330]{background:radial-gradient(circle,rgba(246,130,31,.2) 0,transparent 70%)}.channel-card.s3 .card-glow[data-v-d225d330]{background:radial-gradient(circle,rgba(86,154,49,.2) 0,transparent 70%)}.channel-card.discord .card-glow[data-v-d225d330]{background:radial-gradient(circle,rgba(88,101,242,.2) 0,transparent 70%)}.channel-card.huggingface .card-glow[data-v-d225d330]{background:radial-gradient(circle,rgba(255,210,30,.2) 0,transparent 70%)}.channel-card.webdav .card-glow[data-v-d225d330]{background:radial-gradient(circle,rgba(20,184,166,.2) 0,transparent 70%)}.channel-card[data-v-d225d330]:hover{border-color:var(--glass-border-hover);box-shadow:0 8px 24px rgba(0,0,0,.12);background:var(--glass-bg-hover)}.channel-card.disabled[data-v-d225d330]{opacity:.6;background:var(--el-fill-color-lighter)}.channel-card.telegram[data-v-d225d330]{border-left-color:#54a9eb}.channel-card.cfr2[data-v-d225d330]{border-left-color:#f6821f}.channel-card.s3[data-v-d225d330]{border-left-color:#569a31}.channel-card.discord[data-v-d225d330]{border-left-color:#5865f2}.channel-card.huggingface[data-v-d225d330]{border-left-color:#ffd21e}.channel-card.webdav[data-v-d225d330]{border-left-color:#14b8a6}.channel-card.fixed[data-v-d225d330]{border-left-width:3px;border-left-style:dashed}.card-header[data-v-d225d330]{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;background:var(--glass-header-bg);border-bottom:1px solid var(--glass-header-border)}.card-title[data-v-d225d330]{display:flex;align-items:center;gap:8px}.channel-name[data-v-d225d330]{font-weight:600;font-size:14px;color:var(--el-text-color-primary)}.card-body[data-v-d225d330]{padding:14px 16px;min-height:60px;text-align:left}.card-info[data-v-d225d330]{display:flex;flex-direction:column;gap:8px;align-items:flex-start;width:100%;overflow:hidden}.info-item[data-v-d225d330]{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--el-text-color-secondary);min-width:0;width:100%;max-width:100%}.info-text[data-v-d225d330]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;text-align:left}.info-icon[data-v-d225d330]{width:14px;flex-shrink:0;color:var(--el-text-color-placeholder)}.quota-mini[data-v-d225d330]{margin-top:12px;padding-top:12px;border-top:1px dashed var(--el-border-color-lighter)}.quota-mini[data-v-d225d330] .el-progress{margin-bottom:4px}.quota-text[data-v-d225d330]{font-size:11px;color:var(--el-text-color-secondary)}.card-actions[data-v-d225d330]{display:flex;justify-content:flex-end;gap:4px;padding:10px 16px;border-top:1px solid var(--glass-header-border);background:var(--glass-header-bg);margin-top:auto}.empty-tip[data-v-d225d330]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;color:var(--el-text-color-placeholder);gap:12px}.empty-icon[data-v-d225d330]{font-size:32px}.channel-warning[data-v-d225d330]{margin:0 20px 16px;padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning)}.select-option-icon[data-v-d225d330]{width:18px;margin-right:8px;text-align:center}.form-tip[data-v-d225d330]{margin-left:12px;font-size:12px;color:var(--el-text-color-secondary)}.form-warning[data-v-d225d330]{padding:10px 14px;font-size:13px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);border-radius:6px;border-left:3px solid var(--el-color-warning);margin-top:8px}.quota-status[data-v-d225d330]{width:100%}.quota-status[data-v-d225d330] .el-progress{margin-bottom:8px}.quota-info[data-v-d225d330]{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-d225d330]{color:var(--el-color-danger);background:var(--el-color-danger-light-9);font-weight:500}.quota-label[data-v-d225d330]{display:inline-flex;align-items:center;gap:4px}.refresh-btn[data-v-d225d330]{padding:0!important;margin:0!important;height:auto!important;min-height:auto!important;vertical-align:middle}.refresh-btn .fa-spin[data-v-d225d330]{animation:fa-spin-d225d330 1s linear infinite}@keyframes fa-spin-d225d330{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@media (max-width:768px){.upload-settings[data-v-d225d330]{padding:12px}.page-header[data-v-d225d330]{flex-direction:column;align-items:flex-start}.channel-cards[data-v-d225d330]{grid-template-columns:1fr;padding:12px}.group-header[data-v-d225d330]{flex-direction:column;gap:12px;align-items:flex-start}}[data-v-d225d330] .channel-dialog{width:600px!important;max-width:90vw!important}@media (max-width:768px){[data-v-d225d330] .channel-dialog{width:90vw!important}}.el-checkbox-group{font-size:0;line-height:0}.floating-save-btn[data-v-53091626]{position:fixed;right:var(--floating-btn-right,24px);bottom:var(--floating-btn-bottom,24px);display:flex;align-items:center;gap:6px;padding:10px 18px;background:var(--floating-btn-bg);color:var(--floating-btn-color);border-radius:50px;cursor:pointer;box-shadow:var(--floating-btn-shadow);transition:all .3s cubic-bezier(.4,0,.2,1);z-index:100;font-weight:500;font-size:13px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.floating-save-btn[data-v-53091626]:hover{transform:translateY(-2px);box-shadow:var(--floating-btn-shadow-hover)}.floating-save-btn[data-v-53091626]:active{transform:translateY(-1px);box-shadow:var(--floating-btn-shadow)}.floating-save-btn.is-loading[data-v-53091626]{cursor:not-allowed;opacity:.8}.floating-save-btn.is-loading[data-v-53091626]:hover{transform:none}.floating-save-btn svg[data-v-53091626]{font-size:14px}.fade-up-enter-active[data-v-53091626]{transition:all .3s ease-out}.fade-up-leave-active[data-v-53091626]{transition:all .2s ease-in}.fade-up-enter-from[data-v-53091626]{opacity:0;transform:translateY(20px)}.fade-up-leave-to[data-v-53091626]{opacity:0;transform:translateY(10px)}@media (max-width:768px){.floating-save-btn[data-v-53091626]{right:16px;bottom:16px;padding:10px 16px;font-size:12px}.floating-save-btn svg[data-v-53091626]{font-size:12px}}@media (max-width:480px){.floating-save-btn[data-v-53091626]{right:12px;bottom:12px;padding:12px;border-radius:50%}.save-text[data-v-53091626]{display:none}.floating-save-btn svg[data-v-53091626]{font-size:16px}}.security-settings[data-v-2962b112]{padding:20px;min-height:500px}.first-settings[data-v-2962b112]{margin-bottom:40px}.first-title[data-v-2962b112]{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-2962b112]{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-2962b112] .el-form{padding:16px 20px;background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:12px;border:1px solid var(--glass-border);margin-bottom:20px;box-shadow:var(--glass-shadow);transition:all .3s ease}.first-settings[data-v-2962b112] .el-form:hover{box-shadow:var(--glass-shadow-hover);background:var(--glass-bg-hover)}.first-settings[data-v-2962b112] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-2962b112] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-2962b112] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-2962b112] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-2962b112] .el-input,.first-settings[data-v-2962b112] .el-select{width:100%}.first-settings[data-v-2962b112] .el-switch{--el-switch-on-color:var(--el-color-primary)}.form-item-hint[data-v-2962b112]{display:inline-block;margin-left:8px;font-size:14px;color:var(--el-text-color-regular);line-height:32px;vertical-align:middle}.token-title[data-v-2962b112]{display:flex;align-items:center;justify-content:space-between}.token-actions[data-v-2962b112]{margin-left:5px}.token-table-container[data-v-2962b112]{display:flex;justify-content:center;margin-top:20px;width:100%;overflow:hidden}.token-table[data-v-2962b112]{width:100%;border-radius:12px!important;overflow:hidden;box-shadow:var(--glass-shadow);background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--glass-border)}.token-table[data-v-2962b112] .el-table__header-wrapper{border-radius:12px 12px 0 0}.token-table[data-v-2962b112] .el-table__body-wrapper{border-radius:0 0 12px 12px}.token-table[data-v-2962b112] .el-table{border-radius:12px}.token-table[data-v-2962b112] .el-table__header{background-color:#f8f9fa}.token-table[data-v-2962b112] .el-table th{background-color:#f8f9fa!important;border-bottom:1px solid #ebeef5;text-align:center}.token-table[data-v-2962b112] .el-table td{border-bottom:1px solid #ebeef5}.token-table[data-v-2962b112] .el-table__row:last-child td{border-bottom:none}.table-cell-content[data-v-2962b112]{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:4px;padding:8px 4px;min-height:40px;text-align:center}.action-buttons[data-v-2962b112]{gap:8px}.action-button[data-v-2962b112]{margin-left:0}.permission-tag[data-v-2962b112]{margin:2px!important}.token-display[data-v-2962b112]{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-2962b112]{padding:15px;padding-bottom:80px}.first-settings[data-v-2962b112] .el-form{padding:12px 15px}.first-settings[data-v-2962b112] .el-form-item__content{max-width:100%}.token-table-container[data-v-2962b112]{padding:0 10px}.table-cell-content[data-v-2962b112]{padding:6px 2px;min-height:36px}.token-display[data-v-2962b112]{font-size:11px;padding:3px 6px}}@media (max-width:480px){.token-table-container[data-v-2962b112]{padding:0 5px}.table-cell-content[data-v-2962b112]{padding:4px 2px;min-height:32px;font-size:12px}.action-buttons .el-button[data-v-2962b112]{padding:4px 8px;font-size:12px}.permission-tag[data-v-2962b112]{font-size:11px;padding:0 4px;height:20px;line-height:20px}}.token-result[data-v-2962b112]{padding:10px 0}.token-result .el-form-item[data-v-2962b112]{margin-bottom:20px}.dialog-footer[data-v-2962b112]{display:flex;justify-content:flex-end;gap:10px}.fade-slide-enter-active[data-v-2962b112],.fade-slide-leave-active[data-v-2962b112]{transition:all .3s ease-in-out}.fade-slide-enter-from[data-v-2962b112],.fade-slide-leave-to[data-v-2962b112]{opacity:0;transform:translateY(-10px)}.fade-slide-enter-to[data-v-2962b112],.fade-slide-leave-from[data-v-2962b112]{opacity:1;transform:translateY(0)}[data-v-2962b112] .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-e4c3a742]{padding:20px;min-height:500px}.first-settings[data-v-e4c3a742]{margin-bottom:40px}.first-title[data-v-e4c3a742]{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-e4c3a742]{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-e4c3a742] .el-form{padding:16px 20px;background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:12px;border:1px solid var(--glass-border);box-shadow:var(--glass-shadow);transition:all .3s ease}.first-settings[data-v-e4c3a742] .el-form:hover{box-shadow:var(--glass-shadow-hover);background:var(--glass-bg-hover)}.first-settings[data-v-e4c3a742] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-e4c3a742] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-e4c3a742] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-e4c3a742] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-e4c3a742] .el-form-item:has(.el-textarea) .el-form-item__content{max-width:600px}.first-settings[data-v-e4c3a742] .el-input,.first-settings[data-v-e4c3a742] .el-select{width:100%}.first-settings[data-v-e4c3a742] .el-switch{--el-switch-on-color:var(--el-color-primary)}@media (max-width:768px){.page-settings[data-v-e4c3a742]{padding:15px;padding-bottom:80px}.first-settings[data-v-e4c3a742] .el-form{padding:12px 15px}.first-settings[data-v-e4c3a742] .el-form-item__content{max-width:100%}}.others-settings[data-v-67b1b002]{padding:20px;min-height:500px}.first-settings[data-v-67b1b002]{margin-bottom:40px}.first-title[data-v-67b1b002]{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-67b1b002]{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-67b1b002] .el-form{padding:16px 20px;background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:12px;border:1px solid var(--glass-border);margin-bottom:20px;box-shadow:var(--glass-shadow);transition:all .3s ease}.first-settings[data-v-67b1b002] .el-form:hover{box-shadow:var(--glass-shadow-hover);background:var(--glass-bg-hover)}.first-settings[data-v-67b1b002] .el-form-item{margin-bottom:20px;display:flex;flex-direction:column;align-items:flex-start}.first-settings[data-v-67b1b002] .el-form-item:last-child{margin-bottom:0}.first-settings[data-v-67b1b002] .el-form-item__label{text-align:left;padding-bottom:8px;font-weight:500;color:var(--el-text-color-primary);width:auto!important;display:flex;align-items:center;gap:5px}.first-settings[data-v-67b1b002] .el-form-item__content{width:100%;max-width:400px;margin-left:0!important}.first-settings[data-v-67b1b002] .el-input{width:100%}.first-settings[data-v-67b1b002] .el-switch{--el-switch-on-color:var(--el-color-primary)}@media (max-width:768px){.others-settings[data-v-67b1b002]{padding:15px;padding-bottom:80px}.first-settings[data-v-67b1b002] .el-form{padding:12px 15px}.first-settings[data-v-67b1b002] .el-form-item__content{max-width:100%}}.container[data-v-7607b77d]{background:var(--admin-container-bg-color);min-height:100vh;font-family:Arial,sans-serif;color:var(--admin-container-color);margin:0;padding:0;overflow-x:hidden}.header-content[data-v-7607b77d]{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-7607b77d]{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-7607b77d]{flex-direction:column;top:6px;width:calc(100% - 32px);border-radius:14px;padding:6px 12px;gap:4px}.header-icon[data-v-7607b77d]{font-size:.95em}}.header-content[data-v-7607b77d]: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-7607b77d]: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-7607b77d]{font-size:1.5em;cursor:pointer;transition:all .3s ease;color:var(--admin-container-color);outline:none}.header-icon[data-v-7607b77d]:hover{color:#b39ddb;transform:scale(1.2)}.header-action[data-v-7607b77d]{display:flex;gap:10px}.main-container[data-v-7607b77d]{margin-top:60px;transition:margin-left .3s ease,width .3s ease;width:calc(100% - 280px);margin-left:170px}.main-container.collapsed[data-v-7607b77d]{width:calc(100% - 150px);margin-left:80px}@media (max-width:768px){.main-container.collapsed[data-v-7607b77d],.main-container[data-v-7607b77d]{width:auto;margin-left:65px;margin-right:15px;padding:0;min-height:calc(100vh - 60px);box-sizing:border-box}} \ No newline at end of file diff --git a/frontend-dist/css/75.eb4ff77d.css.gz b/frontend-dist/css/75.eb4ff77d.css.gz deleted file mode 100644 index a821c473edc0c28486118490d40a3bb7b69b961b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9266 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 ImgHub
\ No newline at end of file +Sanyue ImgHub
\ No newline at end of file diff --git a/frontend-dist/index.html.gz b/frontend-dist/index.html.gz index e27da20f4bc0d7c1675ba9d59c5ce5ee129390e2..bc4891fa35ae198c050d2b2abbebbd4d303c5719 100644 GIT binary patch literal 519 zcmV+i0{HzOiwFP!000023YAmAZqzUk{guHSdf6nq)t0uB6RAQ-loJRcxFN@$#O^vC zV^6Zm-=p0urP~St7fUmm_h#Nak9=iF^BfT@55AFy7rY96Ekq+ND$~dTS%J1HW#n3n z+!Z(Cl(o#Uz#pTVYVoc3a#y^iAu4vQM**4wW8hlczpK&o_zM)&fVG$$?jt3BQnz=8 zZEbLJ8jEAFa>21vzQ|g6tT&>O-h~|`^tEuBf&iPat3{PrvD4Ln#;M9vPh|}KS-FbQ zW5G0PTl^<70@(a4viEnkrvH~}#{z<4kjRrDPQqSE{BU?%@h(9^e zNOtV8IU8J7OHwWp!C;5!Ai2XNASYdm>LFL!j$v0!7!0Lc-dyUri70kRmM{cj)Cduj|(G~vO0B@)$c)!o4}dl*FQ{a+|rNYrVY>~oL|bZP z(UWKg{`(0Q`CL|+M~DG0C;+e#FP6+2z@Xq+lMb(9aGJ1bYi z;4xzwwaxw$+N-qt7Yu0f6f5z%-87r^`dqNVq@x?y9cZ33Kd3N|2={&WVQe6SJLt(^ z4A44{U@5T+9SmM^OR+y^+~K^ZXwnP1)roI)#MDdskZO5?7CJcsR%5UH3a=mHF{4t4I77O%m z6lxgq@@AuOdwp{OJoB4~@3h+p=s8{s~ho z2hxz4YZ>TC0Y?g5{S~hwLZTRFXhw!~+}L;5cXn*R5T_-w KE8jx@0{{Ta4E1vW diff --git a/frontend-dist/js/365.ae007b9b.js b/frontend-dist/js/365.ae007b9b.js deleted file mode 100644 index b36dacb5..00000000 --- a/frontend-dist/js/365.ae007b9b.js +++ /dev/null @@ -1,2 +0,0 @@ -(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[365],{213:function(e,t,o){"use strict";o(85331),o(19104)},2893:function(e,t,o){"use strict";o(85331)},4885:function(e,t,o){"use strict";o(85331)},10456:function(e,t,o){"use strict";o(85331)},11393:function(e,t,o){o(16573),o(78100),o(77936),o(79577),o(41549),o(49797),o(49631),o(35623),o(64979),o(14603),o(47566),o(98721),function(t,o){e.exports=o()}(0,function(){return function(e){var t={};function o(s){if(t[s])return t[s].exports;var l=t[s]={i:s,l:!1,exports:{}};return e[s].call(l.exports,l,l.exports,o),l.l=!0,l.exports}return o.m=e,o.c=t,o.d=function(e,t,s){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(o.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var l in e)o.d(s,l,function(t){return e[t]}.bind(null,l));return s},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";var s;function l(e){return["image/png","image/jpeg","image/gif"].some(t=>t===e)}o.r(t),o.d(t,"canvastoDataURL",function(){return a}),o.d(t,"canvastoFile",function(){return n}),o.d(t,"dataURLtoFile",function(){return d}),o.d(t,"dataURLtoImage",function(){return c}),o.d(t,"downloadFile",function(){return u}),o.d(t,"filetoDataURL",function(){return p}),o.d(t,"imagetoCanvas",function(){return m}),o.d(t,"urltoBlob",function(){return g}),o.d(t,"urltoImage",function(){return f}),o.d(t,"compress",function(){return b}),o.d(t,"compressAccurately",function(){return v}),o.d(t,"EImageType",function(){return s}),function(e){e.PNG="image/png",e.JPEG="image/jpeg",e.GIF="image/gif"}(s||(s={}));var i=function(e,t,o,s){return new(o||(o=Promise))(function(l,i){function a(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(a,n)}r((s=s.apply(e,t||[])).next())})};function a(e,t=.92,o=s.JPEG){return i(this,void 0,void 0,function*(){return l(o)||(o=s.JPEG),e.toDataURL(o,t)})}function n(e,t=.92,o=s.JPEG){return new Promise(s=>e.toBlob(e=>s(e),o,t))}var r=function(e,t,o,s){return new(o||(o=Promise))(function(l,i){function a(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(a,n)}r((s=s.apply(e,t||[])).next())})};function d(e,t){return r(this,void 0,void 0,function*(){const o=e.split(",");let s=o[0].match(/:(.*?);/)[1];const i=atob(o[1]);let a=i.length;const n=new Uint8Array(a);for(;a--;)n[a]=i.charCodeAt(a);return l(t)&&(s=t),new Blob([n],{type:s})})}function c(e){return new Promise((t,o)=>{const s=new Image;s.onload=()=>t(s),s.onerror=()=>o(new Error("dataURLtoImage(): dataURL is illegal")),s.src=e})}function u(e,t){const o=document.createElement("a");o.href=window.URL.createObjectURL(e),o.download=t||Date.now().toString(36),document.body.appendChild(o);const s=document.createEvent("MouseEvents");s.initEvent("click",!1,!1),o.dispatchEvent(s),document.body.removeChild(o)}function p(e){return new Promise(t=>{const o=new FileReader;o.onloadend=e=>t(e.target.result),o.readAsDataURL(e)})}var h=function(e,t,o,s){return new(o||(o=Promise))(function(l,i){function a(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(a,n)}r((s=s.apply(e,t||[])).next())})};function m(e,t={}){return h(this,void 0,void 0,function*(){const o=Object.assign({},t),s=document.createElement("canvas"),l=s.getContext("2d");let i,a;for(const e in o)Object.prototype.hasOwnProperty.call(o,e)&&(o[e]=Number(o[e]));if(o.scale){const t=o.scale>0&&o.scale<10?o.scale:1;a=e.width*t,i=e.height*t}else a=o.width||o.height*e.width/e.height||e.width,i=o.height||o.width*e.height/e.width||e.height;switch([5,6,7,8].some(e=>e===o.orientation)?(s.height=a,s.width=i):(s.height=i,s.width=a),o.orientation){case 3:l.rotate(180*Math.PI/180),l.drawImage(e,-s.width,-s.height,s.width,s.height);break;case 6:l.rotate(90*Math.PI/180),l.drawImage(e,0,-s.width,s.height,s.width);break;case 8:l.rotate(270*Math.PI/180),l.drawImage(e,-s.height,0,s.height,s.width);break;case 2:l.translate(s.width,0),l.scale(-1,1),l.drawImage(e,0,0,s.width,s.height);break;case 4:l.translate(s.width,0),l.scale(-1,1),l.rotate(180*Math.PI/180),l.drawImage(e,-s.width,-s.height,s.width,s.height);break;case 5:l.translate(s.width,0),l.scale(-1,1),l.rotate(90*Math.PI/180),l.drawImage(e,0,-s.width,s.height,s.width);break;case 7:l.translate(s.width,0),l.scale(-1,1),l.rotate(270*Math.PI/180),l.drawImage(e,-s.height,0,s.height,s.width);break;default:l.drawImage(e,0,0,s.width,s.height)}return s})}function g(e){return fetch(e).then(e=>e.blob())}function f(e){return new Promise((t,o)=>{const s=new Image;s.onload=()=>t(s),s.onerror=()=>o(new Error("urltoImage(): Image failed to load, please check the image URL")),s.src=e})}var y=function(e,t,o,s){return new(o||(o=Promise))(function(l,i){function a(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(a,n)}r((s=s.apply(e,t||[])).next())})};function b(e,t={}){return y(this,void 0,void 0,function*(){if(!(e instanceof Blob))throw new Error("compress(): First arg must be a Blob object or a File object.");if("object"!=typeof t&&(t=Object.assign({quality:t})),t.quality=Number(t.quality),Number.isNaN(t.quality))return e;const o=yield p(e);let i=o.split(",")[0].match(/:(.*?);/)[1],n=s.JPEG;l(t.type)&&(n=t.type,i=t.type);const r=yield c(o),u=yield m(r,Object.assign({},t)),h=yield a(u,t.quality,n),g=yield d(h,i);return g.size>e.size?e:g})}function v(e,t={}){return y(this,void 0,void 0,function*(){if(!(e instanceof Blob))throw new Error("compressAccurately(): First arg must be a Blob object or a File object.");if("object"!=typeof t&&(t=Object.assign({size:t})),t.size=Number(t.size),Number.isNaN(t.size))return e;if(1024*t.size>e.size)return e;t.accuracy=Number(t.accuracy),(!t.accuracy||t.accuracy<.8||t.accuracy>.99)&&(t.accuracy=.95);const o=t.size*(2-t.accuracy)*1024,i=1024*t.size,n=t.size*t.accuracy*1024,r=yield p(e);let u=r.split(",")[0].match(/:(.*?);/)[1],h=s.JPEG;l(t.type)&&(h=t.type,u=t.type);const g=yield c(r),f=yield m(g,Object.assign({},t));let y,b=.5;const v=[null,null];for(let e=1;e<=7;e++){y=yield a(f,b,h);const t=.75*y.length;if(7===e){(ot)&&(y=[y,...v].filter(e=>e).sort((e,t)=>Math.abs(.75*e.length-i)-Math.abs(.75*t.length-i))[0]);break}if(ot))break;v[0]=y,b+=Math.pow(.5,e+1)}}const C=yield d(y,u);return C.size>e.size?e:C})}}])})},13378:function(e,t,o){"use strict";o(85331),o(38736),o(79899)},15616:function(e,t,o){"use strict";o(85331),o(97197)},18785:function(e,t,o){"use strict";o(85331)},19104:function(e,t,o){"use strict";o(85331)},23597:function(e,t,o){"use strict";o(85331)},30694:function(e,t,o){"use strict";o(85331)},33892:function(e,t,o){"use strict";o.d(t,{A:function(){return $}});var s=o(99114),l=(o(85331),o(30694),o(49385)),i=(o(37952),o(30650)),a=(o(19104),o(31802)),n=(o(13378),o(80047)),r=(o(99648),o(56768)),d=o(45130),c=o(24232);const u={class:"directory-tree-picker"},p={class:"tree-container"},h={key:0,class:"error-state"},m={class:"error-text"},g={class:"node-label"},f={class:"tree-container"},y={key:0,class:"error-state"},b={class:"error-text"},v={class:"node-label"};function C(e,t,o,C,k,w){const F=(0,r.g2)("font-awesome-icon"),L=n.S2,U=a.qk,$=i.Vc,S=l.pw,T=s.A;return(0,r.uX)(),(0,r.CE)("div",u,[w.isDesktop?((0,r.uX)(),(0,r.Wv)($,{key:0,visible:k.popoverVisible,"onUpdate:visible":t[1]||(t[1]=e=>k.popoverVisible=e),placement:"bottom-start",width:320,trigger:"click","popper-class":"directory-tree-popover","show-arrow":!0,"hide-after":0,"show-after":50,transition:"el-zoom-in-top"},{reference:(0,r.k6)(()=>[(0,r.Lk)("span",{class:"popover-trigger-wrapper",onClick:t[0]||(t[0]=(0,d.D$)(()=>{},["stop"]))},[(0,r.RG)(e.$slots,"trigger",{},void 0,!0)])]),default:(0,r.k6)(()=>[(0,r.bo)(((0,r.uX)(),(0,r.CE)("div",p,[k.error?((0,r.uX)(),(0,r.CE)("div",h,[(0,r.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,r.Lk)("span",m,(0,c.v_)(k.error),1),(0,r.bF)(L,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,r.k6)(()=>[(0,r.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,r.uX)(),(0,r.Wv)(U,{key:1,ref:"treeRef",data:k.treeData,props:k.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":o.currentDirectory,class:"directory-tree",onNodeClick:w.handleNodeClick},{default:(0,r.k6)(({node:e,data:t})=>[(0,r.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===o.currentDirectory}])},[(0,r.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,r.Lk)("span",g,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[T,k.loading]])]),_:3},8,["visible"])):((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[(0,r.Lk)("span",{class:"drawer-trigger-wrapper",onClick:t[2]||(t[2]=(...e)=>w.openDrawer&&w.openDrawer(...e))},[(0,r.RG)(e.$slots,"trigger",{},void 0,!0)]),(0,r.bF)(S,{modelValue:k.drawerVisible,"onUpdate:modelValue":t[3]||(t[3]=e=>k.drawerVisible=e),direction:"btt",size:"60%","show-close":!0,"with-header":!0,"z-index":3e3,title:e.$t("directoryTree.selectDirectory"),class:"directory-tree-drawer"},{default:(0,r.k6)(()=>[(0,r.bo)(((0,r.uX)(),(0,r.CE)("div",f,[k.error?((0,r.uX)(),(0,r.CE)("div",y,[(0,r.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,r.Lk)("span",b,(0,c.v_)(k.error),1),(0,r.bF)(L,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,r.k6)(()=>[(0,r.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,r.uX)(),(0,r.Wv)(U,{key:1,ref:"treeRefMobile",data:k.treeData,props:k.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":o.currentDirectory,class:"directory-tree mobile-tree",onNodeClick:w.handleNodeClick},{default:(0,r.k6)(({node:e,data:t})=>[(0,r.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===o.currentDirectory}])},[(0,r.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,r.Lk)("span",v,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[T,k.loading]])]),_:1},8,["modelValue","title"])],64))])}var k=o(457),w=o(70797),F={name:"DirectoryTreePicker",props:{currentDirectory:{type:String,default:""},source:{type:String,default:"upload",validator:e=>["upload","admin"].includes(e)}},data(){return{popoverVisible:!1,drawerVisible:!1,treeData:[],loading:!1,error:"",treeProps:{children:"children",label:"name"},windowWidth:window.innerWidth}},computed:{isDesktop(){return this.windowWidth>=769}},watch:{popoverVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.popoverVisible&&this.$refs.treeRef){const e=this.$refs.treeRef.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},200)},drawerVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.drawerVisible&&this.$refs.treeRefMobile){const e=this.$refs.treeRefMobile.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},300)},currentDirectory(e){this.$nextTick(()=>{this.$refs.treeRef&&e&&this.$refs.treeRef.setCurrentKey(e),this.$refs.treeRefMobile&&e&&this.$refs.treeRefMobile.setCurrentKey(e)})}},mounted(){window.addEventListener("resize",this.handleResize)},beforeUnmount(){window.removeEventListener("resize",this.handleResize)},methods:{handleResize(){this.windowWidth=window.innerWidth},openDrawer(){this.drawerVisible=!0},async fetchDirectoryTree(){this.loading=!0,this.error="";try{let e;if("admin"===this.source){const t=await(0,w.A)("/api/directoryTree",{method:"GET"});if(!t.ok)return void(401===t.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.serverError"));e=await t.json()}else{const t=await k.A.get("/api/directoryTree",{withAuthCode:!0});e=t.data}e.tree?this.treeData=[e.tree]:this.treeData=[]}catch(e){console.error("Failed to fetch directory tree:",e),401===e.response?.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.loadFailed")}finally{this.loading=!1}},handleNodeClick(e){let t=e.path;t&&!t.startsWith("/")?t="/"+t:t||(t="/"),this.$emit("select",t),this.popoverVisible=!1,this.drawerVisible=!1}}},L=o(71241);const U=(0,L.A)(F,[["render",C],["__scopeId","data-v-62eab69a"]]);var $=U},34396:function(e,t,o){"use strict";o(85331),o(4885)},37952:function(e,t,o){"use strict";o(85331),o(97197)},38736:function(e,t,o){"use strict";o(85331)},40670:function(e,t,o){"use strict";o(85331),o(99648),o(19104),o(85970)},50333:function(e,t,o){"use strict";o(85331),o(29092)},58149:function(e,t,o){"use strict";o.r(t),o.d(t,{default:function(){return $o}});var s=o(78507),l=(o(85331),o(213),o(80047)),i=(o(99648),o(56768)),a=o(24232);const n={class:"history-header"},r={class:"header-left"},d={class:"record-count"},c={class:"header-right"},u={class:"timeline-header"},p={class:"date-label"},h={key:0,class:"grid-view"},m={class:"grid-preview"},g=["src"],f=["src"],y={key:2,class:"file-icon-wrapper"},b={class:"grid-overlay"},v={class:"grid-actions"},C={class:"grid-info"},k=["title"],w={class:"upload-time"},F={key:1,class:"list-view"},L={class:"list-preview"},U=["src"],$=["src"],S={key:2,class:"file-icon-wrapper-small"},T={class:"list-info"},_=["title"],x=["title"],M={class:"list-meta"},R={class:"upload-time"},A={class:"list-actions"},E={key:0,class:"load-more-container"},D={key:0,class:"loading-indicator"},I={key:1,class:"load-more-hint"},N={key:1,class:"no-more-hint"},P={key:1,class:"empty-state"};function V(e,t,o,V,W,z){const B=(0,i.g2)("font-awesome-icon"),H=l.S2,X=s.R7;return(0,i.uX)(),(0,i.CE)("div",{class:(0,a.C4)(["history-container",{active:o.show}])},[(0,i.Lk)("div",n,[(0,i.Lk)("div",r,[(0,i.Lk)("h2",null,(0,a.v_)(e.$t("uploadHistory.title")),1),(0,i.Lk)("span",d,(0,a.v_)(e.$t("uploadHistory.totalRecords",{count:W.totalCount})),1)]),(0,i.Lk)("div",c,[(0,i.bF)(X,{content:e.$t("uploadHistory.switchView"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(H,{circle:"",onClick:z.toggleViewMode},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"grid"===W.viewMode?"list":"th-large"},null,8,["icon"])]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,i.bF)(X,{content:e.$t("uploadHistory.clearRecords"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(H,{circle:"",type:"danger",onClick:z.clearHistory},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,i.bF)(H,{circle:"",onClick:t[0]||(t[0]=t=>e.$emit("close"))},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"times"})]),_:1})])]),W.historyList.length>0?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"history-content",ref:"historyContent",onScroll:t[3]||(t[3]=(...e)=>z.handleScroll&&z.handleScroll(...e))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(z.groupedHistory,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.date,class:"history-group"},[(0,i.Lk)("div",u,[t[4]||(t[4]=(0,i.Lk)("div",{class:"timeline-dot"},null,-1)),(0,i.Lk)("span",p,(0,a.v_)(e.date),1)]),"grid"===W.viewMode?((0,i.uX)(),(0,i.CE)("div",h,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.items,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.time,class:"grid-item"},[(0,i.Lk)("div",m,[z.isImage(e.name)?((0,i.uX)(),(0,i.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[1]||(t[1]=(...e)=>z.handleImageError&&z.handleImageError(...e))},null,40,g)):z.isVideo(e.name)?((0,i.uX)(),(0,i.CE)("video",{key:1,src:e.url,muted:""},null,8,f)):((0,i.uX)(),(0,i.CE)("div",y,[(0,i.bF)(B,{icon:"file",class:"file-icon"})])),(0,i.Lk)("div",b,[(0,i.Lk)("div",v,[(0,i.bF)(H,{circle:"",size:"default",type:"primary",onClick:t=>z.copyLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"copy"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"default",class:"action-btn-view",onClick:t=>z.openLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"default",type:"danger",onClick:t=>z.deleteItem(e)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])])])]),(0,i.Lk)("div",C,[(0,i.Lk)("div",{class:"file-name",title:e.name},(0,a.v_)(e.name),9,k),(0,i.Lk)("div",w,(0,a.v_)(z.formatTime(e.time)),1)])]))),128))])):((0,i.uX)(),(0,i.CE)("div",F,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.items,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.time,class:"list-item"},[(0,i.Lk)("div",L,[z.isImage(e.name)?((0,i.uX)(),(0,i.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[2]||(t[2]=(...e)=>z.handleImageError&&z.handleImageError(...e))},null,40,U)):z.isVideo(e.name)?((0,i.uX)(),(0,i.CE)("video",{key:1,src:e.url,muted:""},null,8,$)):((0,i.uX)(),(0,i.CE)("div",S,[(0,i.bF)(B,{icon:"file"})]))]),(0,i.Lk)("div",T,[(0,i.Lk)("div",{class:"file-name",title:e.name},(0,a.v_)(e.name),9,_),(0,i.Lk)("div",{class:"file-url",title:e.url},(0,a.v_)(e.url),9,x)]),(0,i.Lk)("div",M,[(0,i.Lk)("div",R,(0,a.v_)(z.formatTime(e.time)),1)]),(0,i.Lk)("div",A,[(0,i.bF)(H,{circle:"",size:"small",type:"primary",onClick:t=>z.copyLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"copy"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"small",class:"action-btn-view",onClick:t=>z.openLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"small",type:"danger",onClick:t=>z.deleteItem(e)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])])]))),128))]))]))),128)),z.hasMore?((0,i.uX)(),(0,i.CE)("div",E,[W.loadingMore?((0,i.uX)(),(0,i.CE)("div",D,[(0,i.bF)(B,{icon:"spinner",spin:""}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadHistory.loading")),1)])):((0,i.uX)(),(0,i.CE)("div",I,(0,a.v_)(e.$t("uploadHistory.pullToLoadMore")),1))])):W.historyList.length>0?((0,i.uX)(),(0,i.CE)("div",N,(0,a.v_)(e.$t("uploadHistory.noMoreRecords")),1)):(0,i.Q3)("",!0)],544)):((0,i.uX)(),(0,i.CE)("div",P,[(0,i.bF)(B,{icon:"history",class:"empty-icon"}),(0,i.Lk)("p",null,(0,a.v_)(e.$t("uploadHistory.emptyHistory")),1)]))],2)}o(44114),o(18111),o(22489),o(7588),o(61701),o(33110),o(58335);var W={name:"UploadHistory",props:{show:{type:Boolean,default:!1}},data(){return{historyList:[],allHistory:[],viewMode:"grid",pageSize:30,currentPage:0,loadingMore:!1,totalCount:0}},watch:{show(e){e&&this.resetAndLoad()}},computed:{hasMore(){return this.historyList.length{const o=new Date(t.time),s=`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")}`;e[s]||(e[s]=[]),e[s].push(t)}),Object.keys(e).sort((e,t)=>new Date(t)-new Date(e)).map(t=>({date:t,items:e[t]}))}},mounted(){const e=localStorage.getItem("historyViewMode");e&&(this.viewMode=e)},methods:{resetAndLoad(){this.historyList=[],this.currentPage=0,this.loadAllHistory(),this.loadMore()},loadAllHistory(){try{const e=JSON.parse(localStorage.getItem("uploadHistory")||"[]");this.allHistory=e.sort((e,t)=>t.time-e.time),this.totalCount=this.allHistory.length}catch(e){console.error("Failed to load history",e),this.allHistory=[],this.totalCount=0}},loadMore(){!this.loadingMore&&this.hasMore&&(this.loadingMore=!0,setTimeout(()=>{const e=this.currentPage*this.pageSize,t=e+this.pageSize,o=this.allHistory.slice(e,t);this.historyList=[...this.historyList,...o],this.currentPage++,this.loadingMore=!1},50))},handleScroll(e){const t=e.target,o=t.scrollTop,s=t.scrollHeight,l=t.clientHeight;s-o-l<100&&this.loadMore()},toggleViewMode(){this.viewMode="grid"===this.viewMode?"list":"grid",localStorage.setItem("historyViewMode",this.viewMode)},clearHistory(){this.$confirm(this.$t("uploadHistory.clearConfirmMessage"),this.$t("uploadHistory.clearConfirmTitle"),{confirmButtonText:this.$t("uploadHistory.clearConfirmOk"),cancelButtonText:this.$t("uploadHistory.clearConfirmCancel"),type:"warning"}).then(()=>{this.historyList=[],this.allHistory=[],this.totalCount=0,this.currentPage=0,localStorage.removeItem("uploadHistory"),this.$message.success(this.$t("uploadHistory.recordsCleared"))}).catch(()=>{})},deleteItem(e){this.$confirm(this.$t("uploadHistory.deleteConfirmMessage"),this.$t("uploadHistory.clearConfirmTitle"),{confirmButtonText:this.$t("uploadHistory.clearConfirmOk"),cancelButtonText:this.$t("uploadHistory.clearConfirmCancel"),type:"warning"}).then(()=>{this.historyList=this.historyList.filter(t=>t.time!==e.time),this.allHistory=this.allHistory.filter(t=>t.time!==e.time),this.totalCount=this.allHistory.length;try{localStorage.setItem("uploadHistory",JSON.stringify(this.allHistory)),this.$message.success(this.$t("uploadHistory.recordDeleted"))}catch(t){console.error("Failed to update history",t)}}).catch(()=>{})},isImage(e){const t=["jpg","jpeg","png","gif","bmp","webp","svg","tiff","ico","avif","heic","jfif","pjpeg","pjp"],o=e?e.split(".").pop().toLowerCase():"";return t.includes(o)},isVideo(e){const t=["mp4","webm","ogg","mkv"],o=e?e.split(".").pop().toLowerCase():"";return t.includes(o)},formatTime(e){const t=new Date(e),o=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),l=String(t.getDate()).padStart(2,"0"),i=String(t.getHours()).padStart(2,"0"),a=String(t.getMinutes()).padStart(2,"0"),n=String(t.getSeconds()).padStart(2,"0");return`${o}-${s}-${l} ${i}:${a}:${n}`},copyLink(e){navigator.clipboard.writeText(e).then(()=>{this.$message.success(this.$t("uploadHistory.linkCopied"))}).catch(()=>{this.$message.error(this.$t("uploadHistory.copyFailed"))})},openLink(e){window.open(e,"_blank")},handleImageError(e){e.target.src=o(96682)}}},z=o(71241);const B=(0,z.A)(W,[["render",V],["__scopeId","data-v-550797ce"]]);var H=B,X=o(86975),O=o(9267),Q=(o(15616),o(81418)),j=(o(50333),o(74757)),q=o(55558),G=(o(10456),o(39623)),K=(o(29092),o(76018)),J=(o(96808),o(67819),o(66810));o(34396),o(4885);const Y={class:"dialog-section"},Z={class:"section-header"},ee={class:"section-title"},te={class:"section-content"},oe={class:"setting-item"},se={class:"setting-label"},le={key:0,class:"setting-item"},ie={class:"setting-label"},ae={class:"setting-item"},ne={class:"setting-label"},re={class:"setting-item"},de={class:"setting-label"},ce={class:"dialog-section"},ue={class:"section-header"},pe={class:"section-title"},he={class:"section-content"},me={class:"dialog-section"},ge={class:"section-header"},fe={class:"section-title"},ye={class:"section-content"},be={class:"setting-item"},ve={class:"setting-label"},Ce={class:"setting-item"},ke={class:"setting-label"},we={key:0,class:"setting-item slider-item"},Fe={class:"setting-label"},Le={class:"slider-wrapper"},Ue={class:"slider-input-wrapper"},$e={key:1,class:"setting-item slider-item"},Se={class:"setting-label"},Te={class:"slider-wrapper"},_e={class:"slider-input-wrapper"},xe={key:0,class:"dialog-section"},Me={class:"section-header"},Re={class:"section-title"},Ae={class:"section-content"},Ee={class:"setting-item"},De={class:"setting-label"},Ie={class:"dialog-action"};function Ne(e,t,o,n,r,d){const c=(0,i.g2)("font-awesome-icon"),u=J.ll,p=J.MQ,h=s.R7,m=K.P9,g=K.AV,f=G.WK,y=q.qi,b=j.B8,v=Q.lq,C=l.S2,k=O.kZ;return(0,i.uX)(),(0,i.Wv)(k,{title:e.$t("uploadSettings.title"),modelValue:d.visible,"onUpdate:modelValue":t[12]||(t[12]=e=>d.visible=e),width:d.dialogWidth,"show-close":!1,class:"settings-dialog"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Y,[(0,i.Lk)("div",Z,[(0,i.Lk)("span",ee,(0,a.v_)(e.$t("uploadSettings.uploadChannel")),1)]),(0,i.Lk)("div",te,[(0,i.Lk)("div",oe,[(0,i.Lk)("span",se,(0,a.v_)(e.$t("uploadSettings.channelType")),1),(0,i.bF)(p,{"model-value":o.uploadChannel,"onUpdate:modelValue":t[0]||(t[0]=t=>e.$emit("update:uploadChannel",t)),class:"radio-card-group compact"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{label:"telegram",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"paper-plane",class:"channel-icon"}),t[13]||(t[13]=(0,i.Lk)("span",null,"TG",-1))]),_:1}),(0,i.bF)(u,{label:"cfr2",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"cloud",class:"channel-icon"}),t[14]||(t[14]=(0,i.Lk)("span",null,"R2",-1))]),_:1}),(0,i.bF)(u,{label:"s3",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"database",class:"channel-icon"}),t[15]||(t[15]=(0,i.Lk)("span",null,"S3",-1))]),_:1}),(0,i.bF)(u,{label:"discord",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"comments",class:"channel-icon"}),t[16]||(t[16]=(0,i.Lk)("span",null,"DC",-1))]),_:1}),(0,i.bF)(u,{label:"huggingface",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"robot",class:"channel-icon"}),t[17]||(t[17]=(0,i.Lk)("span",null,"HF",-1))]),_:1}),(0,i.bF)(u,{label:"webdav",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"folder",class:"channel-icon"}),t[18]||(t[18]=(0,i.Lk)("span",null,"WD",-1))]),_:1})]),_:1},8,["model-value"])]),o.currentChannelList.length>1?((0,i.uX)(),(0,i.CE)("div",le,[(0,i.Lk)("span",ie,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.channelName"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.channelNameTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(g,{"model-value":o.channelName,"onUpdate:modelValue":t[1]||(t[1]=t=>e.$emit("update:channelName",t)),placeholder:e.$t("uploadSettings.autoSelect"),clearable:"",class:"setting-input"},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.currentChannelList,e=>((0,i.uX)(),(0,i.Wv)(m,{key:e.name,label:e.name,value:e.name},null,8,["label","value"]))),128))]),_:1},8,["model-value","placeholder"])])):(0,i.Q3)("",!0),(0,i.Lk)("div",ae,[(0,i.Lk)("span",ne,(0,a.v_)(e.$t("uploadSettings.uploadDirectory")),1),(0,i.bF)(f,{"model-value":o.uploadFolder,"onUpdate:modelValue":d.handleUploadFolderInput,placeholder:e.$t("uploadSettings.uploadDirectoryPlaceholder"),class:"setting-input"},null,8,["model-value","onUpdate:modelValue","placeholder"])]),(0,i.Lk)("div",re,[(0,i.Lk)("span",de,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.autoSwitch"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.autoSwitchTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(y,{"model-value":o.autoRetry,"onUpdate:modelValue":t[2]||(t[2]=t=>e.$emit("update:autoRetry",t))},null,8,["model-value"])])])]),(0,i.Lk)("div",ce,[(0,i.Lk)("div",ue,[(0,i.Lk)("span",pe,(0,a.v_)(e.$t("uploadSettings.fileNaming")),1)]),(0,i.Lk)("div",he,[(0,i.bF)(p,{"model-value":o.uploadNameType,"onUpdate:modelValue":t[3]||(t[3]=t=>e.$emit("update:uploadNameType",t)),class:"radio-card-group grid-2x2"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{label:"default",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"cog",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadSettings.namingDefault")),1)]),_:1}),(0,i.bF)(u,{label:"index",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"hashtag",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadSettings.namingIndex")),1)]),_:1}),(0,i.bF)(u,{label:"origin",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"file-signature",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadSettings.namingOrigin")),1)]),_:1}),(0,i.bF)(u,{label:"short",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"compress-alt",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadSettings.namingShort")),1)]),_:1})]),_:1},8,["model-value"])])]),(0,i.Lk)("div",me,[(0,i.Lk)("div",ge,[(0,i.Lk)("span",fe,(0,a.v_)(e.$t("uploadSettings.filePreprocess")),1),(0,i.bF)(h,{content:e.$t("uploadSettings.filePreprocessTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",ye,[(0,i.Lk)("div",be,[(0,i.Lk)("span",ve,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.convertToWebp"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.convertToWebpTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(y,{"model-value":o.convertToWebp,"onUpdate:modelValue":t[4]||(t[4]=t=>e.$emit("update:convertToWebp",t))},null,8,["model-value"])]),(0,i.Lk)("div",Ce,[(0,i.Lk)("span",ke,(0,a.v_)(e.$t("uploadSettings.fileCompress")),1),(0,i.bF)(y,{"model-value":o.customerCompress,"onUpdate:modelValue":t[5]||(t[5]=t=>e.$emit("update:customerCompress",t))},null,8,["model-value"])]),o.customerCompress?((0,i.uX)(),(0,i.CE)("div",we,[(0,i.Lk)("span",Fe,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.compressThreshold"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.compressThresholdTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Le,[(0,i.bF)(b,{"model-value":o.compressBar,"onUpdate:modelValue":t[6]||(t[6]=t=>e.$emit("update:compressBar",t)),min:1,max:20,"format-tooltip":e=>`${e} MB`},null,8,["model-value","format-tooltip"]),(0,i.Lk)("div",Ue,[(0,i.bF)(v,{"model-value":o.compressBar,"onUpdate:modelValue":t[7]||(t[7]=t=>e.$emit("update:compressBar",t)),min:1,max:20,step:1,"value-on-clear":1,class:"slider-input","controls-position":"right"},null,8,["model-value"]),t[19]||(t[19]=(0,i.Lk)("span",{class:"slider-unit"},"MB",-1))])])])):(0,i.Q3)("",!0),o.customerCompress?((0,i.uX)(),(0,i.CE)("div",$e,[(0,i.Lk)("span",Se,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.expectedSize"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.expectedSizeTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Te,[(0,i.bF)(b,{"model-value":o.compressQuality,"onUpdate:modelValue":t[8]||(t[8]=t=>e.$emit("update:compressQuality",t)),min:.5,max:o.compressBar,step:.1,"format-tooltip":e=>`${e} MB`},null,8,["model-value","max","format-tooltip"]),(0,i.Lk)("div",_e,[(0,i.bF)(v,{"model-value":o.compressQuality,"onUpdate:modelValue":t[9]||(t[9]=t=>e.$emit("update:compressQuality",t)),min:.5,max:o.compressBar,step:.1,precision:1,"value-on-clear":.5,class:"slider-input","controls-position":"right"},null,8,["model-value","max"]),t[20]||(t[20]=(0,i.Lk)("span",{class:"slider-unit"},"MB",-1))])])])):(0,i.Q3)("",!0)])]),"telegram"===o.uploadChannel?((0,i.uX)(),(0,i.CE)("div",xe,[(0,i.Lk)("div",Me,[(0,i.Lk)("span",Re,(0,a.v_)(e.$t("uploadSettings.serverCompress")),1),(0,i.bF)(h,{content:e.$t("uploadSettings.serverCompressTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Ae,[(0,i.Lk)("div",Ee,[(0,i.Lk)("span",De,(0,a.v_)(e.$t("uploadSettings.enableCompress")),1),(0,i.bF)(y,{"model-value":o.serverCompress,"onUpdate:modelValue":t[10]||(t[10]=t=>e.$emit("update:serverCompress",t))},null,8,["model-value"])])])])):(0,i.Q3)("",!0),(0,i.Lk)("div",Ie,[(0,i.bF)(C,{type:"primary",onClick:t[11]||(t[11]=e=>d.visible=!1),class:"confirm-btn"},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"])}var Pe={name:"UploadSettingsDialog",methods:{handleUploadFolderInput(e){e&&!e.startsWith("/")&&(e="/"+e),this.$emit("update:uploadFolder",e)}},props:{modelValue:{type:Boolean,default:!1},uploadChannel:{type:String,default:"telegram"},channelName:{type:String,default:""},currentChannelList:{type:Array,default:()=>[]},uploadFolder:{type:String,default:""},autoRetry:{type:Boolean,default:!0},uploadNameType:{type:String,default:"default"},convertToWebp:{type:Boolean,default:!1},customerCompress:{type:Boolean,default:!0},compressBar:{type:Number,default:5},compressQuality:{type:Number,default:4},serverCompress:{type:Boolean,default:!0}},emits:["update:modelValue","update:uploadChannel","update:channelName","update:uploadFolder","update:autoRetry","update:uploadNameType","update:convertToWebp","update:customerCompress","update:compressBar","update:compressQuality","update:serverCompress"],computed:{visible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},dialogWidth(){return window.innerWidth>768?"50%":"90%"}}};const Ve=(0,z.A)(Pe,[["render",Ne]]);var We=Ve,ze=o(88559),Be=(o(85970),o(813)),He=(o(34896),o(69655)),Xe=(o(2893),o(74253));o(79899);const Oe={class:"upload-list-item"},Qe=["href"],je={key:0,style:{width:"10vw","border-radius":"12px"},autoplay:"",muted:"",playsinline:"",loop:""},qe=["src"],Ge=["src"],Ke={key:2,style:{width:"10vw","border-radius":"12px"}},Je={class:"upload-list-item-content"},Ye={class:"upload-list-item-name-wrapper"},Ze={key:0,class:"upload-list-item-url"},et={class:"upload-list-item-url-row"},tt={class:"upload-list-item-url-row"},ot={key:1,class:"upload-list-item-progress"},st={class:"upload-list-item-action"};function lt(e,t,o,s,l,n){const r=(0,i.g2)("font-awesome-icon"),d=Xe.$g,c=G.WK,u=He.ve,p=(0,i.g2)("Link"),h=Be.tk,m=(0,i.g2)("Delete");return(0,i.uX)(),(0,i.CE)("div",Oe,[(0,i.Lk)("a",{href:o.file.url,target:"_blank",class:"upload-list-item-preview"},[n.isVideo(o.file.name)?((0,i.uX)(),(0,i.CE)("video",je,[(0,i.Lk)("source",{src:o.file.url,type:"video/mp4"},null,8,qe),t[7]||(t[7]=(0,i.eW)(" Your browser does not support the video tag. ",-1))])):n.isImage(o.file.name)?((0,i.uX)(),(0,i.CE)("img",{key:1,style:{width:"10vw","border-radius":"12px"},src:o.file.url,onError:t[0]||(t[0]=t=>e.$emit("preview-error",o.file))},null,40,Ge)):((0,i.uX)(),(0,i.CE)("div",Ke,[(0,i.bF)(r,{icon:"file",class:"file-icon"})]))],8,Qe),(0,i.Lk)("div",Je,[(0,i.Lk)("div",Ye,[(0,i.bF)(d,{class:"upload-list-item-name",truncated:""},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(n.truncateFilename(o.file.name)),1)]),_:1})]),"done"===o.file.status?((0,i.uX)(),(0,i.CE)("div",Ze,[(0,i.Lk)("div",et,[(0,i.bF)(c,{modelValue:o.file.finalURL,"onUpdate:modelValue":t[1]||(t[1]=e=>o.file.finalURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[8]||(t[8]=[(0,i.eW)("URL",-1)])]),_:1},8,["modelValue","onClick","size"]),(0,i.bF)(c,{modelValue:o.file.mdURL,"onUpdate:modelValue":t[2]||(t[2]=e=>o.file.mdURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[9]||(t[9]=[(0,i.eW)("MarkDown",-1)])]),_:1},8,["modelValue","onClick","size"])]),(0,i.Lk)("div",tt,[(0,i.bF)(c,{modelValue:o.file.htmlURL,"onUpdate:modelValue":t[3]||(t[3]=e=>o.file.htmlURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[10]||(t[10]=[(0,i.eW)("HTML",-1)])]),_:1},8,["modelValue","onClick","size"]),(0,i.bF)(c,{modelValue:o.file.ubbURL,"onUpdate:modelValue":t[4]||(t[4]=e=>o.file.ubbURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[11]||(t[11]=[(0,i.eW)("BBCode",-1)])]),_:1},8,["modelValue","onClick","size"])])])):((0,i.uX)(),(0,i.CE)("div",ot,[(0,i.bF)(u,{percentage:o.file.progreess,status:o.file.status,"show-text":!1},null,8,["percentage","status"])]))]),(0,i.Lk)("div",st,[(0,i.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-primary",onClick:t[5]||(t[5]=t=>e.$emit("copy",o.file))},[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.bF)(p)]),_:1})]),(0,i.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-danger",onClick:t[6]||(t[6]=t=>e.$emit("remove",o.file))},[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.bF)(m)]),_:1})])])])}var it=o(57477);const at=["jpg","jpeg","png","gif","bmp","webp","svg","tiff","ico","avif","heic","jfif","pjpeg","pjp","raw","cr2","nef","dng","eps","ai","emf","wmf"],nt=["mp4","webm","ogg","mkv"];var rt={name:"UploadFileItem",components:{Link:it.Link,Delete:it.Delete},props:{file:{type:Object,required:!0}},emits:["copy","remove","preview-error"],computed:{urlSize(){return window.innerWidth<768?"small":"default"}},methods:{isImage(e){const t=e.split(".").pop().toLowerCase();return at.includes(t)},isVideo(e){const t=e.split(".").pop().toLowerCase();return nt.includes(t)},truncateFilename(e,t=20){if(!e||e.length<=t)return e;const o=e.lastIndexOf(".");let s,l;o>0?(s=e.substring(0,o),l=e.substring(o)):(s=e,l="");const i=l.length+4,a=t-i-3;return a<=0?e.substring(0,t-3)+"...":s.substring(0,a)+"..."+s.slice(-4)+l},selectAllText(e){navigator.clipboard.writeText(e.target.value).then(()=>{this.$message({type:"success",message:this.$t("uploadForm.copySuccess")})}).catch(()=>{this.$message({type:"error",message:this.$t("uploadForm.copyFailed")})})}}};const dt=(0,z.A)(rt,[["render",lt],["__scopeId","data-v-4848c2b0"]]);var ct=dt,ut=o(62086),pt=(o(40670),o(88830),o(23597),o(70683)),ht=(o(95385),o(47358));const mt={class:"upload-form"},gt={class:"upload-card-glow",ref:"uploadCardGlow"},ft=["innerHTML"],yt={key:0,class:"upload-card"},bt={class:"paste-card-actions"},vt={class:"upload-list-dashboard-action"},Ct={class:"modern-action-group"},kt={class:"modern-dropdown-item-content"},wt={class:"modern-action-btn modern-action-btn-danger"};function Ft(e,t,n,r,d,c){const u=(0,i.g2)("CameraFilled"),p=Be.tk,h=ht.j5,m=G.WK,g=l.S2,f=J.Zh,y=J.MQ,b=pt.Ik,v=(0,i.g2)("List"),C=(0,i.g2)("Checked"),k=(0,i.g2)("Failed"),w=Xe.$g,F=(0,i.g2)("font-awesome-icon"),L=s.R7,U=q.qi,$=ut.c6,S=ut.Iy,T=ut.dW,_=ct,x=ze.kA;return(0,i.uX)(),(0,i.CE)("div",mt,[(0,i.Lk)("div",{class:"upload-card-wrapper",onMousemove:t[0]||(t[0]=(...e)=>c.handleUploadCardMouseMove&&c.handleUploadCardMouseMove(...e)),onMouseleave:t[1]||(t[1]=(...e)=>c.handleUploadCardMouseLeave&&c.handleUploadCardMouseLeave(...e))},[(0,i.Lk)("div",gt,null,512),"default"===n.uploadMethod?((0,i.uX)(),(0,i.Wv)(h,{key:0,class:(0,a.C4)(["upload-card",{"is-uploading":d.uploading,"upload-card-busy":d.fileList.length}]),drag:"",multiple:"","http-request":c.uploadFile,onSuccess:c.handleSuccess,"on-error":c.handleError,"before-upload":c.beforeUpload,"on-progress":c.handleProgress,"file-list":d.fileList,"show-file-list":!1},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["el-icon--upload",{"upload-list-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[(0,i.bF)(u)]),_:1},8,["class"]),(0,i.Lk)("div",{class:(0,a.C4)(["el-upload__text",{"upload-list-busy":d.fileList.length}]),innerHTML:e.$t("upload.dragUploadText")},null,10,ft)]),_:1},8,["class","http-request","onSuccess","on-error","before-upload","on-progress","file-list"])):(0,i.Q3)("",!0)],32),"paste"===n.uploadMethod?((0,i.uX)(),(0,i.CE)("div",yt,[(0,i.bF)(b,{class:(0,a.C4)(["paste-card",{"is-uploading":d.uploading,"upload-card-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:d.pastedUrls,"onUpdate:modelValue":t[2]||(t[2]=e=>d.pastedUrls=e),class:"upload-card-textarea",placeholder:e.$t("upload.pasteUrlPlaceholder"),type:"textarea",rows:d.fileList.length?4:14},null,8,["modelValue","placeholder","rows"]),(0,i.Lk)("div",bt,[(0,i.bF)(g,{class:"paste-card-upload-button",type:"primary",size:c.pasteCardMethodButtonSize,onClick:c.handleUploadPasteUrls},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.pasteUploadBtn")),1)]),_:1},8,["size","onClick"]),(0,i.bF)(y,{modelValue:d.pasteUploadMethod,"onUpdate:modelValue":t[3]||(t[3]=e=>d.pasteUploadMethod=e),class:"paste-card-method-group",size:c.pasteCardMethodButtonSize},{default:(0,i.k6)(()=>[(0,i.bF)(f,{label:"save"},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.pasteSave")),1)]),_:1}),(0,i.bF)(f,{label:"external"},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.pasteExternal")),1)]),_:1})]),_:1},8,["modelValue","size"])])]),_:1},8,["class"])])):(0,i.Q3)("",!0),(0,i.bF)(b,{class:(0,a.C4)(["upload-list-card",{"upload-list-busy":d.fileList.length,"is-uploading":d.uploading}])},{default:(0,i.k6)(()=>[(0,i.Lk)("div",{class:(0,a.C4)(["upload-list-container",{"upload-list-busy":d.fileList.length}])},[(0,i.bF)(x,{onScroll:c.handleScroll,ref:"scrollContainer"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",{class:(0,a.C4)(["upload-list-dashboard",{"list-scrolled":d.listScrolled}])},[(0,i.bF)(w,{class:"upload-list-dashboard-title"},{default:(0,i.k6)(()=>[(0,i.bF)(p,null,{default:(0,i.k6)(()=>[(0,i.bF)(v)]),_:1}),(0,i.eW)((0,a.v_)(c.uploadingCount+c.waitingCount)+" ",1),(0,i.bF)(p,null,{default:(0,i.k6)(()=>[(0,i.bF)(C)]),_:1}),(0,i.eW)((0,a.v_)(c.uploadSuccessCount)+" ",1),(0,i.bF)(p,null,{default:(0,i.k6)(()=>[(0,i.bF)(k)]),_:1}),(0,i.eW)((0,a.v_)(c.uploadErrorCount),1)]),_:1}),(0,i.Lk)("div",vt,[(0,i.Lk)("div",Ct,[(0,i.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.copyAll"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.Lk)("button",{class:"modern-action-btn",onClick:t[4]||(t[4]=(...e)=>c.copyAll&&c.copyAll(...e))},[(0,i.bF)(F,{icon:"copy"})])]),_:1},8,["disabled","content"]),(0,i.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.retryFailed"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(T,null,{dropdown:(0,i.k6)(()=>[(0,i.bF)(S,{class:"modern-dropdown-menu"},{default:(0,i.k6)(()=>[(0,i.bF)($,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",kt,[(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadForm.autoRetry")),1),(0,i.bF)(U,{modelValue:d.autoReUpload,"onUpdate:modelValue":t[6]||(t[6]=e=>d.autoReUpload=e),onChange:c.handleAutoRetryChange,size:"small"},null,8,["modelValue","onChange"])])]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.Lk)("button",{class:"modern-action-btn",onClick:t[5]||(t[5]=(...e)=>c.retryError&&c.retryError(...e))},[(0,i.bF)(F,{icon:"redo"})])]),_:1})]),_:1},8,["disabled","content"]),(0,i.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.clearList"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(T,null,{dropdown:(0,i.k6)(()=>[(0,i.bF)(S,{class:"modern-dropdown-menu"},{default:(0,i.k6)(()=>[(0,i.bF)($,{onClick:c.clearFileList},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.clearAll")),1)]),_:1},8,["onClick"]),(0,i.bF)($,{onClick:c.clearSuccessList},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.clearUploaded")),1)]),_:1},8,["onClick"])]),_:1})]),default:(0,i.k6)(()=>[(0,i.Lk)("button",wt,[(0,i.bF)(F,{icon:"trash-alt"})])]),_:1})]),_:1},8,["disabled","content"])])])],2),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(d.fileList.slice().reverse(),e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.name,file:e,onCopy:c.handleCopy,onRemove:c.handleRemove,onPreviewError:t[7]||(t[7]=e=>e.url=o(96682))},null,8,["file","onCopy","onRemove"]))),128))]),_:1},8,["onScroll"])],2)]),_:1},8,["class"])])}o(16573),o(78100),o(77936),o(20116),o(18237),o(79577),o(41549),o(49797),o(49631),o(35623),o(64979),o(14603),o(47566),o(98721);var Lt=o(457),Ut=o(76334),$t=o(60782);function St(e,t,o){const s=o+e;return{finalURL:s,mdURL:`![${t}](${s})`,htmlURL:`${t}`,ubbURL:`[img]${s}[/img]`}}function Tt(e,t){const o={url:e.finalURL,md:e.mdURL,html:e.htmlURL,ubb:e.ubbURL};return o[t]||e.finalURL}function _t(e,t){e.forEach(e=>{if("external"===e.uploadChannel)return;const o=St(e.srcID,e.name,t);Object.assign(e,o)})}const xt=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Mt=(e,t)=>e>>>t|e<<32-t;function Rt(e,t){const o=new Uint32Array(64);for(let u=0;u<16;u++)o[u]=e[4*u]<<24|e[4*u+1]<<16|e[4*u+2]<<8|e[4*u+3];for(let u=16;u<64;u++){const e=Mt(o[u-15],7)^Mt(o[u-15],18)^o[u-15]>>>3,t=Mt(o[u-2],17)^Mt(o[u-2],19)^o[u-2]>>>10;o[u]=o[u-16]+e+o[u-7]+t>>>0}let[s,l,i,a,n,r,d,c]=t;for(let u=0;u<64;u++){const e=Mt(n,6)^Mt(n,11)^Mt(n,25),t=n&r^~n&d,p=c+e+t+xt[u]+o[u]>>>0,h=Mt(s,2)^Mt(s,13)^Mt(s,22),m=s&l^s&i^l&i,g=h+m>>>0;c=d,d=r,r=n,n=a+p>>>0,a=i,i=l,l=s,s=p+g>>>0}t[0]=t[0]+s>>>0,t[1]=t[1]+l>>>0,t[2]=t[2]+i>>>0,t[3]=t[3]+a>>>0,t[4]=t[4]+n>>>0,t[5]=t[5]+r>>>0,t[6]=t[6]+d>>>0,t[7]=t[7]+c>>>0}function At(){let e=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),t=new Uint8Array(64),o=0,s=0;return{update(l){s+=l.length;let i=0;if(o>0){const s=64-o,a=Math.min(s,l.length);t.set(l.subarray(0,a),o),o+=a,i=a,64===o&&(Rt(t,e),o=0)}while(i+64<=l.length)Rt(l.subarray(i,i+64),e),i+=64;i56&&(t.fill(0,o,64),Rt(t,e),o=0),t.fill(0,o,56);const i=new DataView(t.buffer);i.setUint32(56,Math.floor(l/4294967296),!1),i.setUint32(60,l>>>0,!1),Rt(t,e);let a="";for(let t=0;t<8;t++)a+=e[t].toString(16).padStart(8,"0");return a}}}async function Et(e){const t=At(),o=4194304;let s=0;while(sthis.fileListLength&&this.$nextTick(()=>{setTimeout(()=>{this.$refs.scrollContainer&&this.$refs.scrollContainer.setScrollTop(0)},100)}),this.fileListLength=this.fileList.length},deep:!0},useCustomUrl:{handler(){_t(this.fileList,this.rootUrl)},immediate:!0},customUrlPrefix:{handler(){"true"===this.useCustomUrl&&_t(this.fileList,this.rootUrl)},immediate:!0},autoReUpload(e){this.$store.commit("setStoreAutoReUpload",e)}},computed:{...(0,$t.L8)(["storeAutoReUpload"]),uploadSuccessCount(){return this.fileList.filter(e=>"done"===e.status||"success"===e.status).length},uploadErrorCount(){return this.fileList.filter(e=>"exception"===e.status).length},uploadingCount(){return this.fileList.filter(e=>"uploading"===e.status).length},waitingCount(){return this.uploadQueue.length},urlSize(){return window.innerWidth<768?"small":"default"},disableTooltip(){return window.innerWidth<768},rootUrl(){return"true"===this.useCustomUrl?this.customUrlPrefix:this.urlPrefix||`${window.location.protocol}//${window.location.host}/file/`},pasteCardMethodButtonSize(){return this.fileList.length||window.innerWidth<768?"small":"medium"}},mounted(){document.addEventListener("paste",this.handlePaste),this.autoReUpload=this.storeAutoReUpload},beforeUnmount(){document.removeEventListener("paste",this.handlePaste),this.uploadQueue=[],this.fileList=[],this.activeUploads=0},methods:{truncateFilename(e,t=20){if(!e||e.length<=t)return e;const o=e.lastIndexOf(".");let s,l;o>0?(s=e.substring(0,o),l=e.substring(o)):(s=e,l="");const i=l.length+4,a=t-i-3;return a<=0?e.substring(0,t-3)+"...":s.substring(0,a)+"..."+s.slice(-4)+l},uploadFile(e){if(!this.fileList.find(t=>t.uid===e.file.uid))return;if(this.activeUploads>=this.maxConcurrentUploads){this.uploadQueue.push(e);const t=this.fileList.find(t=>t.uid===e.file.uid);return void(t&&(t.status="waiting"))}this.activeUploads++;const t=this.fileList.find(t=>t.uid===e.file.uid);t&&(t.status="uploading");const o=this.fileList.find(t=>t.uid===e.file.uid),s=o?.uploadChannel||this.uploadChannel;if("external"===s)return void this.uploadSingleFile(e);if("huggingface"===s){const t=20971520;return void(e.file.size>=t?this.uploadToHuggingFaceDirect(e):this.uploadSingleFile(e))}if("discord"===s){const t=9437184;return void(e.file.size>t?this.uploadFileInChunks(e):this.uploadSingleFile(e))}const l=20971520;e.file.size>l?this.uploadFileInChunks(e):this.uploadSingleFile(e)},processUploadQueue(){if(0===this.uploadQueue.length||this.activeUploads>=this.maxConcurrentUploads)return;const e=this.uploadQueue.shift();e&&this.fileList.find(t=>t.uid===e.file.uid)?this.uploadFile(e):this.processUploadQueue()},onUploadComplete(){this.activeUploads=Math.max(0,this.activeUploads-1),this.processUploadQueue(),0===this.activeUploads&&0===this.uploadQueue.length&&(this.uploading=!1)},async uploadSingleFile(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=t.serverCompress,s=t.uploadChannel||this.uploadChannel,l=this.autoRetry&&"external"!==s,i="external"===s?"default":this.uploadNameType,a=new AbortController;this.abortControllers.set(e.file.uid,a);const n=new FormData;if(n.append("file",e.file),"external"===s&&n.append("url",e.file.url),"huggingface"===s)try{console.log("Computing SHA256 for HuggingFace upload...");const t=await Et(e.file);n.append("sha256",t),console.log("SHA256 computed:",t)}catch(r){console.error("Failed to compute SHA256:",r)}(0,Lt.A)({url:"/upload?serverCompress="+o+"&uploadChannel="+s+(this.channelName?"&channelName="+encodeURIComponent(this.channelName):"")+"&uploadNameType="+i+"&autoRetry="+l+"&uploadFolder="+encodeURIComponent(this.uploadFolder),method:"post",data:n,withAuthCode:!0,signal:a.signal,onUploadProgress:t=>{const o=Math.round(t.loaded/t.total*100);e.onProgress({percent:o,file:e.file})}}).then(t=>{e.onSuccess(t,e.file)}).catch(t=>{"CanceledError"!==t.name&&"ERR_CANCELED"!==t.code?t.response&&401!==t.response.status?(this.exceptionList.push(e),e.onError(t,e.file)):t.response||(this.exceptionList.push(e),e.onError(t,e.file)):console.log("上传已取消:",e.file.name)}).finally(()=>{this.abortControllers.delete(e.file.uid),this.onUploadComplete()})},async uploadFileInChunks(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=t.uploadChannel||this.uploadChannel,s=new AbortController;this.abortControllers.set(e.file.uid,s);const l="discord"===o?9437184:16777216,i=e.file.size,a=Math.ceil(i/l),n=t.serverCompress,r=this.autoRetry&&"external"!==o,d="external"===o?"default":this.uploadNameType;let c=null;if("huggingface"===o)try{console.log("Computing SHA256 for HuggingFace chunked upload..."),c=await Et(e.file),console.log("SHA256 computed:",c)}catch(u){console.error("Failed to compute SHA256:",u)}try{const t=new FormData;t.append("originalFileName",e.file.name),t.append("originalFileType",e.file.type),t.append("totalChunks",a.toString());const p=await(0,Lt.A)({url:"/upload?serverCompress="+n+"&uploadChannel="+o+(this.channelName?"&channelName="+encodeURIComponent(this.channelName):"")+"&uploadNameType="+d+"&autoRetry="+r+"&uploadFolder="+encodeURIComponent(this.uploadFolder)+"&initChunked=true",method:"post",data:t,withAuthCode:!0});if(!p.data.success)throw new Error(this.$t("uploadForm.chunkInitFailed")+": "+p.data.message);const h=p.data.uploadId;console.log("分块上传初始化成功,uploadId:",h);const m=this.fileList.find(t=>t.uid===e.file.uid);m&&(m.totalChunks=a,m.uploadId=h);const g=3,f=new Array(a).fill(0);let y=0,b=!1,v="",C=!1;const k=async t=>{if(b||C)return;const c=t*l,p=Math.min(c+l,i),m=e.file.slice(c,p),g=new FormData;g.append("file",m,`${e.file.name}.part${t.toString().padStart(3,"0")}`),g.append("chunkIndex",t.toString()),g.append("totalChunks",a.toString()),g.append("uploadId",h),g.append("originalFileName",e.file.name),g.append("originalFileType",e.file.type);let y=0;const k=3;while(y{if(b||C)return;const s=Math.round(o.loaded/o.total*100);f[t]=s;const l=Math.round(f.reduce((e,t)=>e+t,0)/a);e.onProgress({percent:l,file:e.file})}})}catch(u){if("CanceledError"===u.name||"ERR_CANCELED"===u.code)return C=!0,void console.log("分块上传已取消:",e.file.name);if(y++,console.warn(`分块 ${t+1}/${a} 上传失败 (重试 ${y}/${k}):`,u),y>=k)throw b=!0,v=`分块 ${t+1}/${a} 上传失败: ${u.message}`,new Error(v);await new Promise(e=>setTimeout(e,2e3*y))}}},w=[];for(let e=0;e{while(yt.uid===e.file.uid);t&&t.uploadId&&this.cleanupUploadResources(t.uploadId,t.totalChunks).then(()=>{console.log(`已清理分块上传失败的资源: ${t.uploadId}`)}).catch(e=>{console.warn("清理分块上传失败资源时出错:",e)}),u.response&&401!==u.response.status?(this.exceptionList.push(e),e.onError(u,e.file)):u.response||(this.exceptionList.push(e),e.onError(u,e.file))}finally{this.abortControllers.delete(e.file.uid),this.onUploadComplete()}},handleRemove(e){this.abortControllers.has(e.uid)&&(this.abortControllers.get(e.uid).abort(),this.abortControllers.delete(e.uid)),this.uploadQueue=this.uploadQueue.filter(t=>t.file.uid!==e.uid),this.fileList=this.fileList.filter(t=>t.uid!==e.uid),this.$message({type:"info",message:this.$t("uploadForm.deleted",{name:this.truncateFilename(e.name)})})},async cleanupUploadResources(e,t=0){try{await(0,Lt.A)({url:`/upload?cleanup=true&uploadId=${e}&totalChunks=${t}`,method:"get",withAuthCode:!0,timeout:5e3}),console.log(`清理上传资源成功: ${e}`)}catch(o){console.warn("清理上传资源失败:",o)}},handleSuccess(e,t){const o=this.fileList.find(e=>e.uid===t.uid);if(o)try{const s=o.uploadChannel||this.uploadChannel;if("external"!==s){const s=e.data[0].src.replace("/file/","");o.url=`${window.location.protocol}//${window.location.host}/file/`+s;const l=St(s,t.name,this.rootUrl);Object.assign(o,l),o.srcID=s}o.progreess=100,o.status="success",this.saveToHistory(o),this.$message({type:"success",message:this.$t("uploadForm.uploadSuccess",{name:this.truncateFilename(t.name)})}),setTimeout(()=>{const e=this.fileList.find(e=>e.uid===t.uid);e&&(e.status="done")},1e3)}catch(s){this.$message.error(this.$t("uploadForm.uploadFailed",{name:this.truncateFilename(t.name)})),o.status="exception"}},saveToHistory(e){try{const t=JSON.parse(localStorage.getItem("uploadHistory")||"[]"),o={name:e.name,url:e.finalURL,time:Date.now(),type:e.name.split(".").pop().toLowerCase()};t.push(o),localStorage.setItem("uploadHistory",JSON.stringify(t))}catch(t){console.error("Failed to save history",t)}},handleError(e,t){const o=this.fileList.find(e=>e.uid===t.uid);o&&(this.$message.error(this.$t("uploadForm.uploadFailed",{name:this.truncateFilename(t.name)})),o.status="exception",this.autoReUpload&&this.scheduleAutoRetry())},handleCopy(e){const t=this.fileList.find(t=>t.uid===e.uid).status;"done"===t||"success"===t?(navigator.clipboard.writeText(Tt(e,this.selectedUrlForm)),this.$message({type:"success",message:this.$t("uploadForm.copySuccess")})):this.$message({type:"warning",message:this.$t("uploadForm.fileNotUploaded")})},beforeUpload(e){return new Promise(async(t,o)=>{let s=e;const l=this.convertToWebp&&e.type.includes("image")&&!e.type.includes("webp")&&!e.type.includes("gif")&&!e.type.includes("svg");if(l)try{const t=await this.convertImageToWebp(e);t&&(s=t,console.log(`WebP转换成功: ${e.name} -> ${t.name}, 大小: ${(e.size/1024).toFixed(1)}KB -> ${(t.size/1024).toFixed(1)}KB`))}catch(r){console.warn("WebP转换失败,使用原文件:",r)}const i=s.type.includes("image")&&this.customerCompress&&s.size/1024/1024>this.compressBar,a=s.size/1024/1024<=1024||"telegram"!==this.uploadChannel,n=(e,o)=>{const s=URL.createObjectURL(e);this.fileList.push({uid:e.uid,name:e.name,url:s,finalURL:"",mdURL:"",htmlURL:"",ubbURL:"",srcID:"",status:"uploading",progreess:0,serverCompress:o,retryCount:0}),t(e)};if(i)Ut.compressAccurately(s,1024*this.compressQuality).then(t=>{t.size/1024/1024>1024&&"telegram"===this.uploadChannel&&(this.$message.error(this.$t("uploadForm.compressedFileTooLarge",{name:s.name})),o(this.$t("uploadForm.fileSizeTooLarge"))),this.uploading=!0;const l=new File([t],s.name,{type:t.type});l.uid=e.uid;const i=this.uploadCount++,a=this.serverCompress&&l.size/1024/1024<10&&"telegram"===this.uploadChannel;0===i?n(l,a):setTimeout(()=>{n(l,a),this.uploadCount--},300*i)}).catch(e=>{this.$message.error(this.$t("uploadForm.compressFailedCannotUpload",{name:s.name})),o(e)});else if(a){this.uploading=!0;const e=this.uploadCount++,t="telegram"===this.uploadChannel&&this.serverCompress&&(!s.type.includes("image")||s.size/1024/1024<10);0===e?n(s,t):setTimeout(()=>{n(s,t),this.uploadCount--},300*e)}else this.$message.error(this.$t("uploadForm.fileTooLarge",{name:s.name})),o(this.$t("uploadForm.fileSizeTooLarge"))})},handleProgress(e){const t=this.fileList.find(t=>t.uid===e.file.uid);t&&(t.progreess=e.percent)},copyAll(){const e=this.fileList.filter(e=>"done"===e.status||"success"===e.status).map(e=>Tt(e,this.selectedUrlForm)).join("\n");navigator.clipboard.writeText(e),this.$message({type:"success",message:this.$t("uploadForm.copyAllSuccess")})},clearFileList(){this.fileList.length>0?(this.abortControllers.forEach((e,t)=>{e.abort()}),this.abortControllers.clear(),this.uploadQueue=[],this.fileList=[],this.$message({type:"success",message:this.$t("uploadForm.fileListCleared")})):this.$message({type:"info",message:this.$t("uploadForm.fileListEmpty")})},clearSuccessList(){this.uploadSuccessCount>0?(this.fileList=this.fileList.filter(e=>"done"!==e.status&&"success"!==e.status),this.$message({type:"success",message:this.$t("uploadForm.successFilesCleared")})):this.$message({type:"info",message:this.$t("uploadForm.successFilesEmpty")})},handlePaste(e){if("INPUT"===e.target.tagName||"TEXTAREA"===e.target.tagName)return;const t=e.clipboardData.items;t.length>0&&this.uploadFromUrl(t)},handleUploadPasteUrls(){const e=this.pastedUrls.split("\n"),t=e.map(e=>e.trim()).filter(e=>""!==e).filter(e=>/^(https?:\/\/[^\s$.?#].[^\s]*)$/.test(e));if("save"===this.pasteUploadMethod)this.uploadFromUrl(t.map(e=>({kind:"string",getAsString:t=>{t(e)}})));else if("external"===this.pasteUploadMethod)for(let o=0;o`,a=`[img]${e}[/img]`,n=new File([],e.split("/").pop(),{type:"text/plain"});n.uid=Date.now()+o,n.url=e,this.fileList.push({uid:n.uid,name:n.name,url:e,finalURL:e,mdURL:l,htmlURL:i,ubbURL:a,srcID:e,status:"uploading",progreess:0,serverCompress:!1,uploadChannel:"external",retryCount:0}),this.uploadFile({file:n,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}},uploadFromUrl(e){for(let t=0;t{e instanceof File&&this.uploadFile({file:e,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}).catch(e=>{console.log(e)})}else"string"===e[t].kind&&e[t].getAsString(e=>{const o=/^(https?:\/\/[^\s$.?#].[^\s]*)$/;let s="";o.test(e)&&Lt.A.post("/api/fetchRes",{url:e},{responseType:"blob",withAuthCode:!0}).then(o=>{o.headers["content-type"];if(200!=o.status)throw new Error("URL地址请求失败");{const i=o.headers["content-disposition"];if(i){const e=/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/,t=/filename\*\s*=\s*UTF-8''([^;\n]*)/;let o=e.exec(i);if(null!=o&&o[1]){s=o[1].replace(/['"]/g,"");try{s=decodeURIComponent(s)}catch(l){s=""}}""===s&&(o=t.exec(i),null!=o&&o[1]&&(s=decodeURIComponent(o[1])))}if(""===s){const t=new URL(e);s=t.pathname.split("/").pop()}if(""===s){const o=new URL(e);let l=o.pathname.split(".").pop();(!l||""===l||l.length>10)&&(l="bin"),s="PastedFile"+Date.now()+t+"."+l}const a=o.data,n=new File([a],s,{type:a.type});n.uid=Date.now()+t;const r=this.beforeUpload(n);r instanceof Promise&&r.then(e=>{e instanceof File&&this.uploadFile({file:e,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}).catch(e=>{console.log(e)})}}).catch(e=>{this.$message({type:"warning",message:this.$t("uploadForm.urlRequestFailed")})})})},handleScroll(e){this.listScrolled=e.scrollTop>0&&this.fileList.length>0},retryError(){this.exceptionList.length>0?(this.retryFailedFiles(this.exceptionList),this.exceptionList=[]):this.$message({type:"info",message:this.$t("uploadForm.noFailedFiles")})},handleAutoRetryChange(e){this.$message({type:e?"success":"info",message:e?this.$t("uploadForm.autoRetryOn"):this.$t("uploadForm.autoRetryOff")}),e&&this.exceptionList.length>0&&this.scheduleAutoRetry()},retryFailedFiles(e){e.forEach(e=>{const t=e.retryCount||0;tthis.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})):this.$message({type:"warning",message:this.$t("uploadForm.maxRetryReached",{name:e.name,max:this.maxRetryCount})})})},scheduleAutoRetry(){this.retryTimer&&clearTimeout(this.retryTimer),this.retryTimer=setTimeout(()=>{if(this.autoReUpload&&this.exceptionList.length>0){const e=[...this.exceptionList];this.exceptionList=[],this.retryFailedFiles(e)}},this.retryDelay)},async uploadToHuggingFaceDirect(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=new AbortController;this.abortControllers.set(e.file.uid,o);try{console.log("=== HuggingFace Direct Upload ==="),console.log("File:",e.file.name,"Size:",e.file.size),e.onProgress({percent:5,file:e.file}),console.log("Computing SHA256...");const t=await Et(e.file);if(console.log("SHA256:",t),o.signal.aborted)return void console.log("HuggingFace 上传已取消:",e.file.name);const s=new Uint8Array(await e.file.slice(0,512).arrayBuffer()),l=btoa(String.fromCharCode(...s));e.onProgress({percent:10,file:e.file}),console.log("Getting LFS upload URL...");const i=await(0,Lt.A)({url:"/upload/huggingface/getUploadUrl",method:"post",data:{fileSize:e.file.size,fileName:e.file.name,fileType:e.file.type,sha256:t,fileSample:l,channelName:this.channelName,uploadNameType:this.uploadNameType,uploadFolder:this.uploadFolder},withAuthCode:!0,signal:o.signal});if(!i.data.success)throw new Error(i.data.error||"Failed to get upload URL");const a=i.data;if(console.log("Upload info:",a),a.alreadyExists)console.log("File already exists in LFS, skipping upload"),e.onProgress({percent:90,file:e.file});else if(a.needsLfs&&a.uploadAction){const{href:t,header:s}=a.uploadAction;if(s?.chunk_size)await this.uploadToHuggingFaceMultipart(e,a,o);else{console.log("Uploading to S3 (basic)...");const l=await fetch(t,{method:"PUT",headers:s||{},body:e.file,signal:o.signal});if(!l.ok){const e=await l.text();throw new Error(`S3 upload failed: ${l.status} - ${e}`)}console.log("S3 upload complete")}}if(o.signal.aborted)return void console.log("HuggingFace 上传已取消:",e.file.name);e.onProgress({percent:95,file:e.file}),console.log("Committing file...");const n=await(0,Lt.A)({url:"/upload/huggingface/commitUpload",method:"post",data:{fullId:a.fullId,filePath:a.filePath,sha256:t,fileSize:e.file.size,fileName:e.file.name,fileType:e.file.type,channelName:a.channelName},withAuthCode:!0,signal:o.signal});if(!n.data.success)throw new Error(n.data.error||"Failed to commit file");console.log("Upload complete:",n.data);const r={data:[{src:n.data.src}]};e.onSuccess(r,e.file)}catch(s){if("CanceledError"===s.name||"ERR_CANCELED"===s.code||"AbortError"===s.name)return void console.log("HuggingFace 上传已取消:",e.file.name);console.error("HuggingFace direct upload error:",s),this.exceptionList.push(e),e.onError(s,e.file)}finally{this.abortControllers.delete(e.file.uid),this.onUploadComplete()}},async uploadToHuggingFaceMultipart(e,t,o){const{uploadAction:s}=t,{href:l,header:i}=s,a=parseInt(i.chunk_size),n=Object.keys(i).filter(e=>/^[0-9]+$/.test(e));console.log(`Multipart upload: ${n.length} parts, chunk size: ${a}`);const r=[],d=n.length;for(const u of n){if(o&&o.signal.aborted)throw console.log("HuggingFace 分片上传已取消"),new DOMException("Upload cancelled","AbortError");const t=parseInt(u)-1,s=t*a,l=Math.min(s+a,e.file.size),n=e.file.slice(s,l);console.log(`Uploading part ${u}/${d}`);const c=await fetch(i[u],{method:"PUT",body:n,signal:o?o.signal:void 0});if(!c.ok)throw new Error(`Failed to upload part ${u}: ${c.status}`);const p=c.headers.get("ETag");if(!p)throw new Error(`No ETag for part ${u}`);r.push({partNumber:parseInt(u),etag:p});const h=10+Math.round(parseInt(u)/d*80);e.onProgress({percent:h,file:e.file})}if(o&&o.signal.aborted)throw console.log("HuggingFace 分片上传已取消"),new DOMException("Upload cancelled","AbortError");console.log("Completing multipart upload...");const c=await fetch(l,{method:"POST",headers:{Accept:"application/vnd.git-lfs+json","Content-Type":"application/vnd.git-lfs+json"},body:JSON.stringify({oid:t.oid,parts:r}),signal:o?o.signal:void 0});if(!c.ok){const e=await c.text();throw new Error(`Multipart complete failed: ${c.status} - ${e}`)}console.log("Multipart upload complete")},async convertImageToWebp(e){return new Promise((t,o)=>{if(e.type.includes("gif")||e.type.includes("svg")||e.type.includes("webp"))return void t(null);const s=new Image,l=document.createElement("canvas"),i=l.getContext("2d");s.onload=()=>{l.width=s.width,l.height=s.height,i.drawImage(s,0,0),l.toBlob(l=>{if(l){const o=e.name,s=o.lastIndexOf("."),i=s>0?o.substring(0,s)+".webp":o+".webp",a=new File([l],i,{type:"image/webp"});a.uid=e.uid,t(a)}else o(new Error("WebP 转换失败"));URL.revokeObjectURL(s.src)},"image/webp",.92)},s.onerror=()=>{URL.revokeObjectURL(s.src),o(new Error(this.$t("uploadForm.imageLoadFailed")))},s.src=URL.createObjectURL(e)})},handleUploadCardMouseMove(e){const t=this.$refs.uploadCardGlow;if(!t)return;const o=e.currentTarget.getBoundingClientRect(),s=e.clientX-o.left,l=e.clientY-o.top;t.style.opacity="1",t.style.left=s+"px",t.style.top=l+"px"},handleUploadCardMouseLeave(){const e=this.$refs.uploadCardGlow;e&&(e.style.opacity="0")}},beforeDestroy(){this.retryTimer&&clearTimeout(this.retryTimer)}};const It=(0,z.A)(Dt,[["render",Ft],["__scopeId","data-v-37f80c81"]]);var Nt=It,Pt=o(732),Vt=o(33892),Wt=o(45130);const zt={class:"directory-suggestion-input",ref:"wrapperRef"},Bt={class:"suggestion-dropdown"},Ht={class:"suggestion-list"},Xt=["title","onMousedown"];function Ot(e,t,o,s,l,n){const r=G.WK;return(0,i.uX)(),(0,i.CE)("div",zt,[(0,i.bF)(r,{ref:"inputRef",modelValue:n.inputValue,"onUpdate:modelValue":t[0]||(t[0]=e=>n.inputValue=e),placeholder:o.placeholder,onFocus:n.handleFocus,onBlur:n.handleBlur,onInput:n.handleInput},null,8,["modelValue","placeholder","onFocus","onBlur","onInput"]),(0,i.bo)((0,i.Lk)("div",Bt,[(0,i.Lk)("ul",Ht,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.suggestions,(e,t)=>((0,i.uX)(),(0,i.CE)("li",{key:t,class:"suggestion-item",title:e.value,onMousedown:(0,Wt.D$)(t=>n.selectItem(e),["prevent"])},(0,a.v_)(e.value),41,Xt))),128))])],512),[[Wt.aG,l.dropdownVisible&&l.suggestions.length>0]])],512)}var Qt={name:"DirectorySuggestionInput",props:{modelValue:{type:String,default:""},placeholder:{type:String,default:""}},emits:["update:modelValue","focus","blur","select"],data(){return{directoryTreeRoot:null,directoryTreeLoaded:!1,directoryTreeLoading:!1,directoryChildrenMap:{},focusTime:null,dropdownVisible:!1,isFocused:!1,suggestions:[]}},computed:{inputValue:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}}},watch:{modelValue(){this.isFocused&&this.refreshSuggestions()}},methods:{handleFocus(){this.isFocused=!0,this.focusTime=Date.now(),this.ensureDirectoryTreeLoaded(),this.$emit("focus"),setTimeout(()=>{this.isFocused&&(this.refreshSuggestions(),this.dropdownVisible=!0)},500)},handleBlur(){this.isFocused=!1,this.dropdownVisible=!1,this.$emit("blur")},handleInput(e){this.$nextTick(()=>{this.refreshSuggestions(),this.isFocused&&(this.dropdownVisible=!0)})},selectItem(e){const t=e.value;this.inputValue=t,this.$emit("select",t);const o=this.normalizeDirectoryPath(t),s=this.directoryChildrenMap[o];s&&s.length>0?this.$nextTick(()=>{this.refreshSuggestions(),this.dropdownVisible=!0,this.$refs.inputRef?.focus()}):this.dropdownVisible=!1},refreshSuggestions(){this.suggestions=this.getDirectorySuggestions(this.modelValue||"")},normalizeDirectoryPath(e){if(!e)return"/";let t=e;return t.startsWith("/")||(t="/"+t),"/"===t||t.endsWith("/")||(t+="/"),t},buildDirectoryChildrenMap(e){const t={},o=e=>{const s=this.normalizeDirectoryPath(e.path),l=Array.isArray(e.children)?e.children:[];t[s]=l.map(e=>({name:e.name,path:this.normalizeDirectoryPath(e.path)})),l.forEach(o)};o(e),this.directoryChildrenMap=t},async ensureDirectoryTreeLoaded(){if(!this.directoryTreeLoaded&&!this.directoryTreeLoading){this.directoryTreeLoading=!0;try{const e=await Lt.A.get("/api/directoryTree",{withAuthCode:!0}),t=e?.data?.tree;t&&(this.directoryTreeRoot=t,this.buildDirectoryChildrenMap(t),this.directoryTreeLoaded=!0)}catch(e){console.error("Failed to load directory tree for autocomplete:",e)}finally{this.directoryTreeLoading=!1}}},parseDirectoryQuery(e){const t=e&&e.startsWith("/")?e:`/${e||""}`,o=t.slice(1),s=o.split("/"),l=s[s.length-1]||"",i=s.slice(0,-1).filter(Boolean),a=i.length>0?`/${i.join("/")}/`:"/";return{segmentInput:l,parentPath:a}},getDirectorySuggestions(e){const{segmentInput:t,parentPath:o}=this.parseDirectoryQuery(e),s=this.directoryChildrenMap[o]||[];if(!t)return s.slice(0,10).map(e=>({value:e.path}));const l=t.toLowerCase();return s.filter(e=>e.name.toLowerCase().startsWith(l)).slice(0,10).map(e=>({value:e.path}))}}};const jt=(0,z.A)(Qt,[["render",Ot],["__scopeId","data-v-0ff63416"]]);var qt=jt,Gt=o(6834);const Kt={class:"container"},Jt={class:"upload-home"},Yt={class:"toolbar-manage"},Zt={class:"toolbar"},eo={class:"header"},to={class:"title"},oo={class:"main-title",href:"https://github.com/MarSeventh/CloudFlare-ImgBed",target:"_blank"},so={class:"dialog-section"},lo={class:"section-header"},io={class:"section-title"},ao={class:"section-content"},no={class:"dialog-section"},ro={class:"section-header"},co={class:"section-title"},uo={class:"section-content"},po={class:"setting-item"},ho={class:"setting-label"},mo={key:0,class:"setting-item"},go={class:"setting-label"},fo={class:"dialog-action"},yo=["innerHTML"],bo={class:"dialog-footer"};function vo(e,t,o,n,r,d){const c=Gt.A,u=(0,i.g2)("font-awesome-icon"),p=l.S2,h=ut.c6,m=ut.Iy,g=ut.dW,f=qt,y=G.WK,b=Vt.A,v=s.R7,C=Pt.A,k=Nt,w=J.ll,F=J.MQ,L=q.qi,U=O.kZ,$=We,S=X.A,T=H;return(0,i.uX)(),(0,i.CE)("div",Kt,[(0,i.Lk)("div",Jt,[(0,i.bF)(c,{class:"toggle-dark-button desktop-only"}),(0,i.bF)(g,{class:"more-dropdown desktop-only",trigger:"click",onCommand:d.handleDesktopMenuCommand},{dropdown:(0,i.k6)(()=>[(0,i.bF)(m,null,{default:(0,i.k6)(()=>[(0,i.bF)(h,{command:"showHistory"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"history",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.history")),1)]),_:1}),(0,i.bF)(h,{command:"showAnnouncement",disabled:!d.announcementAvailable},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"bullhorn",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.announcement")),1)]),_:1},8,["disabled"]),(0,i.bF)(h,{command:"toggleLanguage"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"globe",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)("zh-CN"===e.$i18n.locale?"English":"简体中文"),1)]),_:1}),(0,i.bF)(h,{command:"viewDocs"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"book",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.viewDocs")),1)]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"more-button"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"ellipsis-v",size:"lg"})]),_:1})]),_:1},8,["onCommand"]),(0,i.Lk)("div",{class:(0,a.C4)(["upload-folder-container",{"no-announcement":!d.announcementAvailable}])},[(0,i.Lk)("div",{class:(0,a.C4)(["upload-folder",{active:r.isFolderInputActive}])},[d.showDirectorySuggestions?((0,i.uX)(),(0,i.Wv)(f,{key:0,modelValue:r.uploadFolder,"onUpdate:modelValue":t[0]||(t[0]=e=>r.uploadFolder=e),class:"inner-folder-input",placeholder:e.$t("upload.folderPlaceholder"),onFocus:d.handleFolderInputFocus,onBlur:d.handleFolderInputBlur,onSelect:d.handleDirectorySelect},null,8,["modelValue","placeholder","onFocus","onBlur","onSelect"])):((0,i.uX)(),(0,i.Wv)(y,{key:1,class:"inner-folder-input",modelValue:r.uploadFolder,"onUpdate:modelValue":t[1]||(t[1]=e=>r.uploadFolder=e),placeholder:e.$t("upload.folderPlaceholder"),onFocus:d.handleFolderInputFocus,onBlur:d.handleFolderInputBlur},null,8,["modelValue","placeholder","onFocus","onBlur"]))],2),d.showDirectorySuggestions?((0,i.uX)(),(0,i.Wv)(b,{key:0,"current-directory":r.uploadFolder,source:"upload",onSelect:d.handleDirectorySelect},{trigger:(0,i.k6)(()=>[(0,i.bF)(p,{class:"directory-tree-trigger"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"folder-tree"})]),_:1})]),_:1},8,["current-directory","onSelect"])):(0,i.Q3)("",!0)],2),(0,i.bF)(v,{content:e.$t("upload.switchUploadMethod"),placement:"bottom",disabled:d.disableTooltip},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"upload-method-button desktop-only",onClick:d.handleChangeUploadMethod},{default:(0,i.k6)(()=>["default"===r.uploadMethod?((0,i.uX)(),(0,i.Wv)(u,{key:0,icon:"folder-open",class:"upload-method-icon",size:"lg"})):"paste"===r.uploadMethod?((0,i.uX)(),(0,i.Wv)(u,{key:1,icon:"paste",class:"upload-method-icon",size:"lg"})):(0,i.Q3)("",!0)]),_:1},8,["onClick"])]),_:1},8,["content","disabled"]),(0,i.bF)(g,{class:"mobile-more-dropdown mobile-only",trigger:"click",onCommand:d.handleMobileMenuCommand},{dropdown:(0,i.k6)(()=>[(0,i.bF)(m,null,{default:(0,i.k6)(()=>[(0,i.bF)(h,{command:"toggleTheme"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:d.getThemeIcon(),style:{width:"16px","margin-right":"8px","text-align":"center"}},null,8,["icon"]),(0,i.eW)(" "+(0,a.v_)(d.getThemeText()),1)]),_:1}),(0,i.bF)(h,{command:"toggleUploadMethod"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"default"===r.uploadMethod?"paste":"folder-open",style:{width:"16px","margin-right":"8px","text-align":"center"}},null,8,["icon"]),(0,i.eW)(" "+(0,a.v_)("default"===r.uploadMethod?e.$t("upload.pasteUpload"):e.$t("upload.fileUpload")),1)]),_:1}),(0,i.bF)(h,{command:"showHistory"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"history",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.history")),1)]),_:1}),(0,i.bF)(h,{command:"showAnnouncement",disabled:!d.announcementAvailable},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"bullhorn",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.announcement")),1)]),_:1},8,["disabled"]),(0,i.bF)(h,{command:"toggleLanguage"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"globe",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)("zh-CN"===e.$i18n.locale?"English":"简体中文"),1)]),_:1}),(0,i.bF)(h,{command:"viewDocs"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"book",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.viewDocs")),1)]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"mobile-more-button"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"ellipsis-v",size:"lg"})]),_:1})]),_:1},8,["onCommand"]),(0,i.Lk)("div",Yt,[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-manage-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.handleOpenToolbar,circle:""},{default:(0,i.k6)(()=>[r.isToolBarOpen?((0,i.uX)(),(0,i.Wv)(u,{key:1,icon:"times",class:"manage-icon",size:"lg"})):((0,i.uX)(),(0,i.Wv)(u,{key:0,icon:"bars",class:"manage-icon",size:"lg"}))]),_:1},8,["class","onClick"])]),(0,i.Lk)("div",Zt,[(0,i.bF)(v,{disabled:d.disableTooltip,content:e.$t("upload.settings"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-button compress-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.openCompressDialog,circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"cloud-upload",class:"compress-icon",size:"lg"})]),_:1},8,["class","onClick"])]),_:1},8,["disabled","content"]),(0,i.bF)(v,{disabled:d.disableTooltip,content:e.$t("upload.linkFormat"),placement:"left"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-button link-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.openUrlDialog,circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"link",class:"link-icon",size:"lg"})]),_:1},8,["class","onClick"])]),_:1},8,["disabled","content"]),(0,i.bF)(v,{disabled:d.disableTooltip,content:e.$t("upload.manage"),placement:"left"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-button config-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.handleManage,circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"cog",class:"config-icon",size:"lg"})]),_:1},8,["class","onClick"])]),_:1},8,["disabled","content"]),(0,i.bF)(v,{disabled:d.disableTooltip,content:e.$t("upload.logout"),placement:"left"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-button sign-out-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.handleLogout,circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"sign-out-alt",class:"sign-out-icon",size:"lg"})]),_:1},8,["class","onClick"])]),_:1},8,["disabled","content"])]),(0,i.bF)(C,{useConfigLink:!0}),(0,i.Lk)("div",eo,[(0,i.Lk)("h1",to,[(0,i.Lk)("a",oo,(0,a.v_)(d.ownerName),1),t[21]||(t[21]=(0,i.eW)(" ImgHub",-1))])]),(0,i.bF)(k,{selectedUrlForm:r.selectedUrlForm,customerCompress:r.customerCompress,compressQuality:r.compressQuality,compressBar:r.compressBar,serverCompress:r.serverCompress,uploadChannel:r.uploadChannel,channelName:r.channelName,uploadNameType:r.uploadNameType,useCustomUrl:r.useCustomUrl,customUrlPrefix:r.customUrlPrefix,autoRetry:r.autoRetry,urlPrefix:d.urlPrefix,uploadMethod:r.uploadMethod,uploadFolder:r.uploadFolder,convertToWebp:r.convertToWebp,class:"upload"},null,8,["selectedUrlForm","customerCompress","compressQuality","compressBar","serverCompress","uploadChannel","channelName","uploadNameType","useCustomUrl","customUrlPrefix","autoRetry","urlPrefix","uploadMethod","uploadFolder","convertToWebp"]),(0,i.bF)(U,{title:e.$t("settings.linkFormatTitle"),modelValue:r.showUrlDialog,"onUpdate:modelValue":t[6]||(t[6]=e=>r.showUrlDialog=e),width:d.dialogWidth,"show-close":!1,class:"settings-dialog"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",so,[(0,i.Lk)("div",lo,[(0,i.Lk)("span",io,(0,a.v_)(e.$t("settings.defaultCopyLink")),1)]),(0,i.Lk)("div",ao,[(0,i.bF)(F,{modelValue:r.selectedUrlForm,"onUpdate:modelValue":t[2]||(t[2]=e=>r.selectedUrlForm=e),onChange:d.changeUrlForm,class:"radio-card-group grid-2x2"},{default:(0,i.k6)(()=>[(0,i.bF)(w,{value:"url",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"link",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("settings.rawLink")),1)]),_:1}),(0,i.bF)(w,{value:"md",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"code",class:"radio-icon"}),t[22]||(t[22]=(0,i.Lk)("span",null,"MarkDown",-1))]),_:1}),(0,i.bF)(w,{value:"html",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"code-branch",class:"radio-icon"}),t[23]||(t[23]=(0,i.Lk)("span",null,"HTML",-1))]),_:1}),(0,i.bF)(w,{value:"ubb",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"quote-right",class:"radio-icon"}),t[24]||(t[24]=(0,i.Lk)("span",null,"BBCode",-1))]),_:1})]),_:1},8,["modelValue","onChange"])])]),(0,i.Lk)("div",no,[(0,i.Lk)("div",ro,[(0,i.Lk)("span",co,(0,a.v_)(e.$t("settings.customLink")),1),(0,i.bF)(v,{content:e.$t("settings.customLinkTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",uo,[(0,i.Lk)("div",po,[(0,i.Lk)("span",ho,(0,a.v_)(e.$t("settings.enableCustom")),1),(0,i.bF)(L,{modelValue:r.useCustomUrl,"onUpdate:modelValue":t[3]||(t[3]=e=>r.useCustomUrl=e),"active-value":"true","inactive-value":"false"},null,8,["modelValue"])]),"true"===r.useCustomUrl?((0,i.uX)(),(0,i.CE)("div",mo,[(0,i.Lk)("span",go,(0,a.v_)(e.$t("settings.customPrefix")),1),(0,i.bF)(y,{modelValue:r.customUrlPrefix,"onUpdate:modelValue":t[4]||(t[4]=e=>r.customUrlPrefix=e),placeholder:e.$t("settings.customPrefixPlaceholder"),class:"setting-input"},null,8,["modelValue","placeholder"])])):(0,i.Q3)("",!0)])]),(0,i.Lk)("div",fo,[(0,i.bF)(p,{type:"primary",onClick:t[5]||(t[5]=e=>r.showUrlDialog=!1),class:"confirm-btn"},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("settings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"]),(0,i.bF)($,{modelValue:r.showCompressDialog,"onUpdate:modelValue":t[7]||(t[7]=e=>r.showCompressDialog=e),uploadChannel:r.uploadChannel,"onUpdate:uploadChannel":t[8]||(t[8]=e=>r.uploadChannel=e),channelName:r.channelName,"onUpdate:channelName":t[9]||(t[9]=e=>r.channelName=e),currentChannelList:d.currentChannelList,uploadFolder:r.uploadFolder,"onUpdate:uploadFolder":t[10]||(t[10]=e=>r.uploadFolder=e),autoRetry:r.autoRetry,"onUpdate:autoRetry":t[11]||(t[11]=e=>r.autoRetry=e),uploadNameType:r.uploadNameType,"onUpdate:uploadNameType":t[12]||(t[12]=e=>r.uploadNameType=e),convertToWebp:r.convertToWebp,"onUpdate:convertToWebp":t[13]||(t[13]=e=>r.convertToWebp=e),customerCompress:r.customerCompress,"onUpdate:customerCompress":t[14]||(t[14]=e=>r.customerCompress=e),compressBar:r.compressBar,"onUpdate:compressBar":t[15]||(t[15]=e=>r.compressBar=e),compressQuality:r.compressQuality,"onUpdate:compressQuality":t[16]||(t[16]=e=>r.compressQuality=e),serverCompress:r.serverCompress,"onUpdate:serverCompress":t[17]||(t[17]=e=>r.serverCompress=e)},null,8,["modelValue","uploadChannel","channelName","currentChannelList","uploadFolder","autoRetry","uploadNameType","convertToWebp","customerCompress","compressBar","compressQuality","serverCompress"])]),(0,i.bF)(S,{class:"footer"}),(0,i.bF)(U,{title:e.$t("upload.announcementTitle"),modelValue:r.showAnnouncementDialog,"onUpdate:modelValue":t[19]||(t[19]=e=>r.showAnnouncementDialog=e),width:d.dialogWidth,"show-close":!1,"close-on-click-modal":!1,"close-on-press-escape":!1,center:""},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",bo,[(0,i.bF)(p,{type:"primary",onClick:t[18]||(t[18]=e=>r.showAnnouncementDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.announcementAck")),1)]),_:1})])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",{innerHTML:r.announcementContent},null,8,yo)]),_:1},8,["title","modelValue","width"]),(0,i.bF)(T,{show:r.showHistory,onClose:t[20]||(t[20]=e=>r.showHistory=!1)},null,8,["show"])])}o(13579);var Co=o(46638),ko=o(48903),wo=o(90144),Fo=o(62388),Lo={name:"UploadHome",mixins:[ko.A],data(){return{selectedUrlForm:(0,wo.KR)(""),showUrlDialog:!1,showCompressDialog:!1,customerCompress:!0,compressQuality:4,compressBar:5,convertToWebp:!1,serverCompress:!0,uploadChannel:"",channelName:"",availableChannels:{},uploadNameType:"",customUrlPrefix:"",useCustomUrl:"false",autoRetry:!0,useDefaultWallPaper:!1,isToolBarOpen:!1,uploadMethod:"default",uploadFolder:"",isFolderInputActive:!1,showAnnouncementDialog:!1,announcementContent:"",showHistory:!1,themeMode:"auto"}},watch:{customerCompress(e){this.updateCompressConfig("customerCompress",e)},compressQuality(e){this.updateCompressConfig("compressQuality",e)},compressBar(e){null===e||void 0===e||e<1?this.compressBar=1:(this.compressQuality>e&&(this.compressQuality=e),this.updateCompressConfig("compressBar",e))},serverCompress(e){this.updateCompressConfig("serverCompress",e)},convertToWebp(e){this.updateCompressConfig("convertToWebp",e)},uploadChannel(e){this.updateStoreUploadChannel(e);const t=this.availableChannels[e]||[],o=this.storeChannelName;o&&t.some(e=>e.name===o)?this.channelName=o:this.channelName=""},channelName(e){this.$store.commit("setStoreChannelName",e||"")},uploadNameType(e){this.updateStoreUploadNameType(e)},customUrlPrefix(e){this.$store.commit("setCustomUrlSettings",{key:"customUrlPrefix",value:e})},useCustomUrl(e){this.$store.commit("setCustomUrlSettings",{key:"useCustomUrl",value:e})},autoRetry(e){this.$store.commit("setStoreAutoRetry",e)},uploadFolder(e){if(this.validateUploadFolder(e,!1)){const t=(0,Fo.G)(e,{strict:!0});t.valid&&this.$store.commit("setStoreUploadFolder",e)}else this.$nextTick(()=>{this.uploadFolder=this.storeUploadFolder})}},computed:{...(0,$t.L8)(["userConfig","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeUploadNameType","customUrlSettings","storeAutoRetry","storeUploadMethod","storeUploadFolder"]),ownerName(){return this.userConfig?.ownerName||"Sanyue"},dialogWidth(){return window.innerWidth>768?"50%":"90%"},disableTooltip(){return window.innerWidth<768},urlPrefix(){return this.userConfig?.urlPrefix||`${window.location.protocol}//${window.location.host}/file/`},announcementAvailable(){return!!this.userConfig?.announcement},showDirectorySuggestions(){return this.userConfig?.showDirectorySuggestions??!1},currentChannelList(){return this.availableChannels[this.uploadChannel]||[]}},mounted(){this.initializeBackground("uploadBkImg",".container",!1,!0),this.selectedUrlForm=this.uploadCopyUrlForm||"url",this.customerCompress=this.compressConfig.customerCompress??this.parseBoolean(this.userConfig?.defaultCustomerCompress,!0),this.compressQuality=this.compressConfig.compressQuality??this.parseNumber(this.userConfig?.defaultCompressQuality,4),this.compressBar=this.compressConfig.compressBar??this.parseNumber(this.userConfig?.defaultCompressBar,5),this.serverCompress=this.compressConfig.serverCompress??!0,this.convertToWebp=this.compressConfig.convertToWebp??this.parseBoolean(this.userConfig?.defaultConvertToWebp,!1),this.uploadChannel=this.storeUploadChannel||this.userConfig?.defaultUploadChannel||"telegram",this.autoRetry=this.storeAutoRetry,this.uploadNameType=this.storeUploadNameType||this.userConfig?.defaultUploadNameType||"default",this.customUrlPrefix=this.customUrlSettings.customUrlPrefix,this.useCustomUrl=this.customUrlSettings.useCustomUrl,this.uploadMethod=this.storeUploadMethod,this.fetchAvailableChannels(),this.uploadFolder=this.storeUploadFolder||this.userConfig?.defaultUploadFolder||"";const e=this.$store.getters.cusDarkMode,t=this.$store.getters.useDarkMode;this.themeMode=e?t?"dark":"light":"auto";const o=localStorage.getItem("visitedUploadHome"),s=this.userConfig?.announcement;!o&&s&&(this.announcementContent=s,this.showAnnouncementDialog=!0,localStorage.setItem("visitedUploadHome","true"))},components:{UploadForm:Nt,Footer:X.A,ToggleDark:Gt.A,Logo:Pt.A,UploadHistory:H,UploadSettingsDialog:We,DirectoryTreePicker:Vt.A,DirectorySuggestionInput:qt},methods:{async fetchAvailableChannels(){try{const e=await Lt.A.get("/api/channels",{withAuthCode:!0});if(e.data){this.availableChannels=e.data;const t=this.storeChannelName,o=this.userConfig?.defaultChannelName,s=this.availableChannels[this.uploadChannel]||[];t&&s.some(e=>e.name===t)?this.channelName=t:""!==t&&null!==t&&void 0!==t||""!==t&&o&&s.some(e=>e.name===o)&&(this.channelName=o)}}catch(e){console.error("Failed to fetch available channels:",e)}},validateUploadFolder(e,t=!0){e&&!e.startsWith("/")&&(e="/"+e,this.uploadFolder=e);const o=(0,Fo.G)(e,{strict:t});return!!o.valid||(this.$message.error(o.error),!1)},handleFolderInputFocus(){this.isFolderInputActive=!0},handleFolderInputBlur(){this.isFolderInputActive=!1,this.uploadFolder&&!this.uploadFolder.startsWith("/")&&(this.uploadFolder="/"+this.uploadFolder),this.validateUploadFolder(this.uploadFolder,!0)||this.$nextTick(()=>{this.uploadFolder=this.storeUploadFolder})},handleManage(){this.$router.push("/dashboard")},parseBoolean(e,t){return void 0===e||null===e?t:"boolean"===typeof e?e:"string"===typeof e?"true"===e:t},parseNumber(e,t){if(void 0===e||null===e)return t;const o=parseFloat(e);return isNaN(o)?t:o},openUrlDialog(){this.showUrlDialog=!0},handleLogout(){Lt.A.post("/api/auth/logout",{authType:"user"},{withCredentials:!0}).finally(()=>{this.$store.commit("setUserLoggedIn",!1),this.$router.push("/login"),this.$message.success(this.$t("upload.logoutSuccess"))})},changeUrlForm(){this.$store.commit("setUploadCopyUrlForm",this.selectedUrlForm)},openCompressDialog(){this.showCompressDialog=!0},updateCompressConfig(e,t){this.$store.commit("setCompressConfig",{key:e,value:t})},updateStoreUploadChannel(e){this.$store.commit("setStoreUploadChannel",e)},updateStoreUploadNameType(e){this.$store.commit("setStoreUploadNameType",e)},handleOpenToolbar(){this.isToolBarOpen=!this.isToolBarOpen,setTimeout(()=>{const e=document.querySelectorAll(".toolbar-button");e.forEach(e=>{e.style.pointerEvents=this.isToolBarOpen?"auto":"none"})},300)},handleChangeUploadMethod(){this.uploadMethod="default"===this.uploadMethod?"paste":"default",this.$store.commit("setUploadMethod",this.uploadMethod)},handleMobileMenuCommand(e){if("toggleTheme"===e)"auto"===this.themeMode?(this.themeMode="light",this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):"light"===this.themeMode?(this.themeMode="dark",this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0)):(this.themeMode="auto",this.$store.commit("setCusDarkMode",!1));else if("toggleUploadMethod"===e)this.handleChangeUploadMethod();else if("viewDocs"===e)window.open("https://cfbed.sanyue.de/qa/","_blank");else if("showHistory"===e)this.showHistory=!0;else if("showAnnouncement"===e)this.handleShowAnnouncement();else if("toggleLanguage"===e){const e="zh-CN"===this.$i18n.locale?"en":"zh-CN";(0,Co.xS)(e)}},handleDesktopMenuCommand(e){if("viewDocs"===e)window.open("https://cfbed.sanyue.de/qa/","_blank");else if("showHistory"===e)this.showHistory=!0;else if("showAnnouncement"===e)this.handleShowAnnouncement();else if("toggleLanguage"===e){const e="zh-CN"===this.$i18n.locale?"en":"zh-CN";(0,Co.xS)(e)}},getThemeIcon(){return"auto"===this.themeMode?"sun":"light"===this.themeMode?"moon":"adjust"},getThemeText(){return"auto"===this.themeMode?this.$t("theme.lightMode"):"light"===this.themeMode?this.$t("theme.darkMode"):this.$t("theme.autoMode")},handleShowAnnouncement(){const e=this.userConfig?.announcement;e?(this.announcementContent=e,this.showAnnouncementDialog=!0):this.$message.info(this.$t("upload.noAnnouncement"))},handleDirectorySelect(e){this.uploadFolder=e,this.validateUploadFolder(e,!0)&&this.$store.commit("setStoreUploadFolder",e)}}};const Uo=(0,z.A)(Lo,[["render",vo],["__scopeId","data-v-f50dcc42"]]);var $o=Uo},62388:function(e,t,o){"use strict";o.d(t,{G:function(){return l}});var s=o(46638);function l(e,{strict:t=!0}={}){if(!e||""===e.trim())return{valid:!0};if("/"===e)return{valid:!0};if(!e.startsWith("/"))return{valid:!1,error:s.Ay.global.t("validation.pathMustStartWithSlash")};if(/(?:^|\/)\.\.(\/|$)/.test(e)||e.includes(".."))return{valid:!1,error:s.Ay.global.t("validation.pathTraversalNotAllowed")};const o=t?/\/\.(\/|$)/:/\/\.\//;if(o.test(e))return{valid:!1,error:s.Ay.global.t("validation.singleDotNotAllowed")};if(e.includes("//"))return{valid:!1,error:s.Ay.global.t("validation.consecutiveSlashNotAllowed")};const l=/[\\:\*\?"'<>\| \(\)\[\]\{\}#%\^`~;@&=\+\$,]/;return l.test(e)?{valid:!1,error:s.Ay.global.t("validation.invalidCharacters")}:{valid:!0}}},67819:function(e,t,o){"use strict";o(85331)},70797:function(e,t,o){"use strict";o.d(t,{A:function(){return a}});o(44114);var s=o(25507),l=o(16915);let i=!1;async function a(e,t={}){t.credentials="include",t.headers={...t.headers};const o=await fetch(e,t);return 401!==o.status||i||(i=!0,s.A.commit("setAdminLoggedIn",!1),l.A.push("/adminLogin").finally(()=>{i=!1})),o}},76334:function(e,t,o){e.exports=o(11393)},79899:function(e,t,o){"use strict";o(85331)},85970:function(e,t,o){"use strict";o(85331)},88830:function(e,t,o){"use strict";o(85331)},95385:function(e,t,o){"use strict";o(85331)},96682:function(e,t,o){"use strict";e.exports=o.p+"img/404.8ed11fb3.png"},96808:function(e,t,o){"use strict";o(85331),o(18785),o(67819),o(85970),o(19104)}}]); -//# sourceMappingURL=365.ae007b9b.js.map \ No newline at end of file diff --git a/frontend-dist/js/365.ae007b9b.js.gz b/frontend-dist/js/365.ae007b9b.js.gz deleted file mode 100644 index a8e65016b1c286473e099e187a25ad2af7c828c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24810 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

6dVhuRuAU@dHSQY}AuyY#8R!UBTS+4Kt^rh_Ocl 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 diff --git a/frontend-dist/js/365.ae007b9b.js.map b/frontend-dist/js/365.ae007b9b.js.map deleted file mode 100644 index 59678043..00000000 --- a/frontend-dist/js/365.ae007b9b.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/365.ae007b9b.js","mappings":"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","sources":["webpack://sanyue_imghub/./node_modules/image-conversion/build/conversion.js","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?9e0f","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?6984","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue?61df","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue?d5f5","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue?f394","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue?adb2","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue?d2e4","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue?420c","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue?f120","webpack://sanyue_imghub/./src/utils/upload/urlBuilder.js","webpack://sanyue_imghub/./src/utils/upload/sha256.js","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue?bdbd","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue?be1c","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue?69c3","webpack://sanyue_imghub/./src/views/UploadHome.vue?728c","webpack://sanyue_imghub/./src/views/UploadHome.vue","webpack://sanyue_imghub/./src/views/UploadHome.vue?af00","webpack://sanyue_imghub/./src/utils/pathValidator.js","webpack://sanyue_imghub/./src/utils/fetchWithAuth.js","webpack://sanyue_imghub/./node_modules/image-conversion/index.js"],"sourcesContent":["!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.imageConversion=e():t.imageConversion=e()}(this,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,\"a\",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p=\"\",n(n.s=0)}([function(t,e,n){\"use strict\";var r;function o(t){return[\"image/png\",\"image/jpeg\",\"image/gif\"].some(e=>e===t)}n.r(e),n.d(e,\"canvastoDataURL\",(function(){return a})),n.d(e,\"canvastoFile\",(function(){return c})),n.d(e,\"dataURLtoFile\",(function(){return s})),n.d(e,\"dataURLtoImage\",(function(){return l})),n.d(e,\"downloadFile\",(function(){return d})),n.d(e,\"filetoDataURL\",(function(){return f})),n.d(e,\"imagetoCanvas\",(function(){return g})),n.d(e,\"urltoBlob\",(function(){return w})),n.d(e,\"urltoImage\",(function(){return m})),n.d(e,\"compress\",(function(){return p})),n.d(e,\"compressAccurately\",(function(){return b})),n.d(e,\"EImageType\",(function(){return r})),function(t){t.PNG=\"image/png\",t.JPEG=\"image/jpeg\",t.GIF=\"image/gif\"}(r||(r={}));var i=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function a(t,e=.92,n=r.JPEG){return i(this,void 0,void 0,(function*(){return o(n)||(n=r.JPEG),t.toDataURL(n,e)}))}function c(t,e=.92,n=r.JPEG){return new Promise(r=>t.toBlob(t=>r(t),n,e))}var u=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function s(t,e){return u(this,void 0,void 0,(function*(){const n=t.split(\",\");let r=n[0].match(/:(.*?);/)[1];const i=atob(n[1]);let a=i.length;const c=new Uint8Array(a);for(;a--;)c[a]=i.charCodeAt(a);return o(e)&&(r=e),new Blob([c],{type:r})}))}function l(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(\"dataURLtoImage(): dataURL is illegal\")),r.src=t})}function d(t,e){const n=document.createElement(\"a\");n.href=window.URL.createObjectURL(t),n.download=e||Date.now().toString(36),document.body.appendChild(n);const r=document.createEvent(\"MouseEvents\");r.initEvent(\"click\",!1,!1),n.dispatchEvent(r),document.body.removeChild(n)}function f(t){return new Promise(e=>{const n=new FileReader;n.onloadend=t=>e(t.target.result),n.readAsDataURL(t)})}var h=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function g(t,e={}){return h(this,void 0,void 0,(function*(){const n=Object.assign({},e),r=document.createElement(\"canvas\"),o=r.getContext(\"2d\");let i,a;for(const t in n)Object.prototype.hasOwnProperty.call(n,t)&&(n[t]=Number(n[t]));if(n.scale){const e=n.scale>0&&n.scale<10?n.scale:1;a=t.width*e,i=t.height*e}else a=n.width||n.height*t.width/t.height||t.width,i=n.height||n.width*t.height/t.width||t.height;switch([5,6,7,8].some(t=>t===n.orientation)?(r.height=a,r.width=i):(r.height=i,r.width=a),n.orientation){case 3:o.rotate(180*Math.PI/180),o.drawImage(t,-r.width,-r.height,r.width,r.height);break;case 6:o.rotate(90*Math.PI/180),o.drawImage(t,0,-r.width,r.height,r.width);break;case 8:o.rotate(270*Math.PI/180),o.drawImage(t,-r.height,0,r.height,r.width);break;case 2:o.translate(r.width,0),o.scale(-1,1),o.drawImage(t,0,0,r.width,r.height);break;case 4:o.translate(r.width,0),o.scale(-1,1),o.rotate(180*Math.PI/180),o.drawImage(t,-r.width,-r.height,r.width,r.height);break;case 5:o.translate(r.width,0),o.scale(-1,1),o.rotate(90*Math.PI/180),o.drawImage(t,0,-r.width,r.height,r.width);break;case 7:o.translate(r.width,0),o.scale(-1,1),o.rotate(270*Math.PI/180),o.drawImage(t,-r.height,0,r.height,r.width);break;default:o.drawImage(t,0,0,r.width,r.height)}return r}))}function w(t){return fetch(t).then(t=>t.blob())}function m(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(\"urltoImage(): Image failed to load, please check the image URL\")),r.src=t})}var y=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function p(t,e={}){return y(this,void 0,void 0,(function*(){if(!(t instanceof Blob))throw new Error(\"compress(): First arg must be a Blob object or a File object.\");if(\"object\"!=typeof e&&(e=Object.assign({quality:e})),e.quality=Number(e.quality),Number.isNaN(e.quality))return t;const n=yield f(t);let i=n.split(\",\")[0].match(/:(.*?);/)[1],c=r.JPEG;o(e.type)&&(c=e.type,i=e.type);const u=yield l(n),d=yield g(u,Object.assign({},e)),h=yield a(d,e.quality,c),w=yield s(h,i);return w.size>t.size?t:w}))}function b(t,e={}){return y(this,void 0,void 0,(function*(){if(!(t instanceof Blob))throw new Error(\"compressAccurately(): First arg must be a Blob object or a File object.\");if(\"object\"!=typeof e&&(e=Object.assign({size:e})),e.size=Number(e.size),Number.isNaN(e.size))return t;if(1024*e.size>t.size)return t;e.accuracy=Number(e.accuracy),(!e.accuracy||e.accuracy<.8||e.accuracy>.99)&&(e.accuracy=.95);const n=e.size*(2-e.accuracy)*1024,i=1024*e.size,c=e.size*e.accuracy*1024,u=yield f(t);let d=u.split(\",\")[0].match(/:(.*?);/)[1],h=r.JPEG;o(e.type)&&(h=e.type,d=e.type);const w=yield l(u),m=yield g(w,Object.assign({},e));let y,p=.5;const b=[null,null];for(let t=1;t<=7;t++){y=yield a(m,p,h);const e=.75*y.length;if(7===t){(ne)&&(y=[y,...b].filter(t=>t).sort((t,e)=>Math.abs(.75*t.length-i)-Math.abs(.75*e.length-i))[0]);break}if(ne))break;b[0]=y,p+=Math.pow(.5,t+1)}}const v=yield s(y,d);return v.size>t.size?t:v}))}}])}));","import { renderSlot as _renderSlot, withModifiers as _withModifiers, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-tree-picker\"\n};\nconst _hoisted_2 = {\n class: \"tree-container\"\n};\nconst _hoisted_3 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_4 = {\n class: \"error-text\"\n};\nconst _hoisted_5 = {\n class: \"node-label\"\n};\nconst _hoisted_6 = {\n class: \"tree-container\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_8 = {\n class: \"error-text\"\n};\nconst _hoisted_9 = {\n class: \"node-label\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tree = _resolveComponent(\"el-tree\");\n const _component_el_popover = _resolveComponent(\"el-popover\");\n const _component_el_drawer = _resolveComponent(\"el-drawer\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [$options.isDesktop ? (_openBlock(), _createBlock(_component_el_popover, {\n key: 0,\n visible: $data.popoverVisible,\n \"onUpdate:visible\": _cache[1] || (_cache[1] = $event => $data.popoverVisible = $event),\n placement: \"bottom-start\",\n width: 320,\n trigger: \"click\",\n \"popper-class\": \"directory-tree-popover\",\n \"show-arrow\": true,\n \"hide-after\": 0,\n \"show-after\": 50,\n transition: \"el-zoom-in-top\"\n }, {\n reference: _withCtx(() => [_createElementVNode(\"span\", {\n class: \"popover-trigger-wrapper\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"]))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)])]),\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_2, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_4, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRef\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 3\n }, 8, [\"visible\"])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createElementVNode(\"span\", {\n class: \"drawer-trigger-wrapper\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.openDrawer && $options.openDrawer(...args))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)]), _createVNode(_component_el_drawer, {\n modelValue: $data.drawerVisible,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.drawerVisible = $event),\n direction: \"btt\",\n size: \"60%\",\n \"show-close\": true,\n \"with-header\": true,\n \"z-index\": 3000,\n title: _ctx.$t('directoryTree.selectDirectory'),\n class: \"directory-tree-drawer\"\n }, {\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_6, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_8, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRefMobile\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree mobile-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_9, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 1\n }, 8, [\"modelValue\", \"title\"])], 64))]);\n}","import axios from '@/utils/axios';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'DirectoryTreePicker',\n props: {\n currentDirectory: {\n type: String,\n default: ''\n },\n source: {\n type: String,\n default: 'upload',\n validator: value => ['upload', 'admin'].includes(value)\n }\n },\n data() {\n return {\n popoverVisible: false,\n drawerVisible: false,\n treeData: [],\n loading: false,\n error: '',\n treeProps: {\n children: 'children',\n label: 'name'\n },\n windowWidth: window.innerWidth\n };\n },\n computed: {\n isDesktop() {\n return this.windowWidth >= 769;\n }\n },\n watch: {\n popoverVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 弹窗关闭后延迟折叠所有节点,避免下次打开时出现折叠动画\n setTimeout(() => {\n if (!this.popoverVisible && this.$refs.treeRef) {\n const store = this.$refs.treeRef.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 200);\n }\n },\n drawerVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 抽屉关闭后延迟折叠所有节点\n setTimeout(() => {\n if (!this.drawerVisible && this.$refs.treeRefMobile) {\n const store = this.$refs.treeRefMobile.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 300);\n }\n },\n currentDirectory(newVal) {\n this.$nextTick(() => {\n if (this.$refs.treeRef && newVal) {\n this.$refs.treeRef.setCurrentKey(newVal);\n }\n if (this.$refs.treeRefMobile && newVal) {\n this.$refs.treeRefMobile.setCurrentKey(newVal);\n }\n });\n }\n },\n mounted() {\n window.addEventListener('resize', this.handleResize);\n },\n beforeUnmount() {\n window.removeEventListener('resize', this.handleResize);\n },\n methods: {\n handleResize() {\n this.windowWidth = window.innerWidth;\n },\n openDrawer() {\n this.drawerVisible = true;\n },\n async fetchDirectoryTree() {\n this.loading = true;\n this.error = '';\n try {\n let data;\n if (this.source === 'admin') {\n const response = await fetchWithAuth('/api/directoryTree', {\n method: 'GET'\n });\n if (!response.ok) {\n if (response.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.serverError');\n }\n return;\n }\n data = await response.json();\n } else {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n data = response.data;\n }\n if (data.tree) {\n this.treeData = [data.tree];\n } else {\n this.treeData = [];\n }\n } catch (err) {\n console.error('Failed to fetch directory tree:', err);\n if (err.response?.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.loadFailed');\n }\n } finally {\n this.loading = false;\n }\n },\n handleNodeClick(data) {\n let path = data.path;\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n } else if (!path) {\n path = '/';\n }\n this.$emit('select', path);\n this.popoverVisible = false;\n this.drawerVisible = false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectoryTreePicker.vue?vue&type=template&id=62eab69a&scoped=true\"\nimport script from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\nexport * from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\n\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=0&id=62eab69a&scoped=true&lang=css\"\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=1&id=62eab69a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-62eab69a\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"history-header\"\n};\nconst _hoisted_2 = {\n class: \"header-left\"\n};\nconst _hoisted_3 = {\n class: \"record-count\"\n};\nconst _hoisted_4 = {\n class: \"header-right\"\n};\nconst _hoisted_5 = {\n class: \"timeline-header\"\n};\nconst _hoisted_6 = {\n class: \"date-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"grid-view\"\n};\nconst _hoisted_8 = {\n class: \"grid-preview\"\n};\nconst _hoisted_9 = [\"src\"];\nconst _hoisted_10 = [\"src\"];\nconst _hoisted_11 = {\n key: 2,\n class: \"file-icon-wrapper\"\n};\nconst _hoisted_12 = {\n class: \"grid-overlay\"\n};\nconst _hoisted_13 = {\n class: \"grid-actions\"\n};\nconst _hoisted_14 = {\n class: \"grid-info\"\n};\nconst _hoisted_15 = [\"title\"];\nconst _hoisted_16 = {\n class: \"upload-time\"\n};\nconst _hoisted_17 = {\n key: 1,\n class: \"list-view\"\n};\nconst _hoisted_18 = {\n class: \"list-preview\"\n};\nconst _hoisted_19 = [\"src\"];\nconst _hoisted_20 = [\"src\"];\nconst _hoisted_21 = {\n key: 2,\n class: \"file-icon-wrapper-small\"\n};\nconst _hoisted_22 = {\n class: \"list-info\"\n};\nconst _hoisted_23 = [\"title\"];\nconst _hoisted_24 = [\"title\"];\nconst _hoisted_25 = {\n class: \"list-meta\"\n};\nconst _hoisted_26 = {\n class: \"upload-time\"\n};\nconst _hoisted_27 = {\n class: \"list-actions\"\n};\nconst _hoisted_28 = {\n key: 0,\n class: \"load-more-container\"\n};\nconst _hoisted_29 = {\n key: 0,\n class: \"loading-indicator\"\n};\nconst _hoisted_30 = {\n key: 1,\n class: \"load-more-hint\"\n};\nconst _hoisted_31 = {\n key: 1,\n class: \"no-more-hint\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"empty-state\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"history-container\", {\n 'active': $props.show\n }])\n }, [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h2\", null, _toDisplayString(_ctx.$t('uploadHistory.title')), 1), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadHistory.totalRecords', {\n count: $data.totalCount\n })), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.switchView'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n onClick: $options.toggleViewMode\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.viewMode === 'grid' ? 'list' : 'th-large'\n }, null, 8, [\"icon\"])]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.clearRecords'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n type: \"danger\",\n onClick: $options.clearHistory\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_button, {\n circle: \"\",\n onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('close'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n })]),\n _: 1\n })])]), $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"history-content\",\n ref: \"historyContent\",\n onScroll: _cache[3] || (_cache[3] = (...args) => $options.handleScroll && $options.handleScroll(...args))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedHistory, group => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: group.date,\n class: \"history-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_cache[4] || (_cache[4] = _createElementVNode(\"div\", {\n class: \"timeline-dot\"\n }, null, -1)), _createElementVNode(\"span\", _hoisted_6, _toDisplayString(group.date), 1)]), $data.viewMode === 'grid' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"grid-item\"\n }, [_createElementVNode(\"div\", _hoisted_8, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[1] || (_cache[1] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_9)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_10)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })])), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_15), _createElementVNode(\"div\", _hoisted_16, _toDisplayString($options.formatTime(item.time)), 1)])]);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"list-item\"\n }, [_createElementVNode(\"div\", _hoisted_18, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[2] || (_cache[2] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_19)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_20)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_21, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\"\n })]))]), _createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_23), _createElementVNode(\"div\", {\n class: \"file-url\",\n title: item.url\n }, _toDisplayString(item.url), 9, _hoisted_24)]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"div\", _hoisted_26, _toDisplayString($options.formatTime(item.time)), 1)]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])]);\n }), 128))]))]);\n }), 128)), $options.hasMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_28, [$data.loadingMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"spinner\",\n spin: \"\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadHistory.loading')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_30, _toDisplayString(_ctx.$t('uploadHistory.pullToLoadMore')), 1))])) : $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, _toDisplayString(_ctx.$t('uploadHistory.noMoreRecords')), 1)) : _createCommentVNode(\"\", true)], 544)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n class: \"empty-icon\"\n }), _createElementVNode(\"p\", null, _toDisplayString(_ctx.$t('uploadHistory.emptyHistory')), 1)]))], 2);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.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 \"core-js/modules/esnext.json.parse.js\";\nexport default {\n name: 'UploadHistory',\n props: {\n show: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n historyList: [],\n allHistory: [],\n // 完整历史记录\n viewMode: 'grid',\n // 'grid' or 'list'\n pageSize: 30,\n // 每次加载数量\n currentPage: 0,\n loadingMore: false,\n totalCount: 0\n };\n },\n watch: {\n show(val) {\n if (val) {\n this.resetAndLoad();\n }\n }\n },\n computed: {\n hasMore() {\n return this.historyList.length < this.totalCount;\n },\n groupedHistory() {\n const groups = {};\n this.historyList.forEach(item => {\n const date = new Date(item.time);\n const dateStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\n if (!groups[dateStr]) {\n groups[dateStr] = [];\n }\n groups[dateStr].push(item);\n });\n\n // Sort dates descending\n return Object.keys(groups).sort((a, b) => new Date(b) - new Date(a)).map(date => ({\n date,\n items: groups[date]\n }));\n }\n },\n mounted() {\n // Load view mode preference\n const savedMode = localStorage.getItem('historyViewMode');\n if (savedMode) {\n this.viewMode = savedMode;\n }\n },\n methods: {\n resetAndLoad() {\n this.historyList = [];\n this.currentPage = 0;\n this.loadAllHistory();\n this.loadMore();\n },\n loadAllHistory() {\n try {\n const history = JSON.parse(localStorage.getItem('uploadHistory') || '[]');\n // Sort by time desc\n this.allHistory = history.sort((a, b) => b.time - a.time);\n this.totalCount = this.allHistory.length;\n } catch (e) {\n console.error('Failed to load history', e);\n this.allHistory = [];\n this.totalCount = 0;\n }\n },\n loadMore() {\n if (this.loadingMore || !this.hasMore) return;\n this.loadingMore = true;\n\n // 模拟异步加载,避免阻塞UI\n setTimeout(() => {\n const start = this.currentPage * this.pageSize;\n const end = start + this.pageSize;\n const newItems = this.allHistory.slice(start, end);\n this.historyList = [...this.historyList, ...newItems];\n this.currentPage++;\n this.loadingMore = false;\n }, 50);\n },\n handleScroll(e) {\n const container = e.target;\n const scrollTop = container.scrollTop;\n const scrollHeight = container.scrollHeight;\n const clientHeight = container.clientHeight;\n\n // 距离底部 100px 时加载更多\n if (scrollHeight - scrollTop - clientHeight < 100) {\n this.loadMore();\n }\n },\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n localStorage.setItem('historyViewMode', this.viewMode);\n },\n clearHistory() {\n this.$confirm(this.$t('uploadHistory.clearConfirmMessage'), this.$t('uploadHistory.clearConfirmTitle'), {\n confirmButtonText: this.$t('uploadHistory.clearConfirmOk'),\n cancelButtonText: this.$t('uploadHistory.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n this.historyList = [];\n this.allHistory = [];\n this.totalCount = 0;\n this.currentPage = 0;\n localStorage.removeItem('uploadHistory');\n this.$message.success(this.$t('uploadHistory.recordsCleared'));\n }).catch(() => {});\n },\n deleteItem(item) {\n this.$confirm(this.$t('uploadHistory.deleteConfirmMessage'), this.$t('uploadHistory.clearConfirmTitle'), {\n confirmButtonText: this.$t('uploadHistory.clearConfirmOk'),\n cancelButtonText: this.$t('uploadHistory.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n // Remove from lists\n this.historyList = this.historyList.filter(i => i.time !== item.time);\n this.allHistory = this.allHistory.filter(i => i.time !== item.time);\n this.totalCount = this.allHistory.length;\n\n // Update localStorage\n try {\n localStorage.setItem('uploadHistory', JSON.stringify(this.allHistory));\n this.$message.success(this.$t('uploadHistory.recordDeleted'));\n } catch (e) {\n console.error('Failed to update history', e);\n }\n }).catch(() => {});\n },\n isImage(fileName) {\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff', 'ico', 'avif', 'heic', 'jfif', 'pjpeg', 'pjp'];\n const extension = fileName ? fileName.split('.').pop().toLowerCase() : '';\n return imageExtensions.includes(extension);\n },\n isVideo(fileName) {\n const videoExtensions = ['mp4', 'webm', 'ogg', 'mkv'];\n const extension = fileName ? fileName.split('.').pop().toLowerCase() : '';\n return videoExtensions.includes(extension);\n },\n formatTime(timestamp) {\n const date = new Date(timestamp);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n },\n copyLink(url) {\n navigator.clipboard.writeText(url).then(() => {\n this.$message.success(this.$t('uploadHistory.linkCopied'));\n }).catch(() => {\n this.$message.error(this.$t('uploadHistory.copyFailed'));\n });\n },\n openLink(url) {\n window.open(url, '_blank');\n },\n handleImageError(e) {\n e.target.src = require('@/assets/404.png');\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadHistory.vue?vue&type=template&id=550797ce&scoped=true\"\nimport script from \"./UploadHistory.vue?vue&type=script&lang=js\"\nexport * from \"./UploadHistory.vue?vue&type=script&lang=js\"\n\nimport \"./UploadHistory.vue?vue&type=style&index=0&id=550797ce&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-550797ce\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n class: \"dialog-section\"\n};\nconst _hoisted_2 = {\n class: \"section-header\"\n};\nconst _hoisted_3 = {\n class: \"section-title\"\n};\nconst _hoisted_4 = {\n class: \"section-content\"\n};\nconst _hoisted_5 = {\n class: \"setting-item\"\n};\nconst _hoisted_6 = {\n class: \"setting-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_8 = {\n class: \"setting-label\"\n};\nconst _hoisted_9 = {\n class: \"setting-item\"\n};\nconst _hoisted_10 = {\n class: \"setting-label\"\n};\nconst _hoisted_11 = {\n class: \"setting-item\"\n};\nconst _hoisted_12 = {\n class: \"setting-label\"\n};\nconst _hoisted_13 = {\n class: \"dialog-section\"\n};\nconst _hoisted_14 = {\n class: \"section-header\"\n};\nconst _hoisted_15 = {\n class: \"section-title\"\n};\nconst _hoisted_16 = {\n class: \"section-content\"\n};\nconst _hoisted_17 = {\n class: \"dialog-section\"\n};\nconst _hoisted_18 = {\n class: \"section-header\"\n};\nconst _hoisted_19 = {\n class: \"section-title\"\n};\nconst _hoisted_20 = {\n class: \"section-content\"\n};\nconst _hoisted_21 = {\n class: \"setting-item\"\n};\nconst _hoisted_22 = {\n class: \"setting-label\"\n};\nconst _hoisted_23 = {\n class: \"setting-item\"\n};\nconst _hoisted_24 = {\n class: \"setting-label\"\n};\nconst _hoisted_25 = {\n key: 0,\n class: \"setting-item slider-item\"\n};\nconst _hoisted_26 = {\n class: \"setting-label\"\n};\nconst _hoisted_27 = {\n class: \"slider-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"slider-input-wrapper\"\n};\nconst _hoisted_29 = {\n key: 1,\n class: \"setting-item slider-item\"\n};\nconst _hoisted_30 = {\n class: \"setting-label\"\n};\nconst _hoisted_31 = {\n class: \"slider-wrapper\"\n};\nconst _hoisted_32 = {\n class: \"slider-input-wrapper\"\n};\nconst _hoisted_33 = {\n key: 0,\n class: \"dialog-section\"\n};\nconst _hoisted_34 = {\n class: \"section-header\"\n};\nconst _hoisted_35 = {\n class: \"section-title\"\n};\nconst _hoisted_36 = {\n class: \"section-content\"\n};\nconst _hoisted_37 = {\n class: \"setting-item\"\n};\nconst _hoisted_38 = {\n class: \"setting-label\"\n};\nconst _hoisted_39 = {\n class: \"dialog-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\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_input = _resolveComponent(\"el-input\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_slider = _resolveComponent(\"el-slider\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n return _openBlock(), _createBlock(_component_el_dialog, {\n title: _ctx.$t('uploadSettings.title'),\n modelValue: $options.visible,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $options.visible = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadSettings.uploadChannel')), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"span\", _hoisted_6, _toDisplayString(_ctx.$t('uploadSettings.channelType')), 1), _createVNode(_component_el_radio_group, {\n \"model-value\": $props.uploadChannel,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => _ctx.$emit('update:uploadChannel', $event)),\n class: \"radio-card-group compact\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"telegram\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"paper-plane\",\n class: \"channel-icon\"\n }), _cache[13] || (_cache[13] = _createElementVNode(\"span\", null, \"TG\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"cfr2\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud\",\n class: \"channel-icon\"\n }), _cache[14] || (_cache[14] = _createElementVNode(\"span\", null, \"R2\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"s3\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"channel-icon\"\n }), _cache[15] || (_cache[15] = _createElementVNode(\"span\", null, \"S3\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"discord\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"channel-icon\"\n }), _cache[16] || (_cache[16] = _createElementVNode(\"span\", null, \"DC\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"huggingface\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"channel-icon\"\n }), _cache[17] || (_cache[17] = _createElementVNode(\"span\", null, \"HF\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"webdav\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"folder\",\n class: \"channel-icon\"\n }), _cache[18] || (_cache[18] = _createElementVNode(\"span\", null, \"WD\", -1))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model-value\"])]), $props.currentChannelList.length > 1 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.channelName')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.channelNameTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_select, {\n \"model-value\": $props.channelName,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => _ctx.$emit('update:channelName', $event)),\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\",\n class: \"setting-input\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"model-value\", \"placeholder\"])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.$t('uploadSettings.uploadDirectory')), 1), _createVNode(_component_el_input, {\n \"model-value\": $props.uploadFolder,\n \"onUpdate:modelValue\": $options.handleUploadFolderInput,\n placeholder: _ctx.$t('uploadSettings.uploadDirectoryPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"model-value\", \"onUpdate:modelValue\", \"placeholder\"])]), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"span\", _hoisted_12, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.autoSwitch')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.autoSwitchTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_switch, {\n \"model-value\": $props.autoRetry,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => _ctx.$emit('update:autoRetry', $event))\n }, null, 8, [\"model-value\"])])])]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"span\", _hoisted_15, _toDisplayString(_ctx.$t('uploadSettings.fileNaming')), 1)]), _createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_radio_group, {\n \"model-value\": $props.uploadNameType,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => _ctx.$emit('update:uploadNameType', $event)),\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"default\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cog\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingDefault')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"index\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingIndex')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"origin\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"file-signature\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingOrigin')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"short\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"compress-alt\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingShort')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model-value\"])])]), _createElementVNode(\"div\", _hoisted_17, [_createElementVNode(\"div\", _hoisted_18, [_createElementVNode(\"span\", _hoisted_19, _toDisplayString(_ctx.$t('uploadSettings.filePreprocess')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.filePreprocessTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"span\", _hoisted_22, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.convertToWebp')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.convertToWebpTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_switch, {\n \"model-value\": $props.convertToWebp,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => _ctx.$emit('update:convertToWebp', $event))\n }, null, 8, [\"model-value\"])]), _createElementVNode(\"div\", _hoisted_23, [_createElementVNode(\"span\", _hoisted_24, _toDisplayString(_ctx.$t('uploadSettings.fileCompress')), 1), _createVNode(_component_el_switch, {\n \"model-value\": $props.customerCompress,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => _ctx.$emit('update:customerCompress', $event))\n }, null, 8, [\"model-value\"])]), $props.customerCompress ? (_openBlock(), _createElementBlock(\"div\", _hoisted_25, [_createElementVNode(\"span\", _hoisted_26, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.compressThreshold')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.compressThresholdTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_slider, {\n \"model-value\": $props.compressBar,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => _ctx.$emit('update:compressBar', $event)),\n min: 1,\n max: 20,\n \"format-tooltip\": value => `${value} MB`\n }, null, 8, [\"model-value\", \"format-tooltip\"]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_el_input_number, {\n \"model-value\": $props.compressBar,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => _ctx.$emit('update:compressBar', $event)),\n min: 1,\n max: 20,\n step: 1,\n \"value-on-clear\": 1,\n class: \"slider-input\",\n \"controls-position\": \"right\"\n }, null, 8, [\"model-value\"]), _cache[19] || (_cache[19] = _createElementVNode(\"span\", {\n class: \"slider-unit\"\n }, \"MB\", -1))])])])) : _createCommentVNode(\"\", true), $props.customerCompress ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createElementVNode(\"span\", _hoisted_30, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.expectedSize')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.expectedSizeTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_31, [_createVNode(_component_el_slider, {\n \"model-value\": $props.compressQuality,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => _ctx.$emit('update:compressQuality', $event)),\n min: 0.5,\n max: $props.compressBar,\n step: 0.1,\n \"format-tooltip\": value => `${value} MB`\n }, null, 8, [\"model-value\", \"max\", \"format-tooltip\"]), _createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_el_input_number, {\n \"model-value\": $props.compressQuality,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => _ctx.$emit('update:compressQuality', $event)),\n min: 0.5,\n max: $props.compressBar,\n step: 0.1,\n precision: 1,\n \"value-on-clear\": 0.5,\n class: \"slider-input\",\n \"controls-position\": \"right\"\n }, null, 8, [\"model-value\", \"max\"]), _cache[20] || (_cache[20] = _createElementVNode(\"span\", {\n class: \"slider-unit\"\n }, \"MB\", -1))])])])) : _createCommentVNode(\"\", true)])]), $props.uploadChannel === 'telegram' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_33, [_createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"span\", _hoisted_35, _toDisplayString(_ctx.$t('uploadSettings.serverCompress')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.serverCompressTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_36, [_createElementVNode(\"div\", _hoisted_37, [_createElementVNode(\"span\", _hoisted_38, _toDisplayString(_ctx.$t('uploadSettings.enableCompress')), 1), _createVNode(_component_el_switch, {\n \"model-value\": $props.serverCompress,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => _ctx.$emit('update:serverCompress', $event))\n }, null, 8, [\"model-value\"])])])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_39, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[11] || (_cache[11] = $event => $options.visible = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]);\n}","export default {\n name: 'UploadSettingsDialog',\n methods: {\n handleUploadFolderInput(val) {\n // 自动补全前导 /\n if (val && !val.startsWith('/')) {\n val = '/' + val;\n }\n this.$emit('update:uploadFolder', val);\n }\n },\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n uploadChannel: {\n type: String,\n default: 'telegram'\n },\n channelName: {\n type: String,\n default: ''\n },\n currentChannelList: {\n type: Array,\n default: () => []\n },\n uploadFolder: {\n type: String,\n default: ''\n },\n autoRetry: {\n type: Boolean,\n default: true\n },\n uploadNameType: {\n type: String,\n default: 'default'\n },\n convertToWebp: {\n type: Boolean,\n default: false\n },\n customerCompress: {\n type: Boolean,\n default: true\n },\n compressBar: {\n type: Number,\n default: 5\n },\n compressQuality: {\n type: Number,\n default: 4\n },\n serverCompress: {\n type: Boolean,\n default: true\n }\n },\n emits: ['update:modelValue', 'update:uploadChannel', 'update:channelName', 'update:uploadFolder', 'update:autoRetry', 'update:uploadNameType', 'update:convertToWebp', 'update:customerCompress', 'update:compressBar', 'update:compressQuality', 'update:serverCompress'],\n computed: {\n visible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadSettingsDialog.vue?vue&type=template&id=23f532c8\"\nimport script from \"./UploadSettingsDialog.vue?vue&type=script&lang=js\"\nexport * from \"./UploadSettingsDialog.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-list-item\"\n};\nconst _hoisted_2 = [\"href\"];\nconst _hoisted_3 = {\n key: 0,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n },\n autoplay: \"\",\n muted: \"\",\n playsinline: \"\",\n loop: \"\"\n};\nconst _hoisted_4 = [\"src\"];\nconst _hoisted_5 = [\"src\"];\nconst _hoisted_6 = {\n key: 2,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n }\n};\nconst _hoisted_7 = {\n class: \"upload-list-item-content\"\n};\nconst _hoisted_8 = {\n class: \"upload-list-item-name-wrapper\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"upload-list-item-url\"\n};\nconst _hoisted_10 = {\n class: \"upload-list-item-url-row\"\n};\nconst _hoisted_11 = {\n class: \"upload-list-item-url-row\"\n};\nconst _hoisted_12 = {\n key: 1,\n class: \"upload-list-item-progress\"\n};\nconst _hoisted_13 = {\n class: \"upload-list-item-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_text = _resolveComponent(\"el-text\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_Link = _resolveComponent(\"Link\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_Delete = _resolveComponent(\"Delete\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"a\", {\n href: $props.file.url,\n target: \"_blank\",\n class: \"upload-list-item-preview\"\n }, [$options.isVideo($props.file.name) ? (_openBlock(), _createElementBlock(\"video\", _hoisted_3, [_createElementVNode(\"source\", {\n src: $props.file.url,\n type: \"video/mp4\"\n }, null, 8, _hoisted_4), _cache[7] || (_cache[7] = _createTextVNode(\" Your browser does not support the video tag. \", -1))])) : $options.isImage($props.file.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 1,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n },\n src: $props.file.url,\n onError: _cache[0] || (_cache[0] = $event => _ctx.$emit('preview-error', $props.file))\n }, null, 40, _hoisted_5)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })]))], 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"div\", _hoisted_8, [_createVNode(_component_el_text, {\n class: \"upload-list-item-name\",\n truncated: \"\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.truncateFilename($props.file.name)), 1)]),\n _: 1\n })]), $props.file.status === 'done' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [_createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_input, {\n modelValue: $props.file.finalURL,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $props.file.finalURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[8] || (_cache[8] = [_createTextVNode(\"URL\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"]), _createVNode(_component_el_input, {\n modelValue: $props.file.mdURL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $props.file.mdURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[9] || (_cache[9] = [_createTextVNode(\"MarkDown\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"])]), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_input, {\n modelValue: $props.file.htmlURL,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $props.file.htmlURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[10] || (_cache[10] = [_createTextVNode(\"HTML\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"]), _createVNode(_component_el_input, {\n modelValue: $props.file.ubbURL,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $props.file.ubbURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[11] || (_cache[11] = [_createTextVNode(\"BBCode\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_12, [_createVNode(_component_el_progress, {\n percentage: $props.file.progreess,\n status: $props.file.status,\n \"show-text\": false\n }, null, 8, [\"percentage\", \"status\"])]))]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"button\", {\n class: \"modern-file-action-btn modern-file-action-btn-primary\",\n onClick: _cache[5] || (_cache[5] = $event => _ctx.$emit('copy', $props.file))\n }, [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Link)]),\n _: 1\n })]), _createElementVNode(\"button\", {\n class: \"modern-file-action-btn modern-file-action-btn-danger\",\n onClick: _cache[6] || (_cache[6] = $event => _ctx.$emit('remove', $props.file))\n }, [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Delete)]),\n _: 1\n })])])]);\n}","import { Link, Delete } from '@element-plus/icons-vue';\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff', 'ico', 'avif', 'heic', 'jfif', 'pjpeg', 'pjp', 'raw', 'cr2', 'nef', 'dng', 'eps', 'ai', 'emf', 'wmf'];\nconst VIDEO_EXTENSIONS = ['mp4', 'webm', 'ogg', 'mkv'];\nexport default {\n name: 'UploadFileItem',\n components: {\n Link,\n Delete\n },\n props: {\n file: {\n type: Object,\n required: true\n }\n },\n emits: ['copy', 'remove', 'preview-error'],\n computed: {\n urlSize() {\n return window.innerWidth < 768 ? 'small' : 'default';\n }\n },\n methods: {\n isImage(fileName) {\n const ext = fileName.split('.').pop().toLowerCase();\n return IMAGE_EXTENSIONS.includes(ext);\n },\n isVideo(fileName) {\n const ext = fileName.split('.').pop().toLowerCase();\n return VIDEO_EXTENSIONS.includes(ext);\n },\n truncateFilename(filename, maxLength = 20) {\n if (!filename || filename.length <= maxLength) return filename;\n const lastDotIndex = filename.lastIndexOf('.');\n let name, ext;\n if (lastDotIndex > 0) {\n name = filename.substring(0, lastDotIndex);\n ext = filename.substring(lastDotIndex);\n } else {\n name = filename;\n ext = '';\n }\n const keepEnd = ext.length + 4;\n const keepStart = maxLength - keepEnd - 3;\n if (keepStart <= 0) return filename.substring(0, maxLength - 3) + '...';\n return name.substring(0, keepStart) + '...' + name.slice(-4) + ext;\n },\n selectAllText(event) {\n navigator.clipboard.writeText(event.target.value).then(() => {\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copySuccess')\n });\n }).catch(() => {\n this.$message({\n type: 'error',\n message: this.$t('uploadForm.copyFailed')\n });\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadFileItem.vue?vue&type=template&id=4848c2b0&scoped=true\"\nimport script from \"./UploadFileItem.vue?vue&type=script&lang=js\"\nexport * from \"./UploadFileItem.vue?vue&type=script&lang=js\"\n\nimport \"./UploadFileItem.vue?vue&type=style&index=0&id=4848c2b0&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-4848c2b0\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createElementBlock as _createElementBlock, renderList as _renderList, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-form\"\n};\nconst _hoisted_2 = {\n class: \"upload-card-glow\",\n ref: \"uploadCardGlow\"\n};\nconst _hoisted_3 = [\"innerHTML\"];\nconst _hoisted_4 = {\n key: 0,\n class: \"upload-card\"\n};\nconst _hoisted_5 = {\n class: \"paste-card-actions\"\n};\nconst _hoisted_6 = {\n class: \"upload-list-dashboard-action\"\n};\nconst _hoisted_7 = {\n class: \"modern-action-group\"\n};\nconst _hoisted_8 = {\n class: \"modern-dropdown-item-content\"\n};\nconst _hoisted_9 = {\n class: \"modern-action-btn modern-action-btn-danger\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_CameraFilled = _resolveComponent(\"CameraFilled\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_upload = _resolveComponent(\"el-upload\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_card = _resolveComponent(\"el-card\");\n const _component_List = _resolveComponent(\"List\");\n const _component_Checked = _resolveComponent(\"Checked\");\n const _component_Failed = _resolveComponent(\"Failed\");\n const _component_el_text = _resolveComponent(\"el-text\");\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_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_UploadFileItem = _resolveComponent(\"UploadFileItem\");\n const _component_el_scrollbar = _resolveComponent(\"el-scrollbar\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"upload-card-wrapper\",\n onMousemove: _cache[0] || (_cache[0] = (...args) => $options.handleUploadCardMouseMove && $options.handleUploadCardMouseMove(...args)),\n onMouseleave: _cache[1] || (_cache[1] = (...args) => $options.handleUploadCardMouseLeave && $options.handleUploadCardMouseLeave(...args))\n }, [_createElementVNode(\"div\", _hoisted_2, null, 512), $props.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_el_upload, {\n key: 0,\n class: _normalizeClass([\"upload-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }]),\n drag: \"\",\n multiple: \"\",\n \"http-request\": $options.uploadFile,\n onSuccess: $options.handleSuccess,\n \"on-error\": $options.handleError,\n \"before-upload\": $options.beforeUpload,\n \"on-progress\": $options.handleProgress,\n \"file-list\": $data.fileList,\n \"show-file-list\": false\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, {\n class: _normalizeClass([\"el-icon--upload\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_CameraFilled)]),\n _: 1\n }, 8, [\"class\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"el-upload__text\", {\n 'upload-list-busy': $data.fileList.length\n }]),\n innerHTML: _ctx.$t('upload.dragUploadText')\n }, null, 10, _hoisted_3)]),\n _: 1\n }, 8, [\"class\", \"http-request\", \"onSuccess\", \"on-error\", \"before-upload\", \"on-progress\", \"file-list\"])) : _createCommentVNode(\"\", true)], 32), $props.uploadMethod === 'paste' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [_createVNode(_component_el_card, {\n class: _normalizeClass([\"paste-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.pastedUrls,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.pastedUrls = $event),\n class: \"upload-card-textarea\",\n placeholder: _ctx.$t('upload.pasteUrlPlaceholder'),\n type: \"textarea\",\n rows: $data.fileList.length ? 4 : 14\n }, null, 8, [\"modelValue\", \"placeholder\", \"rows\"]), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_button, {\n class: \"paste-card-upload-button\",\n type: \"primary\",\n size: $options.pasteCardMethodButtonSize,\n onClick: $options.handleUploadPasteUrls\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteUploadBtn')), 1)]),\n _: 1\n }, 8, [\"size\", \"onClick\"]), _createVNode(_component_el_radio_group, {\n modelValue: $data.pasteUploadMethod,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.pasteUploadMethod = $event),\n class: \"paste-card-method-group\",\n size: $options.pasteCardMethodButtonSize\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"save\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteSave')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"external\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteExternal')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"size\"])])]),\n _: 1\n }, 8, [\"class\"])])) : _createCommentVNode(\"\", true), _createVNode(_component_el_card, {\n class: _normalizeClass([\"upload-list-card\", {\n 'upload-list-busy': $data.fileList.length,\n 'is-uploading': $data.uploading\n }])\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-container\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, [_createVNode(_component_el_scrollbar, {\n onScroll: $options.handleScroll,\n ref: \"scrollContainer\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-dashboard\", {\n 'list-scrolled': $data.listScrolled\n }])\n }, [_createVNode(_component_el_text, {\n class: \"upload-list-dashboard-title\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_List)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadingCount + $options.waitingCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Checked)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadSuccessCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Failed)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadErrorCount), 1)]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.copyAll'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn\",\n onClick: _cache[4] || (_cache[4] = (...args) => $options.copyAll && $options.copyAll(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.retryFailed'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadForm.autoRetry')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.autoReUpload,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.autoReUpload = $event),\n onChange: $options.handleAutoRetryChange,\n size: \"small\"\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn\",\n onClick: _cache[5] || (_cache[5] = (...args) => $options.retryError && $options.retryError(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.clearList'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n onClick: $options.clearFileList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearAll')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_dropdown_item, {\n onClick: $options.clearSuccessList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearUploaded')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])], 2), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.fileList.slice().reverse(), file => {\n return _openBlock(), _createBlock(_component_UploadFileItem, {\n key: file.name,\n file: file,\n onCopy: $options.handleCopy,\n onRemove: $options.handleRemove,\n onPreviewError: _cache[7] || (_cache[7] = f => f.url = require('@/assets/404.png'))\n }, null, 8, [\"file\", \"onCopy\", \"onRemove\"]);\n }), 128))]),\n _: 1\n }, 8, [\"onScroll\"])], 2)]),\n _: 1\n }, 8, [\"class\"])]);\n}","/**\r\n * URL 构建工具函数\r\n * 用于生成各种格式的文件链接(原始链接、Markdown、HTML、BBCode)\r\n */\r\n\r\n/**\r\n * 根据 srcID 和文件名生成所有格式的 URL\r\n * @param {string} srcID - 文件资源 ID\r\n * @param {string} name - 文件名\r\n * @param {string} rootUrl - 链接前缀\r\n * @returns {{ finalURL: string, mdURL: string, htmlURL: string, ubbURL: string }}\r\n */\r\nexport function buildFileUrls(srcID, name, rootUrl) {\r\n const url = rootUrl + srcID\r\n return {\r\n finalURL: url,\r\n mdURL: `![${name}](${url})`,\r\n htmlURL: `\"${name}\"`,\r\n ubbURL: `[img]${url}[/img]`\r\n }\r\n}\r\n\r\n/**\r\n * 根据 selectedUrlForm 获取对应格式的 URL 值\r\n * @param {object} file - 文件对象,包含 finalURL/mdURL/htmlURL/ubbURL\r\n * @param {string} format - 格式类型:'url' | 'md' | 'html' | 'ubb'\r\n * @returns {string}\r\n */\r\nexport function getUrlByFormat(file, format) {\r\n const map = {\r\n url: file.finalURL,\r\n md: file.mdURL,\r\n html: file.htmlURL,\r\n ubb: file.ubbURL\r\n }\r\n return map[format] || file.finalURL\r\n}\r\n\r\n/**\r\n * 批量更新文件列表中的 URL(当自定义链接前缀变化时)\r\n * @param {Array} fileList - 文件列表\r\n * @param {string} rootUrl - 新的链接前缀\r\n */\r\nexport function updateFileListUrls(fileList, rootUrl) {\r\n fileList.forEach(item => {\r\n if (item.uploadChannel === 'external') {\r\n return\r\n }\r\n const urls = buildFileUrls(item.srcID, item.name, rootUrl)\r\n Object.assign(item, urls)\r\n })\r\n}\r\n","/**\r\n * SHA256 计算工具\r\n * 纯 JavaScript 实现的增量 SHA256 哈希算法,支持任意大小文件\r\n */\r\n\r\n// SHA256 常量\r\nconst K = new Uint32Array([\r\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\r\n])\r\n\r\nconst rotr = (x, n) => (x >>> n) | (x << (32 - n))\r\n\r\nfunction processBlock(block, H) {\r\n const W = new Uint32Array(64)\r\n\r\n for (let i = 0; i < 16; i++) {\r\n W[i] = (block[i * 4] << 24) | (block[i * 4 + 1] << 16) | (block[i * 4 + 2] << 8) | block[i * 4 + 3]\r\n }\r\n\r\n for (let i = 16; i < 64; i++) {\r\n const s0 = rotr(W[i - 15], 7) ^ rotr(W[i - 15], 18) ^ (W[i - 15] >>> 3)\r\n const s1 = rotr(W[i - 2], 17) ^ rotr(W[i - 2], 19) ^ (W[i - 2] >>> 10)\r\n W[i] = (W[i - 16] + s0 + W[i - 7] + s1) >>> 0\r\n }\r\n\r\n let [a, b, c, d, e, f, g, h] = H\r\n\r\n for (let i = 0; i < 64; i++) {\r\n const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)\r\n const ch = (e & f) ^ (~e & g)\r\n const temp1 = (h + S1 + ch + K[i] + W[i]) >>> 0\r\n const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)\r\n const maj = (a & b) ^ (a & c) ^ (b & c)\r\n const temp2 = (S0 + maj) >>> 0\r\n\r\n h = g; g = f; f = e\r\n e = (d + temp1) >>> 0\r\n d = c; c = b; b = a\r\n a = (temp1 + temp2) >>> 0\r\n }\r\n\r\n H[0] = (H[0] + a) >>> 0\r\n H[1] = (H[1] + b) >>> 0\r\n H[2] = (H[2] + c) >>> 0\r\n H[3] = (H[3] + d) >>> 0\r\n H[4] = (H[4] + e) >>> 0\r\n H[5] = (H[5] + f) >>> 0\r\n H[6] = (H[6] + g) >>> 0\r\n H[7] = (H[7] + h) >>> 0\r\n}\r\n\r\n/**\r\n * 创建增量 SHA256 哈希器\r\n * @returns {{ update: (data: Uint8Array) => void, digest: () => string }}\r\n */\r\nexport function createSha256() {\r\n let H = new Uint32Array([\r\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\r\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\r\n ])\r\n\r\n let buffer = new Uint8Array(64)\r\n let bufferLength = 0\r\n let totalLength = 0\r\n\r\n return {\r\n update(data) {\r\n totalLength += data.length\r\n let offset = 0\r\n\r\n if (bufferLength > 0) {\r\n const needed = 64 - bufferLength\r\n const toCopy = Math.min(needed, data.length)\r\n buffer.set(data.subarray(0, toCopy), bufferLength)\r\n bufferLength += toCopy\r\n offset = toCopy\r\n\r\n if (bufferLength === 64) {\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n }\r\n\r\n while (offset + 64 <= data.length) {\r\n processBlock(data.subarray(offset, offset + 64), H)\r\n offset += 64\r\n }\r\n\r\n if (offset < data.length) {\r\n buffer.set(data.subarray(offset), 0)\r\n bufferLength = data.length - offset\r\n }\r\n },\r\n digest() {\r\n const bitLength = totalLength * 8\r\n\r\n // Padding\r\n buffer[bufferLength++] = 0x80\r\n\r\n if (bufferLength > 56) {\r\n buffer.fill(0, bufferLength, 64)\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n\r\n buffer.fill(0, bufferLength, 56)\r\n\r\n // Length in bits (big-endian, 64-bit)\r\n const view = new DataView(buffer.buffer)\r\n view.setUint32(56, Math.floor(bitLength / 0x100000000), false)\r\n view.setUint32(60, bitLength >>> 0, false)\r\n\r\n processBlock(buffer, H)\r\n\r\n // Convert to hex\r\n let hex = ''\r\n for (let i = 0; i < 8; i++) {\r\n hex += H[i].toString(16).padStart(8, '0')\r\n }\r\n return hex\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 计算文件的 SHA256 哈希\r\n * 使用增量哈希算法,支持任意大小文件\r\n * @param {File} file - 要计算哈希的文件\r\n * @returns {Promise} SHA256 哈希值(十六进制字符串)\r\n */\r\nexport async function computeSha256(file) {\r\n const sha256 = createSha256()\r\n\r\n const CHUNK_SIZE = 4 * 1024 * 1024 // 4MB chunks\r\n let offset = 0\r\n\r\n while (offset < file.size) {\r\n const chunk = file.slice(offset, Math.min(offset + CHUNK_SIZE, file.size))\r\n const buffer = await chunk.arrayBuffer()\r\n sha256.update(new Uint8Array(buffer))\r\n offset += CHUNK_SIZE\r\n\r\n // 每处理 20MB 打印一次进度\r\n if (offset % (20 * 1024 * 1024) < CHUNK_SIZE) {\r\n console.log(`SHA256 progress: ${Math.min(100, Math.round(offset / file.size * 100))}%`)\r\n }\r\n }\r\n\r\n return sha256.digest()\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.array-buffer.detached.js\";\nimport \"core-js/modules/es.array-buffer.transfer.js\";\nimport \"core-js/modules/es.array-buffer.transfer-to-fixed-length.js\";\nimport \"core-js/modules/es.iterator.constructor.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.iterator.reduce.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/es.typed-array.with.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nimport \"core-js/modules/esnext.uint8-array.set-from-base64.js\";\nimport \"core-js/modules/esnext.uint8-array.set-from-hex.js\";\nimport \"core-js/modules/esnext.uint8-array.to-base64.js\";\nimport \"core-js/modules/esnext.uint8-array.to-hex.js\";\nimport \"core-js/modules/web.dom-exception.stack.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 axios from '@/utils/axios';\nimport * as imageConversion from 'image-conversion';\nimport { mapGetters } from 'vuex';\nimport { buildFileUrls, updateFileListUrls, getUrlByFormat } from '@/utils/upload/urlBuilder';\nimport { computeSha256 } from '@/utils/upload/sha256';\nimport UploadFileItem from '@/components/upload/UploadFileItem.vue';\nexport default {\n name: 'UploadForm',\n components: {\n UploadFileItem\n },\n props: {\n selectedUrlForm: {\n type: String,\n default: 'url',\n required: false\n },\n customerCompress: {\n type: Boolean,\n default: true,\n required: false\n },\n compressQuality: {\n type: Number,\n default: 4,\n required: false\n },\n compressBar: {\n type: Number,\n default: 5,\n required: false\n },\n serverCompress: {\n type: Boolean,\n default: true,\n required: false\n },\n uploadChannel: {\n type: String,\n default: 'telegram',\n required: false\n },\n channelName: {\n type: String,\n default: '',\n required: false\n },\n uploadNameType: {\n type: String,\n default: 'default',\n required: false\n },\n useCustomUrl: {\n type: String,\n default: 'false',\n required: false\n },\n customUrlPrefix: {\n type: String,\n default: '',\n required: false\n },\n autoRetry: {\n type: Boolean,\n default: true,\n required: false\n },\n urlPrefix: {\n type: String,\n default: '',\n required: false\n },\n uploadMethod: {\n type: String,\n default: 'default',\n required: false\n },\n uploadFolder: {\n type: String,\n default: '',\n required: false\n },\n convertToWebp: {\n type: Boolean,\n default: false,\n required: false\n }\n },\n data() {\n return {\n fileList: [],\n uploading: false,\n maxUploading: 6,\n exceptionList: [],\n listScrolled: false,\n fileListLength: 0,\n uploadCount: 0,\n pastedUrls: '',\n pasteUploadMethod: 'save',\n // 失败文件自动重试相关\n autoReUpload: true,\n maxRetryCount: 10,\n // 最大重试次数\n retryTimer: null,\n // 自动重试定时器\n retryDelay: 12000,\n // 重试延迟时间(毫秒)\n // 批量上传并发控制\n uploadQueue: [],\n // 等待上传的文件队列\n activeUploads: 0,\n // 当前正在上传的文件数\n maxConcurrentUploads: 6,\n // 最大并发上传数\n // 取消上传控制\n abortControllers: new Map() // 存储每个文件的 AbortController\n };\n },\n watch: {\n fileList: {\n handler() {\n if (this.fileList.length > this.fileListLength) {\n this.$nextTick(() => {\n setTimeout(() => {\n if (this.$refs.scrollContainer) {\n // this.$refs.scrollContainer.setScrollTop(this.$refs.scrollContainer.wrapRef.scrollHeight) // 滚动到底部\n this.$refs.scrollContainer.setScrollTop(0); // 滚动到顶部\n }\n }, 100);\n });\n }\n this.fileListLength = this.fileList.length;\n },\n deep: true\n },\n useCustomUrl: {\n handler() {\n updateFileListUrls(this.fileList, this.rootUrl);\n },\n immediate: true\n },\n customUrlPrefix: {\n handler() {\n if (this.useCustomUrl === 'true') {\n updateFileListUrls(this.fileList, this.rootUrl);\n }\n },\n immediate: true\n },\n autoReUpload(val) {\n this.$store.commit('setStoreAutoReUpload', val);\n }\n },\n computed: {\n ...mapGetters(['storeAutoReUpload']),\n uploadSuccessCount() {\n return this.fileList.filter(item => item.status === 'done' || item.status === 'success').length;\n },\n uploadErrorCount() {\n return this.fileList.filter(item => item.status === 'exception').length;\n },\n uploadingCount() {\n return this.fileList.filter(item => item.status === 'uploading').length;\n },\n waitingCount() {\n return this.uploadQueue.length;\n },\n urlSize() {\n // 移动端为small\n return window.innerWidth < 768 ? 'small' : 'default';\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n rootUrl() {\n // 链接前缀,优先级:用户自定义 > urlPrefix > 默认\n return this.useCustomUrl === 'true' ? this.customUrlPrefix : this.urlPrefix || `${window.location.protocol}//${window.location.host}/file/`;\n },\n pasteCardMethodButtonSize() {\n if (this.fileList.length) {\n return 'small';\n } else {\n return window.innerWidth < 768 ? 'small' : 'medium';\n }\n }\n },\n mounted() {\n document.addEventListener('paste', this.handlePaste);\n this.autoReUpload = this.storeAutoReUpload;\n },\n beforeUnmount() {\n document.removeEventListener('paste', this.handlePaste);\n // 清理状态\n this.uploadQueue = [];\n this.fileList = [];\n this.activeUploads = 0;\n },\n methods: {\n // 文件名中间截断,保留前缀和扩展名\n truncateFilename(filename, maxLength = 20) {\n if (!filename || filename.length <= maxLength) {\n return filename;\n }\n const lastDotIndex = filename.lastIndexOf('.');\n let name, ext;\n if (lastDotIndex > 0) {\n name = filename.substring(0, lastDotIndex);\n ext = filename.substring(lastDotIndex);\n } else {\n name = filename;\n ext = '';\n }\n // 保留扩展名和部分前后缀\n const keepEnd = ext.length + 4; // 扩展名 + 4个字符\n const keepStart = maxLength - keepEnd - 3; // 3个字符留给...\n if (keepStart <= 0) {\n return filename.substring(0, maxLength - 3) + '...';\n }\n return name.substring(0, keepStart) + '...' + name.slice(-4) + ext;\n },\n uploadFile(file) {\n // 如果fileList中不存在该文件,说明已被删除,直接返回\n if (!this.fileList.find(item => item.uid === file.file.uid)) {\n return;\n }\n\n // 并发控制:如果当前上传数已达上限,加入队列等待\n if (this.activeUploads >= this.maxConcurrentUploads) {\n this.uploadQueue.push(file);\n const waitingItem = this.fileList.find(item => item.uid === file.file.uid);\n if (waitingItem) waitingItem.status = 'waiting';\n return;\n }\n\n // 开始上传,增加计数\n this.activeUploads++;\n const uploadingItem = this.fileList.find(item => item.uid === file.file.uid);\n if (uploadingItem) uploadingItem.status = 'uploading';\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n const uploadChannel = fileItem?.uploadChannel || this.uploadChannel;\n\n // 如果上传渠道为外链,直接使用外链上传\n if (uploadChannel === 'external') {\n this.uploadSingleFile(file);\n return;\n }\n\n // HuggingFace 渠道:根据文件大小选择上传方式\n // 小文件(<20MB):通过 CF Workers 代理上传\n // 大文件(>=20MB):前端直传到 HuggingFace S3,绕过 CF Workers 限制\n if (uploadChannel === 'huggingface') {\n const HF_DIRECT_THRESHOLD = 20 * 1024 * 1024; // 20MB\n if (file.file.size >= HF_DIRECT_THRESHOLD) {\n this.uploadToHuggingFaceDirect(file);\n } else {\n this.uploadSingleFile(file);\n }\n return;\n }\n\n // Discord 渠道:限制 10MB,超过 9MB 就用分块上传(留安全余量)\n if (uploadChannel === 'discord') {\n const DISCORD_CHUNK_THRESHOLD = 9 * 1024 * 1024; // 9MB\n if (file.file.size > DISCORD_CHUNK_THRESHOLD) {\n this.uploadFileInChunks(file);\n } else {\n this.uploadSingleFile(file);\n }\n return;\n }\n\n // 其他渠道,检查文件大小,决定是否使用分块上传\n const CHUNK_THRESHOLD = 20 * 1024 * 1024; // 20MB\n if (file.file.size > CHUNK_THRESHOLD) {\n this.uploadFileInChunks(file);\n } else {\n this.uploadSingleFile(file);\n }\n },\n // 处理上传队列中的下一个文件\n processUploadQueue() {\n // 如果队列为空或已达并发上限,不处理\n if (this.uploadQueue.length === 0 || this.activeUploads >= this.maxConcurrentUploads) {\n return;\n }\n\n // 从队列中取出下一个文件并上传\n const nextFile = this.uploadQueue.shift();\n if (nextFile && this.fileList.find(item => item.uid === nextFile.file.uid)) {\n this.uploadFile(nextFile);\n } else {\n // 如果文件已被删除,继续处理下一个\n this.processUploadQueue();\n }\n },\n // 上传完成后的清理工作(成功或失败都调用)\n onUploadComplete() {\n this.activeUploads = Math.max(0, this.activeUploads - 1);\n\n // 处理队列中的下一个文件\n this.processUploadQueue();\n\n // 更新上传状态\n if (this.activeUploads === 0 && this.uploadQueue.length === 0) {\n this.uploading = false;\n }\n },\n // 单文件上传\n async uploadSingleFile(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return; // 文件已被删除\n\n const needServerCompress = fileItem.serverCompress;\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n const autoRetry = this.autoRetry && uploadChannel !== 'external';\n const uploadNameType = uploadChannel === 'external' ? 'default' : this.uploadNameType;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n const formData = new FormData();\n formData.append('file', file.file);\n if (uploadChannel === 'external') {\n formData.append('url', file.file.url);\n }\n\n // HuggingFace 渠道:在前端预计算 SHA256,避免后端 CPU 超时\n if (uploadChannel === 'huggingface') {\n try {\n console.log('Computing SHA256 for HuggingFace upload...');\n const sha256 = await computeSha256(file.file);\n formData.append('sha256', sha256);\n console.log('SHA256 computed:', sha256);\n } catch (err) {\n console.error('Failed to compute SHA256:', err);\n // 继续上传,让后端计算(可能会超时)\n }\n }\n axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder),\n method: 'post',\n data: formData,\n withAuthCode: true,\n signal: abortController.signal,\n // 添加取消信号\n onUploadProgress: progressEvent => {\n const percentCompleted = Math.round(progressEvent.loaded / progressEvent.total * 100);\n file.onProgress({\n percent: percentCompleted,\n file: file.file\n });\n }\n }).then(res => {\n file.onSuccess(res, file.file);\n }).catch(err => {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n console.log('上传已取消:', file.file.name);\n return;\n }\n if (err.response && err.response.status !== 401) {\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } else if (!err.response) {\n // 网络错误(如 ERR_HTTP2_PROTOCOL_ERROR),也加入异常列表\n this.exceptionList.push(file);\n file.onError(err, file.file);\n }\n }).finally(() => {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n });\n },\n // 分块上传\n async uploadFileInChunks(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return; // 文件已被删除\n\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n\n // Discord 使用 9MB 分块(留安全余量,Discord 限制 10MB)\n // Telegram 使用 16MB 分块(TG Bot getFile 下载限制 20MB,留 4MB 安全余量)\n // 其他渠道使用 16MB 分块\n const CHUNK_SIZE = uploadChannel === 'discord' ? 9 * 1024 * 1024 // 9MB for Discord\n : 16 * 1024 * 1024; // 16MB for Telegram and others (TG getFile limit: 20MB)\n\n const fileSize = file.file.size;\n const totalChunks = Math.ceil(fileSize / CHUNK_SIZE);\n const needServerCompress = fileItem.serverCompress;\n const autoRetry = this.autoRetry && uploadChannel !== 'external';\n const uploadNameType = uploadChannel === 'external' ? 'default' : this.uploadNameType;\n\n // HuggingFace 渠道:在前端预计算 SHA256\n let precomputedSha256 = null;\n if (uploadChannel === 'huggingface') {\n try {\n console.log('Computing SHA256 for HuggingFace chunked upload...');\n precomputedSha256 = await computeSha256(file.file);\n console.log('SHA256 computed:', precomputedSha256);\n } catch (err) {\n console.error('Failed to compute SHA256:', err);\n }\n }\n try {\n // 第一步:初始化分块上传,获取uploadId\n const initFormData = new FormData();\n initFormData.append('originalFileName', file.file.name);\n initFormData.append('originalFileType', file.file.type);\n initFormData.append('totalChunks', totalChunks.toString());\n const initResponse = await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&initChunked=true',\n method: 'post',\n data: initFormData,\n withAuthCode: true\n });\n if (!initResponse.data.success) {\n throw new Error(this.$t('uploadForm.chunkInitFailed') + ': ' + initResponse.data.message);\n }\n const uploadId = initResponse.data.uploadId;\n console.log('分块上传初始化成功,uploadId:', uploadId);\n\n // 记录 totalChunks 和 uploadId 到文件项,用于后续清理\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (fileItem) {\n fileItem.totalChunks = totalChunks;\n fileItem.uploadId = uploadId;\n }\n\n // 第二步:并发上传所有分块\n const maxConcurrency = 3; // 最大并发数\n const chunkProgress = new Array(totalChunks).fill(0);\n let nextChunkIndex = 0;\n let hasError = false;\n let errorMsg = '';\n let isCancelled = false; // 标记是否被取消\n\n const uploadChunk = async chunkIndex => {\n if (hasError || isCancelled) return;\n const start = chunkIndex * CHUNK_SIZE;\n const end = Math.min(start + CHUNK_SIZE, fileSize);\n const chunk = file.file.slice(start, end);\n const formData = new FormData();\n formData.append('file', chunk, `${file.file.name}.part${chunkIndex.toString().padStart(3, '0')}`);\n formData.append('chunkIndex', chunkIndex.toString());\n formData.append('totalChunks', totalChunks.toString());\n formData.append('uploadId', uploadId);\n formData.append('originalFileName', file.file.name);\n formData.append('originalFileType', file.file.type);\n let retryCount = 0;\n const maxRetries = 3;\n while (retryCount < maxRetries) {\n if (hasError || isCancelled) return;\n try {\n await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&chunked=true',\n method: 'post',\n data: formData,\n withAuthCode: true,\n signal: abortController.signal,\n // 添加取消信号\n onUploadProgress: progressEvent => {\n if (hasError || isCancelled) return;\n const percent = Math.round(progressEvent.loaded / progressEvent.total * 100);\n chunkProgress[chunkIndex] = percent;\n const totalPercent = Math.round(chunkProgress.reduce((a, b) => a + b, 0) / totalChunks);\n file.onProgress({\n percent: totalPercent,\n file: file.file\n });\n }\n });\n return; // Success\n } catch (err) {\n // 如果是取消操作,直接返回\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n isCancelled = true;\n console.log('分块上传已取消:', file.file.name);\n return;\n }\n retryCount++;\n console.warn(`分块 ${chunkIndex + 1}/${totalChunks} 上传失败 (重试 ${retryCount}/${maxRetries}):`, err);\n if (retryCount >= maxRetries) {\n hasError = true;\n errorMsg = `分块 ${chunkIndex + 1}/${totalChunks} 上传失败: ${err.message}`;\n throw new Error(errorMsg);\n }\n // 等待后重试\n await new Promise(resolve => setTimeout(resolve, 2000 * retryCount));\n }\n }\n };\n\n // 创建并发池\n const pool = [];\n for (let i = 0; i < maxConcurrency; i++) {\n pool.push((async () => {\n while (nextChunkIndex < totalChunks && !hasError && !isCancelled) {\n const currentIndex = nextChunkIndex++;\n try {\n await uploadChunk(currentIndex);\n } catch (e) {\n if (!isCancelled) {\n hasError = true;\n errorMsg = e.message;\n }\n break;\n }\n }\n })());\n }\n await Promise.all(pool);\n\n // 如果被取消,直接返回\n if (isCancelled) {\n console.log('分块上传已取消,跳过合并步骤');\n return;\n }\n if (hasError) {\n throw new Error(errorMsg || this.$t('uploadForm.uploadError'));\n }\n\n // 第三步:所有分块上传完成,发送合并请求\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.chunkMerging'),\n duration: 0 // 不自动关闭\n });\n const mergeFormData = new FormData();\n mergeFormData.append('uploadId', uploadId);\n mergeFormData.append('totalChunks', totalChunks.toString());\n mergeFormData.append('originalFileName', file.file.name);\n mergeFormData.append('originalFileType', file.file.type);\n // HuggingFace 渠道:传递预计算的 SHA256\n if (precomputedSha256) {\n mergeFormData.append('sha256', precomputedSha256);\n }\n const response = await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&chunked=true&merge=true',\n method: 'post',\n data: mergeFormData,\n withAuthCode: true\n });\n\n // 关闭提示\n this.$message.closeAll();\n\n // 同步处理完成\n file.onSuccess(response, file.file);\n } catch (err) {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n console.log('分块上传已取消:', file.file.name);\n return;\n }\n console.error('分块上传失败:', err);\n\n // 如果有uploadId,清理相关资源\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (fileItem && fileItem.uploadId) {\n this.cleanupUploadResources(fileItem.uploadId, fileItem.totalChunks).then(() => {\n console.log(`已清理分块上传失败的资源: ${fileItem.uploadId}`);\n }).catch(cleanupError => {\n console.warn('清理分块上传失败资源时出错:', cleanupError);\n });\n }\n if (err.response && err.response.status !== 401) {\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } else if (!err.response) {\n // 网络错误,也加入异常列表\n this.exceptionList.push(file);\n file.onError(err, file.file);\n }\n } finally {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n }\n },\n handleRemove(file) {\n // 如果文件正在上传,取消上传\n if (this.abortControllers.has(file.uid)) {\n this.abortControllers.get(file.uid).abort();\n this.abortControllers.delete(file.uid);\n }\n // 从上传队列中移除(如果在等待中)\n this.uploadQueue = this.uploadQueue.filter(item => item.file.uid !== file.uid);\n // 从文件列表中移除\n this.fileList = this.fileList.filter(item => item.uid !== file.uid);\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.deleted', {\n name: this.truncateFilename(file.name)\n })\n });\n },\n // 清理上传资源\n async cleanupUploadResources(uploadId, totalChunks = 0) {\n try {\n await axios({\n url: `/upload?cleanup=true&uploadId=${uploadId}&totalChunks=${totalChunks}`,\n method: 'get',\n withAuthCode: true,\n timeout: 5000\n });\n console.log(`清理上传资源成功: ${uploadId}`);\n } catch (error) {\n console.warn('清理上传资源失败:', error);\n }\n },\n handleSuccess(response, file) {\n const fileItem = this.fileList.find(item => item.uid === file.uid);\n if (!fileItem) return; // 文件已被删除\n\n try {\n // 对上传渠道为外链的,不修改链接\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n if (uploadChannel !== 'external') {\n // 从response.data[0].src中去除/file/前缀\n const srcID = response.data[0].src.replace('/file/', '');\n fileItem.url = `${window.location.protocol}//${window.location.host}/file/` + srcID;\n const urls = buildFileUrls(srcID, file.name, this.rootUrl);\n Object.assign(fileItem, urls);\n fileItem.srcID = srcID;\n }\n fileItem.progreess = 100;\n fileItem.status = 'success';\n\n // Save to history\n this.saveToHistory(fileItem);\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.uploadSuccess', {\n name: this.truncateFilename(file.name)\n })\n });\n setTimeout(() => {\n const item = this.fileList.find(item => item.uid === file.uid);\n if (item) item.status = 'done';\n }, 1000);\n } catch (error) {\n this.$message.error(this.$t('uploadForm.uploadFailed', {\n name: this.truncateFilename(file.name)\n }));\n fileItem.status = 'exception';\n }\n // 注意:并发控制的 onUploadComplete 已在各上传方法的 finally 中调用\n },\n saveToHistory(fileItem) {\n try {\n const history = JSON.parse(localStorage.getItem('uploadHistory') || '[]');\n const newRecord = {\n name: fileItem.name,\n url: fileItem.finalURL,\n time: Date.now(),\n type: fileItem.name.split('.').pop().toLowerCase()\n };\n history.push(newRecord);\n localStorage.setItem('uploadHistory', JSON.stringify(history));\n } catch (e) {\n console.error('Failed to save history', e);\n }\n },\n handleError(err, file) {\n const fileItem = this.fileList.find(item => item.uid === file.uid);\n if (!fileItem) return; // 文件已被删除\n\n this.$message.error(this.$t('uploadForm.uploadFailed', {\n name: this.truncateFilename(file.name)\n }));\n fileItem.status = 'exception';\n\n // 如果开启了自动重试,安排自动重试\n if (this.autoReUpload) {\n this.scheduleAutoRetry();\n }\n // 注意:并发控制的 onUploadComplete 已在各上传方法的 finally 中调用\n },\n handleCopy(file) {\n const status = this.fileList.find(item => item.uid === file.uid).status;\n if (status !== 'done' && status !== 'success') {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.fileNotUploaded')\n });\n return;\n }\n navigator.clipboard.writeText(getUrlByFormat(file, this.selectedUrlForm));\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copySuccess')\n });\n },\n beforeUpload(file) {\n return new Promise(async (resolve, reject) => {\n let processedFile = file;\n\n // WebP 转换:在压缩之前进行\n // 条件:1.开启WebP转换 2.文件类型为图片 3.不是WebP/GIF/SVG格式\n const canConvertToWebp = this.convertToWebp && file.type.includes('image') && !file.type.includes('webp') && !file.type.includes('gif') && !file.type.includes('svg');\n if (canConvertToWebp) {\n try {\n const convertedFile = await this.convertImageToWebp(file);\n if (convertedFile) {\n processedFile = convertedFile;\n console.log(`WebP转换成功: ${file.name} -> ${convertedFile.name}, 大小: ${(file.size / 1024).toFixed(1)}KB -> ${(convertedFile.size / 1024).toFixed(1)}KB`);\n }\n } catch (err) {\n console.warn('WebP转换失败,使用原文件:', err);\n // 转换失败,继续使用原文件\n }\n }\n\n // 客户端压缩条件:1.文件类型为图片 2.开启客户端压缩,且文件大小大于压缩阈值\n const needCustomCompress = processedFile.type.includes('image') && this.customerCompress && processedFile.size / 1024 / 1024 > this.compressBar;\n const isLtLim = processedFile.size / 1024 / 1024 <= 1024 || this.uploadChannel !== 'telegram';\n const pushFileToQueue = (file, serverCompress) => {\n const fileUrl = URL.createObjectURL(file);\n this.fileList.push({\n uid: file.uid,\n name: file.name,\n url: fileUrl,\n finalURL: '',\n mdURL: '',\n htmlURL: '',\n ubbURL: '',\n srcID: '',\n status: 'uploading',\n progreess: 0,\n serverCompress: serverCompress,\n retryCount: 0\n });\n resolve(file);\n };\n if (needCustomCompress) {\n //尝试压缩图片\n imageConversion.compressAccurately(processedFile, 1024 * this.compressQuality).then(res => {\n //如果压缩后大于1024MB,且上传渠道为telegram,则不上传\n if (res.size / 1024 / 1024 > 1024 && this.uploadChannel === 'telegram') {\n this.$message.error(this.$t('uploadForm.compressedFileTooLarge', {\n name: processedFile.name\n }));\n reject(this.$t('uploadForm.fileSizeTooLarge'));\n }\n this.uploading = true;\n //将res包装成新的file\n const newFile = new File([res], processedFile.name, {\n type: res.type\n });\n newFile.uid = file.uid;\n const myUploadCount = this.uploadCount++;\n\n //开启服务端压缩条件:1.开启服务端压缩 2.文件大小小于10MB 3.上传渠道为Telegram\n const needServerCompress = this.serverCompress && newFile.size / 1024 / 1024 < 10 && this.uploadChannel === 'telegram';\n if (myUploadCount === 0) {\n pushFileToQueue(newFile, needServerCompress);\n } else {\n setTimeout(() => {\n pushFileToQueue(newFile, needServerCompress);\n this.uploadCount--;\n }, 300 * myUploadCount);\n }\n }).catch(err => {\n this.$message.error(this.$t('uploadForm.compressFailedCannotUpload', {\n name: processedFile.name\n }));\n reject(err);\n });\n } else if (isLtLim) {\n this.uploading = true;\n const myUploadCount = this.uploadCount++;\n\n // 开启服务端压缩条件:1.上传渠道为Telegram 2.开启服务端压缩 3.如果为图片,则文件大小小于10MB,否则不限制大小\n const needServerCompress = this.uploadChannel === 'telegram' && this.serverCompress && (processedFile.type.includes('image') ? processedFile.size / 1024 / 1024 < 10 : true);\n if (myUploadCount === 0) {\n pushFileToQueue(processedFile, needServerCompress);\n } else {\n setTimeout(() => {\n pushFileToQueue(processedFile, needServerCompress);\n this.uploadCount--;\n }, 300 * myUploadCount);\n }\n } else {\n this.$message.error(this.$t('uploadForm.fileTooLarge', {\n name: processedFile.name\n }));\n reject(this.$t('uploadForm.fileSizeTooLarge'));\n }\n });\n },\n handleProgress(event) {\n const fileItem = this.fileList.find(item => item.uid === event.file.uid);\n if (fileItem) {\n fileItem.progreess = event.percent;\n }\n },\n copyAll() {\n const urls = this.fileList.filter(item => item.status === 'done' || item.status === 'success').map(item => getUrlByFormat(item, this.selectedUrlForm)).join('\\n');\n navigator.clipboard.writeText(urls);\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copyAllSuccess')\n });\n },\n clearFileList() {\n if (this.fileList.length > 0) {\n // 取消所有正在上传的文件\n this.abortControllers.forEach((controller, uid) => {\n controller.abort();\n });\n this.abortControllers.clear();\n // 清空上传队列\n this.uploadQueue = [];\n // 清空文件列表\n this.fileList = [];\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.fileListCleared')\n });\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.fileListEmpty')\n });\n }\n },\n clearSuccessList() {\n if (this.uploadSuccessCount > 0) {\n this.fileList = this.fileList.filter(item => item.status !== 'done' && item.status !== 'success');\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.successFilesCleared')\n });\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.successFilesEmpty')\n });\n }\n },\n handlePaste(event) {\n // 当粘贴位置是文本框时,不执行该操作\n if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {\n return;\n }\n const items = event.clipboardData.items;\n if (items.length > 0) {\n this.uploadFromUrl(items);\n }\n },\n handleUploadPasteUrls() {\n // 用于上传在上传文本框中粘贴的外链\n const urls = this.pastedUrls.split('\\n');\n // 处理空行和首尾空字符,链接须符合URL规范\n const validUrls = urls.map(url => url.trim()).filter(url => url !== '').filter(url => /^(https?:\\/\\/[^\\s$.?#].[^\\s]*)$/.test(url));\n\n // 根据粘贴上传方式进行上传\n if (this.pasteUploadMethod === 'save') {\n // 正常上传\n this.uploadFromUrl(validUrls.map(url => {\n return {\n kind: 'string',\n getAsString: callback => {\n callback(url);\n }\n };\n }));\n } else if (this.pasteUploadMethod === 'external') {\n // 仅保存外链,使用 external 渠道上传\n for (let i = 0; i < validUrls.length; i++) {\n const url = validUrls[i];\n const fileName = url.split('/').pop();\n const mdUrl = `![${fileName}](${url})`;\n const htmlUrl = `\"${fileName}\"`;\n const ubbUrl = `[img]${url}[/img]`;\n // 将 url 作为文件内容,文件名为 URL 的最后一部分\n const file = new File([], url.split('/').pop(), {\n type: 'text/plain'\n });\n file.uid = Date.now() + i;\n file.url = url;\n this.fileList.push({\n uid: file.uid,\n name: file.name,\n url: url,\n finalURL: url,\n mdURL: mdUrl,\n htmlURL: htmlUrl,\n ubbURL: ubbUrl,\n srcID: url,\n status: 'uploading',\n progreess: 0,\n serverCompress: false,\n uploadChannel: 'external',\n retryCount: 0\n });\n // 上传\n this.uploadFile({\n file: file,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }\n },\n uploadFromUrl(items) {\n for (let i = 0; i < items.length; i++) {\n if (items[i].kind === 'file') {\n const file = items[i].getAsFile();\n // 允许上传任意类型的文件\n file.uid = Date.now() + i;\n //接收beforeUpload的Promise对象\n const checkResult = this.beforeUpload(file);\n if (checkResult instanceof Promise) {\n checkResult.then(newFile => {\n if (newFile instanceof File) {\n this.uploadFile({\n file: newFile,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }).catch(err => {\n console.log(err);\n });\n }\n } else if (items[i].kind === 'string') {\n items[i].getAsString(text => {\n const urlPattern = /^(https?:\\/\\/[^\\s$.?#].[^\\s]*)$/;\n let fileName = '';\n if (urlPattern.test(text)) {\n axios.post('/api/fetchRes', {\n url: text\n }, {\n responseType: 'blob',\n withAuthCode: true\n }).then(response => {\n const contentType = response.headers['content-type'];\n if (response.status == 200) {\n // 提取文件名\n const disposition = response.headers['content-disposition'];\n if (disposition) {\n const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\n const filenameStarRegex = /filename\\*\\s*=\\s*UTF-8''([^;\\n]*)/; // 处理 filename*\n\n let matches = filenameRegex.exec(disposition);\n if (matches != null && matches[1]) {\n fileName = matches[1].replace(/['\"]/g, '');\n // 尝试解码\n try {\n fileName = decodeURIComponent(fileName);\n } catch (e) {\n fileName = '';\n }\n }\n if (fileName === '') {\n matches = filenameStarRegex.exec(disposition); // 尝试匹配 filename*\n if (matches != null && matches[1]) {\n fileName = decodeURIComponent(matches[1]);\n }\n }\n }\n // 尝试从URL中提取文件名\n if (fileName === '') {\n const url = new URL(text);\n fileName = url.pathname.split('/').pop();\n }\n // 未提取到文件名,使用默认文件名\n if (fileName === '') {\n // 获取文件后缀\n const url = new URL(text);\n let extension = url.pathname.split('.').pop();\n // 未能从URL提取有效后缀,使用bin作为默认后缀\n if (!extension || extension === '' || extension.length > 10) {\n extension = 'bin';\n }\n fileName = 'PastedFile' + Date.now() + i + '.' + extension;\n }\n\n // 读取文件内容\n const blob = response.data;\n const file = new File([blob], fileName, {\n type: blob.type\n });\n file.uid = Date.now() + i;\n // 接收beforeUpload的Promise对象\n const checkResult = this.beforeUpload(file);\n if (checkResult instanceof Promise) {\n checkResult.then(newFile => {\n if (newFile instanceof File) {\n this.uploadFile({\n file: newFile,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }).catch(err => {\n console.log(err);\n });\n }\n } else {\n throw new Error('URL地址请求失败');\n }\n }).catch(error => {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.urlRequestFailed')\n });\n });\n }\n });\n }\n }\n },\n handleScroll(event) {\n this.listScrolled = event.scrollTop > 0 && this.fileList.length > 0;\n },\n retryError() {\n if (this.exceptionList.length > 0) {\n this.retryFailedFiles(this.exceptionList);\n this.exceptionList = [];\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.noFailedFiles')\n });\n }\n },\n handleAutoRetryChange(val) {\n this.$message({\n type: val ? 'success' : 'info',\n message: val ? this.$t('uploadForm.autoRetryOn') : this.$t('uploadForm.autoRetryOff')\n });\n\n // 如果开启自动重试且有失败文件,立即开始重试\n if (val && this.exceptionList.length > 0) {\n this.scheduleAutoRetry();\n }\n },\n retryFailedFiles(files) {\n files.forEach(file => {\n const retryCount = file.retryCount || 0;\n if (retryCount < this.maxRetryCount) {\n file.retryCount = retryCount + 1;\n this.uploadFile({\n file: file.file,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n } else {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.maxRetryReached', {\n name: file.name,\n max: this.maxRetryCount\n })\n });\n }\n });\n },\n scheduleAutoRetry() {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n this.retryTimer = setTimeout(() => {\n if (this.autoReUpload && this.exceptionList.length > 0) {\n const filesToRetry = [...this.exceptionList];\n this.exceptionList = [];\n this.retryFailedFiles(filesToRetry);\n }\n }, this.retryDelay);\n },\n // HuggingFace 大文件直传(绕过 CF Workers 限制)\n // 流程:前端计算 SHA256 → 获取 S3 上传 URL → 直传到 S3 → 提交文件引用\n async uploadToHuggingFaceDirect(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n try {\n console.log('=== HuggingFace Direct Upload ===');\n console.log('File:', file.file.name, 'Size:', file.file.size);\n\n // 1. 计算 SHA256\n file.onProgress({\n percent: 5,\n file: file.file\n });\n console.log('Computing SHA256...');\n const sha256 = await computeSha256(file.file);\n console.log('SHA256:', sha256);\n\n // 检查是否已取消\n if (abortController.signal.aborted) {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n\n // 2. 获取文件样本(前512字节的base64)\n const sampleBytes = new Uint8Array(await file.file.slice(0, 512).arrayBuffer());\n const fileSample = btoa(String.fromCharCode(...sampleBytes));\n\n // 3. 获取 LFS 上传 URL\n file.onProgress({\n percent: 10,\n file: file.file\n });\n console.log('Getting LFS upload URL...');\n const uploadInfoRes = await axios({\n url: '/upload/huggingface/getUploadUrl',\n method: 'post',\n data: {\n fileSize: file.file.size,\n fileName: file.file.name,\n fileType: file.file.type,\n sha256,\n fileSample,\n channelName: this.channelName,\n // 传递指定的渠道名称\n uploadNameType: this.uploadNameType,\n uploadFolder: this.uploadFolder\n },\n withAuthCode: true,\n signal: abortController.signal\n });\n if (!uploadInfoRes.data.success) {\n throw new Error(uploadInfoRes.data.error || 'Failed to get upload URL');\n }\n const uploadInfo = uploadInfoRes.data;\n console.log('Upload info:', uploadInfo);\n\n // 检查文件是否已存在\n if (uploadInfo.alreadyExists) {\n console.log('File already exists in LFS, skipping upload');\n file.onProgress({\n percent: 90,\n file: file.file\n });\n } else if (uploadInfo.needsLfs && uploadInfo.uploadAction) {\n // 4. 直接上传到 S3\n const {\n href,\n header\n } = uploadInfo.uploadAction;\n if (header?.chunk_size) {\n // 分片上传\n await this.uploadToHuggingFaceMultipart(file, uploadInfo, abortController);\n } else {\n // 基本上传\n console.log('Uploading to S3 (basic)...');\n const uploadRes = await fetch(href, {\n method: 'PUT',\n headers: header || {},\n body: file.file,\n signal: abortController.signal\n });\n if (!uploadRes.ok) {\n const error = await uploadRes.text();\n throw new Error(`S3 upload failed: ${uploadRes.status} - ${error}`);\n }\n console.log('S3 upload complete');\n }\n }\n\n // 检查是否已取消\n if (abortController.signal.aborted) {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n\n // 5. 提交文件引用\n file.onProgress({\n percent: 95,\n file: file.file\n });\n console.log('Committing file...');\n const commitRes = await axios({\n url: '/upload/huggingface/commitUpload',\n method: 'post',\n data: {\n fullId: uploadInfo.fullId,\n filePath: uploadInfo.filePath,\n sha256,\n fileSize: file.file.size,\n fileName: file.file.name,\n fileType: file.file.type,\n channelName: uploadInfo.channelName\n },\n withAuthCode: true,\n signal: abortController.signal\n });\n if (!commitRes.data.success) {\n throw new Error(commitRes.data.error || 'Failed to commit file');\n }\n console.log('Upload complete:', commitRes.data);\n // 转换响应格式以匹配 handleSuccess 期望的格式\n const formattedResponse = {\n data: [{\n src: commitRes.data.src\n }]\n };\n file.onSuccess(formattedResponse, file.file);\n } catch (err) {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED' || err.name === 'AbortError') {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n console.error('HuggingFace direct upload error:', err);\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } finally {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n }\n },\n // HuggingFace 分片上传到 S3\n async uploadToHuggingFaceMultipart(file, uploadInfo, abortController) {\n const {\n uploadAction\n } = uploadInfo;\n const {\n href: completionUrl,\n header\n } = uploadAction;\n const chunkSize = parseInt(header.chunk_size);\n\n // 获取所有分片的上传 URL\n const parts = Object.keys(header).filter(key => /^[0-9]+$/.test(key));\n console.log(`Multipart upload: ${parts.length} parts, chunk size: ${chunkSize}`);\n const completeParts = [];\n const totalParts = parts.length;\n for (const part of parts) {\n // 检查是否已取消\n if (abortController && abortController.signal.aborted) {\n console.log('HuggingFace 分片上传已取消');\n throw new DOMException('Upload cancelled', 'AbortError');\n }\n const index = parseInt(part) - 1;\n const start = index * chunkSize;\n const end = Math.min(start + chunkSize, file.file.size);\n const chunk = file.file.slice(start, end);\n console.log(`Uploading part ${part}/${totalParts}`);\n const response = await fetch(header[part], {\n method: 'PUT',\n body: chunk,\n signal: abortController ? abortController.signal : undefined\n });\n if (!response.ok) {\n throw new Error(`Failed to upload part ${part}: ${response.status}`);\n }\n const etag = response.headers.get('ETag');\n if (!etag) {\n throw new Error(`No ETag for part ${part}`);\n }\n completeParts.push({\n partNumber: parseInt(part),\n etag\n });\n\n // 更新进度(10% - 90%)\n const progress = 10 + Math.round(parseInt(part) / totalParts * 80);\n file.onProgress({\n percent: progress,\n file: file.file\n });\n }\n\n // 检查是否已取消\n if (abortController && abortController.signal.aborted) {\n console.log('HuggingFace 分片上传已取消');\n throw new DOMException('Upload cancelled', 'AbortError');\n }\n\n // 完成分片上传\n console.log('Completing multipart upload...');\n const completeResponse = await fetch(completionUrl, {\n method: 'POST',\n headers: {\n 'Accept': 'application/vnd.git-lfs+json',\n 'Content-Type': 'application/vnd.git-lfs+json'\n },\n body: JSON.stringify({\n oid: uploadInfo.oid,\n parts: completeParts\n }),\n signal: abortController ? abortController.signal : undefined\n });\n if (!completeResponse.ok) {\n const error = await completeResponse.text();\n throw new Error(`Multipart complete failed: ${completeResponse.status} - ${error}`);\n }\n console.log('Multipart upload complete');\n },\n // 将图片转换为 WebP 格式\n async convertImageToWebp(file) {\n return new Promise((resolve, reject) => {\n // 不支持转换的格式直接返回 null\n if (file.type.includes('gif') || file.type.includes('svg') || file.type.includes('webp')) {\n resolve(null);\n return;\n }\n const img = new Image();\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n canvas.toBlob(blob => {\n if (blob) {\n // 修改文件名:将原扩展名替换为 .webp\n const originalName = file.name;\n const lastDotIndex = originalName.lastIndexOf('.');\n const newName = lastDotIndex > 0 ? originalName.substring(0, lastDotIndex) + '.webp' : originalName + '.webp';\n const webpFile = new File([blob], newName, {\n type: 'image/webp'\n });\n webpFile.uid = file.uid;\n resolve(webpFile);\n } else {\n reject(new Error('WebP 转换失败'));\n }\n\n // 清理\n URL.revokeObjectURL(img.src);\n }, 'image/webp', 0.92); // 0.92 质量参数,平衡质量和大小\n };\n img.onerror = () => {\n URL.revokeObjectURL(img.src);\n reject(new Error(this.$t('uploadForm.imageLoadFailed')));\n };\n img.src = URL.createObjectURL(file);\n });\n },\n // 拖拽上传卡片鼠标移动事件 - 悬浮光斑效果\n handleUploadCardMouseMove(e) {\n const glow = this.$refs.uploadCardGlow;\n if (!glow) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n glow.style.opacity = '1';\n glow.style.left = x + 'px';\n glow.style.top = y + 'px';\n },\n // 拖拽上传卡片鼠标离开事件\n handleUploadCardMouseLeave() {\n const glow = this.$refs.uploadCardGlow;\n if (!glow) return;\n glow.style.opacity = '0';\n }\n },\n beforeDestroy() {\n // 清理定时器\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadForm.vue?vue&type=template&id=37f80c81&scoped=true\"\nimport script from \"./UploadForm.vue?vue&type=script&lang=js\"\nexport * from \"./UploadForm.vue?vue&type=script&lang=js\"\n\nimport \"./UploadForm.vue?vue&type=style&index=0&id=37f80c81&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-37f80c81\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, withModifiers as _withModifiers, createElementVNode as _createElementVNode, vShow as _vShow, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-suggestion-input\",\n ref: \"wrapperRef\"\n};\nconst _hoisted_2 = {\n class: \"suggestion-dropdown\"\n};\nconst _hoisted_3 = {\n class: \"suggestion-list\"\n};\nconst _hoisted_4 = [\"title\", \"onMousedown\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_input, {\n ref: \"inputRef\",\n modelValue: $options.inputValue,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $options.inputValue = $event),\n placeholder: $props.placeholder,\n onFocus: $options.handleFocus,\n onBlur: $options.handleBlur,\n onInput: $options.handleInput\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\", \"onInput\"]), _withDirectives(_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"ul\", _hoisted_3, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.suggestions, (item, index) => {\n return _openBlock(), _createElementBlock(\"li\", {\n key: index,\n class: \"suggestion-item\",\n title: item.value,\n onMousedown: _withModifiers($event => $options.selectItem(item), [\"prevent\"])\n }, _toDisplayString(item.value), 41, _hoisted_4);\n }), 128))])], 512), [[_vShow, $data.dropdownVisible && $data.suggestions.length > 0]])], 512);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport axios from '@/utils/axios';\nexport default {\n name: 'DirectorySuggestionInput',\n props: {\n modelValue: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: ''\n }\n },\n emits: ['update:modelValue', 'focus', 'blur', 'select'],\n data() {\n return {\n directoryTreeRoot: null,\n directoryTreeLoaded: false,\n directoryTreeLoading: false,\n directoryChildrenMap: {},\n focusTime: null,\n dropdownVisible: false,\n isFocused: false,\n suggestions: []\n };\n },\n computed: {\n inputValue: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n }\n },\n watch: {\n modelValue() {\n // 外部修改 modelValue 时也刷新建议\n if (this.isFocused) {\n this.refreshSuggestions();\n }\n }\n },\n methods: {\n handleFocus() {\n this.isFocused = true;\n this.focusTime = Date.now();\n this.ensureDirectoryTreeLoaded();\n this.$emit('focus');\n setTimeout(() => {\n if (this.isFocused) {\n this.refreshSuggestions();\n this.dropdownVisible = true;\n }\n }, 500);\n },\n handleBlur() {\n this.isFocused = false;\n this.dropdownVisible = false;\n this.$emit('blur');\n },\n handleInput(val) {\n // val 是 el-input @input 事件传来的最新值\n this.$nextTick(() => {\n this.refreshSuggestions();\n if (this.isFocused) {\n this.dropdownVisible = true;\n }\n });\n },\n selectItem(item) {\n const path = item.value;\n this.inputValue = path;\n this.$emit('select', path);\n const normalizedPath = this.normalizeDirectoryPath(path);\n const children = this.directoryChildrenMap[normalizedPath];\n if (children && children.length > 0) {\n this.$nextTick(() => {\n this.refreshSuggestions();\n this.dropdownVisible = true;\n this.$refs.inputRef?.focus();\n });\n } else {\n this.dropdownVisible = false;\n }\n },\n refreshSuggestions() {\n this.suggestions = this.getDirectorySuggestions(this.modelValue || '');\n },\n normalizeDirectoryPath(path) {\n if (!path) return '/';\n let normalized = path;\n if (!normalized.startsWith('/')) normalized = '/' + normalized;\n if (normalized !== '/' && !normalized.endsWith('/')) normalized += '/';\n return normalized;\n },\n buildDirectoryChildrenMap(treeRoot) {\n const map = {};\n const walk = node => {\n const parentPath = this.normalizeDirectoryPath(node.path);\n const children = Array.isArray(node.children) ? node.children : [];\n map[parentPath] = children.map(child => ({\n name: child.name,\n path: this.normalizeDirectoryPath(child.path)\n }));\n children.forEach(walk);\n };\n walk(treeRoot);\n this.directoryChildrenMap = map;\n },\n async ensureDirectoryTreeLoaded() {\n if (this.directoryTreeLoaded || this.directoryTreeLoading) return;\n this.directoryTreeLoading = true;\n try {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n const tree = response?.data?.tree;\n if (tree) {\n this.directoryTreeRoot = tree;\n this.buildDirectoryChildrenMap(tree);\n this.directoryTreeLoaded = true;\n }\n } catch (error) {\n console.error('Failed to load directory tree for autocomplete:', error);\n } finally {\n this.directoryTreeLoading = false;\n }\n },\n parseDirectoryQuery(value) {\n const normalizedInput = value && value.startsWith('/') ? value : `/${value || ''}`;\n const raw = normalizedInput.slice(1);\n const parts = raw.split('/');\n const segmentInput = parts[parts.length - 1] || '';\n const parentSegments = parts.slice(0, -1).filter(Boolean);\n const parentPath = parentSegments.length > 0 ? `/${parentSegments.join('/')}/` : '/';\n return {\n segmentInput,\n parentPath\n };\n },\n getDirectorySuggestions(queryString) {\n const {\n segmentInput,\n parentPath\n } = this.parseDirectoryQuery(queryString);\n const parentChildren = this.directoryChildrenMap[parentPath] || [];\n if (!segmentInput) {\n return parentChildren.slice(0, 10).map(item => ({\n value: item.path\n }));\n }\n const keyword = segmentInput.toLowerCase();\n return parentChildren.filter(item => item.name.toLowerCase().startsWith(keyword)).slice(0, 10).map(item => ({\n value: item.path\n }));\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectorySuggestionInput.vue?vue&type=template&id=0ff63416&scoped=true\"\nimport script from \"./DirectorySuggestionInput.vue?vue&type=script&lang=js\"\nexport * from \"./DirectorySuggestionInput.vue?vue&type=script&lang=js\"\n\nimport \"./DirectorySuggestionInput.vue?vue&type=style&index=0&id=0ff63416&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-0ff63416\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"upload-home\"\n};\nconst _hoisted_3 = {\n class: \"toolbar-manage\"\n};\nconst _hoisted_4 = {\n class: \"toolbar\"\n};\nconst _hoisted_5 = {\n class: \"header\"\n};\nconst _hoisted_6 = {\n class: \"title\"\n};\nconst _hoisted_7 = {\n class: \"main-title\",\n href: \"https://github.com/MarSeventh/CloudFlare-ImgBed\",\n target: \"_blank\"\n};\nconst _hoisted_8 = {\n class: \"dialog-section\"\n};\nconst _hoisted_9 = {\n class: \"section-header\"\n};\nconst _hoisted_10 = {\n class: \"section-title\"\n};\nconst _hoisted_11 = {\n class: \"section-content\"\n};\nconst _hoisted_12 = {\n class: \"dialog-section\"\n};\nconst _hoisted_13 = {\n class: \"section-header\"\n};\nconst _hoisted_14 = {\n class: \"section-title\"\n};\nconst _hoisted_15 = {\n class: \"section-content\"\n};\nconst _hoisted_16 = {\n class: \"setting-item\"\n};\nconst _hoisted_17 = {\n class: \"setting-label\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_19 = {\n class: \"setting-label\"\n};\nconst _hoisted_20 = {\n class: \"dialog-action\"\n};\nconst _hoisted_21 = [\"innerHTML\"];\nconst _hoisted_22 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ToggleDark = _resolveComponent(\"ToggleDark\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_DirectorySuggestionInput = _resolveComponent(\"DirectorySuggestionInput\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_DirectoryTreePicker = _resolveComponent(\"DirectoryTreePicker\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_Logo = _resolveComponent(\"Logo\");\n const _component_UploadForm = _resolveComponent(\"UploadForm\");\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_dialog = _resolveComponent(\"el-dialog\");\n const _component_UploadSettingsDialog = _resolveComponent(\"UploadSettingsDialog\");\n const _component_Footer = _resolveComponent(\"Footer\");\n const _component_UploadHistory = _resolveComponent(\"UploadHistory\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_ToggleDark, {\n class: \"toggle-dark-button desktop-only\"\n }), _createVNode(_component_el_dropdown, {\n class: \"more-dropdown desktop-only\",\n trigger: \"click\",\n onCommand: $options.handleDesktopMenuCommand\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"showHistory\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.history')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showAnnouncement\",\n disabled: !$options.announcementAvailable\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"bullhorn\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.announcement')), 1)]),\n _: 1\n }, 8, [\"disabled\"]), _createVNode(_component_el_dropdown_item, {\n command: \"toggleLanguage\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.locale === 'zh-CN' ? 'English' : '简体中文'), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"viewDocs\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"book\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.viewDocs')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"more-button\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ellipsis-v\",\n size: \"lg\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"onCommand\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-folder-container\", {\n 'no-announcement': !$options.announcementAvailable\n }])\n }, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-folder\", {\n 'active': $data.isFolderInputActive\n }])\n }, [$options.showDirectorySuggestions ? (_openBlock(), _createBlock(_component_DirectorySuggestionInput, {\n key: 0,\n modelValue: $data.uploadFolder,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.uploadFolder = $event),\n class: \"inner-folder-input\",\n placeholder: _ctx.$t('upload.folderPlaceholder'),\n onFocus: $options.handleFolderInputFocus,\n onBlur: $options.handleFolderInputBlur,\n onSelect: $options.handleDirectorySelect\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\", \"onSelect\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 1,\n class: \"inner-folder-input\",\n modelValue: $data.uploadFolder,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.uploadFolder = $event),\n placeholder: _ctx.$t('upload.folderPlaceholder'),\n onFocus: $options.handleFolderInputFocus,\n onBlur: $options.handleFolderInputBlur\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\"]))], 2), $options.showDirectorySuggestions ? (_openBlock(), _createBlock(_component_DirectoryTreePicker, {\n key: 0,\n \"current-directory\": $data.uploadFolder,\n source: \"upload\",\n onSelect: $options.handleDirectorySelect\n }, {\n trigger: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"directory-tree-trigger\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-tree\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"current-directory\", \"onSelect\"])) : _createCommentVNode(\"\", true)], 2), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('upload.switchUploadMethod'),\n placement: \"bottom\",\n disabled: $options.disableTooltip\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"upload-method-button desktop-only\",\n onClick: $options.handleChangeUploadMethod\n }, {\n default: _withCtx(() => [$data.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"folder-open\",\n class: \"upload-method-icon\",\n size: \"lg\"\n })) : $data.uploadMethod === 'paste' ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"paste\",\n class: \"upload-method-icon\",\n size: \"lg\"\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\", \"disabled\"]), _createVNode(_component_el_dropdown, {\n class: \"mobile-more-dropdown mobile-only\",\n trigger: \"click\",\n onCommand: $options.handleMobileMenuCommand\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"toggleTheme\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $options.getThemeIcon(),\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($options.getThemeText()), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"toggleUploadMethod\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.uploadMethod === 'default' ? 'paste' : 'folder-open',\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($data.uploadMethod === 'default' ? _ctx.$t('upload.pasteUpload') : _ctx.$t('upload.fileUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showHistory\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.history')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showAnnouncement\",\n disabled: !$options.announcementAvailable\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"bullhorn\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.announcement')), 1)]),\n _: 1\n }, 8, [\"disabled\"]), _createVNode(_component_el_dropdown_item, {\n command: \"toggleLanguage\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.locale === 'zh-CN' ? 'English' : '简体中文'), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"viewDocs\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"book\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.viewDocs')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"mobile-more-button\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ellipsis-v\",\n size: \"lg\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"onCommand\"]), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-manage-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.handleOpenToolbar,\n circle: \"\"\n }, {\n default: _withCtx(() => [!$data.isToolBarOpen ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"bars\",\n class: \"manage-icon\",\n size: \"lg\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"times\",\n class: \"manage-icon\",\n size: \"lg\"\n }))]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.settings'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button compress-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.openCompressDialog,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload\",\n class: \"compress-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.linkFormat'),\n placement: \"left\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button link-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.openUrlDialog,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"link-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.manage'),\n placement: \"left\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button config-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.handleManage,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cog\",\n class: \"config-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.logout'),\n placement: \"left\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button sign-out-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.handleLogout,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"sign-out-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])]), _createVNode(_component_Logo, {\n useConfigLink: true\n }), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"h1\", _hoisted_6, [_createElementVNode(\"a\", _hoisted_7, _toDisplayString($options.ownerName), 1), _cache[21] || (_cache[21] = _createTextVNode(\" ImgHub\", -1))])]), _createVNode(_component_UploadForm, {\n selectedUrlForm: $data.selectedUrlForm,\n customerCompress: $data.customerCompress,\n compressQuality: $data.compressQuality,\n compressBar: $data.compressBar,\n serverCompress: $data.serverCompress,\n uploadChannel: $data.uploadChannel,\n channelName: $data.channelName,\n uploadNameType: $data.uploadNameType,\n useCustomUrl: $data.useCustomUrl,\n customUrlPrefix: $data.customUrlPrefix,\n autoRetry: $data.autoRetry,\n urlPrefix: $options.urlPrefix,\n uploadMethod: $data.uploadMethod,\n uploadFolder: $data.uploadFolder,\n convertToWebp: $data.convertToWebp,\n class: \"upload\"\n }, null, 8, [\"selectedUrlForm\", \"customerCompress\", \"compressQuality\", \"compressBar\", \"serverCompress\", \"uploadChannel\", \"channelName\", \"uploadNameType\", \"useCustomUrl\", \"customUrlPrefix\", \"autoRetry\", \"urlPrefix\", \"uploadMethod\", \"uploadFolder\", \"convertToWebp\"]), _createVNode(_component_el_dialog, {\n title: _ctx.$t('settings.linkFormatTitle'),\n modelValue: $data.showUrlDialog,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.showUrlDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.$t('settings.defaultCopyLink')), 1)]), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_radio_group, {\n modelValue: $data.selectedUrlForm,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.selectedUrlForm = $event),\n onChange: $options.changeUrlForm,\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n value: \"url\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('settings.rawLink')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"md\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code\",\n class: \"radio-icon\"\n }), _cache[22] || (_cache[22] = _createElementVNode(\"span\", null, \"MarkDown\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"html\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\",\n class: \"radio-icon\"\n }), _cache[23] || (_cache[23] = _createElementVNode(\"span\", null, \"HTML\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"ubb\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"quote-right\",\n class: \"radio-icon\"\n }), _cache[24] || (_cache[24] = _createElementVNode(\"span\", null, \"BBCode\", -1))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])])]), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"span\", _hoisted_14, _toDisplayString(_ctx.$t('settings.customLink')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('settings.customLinkTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, [_createElementVNode(\"span\", _hoisted_17, _toDisplayString(_ctx.$t('settings.enableCustom')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.useCustomUrl,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.useCustomUrl = $event),\n \"active-value\": \"true\",\n \"inactive-value\": \"false\"\n }, null, 8, [\"modelValue\"])]), $data.useCustomUrl === 'true' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createElementVNode(\"span\", _hoisted_19, _toDisplayString(_ctx.$t('settings.customPrefix')), 1), _createVNode(_component_el_input, {\n modelValue: $data.customUrlPrefix,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.customUrlPrefix = $event),\n placeholder: _ctx.$t('settings.customPrefixPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"modelValue\", \"placeholder\"])])) : _createCommentVNode(\"\", true)])]), _createElementVNode(\"div\", _hoisted_20, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[5] || (_cache[5] = $event => $data.showUrlDialog = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('settings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_UploadSettingsDialog, {\n modelValue: $data.showCompressDialog,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.showCompressDialog = $event),\n uploadChannel: $data.uploadChannel,\n \"onUpdate:uploadChannel\": _cache[8] || (_cache[8] = $event => $data.uploadChannel = $event),\n channelName: $data.channelName,\n \"onUpdate:channelName\": _cache[9] || (_cache[9] = $event => $data.channelName = $event),\n currentChannelList: $options.currentChannelList,\n uploadFolder: $data.uploadFolder,\n \"onUpdate:uploadFolder\": _cache[10] || (_cache[10] = $event => $data.uploadFolder = $event),\n autoRetry: $data.autoRetry,\n \"onUpdate:autoRetry\": _cache[11] || (_cache[11] = $event => $data.autoRetry = $event),\n uploadNameType: $data.uploadNameType,\n \"onUpdate:uploadNameType\": _cache[12] || (_cache[12] = $event => $data.uploadNameType = $event),\n convertToWebp: $data.convertToWebp,\n \"onUpdate:convertToWebp\": _cache[13] || (_cache[13] = $event => $data.convertToWebp = $event),\n customerCompress: $data.customerCompress,\n \"onUpdate:customerCompress\": _cache[14] || (_cache[14] = $event => $data.customerCompress = $event),\n compressBar: $data.compressBar,\n \"onUpdate:compressBar\": _cache[15] || (_cache[15] = $event => $data.compressBar = $event),\n compressQuality: $data.compressQuality,\n \"onUpdate:compressQuality\": _cache[16] || (_cache[16] = $event => $data.compressQuality = $event),\n serverCompress: $data.serverCompress,\n \"onUpdate:serverCompress\": _cache[17] || (_cache[17] = $event => $data.serverCompress = $event)\n }, null, 8, [\"modelValue\", \"uploadChannel\", \"channelName\", \"currentChannelList\", \"uploadFolder\", \"autoRetry\", \"uploadNameType\", \"convertToWebp\", \"customerCompress\", \"compressBar\", \"compressQuality\", \"serverCompress\"])]), _createVNode(_component_Footer, {\n class: \"footer\"\n }), _createVNode(_component_el_dialog, {\n title: _ctx.$t('upload.announcementTitle'),\n modelValue: $data.showAnnouncementDialog,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.showAnnouncementDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n \"close-on-click-modal\": false,\n \"close-on-press-escape\": false,\n center: \"\"\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_22, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[18] || (_cache[18] = $event => $data.showAnnouncementDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.announcementAck')), 1)]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", {\n innerHTML: $data.announcementContent\n }, null, 8, _hoisted_21)]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_UploadHistory, {\n show: $data.showHistory,\n onClose: _cache[20] || (_cache[20] = $event => $data.showHistory = false)\n }, null, 8, [\"show\"])]);\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.iterator.some.js\";\nimport UploadForm from '@/components/upload/UploadForm.vue';\nimport Footer from '@/components/Footer.vue';\nimport ToggleDark from '@/components/ToggleDark.vue';\nimport Logo from '@/components/Logo.vue';\nimport { setLocale } from '@/locales';\nimport UploadHistory from '@/components/upload/UploadHistory.vue';\nimport UploadSettingsDialog from '@/components/upload/UploadSettingsDialog.vue';\nimport DirectoryTreePicker from '@/components/DirectoryTreePicker.vue';\nimport DirectorySuggestionInput from '@/components/DirectorySuggestionInput.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nimport axios from '@/utils/axios';\nimport { ref } from 'vue';\nimport { mapGetters } from 'vuex';\nimport { validateFolderPath } from '@/utils/pathValidator';\nexport default {\n name: 'UploadHome',\n mixins: [backgroundManager],\n data() {\n return {\n selectedUrlForm: ref(''),\n showUrlDialog: false,\n showCompressDialog: false,\n customerCompress: true,\n //上传前压缩\n compressQuality: 4,\n //压缩后大小\n compressBar: 5,\n //压缩阈值\n convertToWebp: false,\n //转换为WebP格式\n serverCompress: true,\n //服务器端压缩\n uploadChannel: '',\n //上传渠道\n channelName: '',\n //指定的渠道名称\n availableChannels: {},\n //可用渠道列表\n uploadNameType: '',\n //上传文件命名方式\n customUrlPrefix: '',\n //自定义链接前缀\n useCustomUrl: 'false',\n //是否启用自定义链接格式\n autoRetry: true,\n //失败自动切换\n useDefaultWallPaper: false,\n isToolBarOpen: false,\n //是否打开工具栏\n uploadMethod: 'default',\n //上传方式\n uploadFolder: '',\n // 上传文件夹\n isFolderInputActive: false,\n showAnnouncementDialog: false,\n // 控制公告弹窗的显示\n announcementContent: '',\n // 公告内容\n showHistory: false,\n themeMode: 'auto' // 主题模式:light, dark, auto\n };\n },\n watch: {\n customerCompress(val) {\n this.updateCompressConfig('customerCompress', val);\n },\n compressQuality(val) {\n this.updateCompressConfig('compressQuality', val);\n },\n compressBar(val) {\n // 确保值在有效范围内\n if (val === null || val === undefined || val < 1) {\n this.compressBar = 1;\n return;\n }\n // 确保期望大小不超过压缩阈值\n if (this.compressQuality > val) {\n this.compressQuality = val;\n }\n this.updateCompressConfig('compressBar', val);\n },\n serverCompress(val) {\n this.updateCompressConfig('serverCompress', val);\n },\n convertToWebp(val) {\n this.updateCompressConfig('convertToWebp', val);\n },\n uploadChannel(val) {\n this.updateStoreUploadChannel(val);\n // 切换渠道类型时,检查持久化的渠道名是否在新渠道列表中\n const newChannelList = this.availableChannels[val] || [];\n const savedChannelName = this.storeChannelName;\n if (savedChannelName && newChannelList.some(ch => ch.name === savedChannelName)) {\n // 持久化的渠道名在新渠道列表中,恢复它\n this.channelName = savedChannelName;\n } else {\n // 否则清空\n this.channelName = '';\n }\n },\n channelName(val) {\n // 确保清空时保存空字符串而不是null\n this.$store.commit('setStoreChannelName', val || '');\n },\n uploadNameType(val) {\n this.updateStoreUploadNameType(val);\n },\n customUrlPrefix(val) {\n this.$store.commit('setCustomUrlSettings', {\n key: 'customUrlPrefix',\n value: val\n });\n },\n useCustomUrl(val) {\n this.$store.commit('setCustomUrlSettings', {\n key: 'useCustomUrl',\n value: val\n });\n },\n autoRetry(val) {\n this.$store.commit('setStoreAutoRetry', val);\n },\n uploadFolder(val) {\n // 实时输入时用非 strict 模式,不检查末尾的单独 . 以允许继续输入如 .123\n if (this.validateUploadFolder(val, false)) {\n // 非 strict 通过后,再用 strict 模式静默检查,只有完全合法才更新 store\n const strictResult = validateFolderPath(val, {\n strict: true\n });\n if (strictResult.valid) {\n this.$store.commit('setStoreUploadFolder', val);\n }\n // strict 不通过时不更新 store,等失焦时提示并回滚\n } else {\n this.$nextTick(() => {\n this.uploadFolder = this.storeUploadFolder;\n });\n }\n }\n },\n computed: {\n ...mapGetters(['userConfig', 'uploadCopyUrlForm', 'compressConfig', 'storeUploadChannel', 'storeChannelName', 'storeUploadNameType', 'customUrlSettings', 'storeAutoRetry', 'storeUploadMethod', 'storeUploadFolder']),\n ownerName() {\n return this.userConfig?.ownerName || 'Sanyue';\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n urlPrefix() {\n // 全局自定义链接前缀\n return this.userConfig?.urlPrefix || `${window.location.protocol}//${window.location.host}/file/`;\n },\n announcementAvailable() {\n return !!this.userConfig?.announcement;\n },\n // 是否显示目录候选项(从 userConfig 获取)\n showDirectorySuggestions() {\n return this.userConfig?.showDirectorySuggestions ?? false;\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.uploadChannel] || [];\n }\n },\n mounted() {\n // 初始化背景图,启用自动创建元素\n this.initializeBackground('uploadBkImg', '.container', false, true);\n\n // 读取用户选择的链接格式\n this.selectedUrlForm = this.uploadCopyUrlForm || 'url';\n // 读取用户选择的压缩设置(优先用户设置,其次系统默认配置)\n this.customerCompress = this.compressConfig.customerCompress ?? this.parseBoolean(this.userConfig?.defaultCustomerCompress, true);\n this.compressQuality = this.compressConfig.compressQuality ?? this.parseNumber(this.userConfig?.defaultCompressQuality, 4);\n this.compressBar = this.compressConfig.compressBar ?? this.parseNumber(this.userConfig?.defaultCompressBar, 5);\n this.serverCompress = this.compressConfig.serverCompress ?? true;\n this.convertToWebp = this.compressConfig.convertToWebp ?? this.parseBoolean(this.userConfig?.defaultConvertToWebp, false);\n // 读取用户选择的上传渠道\n this.uploadChannel = this.storeUploadChannel || this.userConfig?.defaultUploadChannel || 'telegram';\n // 用户定义的失败自动切换\n this.autoRetry = this.storeAutoRetry;\n // 读取用户选择的上传文件命名方式\n this.uploadNameType = this.storeUploadNameType || this.userConfig?.defaultUploadNameType || 'default';\n // 读取用户自定义链接格式\n this.customUrlPrefix = this.customUrlSettings.customUrlPrefix;\n this.useCustomUrl = this.customUrlSettings.useCustomUrl;\n // 读取用户偏好的上传方式\n this.uploadMethod = this.storeUploadMethod;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n // 读取用户设置的上传文件夹\n this.uploadFolder = this.storeUploadFolder || this.userConfig?.defaultUploadFolder || '';\n\n // 从 Vuex store 读取主题模式状态\n const cusDarkMode = this.$store.getters.cusDarkMode;\n const useDarkMode = this.$store.getters.useDarkMode;\n if (!cusDarkMode) {\n this.themeMode = 'auto';\n } else if (useDarkMode) {\n this.themeMode = 'dark';\n } else {\n this.themeMode = 'light';\n }\n\n // 首次访问公告\n const visited = localStorage.getItem('visitedUploadHome');\n const announcement = this.userConfig?.announcement;\n if (!visited && announcement) {\n this.announcementContent = announcement;\n this.showAnnouncementDialog = true;\n localStorage.setItem('visitedUploadHome', 'true');\n }\n },\n components: {\n UploadForm,\n Footer,\n ToggleDark,\n Logo,\n UploadHistory,\n UploadSettingsDialog,\n DirectoryTreePicker,\n DirectorySuggestionInput\n },\n methods: {\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels', {\n withAuthCode: true\n });\n if (response.data) {\n this.availableChannels = response.data;\n // 恢复渠道名称:优先持久化的值,其次系统默认配置\n const savedChannelName = this.storeChannelName;\n const defaultChannelName = this.userConfig?.defaultChannelName;\n const currentChannelList = this.availableChannels[this.uploadChannel] || [];\n\n // 如果用户主动清空过(savedChannelName === ''),则保持为空\n // 如果从未选择过(savedChannelName === null/undefined),则使用默认值\n if (savedChannelName && currentChannelList.some(ch => ch.name === savedChannelName)) {\n this.channelName = savedChannelName;\n } else if (savedChannelName === '' || savedChannelName === null || savedChannelName === undefined) {\n // 用户主动清空或从未选择,检查是否使用默认值\n if (savedChannelName !== '' && defaultChannelName && currentChannelList.some(ch => ch.name === defaultChannelName)) {\n this.channelName = defaultChannelName;\n }\n // 如果 savedChannelName === '',说明用户主动清空,保持为空\n }\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n },\n // 验证上传文件夹路径的合法性\n validateUploadFolder(path, strict = true) {\n // 自动补全前导 /\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n this.uploadFolder = path;\n }\n const result = validateFolderPath(path, {\n strict\n });\n if (!result.valid) {\n this.$message.error(result.error);\n return false;\n }\n return true;\n },\n handleFolderInputFocus() {\n this.isFolderInputActive = true;\n },\n handleFolderInputBlur() {\n this.isFolderInputActive = false;\n // 失焦时自动补全前导 /\n if (this.uploadFolder && !this.uploadFolder.startsWith('/')) {\n this.uploadFolder = '/' + this.uploadFolder;\n }\n // 失焦时做完整校验(包括末尾单独的 .)\n if (!this.validateUploadFolder(this.uploadFolder, true)) {\n this.$nextTick(() => {\n this.uploadFolder = this.storeUploadFolder;\n });\n }\n },\n handleManage() {\n this.$router.push('/dashboard');\n },\n // 解析布尔值\n parseBoolean(value, defaultValue) {\n if (value === undefined || value === null) return defaultValue;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value === 'true';\n return defaultValue;\n },\n // 解析数字\n parseNumber(value, defaultValue) {\n if (value === undefined || value === null) return defaultValue;\n const num = parseFloat(value);\n return isNaN(num) ? defaultValue : num;\n },\n openUrlDialog() {\n this.showUrlDialog = true;\n },\n handleLogout() {\n axios.post('/api/auth/logout', {\n authType: 'user'\n }, {\n withCredentials: true\n }).finally(() => {\n this.$store.commit('setUserLoggedIn', false);\n this.$router.push('/login');\n this.$message.success(this.$t('upload.logoutSuccess'));\n });\n },\n changeUrlForm() {\n this.$store.commit('setUploadCopyUrlForm', this.selectedUrlForm);\n },\n openCompressDialog() {\n this.showCompressDialog = true;\n },\n updateCompressConfig(key, value) {\n this.$store.commit('setCompressConfig', {\n key,\n value\n });\n },\n updateStoreUploadChannel(value) {\n this.$store.commit('setStoreUploadChannel', value);\n },\n updateStoreUploadNameType(value) {\n this.$store.commit('setStoreUploadNameType', value);\n },\n handleOpenToolbar() {\n this.isToolBarOpen = !this.isToolBarOpen;\n // 等过渡动画结束,向active类添加pointer-events属性,使其可以点击\n setTimeout(() => {\n const buttons = document.querySelectorAll('.toolbar-button');\n buttons.forEach(button => {\n button.style.pointerEvents = this.isToolBarOpen ? 'auto' : 'none';\n });\n }, 300);\n },\n handleChangeUploadMethod() {\n this.uploadMethod = this.uploadMethod === 'default' ? 'paste' : 'default';\n this.$store.commit('setUploadMethod', this.uploadMethod);\n },\n handleMobileMenuCommand(command) {\n if (command === 'toggleTheme') {\n // 循环切换:auto -> light -> dark -> auto\n if (this.themeMode === 'auto') {\n // 切换到亮色\n this.themeMode = 'light';\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (this.themeMode === 'light') {\n // 切换到暗色\n this.themeMode = 'dark';\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 切换到自动\n this.themeMode = 'auto';\n this.$store.commit('setCusDarkMode', false);\n }\n } else if (command === 'toggleUploadMethod') {\n this.handleChangeUploadMethod();\n } else if (command === 'viewDocs') {\n window.open('https://cfbed.sanyue.de/qa/', '_blank');\n } else if (command === 'showHistory') {\n this.showHistory = true;\n } else if (command === 'showAnnouncement') {\n this.handleShowAnnouncement();\n } else if (command === 'toggleLanguage') {\n const next = this.$i18n.locale === 'zh-CN' ? 'en' : 'zh-CN';\n setLocale(next);\n }\n },\n handleDesktopMenuCommand(command) {\n if (command === 'viewDocs') {\n window.open('https://cfbed.sanyue.de/qa/', '_blank');\n } else if (command === 'showHistory') {\n this.showHistory = true;\n } else if (command === 'showAnnouncement') {\n this.handleShowAnnouncement();\n } else if (command === 'toggleLanguage') {\n const next = this.$i18n.locale === 'zh-CN' ? 'en' : 'zh-CN';\n setLocale(next);\n }\n },\n getThemeIcon() {\n // 显示下一个模式的图标\n if (this.themeMode === 'auto') return 'sun'; // auto -> light\n if (this.themeMode === 'light') return 'moon'; // light -> dark\n return 'adjust'; // dark -> auto\n },\n getThemeText() {\n // 显示下一个模式的文字\n if (this.themeMode === 'auto') return this.$t('theme.lightMode');\n if (this.themeMode === 'light') return this.$t('theme.darkMode');\n return this.$t('theme.autoMode');\n },\n handleShowAnnouncement() {\n const announcement = this.userConfig?.announcement;\n if (announcement) {\n this.announcementContent = announcement;\n this.showAnnouncementDialog = true;\n } else {\n this.$message.info(this.$t('upload.noAnnouncement'));\n }\n },\n // 处理目录选择\n handleDirectorySelect(path) {\n // 填入选择的目录路径\n this.uploadFolder = path;\n // 触发路径验证逻辑\n if (this.validateUploadFolder(path, true)) {\n this.$store.commit('setStoreUploadFolder', path);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadHome.vue?vue&type=template&id=f50dcc42&scoped=true\"\nimport script from \"./UploadHome.vue?vue&type=script&lang=js\"\nexport * from \"./UploadHome.vue?vue&type=script&lang=js\"\n\nimport \"./UploadHome.vue?vue&type=style&index=0&id=f50dcc42&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-f50dcc42\"]])\n\nexport default __exports__","/**\r\n * 路径验证器模块\r\n * 提供共享的文件夹路径验证功能,供 AdminDashBoard 和 UploadHome 共同使用\r\n */\r\nimport i18n from '@/locales'\r\n\r\n/**\r\n * 验证文件夹路径的合法性\r\n * @param {string} path - 要验证的路径\r\n * @param {{ strict?: boolean }} options - 选项,strict 为 true 时检查末尾单独的 \".\"(默认 true)\r\n * @returns {{ valid: boolean, error?: string }} 验证结果\r\n */\r\nexport function validateFolderPath(path, { strict = true } = {}) {\r\n // 如果路径为空或仅为空白字符,返回有效(表示根目录)\r\n if (!path || path.trim() === '') {\r\n return { valid: true };\r\n }\r\n \r\n // 如果路径仅为 \"/\",返回有效(表示根目录)\r\n if (path === '/') {\r\n return { valid: true };\r\n }\r\n \r\n // 检查路径是否以 \"/\" 开头\r\n if (!path.startsWith('/')) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.pathMustStartWithSlash') \r\n };\r\n }\r\n\r\n // 检查路径穿越:包含 .. 的路径段\r\n if (/(?:^|\\/)\\.\\.(\\/|$)/.test(path) || path.includes('..')) {\r\n return {\r\n valid: false,\r\n error: i18n.global.t('validation.pathTraversalNotAllowed')\r\n };\r\n }\r\n\r\n // 检查路径中单独的 . 段\r\n // strict 模式检查 /./ 和末尾 /.,非 strict 模式仅检查 /./ 以允许用户继续输入如 /.123\r\n const dotPattern = strict ? /\\/\\.(\\/|$)/ : /\\/\\.\\//;\r\n if (dotPattern.test(path)) {\r\n return {\r\n valid: false,\r\n error: i18n.global.t('validation.singleDotNotAllowed')\r\n };\r\n }\r\n\r\n // 检查路径是否包含连续的斜杠\r\n if (path.includes('//')) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.consecutiveSlashNotAllowed') \r\n };\r\n }\r\n \r\n // 检查路径是否包含非法字符\r\n // 非法字符包括: \\ : * ? \" ' < > | 空格 ( ) [ ] { } # % ^ ` ~ ; @ & = + $ ,\r\n const invalidChars = /[\\\\:\\*\\?\"'<>\\| \\(\\)\\[\\]\\{\\}#%\\^`~;@&=\\+\\$,]/;\r\n if (invalidChars.test(path)) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.invalidCharacters') \r\n };\r\n }\r\n \r\n return { valid: true };\r\n}\r\n","import store from '@/store'\r\nimport router from '@/router'\r\n\r\nlet isRedirecting = false;\r\n\r\nexport default async function fetchWithAuth(url, options = {}) {\r\n // 开发环境下添加 /api 前缀\r\n url = process.env.NODE_ENV === 'production' ? url : `/api${url}`;\r\n\r\n // 确保包含凭据(HttpOnly Cookie 会自动携带)\r\n options.credentials = 'include';\r\n\r\n options.headers = {\r\n ...options.headers,\r\n };\r\n\r\n const response = await fetch(url, options);\r\n\r\n if (response.status === 401 && !isRedirecting) {\r\n isRedirecting = true;\r\n store.commit('setAdminLoggedIn', false);\r\n // 静默跳转登录页,不弹出错误提示(路由守卫负责认证 UX)\r\n router.push('/adminLogin').finally(() => {\r\n isRedirecting = false;\r\n });\r\n }\r\n\r\n return response;\r\n}\r\n","module.exports = require(\"./build/conversion.js\");\n"],"names":["t","e","module","exports","this","n","r","o","i","l","call","m","c","d","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","some","a","f","g","w","b","PNG","JPEG","GIF","Promise","u","next","throw","done","then","apply","toDataURL","toBlob","split","match","atob","length","Uint8Array","charCodeAt","Blob","type","Image","onload","onerror","Error","src","document","createElement","href","window","URL","createObjectURL","download","Date","now","toString","body","appendChild","createEvent","initEvent","dispatchEvent","removeChild","FileReader","onloadend","target","result","readAsDataURL","h","assign","getContext","Number","scale","width","height","orientation","rotate","Math","PI","drawImage","translate","fetch","blob","y","quality","isNaN","size","accuracy","filter","sort","abs","pow","v","_hoisted_1","class","_hoisted_2","_hoisted_3","key","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","_component_el_tree","_component_el_popover","_component_el_drawer","_directive_loading","isDesktop","visible","popoverVisible","$event","placement","trigger","transition","reference","onClick","$slots","undefined","error","icon","fetchDirectoryTree","$t","_","ref","data","treeData","props","treeProps","currentDirectory","onNodeClick","handleNodeClick","node","path","expanded","name","loading","args","openDrawer","modelValue","drawerVisible","direction","title","String","source","validator","includes","children","label","windowWidth","innerWidth","computed","watch","newVal","setTimeout","$refs","treeRef","store","nodesMap","treeRefMobile","$nextTick","setCurrentKey","mounted","addEventListener","handleResize","beforeUnmount","removeEventListener","methods","response","fetchWithAuth","method","ok","status","json","axios","withAuthCode","tree","err","console","startsWith","$emit","__exports__","_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","_component_el_tooltip","show","count","totalCount","content","circle","toggleViewMode","viewMode","clearHistory","historyList","onScroll","handleScroll","groupedHistory","group","date","items","item","time","isImage","url","onError","handleImageError","isVideo","muted","copyLink","openLink","deleteItem","formatTime","hasMore","loadingMore","spin","Boolean","allHistory","pageSize","currentPage","val","resetAndLoad","groups","forEach","dateStr","getFullYear","getMonth","padStart","getDate","push","keys","map","savedMode","localStorage","getItem","loadAllHistory","loadMore","history","JSON","parse","start","end","newItems","slice","container","scrollTop","scrollHeight","clientHeight","setItem","$confirm","confirmButtonText","cancelButtonText","removeItem","$message","success","catch","stringify","fileName","imageExtensions","extension","pop","toLowerCase","videoExtensions","timestamp","year","month","day","hours","getHours","minutes","getMinutes","seconds","getSeconds","navigator","clipboard","writeText","open","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_component_el_radio","_component_el_radio_group","_component_el_option","_component_el_select","_component_el_input","_component_el_switch","_component_el_slider","_component_el_input_number","_component_el_dialog","dialogWidth","uploadChannel","currentChannelList","channelName","placeholder","clearable","ch","uploadFolder","handleUploadFolderInput","autoRetry","uploadNameType","convertToWebp","customerCompress","compressBar","min","max","step","compressQuality","precision","serverCompress","Array","emits","set","style","autoplay","playsinline","loop","_component_el_text","_component_el_progress","_component_Link","_component_el_icon","_component_Delete","file","truncated","truncateFilename","finalURL","readonly","selectAllText","urlSize","prepend","mdURL","htmlURL","ubbURL","percentage","progreess","IMAGE_EXTENSIONS","VIDEO_EXTENSIONS","components","Link","Delete","required","ext","filename","maxLength","lastDotIndex","lastIndexOf","substring","keepEnd","keepStart","event","message","_component_CameraFilled","_component_el_upload","_component_el_radio_button","_component_el_card","_component_List","_component_Checked","_component_Failed","_component_el_dropdown_item","_component_el_dropdown_menu","_component_el_dropdown","_component_UploadFileItem","_component_el_scrollbar","onMousemove","handleUploadCardMouseMove","onMouseleave","handleUploadCardMouseLeave","uploadMethod","uploading","fileList","drag","multiple","uploadFile","onSuccess","handleSuccess","handleError","beforeUpload","handleProgress","innerHTML","pastedUrls","rows","pasteCardMethodButtonSize","handleUploadPasteUrls","pasteUploadMethod","listScrolled","uploadingCount","waitingCount","uploadSuccessCount","uploadErrorCount","disabled","disableTooltip","copyAll","dropdown","autoReUpload","onChange","handleAutoRetryChange","retryError","clearFileList","clearSuccessList","reverse","onCopy","handleCopy","onRemove","handleRemove","onPreviewError","buildFileUrls","srcID","rootUrl","getUrlByFormat","format","md","html","ubb","updateFileListUrls","urls","K","Uint32Array","rotr","x","processBlock","block","H","W","s0","s1","S1","temp1","S0","maj","temp2","createSha256","buffer","bufferLength","totalLength","update","offset","needed","toCopy","subarray","digest","bitLength","fill","view","DataView","setUint32","floor","hex","async","computeSha256","sha256","CHUNK_SIZE","chunk","arrayBuffer","log","round","UploadFileItem","selectedUrlForm","useCustomUrl","customUrlPrefix","urlPrefix","maxUploading","exceptionList","fileListLength","uploadCount","maxRetryCount","retryTimer","retryDelay","uploadQueue","activeUploads","maxConcurrentUploads","abortControllers","Map","handler","scrollContainer","setScrollTop","deep","immediate","$store","commit","location","protocol","host","handlePaste","storeAutoReUpload","find","uid","waitingItem","uploadingItem","fileItem","uploadSingleFile","HF_DIRECT_THRESHOLD","uploadToHuggingFaceDirect","DISCORD_CHUNK_THRESHOLD","uploadFileInChunks","CHUNK_THRESHOLD","processUploadQueue","nextFile","shift","onUploadComplete","needServerCompress","abortController","AbortController","formData","FormData","append","encodeURIComponent","signal","onUploadProgress","progressEvent","percentCompleted","loaded","total","onProgress","percent","res","code","finally","delete","fileSize","totalChunks","ceil","precomputedSha256","initFormData","initResponse","uploadId","maxConcurrency","chunkProgress","nextChunkIndex","hasError","errorMsg","isCancelled","uploadChunk","chunkIndex","retryCount","maxRetries","totalPercent","reduce","warn","resolve","pool","currentIndex","all","duration","mergeFormData","closeAll","cleanupUploadResources","cleanupError","has","abort","timeout","replace","saveToHistory","newRecord","scheduleAutoRetry","reject","processedFile","canConvertToWebp","convertedFile","convertImageToWebp","toFixed","needCustomCompress","isLtLim","pushFileToQueue","fileUrl","newFile","File","myUploadCount","join","controller","clear","tagName","clipboardData","uploadFromUrl","validUrls","trim","test","kind","getAsString","callback","mdUrl","htmlUrl","ubbUrl","evt","getAsFile","checkResult","text","urlPattern","post","responseType","headers","disposition","filenameRegex","filenameStarRegex","matches","exec","decodeURIComponent","pathname","retryFailedFiles","files","clearTimeout","filesToRetry","aborted","sampleBytes","fileSample","btoa","fromCharCode","uploadInfoRes","fileType","uploadInfo","alreadyExists","needsLfs","uploadAction","header","chunk_size","uploadToHuggingFaceMultipart","uploadRes","commitRes","fullId","filePath","formattedResponse","completionUrl","chunkSize","parseInt","parts","completeParts","totalParts","part","DOMException","index","etag","partNumber","progress","completeResponse","oid","img","canvas","ctx","originalName","newName","webpFile","revokeObjectURL","glow","uploadCardGlow","rect","currentTarget","getBoundingClientRect","clientX","left","clientY","top","opacity","beforeDestroy","inputValue","onFocus","handleFocus","onBlur","handleBlur","onInput","handleInput","suggestions","onMousedown","selectItem","dropdownVisible","directoryTreeRoot","directoryTreeLoaded","directoryTreeLoading","directoryChildrenMap","focusTime","isFocused","refreshSuggestions","ensureDirectoryTreeLoaded","normalizedPath","normalizeDirectoryPath","inputRef","focus","getDirectorySuggestions","normalized","endsWith","buildDirectoryChildrenMap","treeRoot","walk","parentPath","isArray","child","parseDirectoryQuery","normalizedInput","raw","segmentInput","parentSegments","queryString","parentChildren","keyword","_component_ToggleDark","_component_DirectorySuggestionInput","_component_DirectoryTreePicker","_component_Logo","_component_UploadForm","_component_UploadSettingsDialog","_component_Footer","_component_UploadHistory","onCommand","handleDesktopMenuCommand","command","announcementAvailable","$i18n","locale","isFolderInputActive","showDirectorySuggestions","handleFolderInputFocus","handleFolderInputBlur","onSelect","handleDirectorySelect","handleChangeUploadMethod","handleMobileMenuCommand","getThemeIcon","getThemeText","isToolBarOpen","handleOpenToolbar","openCompressDialog","openUrlDialog","handleManage","handleLogout","useConfigLink","ownerName","showUrlDialog","changeUrlForm","showCompressDialog","showAnnouncementDialog","center","footer","announcementContent","showHistory","onClose","mixins","backgroundManager","availableChannels","useDefaultWallPaper","themeMode","updateCompressConfig","updateStoreUploadChannel","newChannelList","savedChannelName","storeChannelName","updateStoreUploadNameType","validateUploadFolder","strictResult","strict","valid","storeUploadFolder","userConfig","announcement","initializeBackground","uploadCopyUrlForm","compressConfig","parseBoolean","defaultCustomerCompress","parseNumber","defaultCompressQuality","defaultCompressBar","defaultConvertToWebp","storeUploadChannel","defaultUploadChannel","storeAutoRetry","storeUploadNameType","defaultUploadNameType","customUrlSettings","storeUploadMethod","fetchAvailableChannels","defaultUploadFolder","cusDarkMode","getters","useDarkMode","visited","UploadForm","Footer","ToggleDark","Logo","UploadHistory","UploadSettingsDialog","DirectoryTreePicker","DirectorySuggestionInput","defaultChannelName","$router","defaultValue","num","parseFloat","authType","withCredentials","buttons","querySelectorAll","button","pointerEvents","handleShowAnnouncement","info","validateFolderPath","i18n","global","dotPattern","invalidChars","isRedirecting","options","credentials","router"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/365.ae007b9b.js.map.gz b/frontend-dist/js/365.ae007b9b.js.map.gz deleted file mode 100644 index a1e3ccaf015de7fd66e7f206d346fba0d695089f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67783 zcmV(xKl(${{i`GUoWdf34f|MQ<|x>wh!Hf4%pH?Z5u_ul^#H zInVx2vwd=sd(FT8Pk-^(@n56nblMwt7JvQkUxOE=%yC_*x;plh^31WX)U06WN7WqH zl&Tf!QLl7tl5Va5*uL6y5Q3V-|{@%)4T7HuUF~@DC+V9R+ zJc0J{Gi?G*4y~WCXlhV!8`GFKcsJ2XP4qzXN|p59RH}KsH_|}Mqi3a_c|dbqv0Hz$ z*PMIdW)uF90gk1k!F4zp6-Niz1X@JFf#NkkahF1)qDAl%MDEUjTXF5dI zxyHBDZAG?)p5rf;M_=}}GblQ%IV-+LFAb#{yy8Z<6D96ss@<7KrWcIQf2xd-x6Ybt z5hRH3U$}mGM}HQYd*MG_85s?OQ&@1&ocp_upV&eI$l`F@042~%@N%o2(@qcEg}j6d zwwn?(E;(4wle%>QMm+)l9~sgBeHUweh{K>{AraulQafv2>98qHV4USi&$2Ri8a?Z7 zdI^(Yq;|*}wKK9q+<;MryWnHO?di`s=9$&9=n%EJb=eu}T1e9#&<0wmk%PVGIv{PO zo!)QXR;uGPe+*mS?l7~Nr!-OaptA8oX_y)4hWQUI`1OKBX&{+!NY!f zhEDAxf0@#5b9y2NHLpW5v_j8){4>DxwiFgg8jMXMqSFY*VR4UyPiFE;$BZ3RyyP(1MPB0XK20D;bP_Tzu}L{4u`_sPYPHULEJ?m*_Li0 z;LDxU3lQJOPRqiC;@aFEEABjmC^zgC_(>lC92CMX)&)n1lB=)~N{>^A-JYS7;}4_M zhmkikoY+jkISn-7Cck}k@qj)Cx~>Ys2Da#a=2ME^J^&jdk^+thF)JP2_Z%v7jt=D6 zz>}}AYI?(;-t&JO@{%xZ=!H`OcoqdY^NfhZ9}jV1k3>4D6DX{hRhr`E%;Tv~(Vg_s zko~5fmYzca=;aA;BBhhJa4rl(2qT~(goHJE+h9sLjOreV3r`?MeWlU*6m#qr(Q`nN zd&Tg$_KW|e$p7IK84K^4xb7p|<_?e`=Y2t&>-=isISL%!grajW7m<@q*t#q@kUAHk zm+1)84KE^f24^6z9pYI(B*R_{ZH?2}Ns+%udCq%hlAWR>bTSuJbPj-hOYOVGuO2b} z6kM)vfj9G_qsGD}tT3%*F&z0E--s;QLjyUL1N>SS-ENmf+ZCZ<^j#k7y|iCbi(%3B z9Q``lvrNl*7u#g#4*?+!I-PT6bHH{~!-Ft?HGBZa zO7b|-IfRO}U{rzAuP$1KaN+lZQ5WcOy?-{Of!s#nG6gYX00{n6ehTehp25EuOMZLa z|6KI?r-S)tcu8?2R9k@pGDP7gW`+tBs@%NhQMbB5?NqYrb2M?m3hF_AN*p09Xe7Rv&*4#<4m^OWj& zuJvZ;B29CTp=?9px9Fq%otVVO=` zwF5|PRL3CNwi~N06CNmhHp4MY8^?G#1Fw{Kam5ALJAabbj{2;|k4Dhver z)WZ%9U341Y$GeM8179{`51r%<8vBmb6nC1_VH8sC2gbf&vZ~#IM?UNg!MAjYg}(wt zM(mN(xqTE|AgQ85WbE{LXCi|@KPJ~@Xh4<4tcwo*%Cq7AfH`3M-QJ;s^5?`FWIjJs zJpf1~!B0+=T+4Ee%dry8;LF~zngh{A=D5J@vUoUiY2Ntrlf{1ob?1%<#Di2FJP)=Y z{A}n5PbzMv=da{&iq1*yj*hmnbTE)C+MP_^gghZeD}DqU>lr&ELV6U0<(hHgeZ^DtpfhELZK@fg^QLr09 zzm9+dE%ZQ7wti?t54Yvn<-`b_ztUxlOQ3E(uzNYYoX92?Ly~t^bTq+<#Pq|D6H}nc z@kvJ;v(4OuY$5rEn7-zrtH&Q&d6(|<0-g`(xff|)0$*>gFVUo}yvvf);tG#j%DXH( zkFUeW73cAdGfp+qOVT(sr^Q{^VcmIrA3QFK9u@9Wo?Uot?{AgBWYPrzj<3`apX`Aq z6S3*T1#3mL#H=;{nDLJ}er)*1Rwp(qDU%U5jYraA)yUz8=Lp6Av%OqArRvqdHqH&3 zm(rtAW?bs)5GJ^I>+JYaX&kqec|RVpFA?)$?8Z`6_^;0x=quHD3Yx2)=0&GGVYS=J zJauK$OUm5#m`c`46(q!?~gi$OTT6ypt{7kv(9(`?g!*?q#~D+9iaDvVP%V>x&o zt<1Fp52g~&^q{97?O0VSjB%%32F!wc?Ov`u^x9D7=G@@_HDzvAJcBy>detYIJk3m> zzbUMf*Iwtf^T-#x;_`{y!W*sB2jg|ND8$8Ars$BF&>IDai_M$xcuTMAVD3aHNJE)x zOc%Pi%85R%EAs-lK#r)KX=?Whq^c_Oa=d`ghNsL@^Sn0vW6MWX@l|Z*TFwI4VDd-l zX*z~k0XqG}bA(XR%MrCt)f)6Dk|(-wZY5>`G_Mmz0^mP#w*haMLedXpCMV;w0r&l)#`sT z9pr`os|exw|33*~-9fG+{VyYg)}N5fq68UpywN7be!0eb#u^rMNQBij%3KGIpM>gbXu7tZHh94deu7dj+JZ|KQa<^lcD)BC<~dcHEZbxT{#{YazrqcRVIn>FR#197qt zf6o2mM=|>uJ5Qs`9sN(S_S`^J%U?oI$vZEBfKQ33F7M_pE)&-`*2ZHpLA5 zwoglhjsA5{7}zrL!Gs-Iyzi8F;RD@;uz7AZ?ll0?u7z;PLFMWywC_xoy6s;Jx=vI?n-Ti1$7grDs@>lM3O9ZPn zpI(Sa#e_9+qZZjU%=%BSi2$vxX;D4B;j8go7BslF`X_TgypF<{=mTTxR%a5xU*-wl z5niNX4N8ClIU<_;-aGotlaEWv&lyH7LOfMx9Nb;P`}k7yij1jq%x-Z_1c5mW*(~5~ z7T=s-N<;{Mvvt48;u}9euvZoZ84tsoAA6el*!_}5S-Kt#=3Ggn+dd8OC!2R z$i6`QR|bfEa)pydM>>r!KiI2+ZfNsL97hWP zP*<>ysAXNUjWWAJKyAGTMkq$RI#JQe%ki_i-f&-2%|ddWucfE_wL8NdCU7Rf17})! zbDb@H(&R#uD?bCdc?vd>_MNWPazHw01=m5S9!qpgxP*COat&6kq`a<%My)E{ zW(dQHJ2c8b=Ug5!D|$PGdb4wdD~^bA!M?AMzhSI_r@SfOKp@Mb0uxtYc}8@Y1EbW) zobanD!)>Q|(9%7hAckI7|1S7WHQN?=E;VITHi|>WvR*}?Tic%N4i4K}Xhf;r35QTt z=7m+9h*Ba-VQE)J=S`p(s4%6wq^9OUSytP-Ujt_sVgaCer1;FuwY(Bi-V$j%neF z0n?nQd*kN`%D0hD*1omARK7Knm2W&ypnYTh$h>X%ptgbs@5cT%L!Bz_^-Z9;9QjV8 zvF~(0ao4L$Axt;19+H;*;kMbih$4%`>ROJ^mc%V=NmnXY&vV*MuW<198tyb)vg!fiC( zZ^Uz2xs9fmN&4V_kcJoN1Fdd8S$7K#Z+p2X=mheB$?*NvVCz-&j0|03ayL#t>C333 zERVgtr{%zg$@fkpNiMaLu}C@0NLewb9{J#0Td`_gn}L{Q5J-IHlhWcL7|QCZWAkiI z9M$x^2$7D0EYwIM28{(}hzX_djv5`JyAlU-&FEixA(x zIoKa42i7_CAU=LDYc%HoW2GIFp)_(>nZQ7kVMPO?MkE_QkqV49wcF7fsn`26ihSSCzT{!2i3Y?;_RtC5I|cbneprhE%yD6S~Tv;>6ZdSqN9p~Mr2>DEc|Y8eBqrbTE9zse5;PKm=0di=>g1RGrm9Z zj^Rcwbo0_BMDtRpJkFW$|3X9Aov!f!N?Hm7AO(Pdz)zjDo^p#YyLMP$Ge%?iaNs@W+z$0O~>jrwZ9$D_XdwmfrGb~?;NJM55= zC9s~;7uKh;mN+?xw+>8}4otG|E=-av{ehjxad-;mazv7loPCddM$PfSGr3zBNSgs3 zL=2=y;s;=qxyrNYrg8?POjoTBwExP+%+t6r^P>nuH5oP_bC87Lz3jv~SykS{iMDo4 z??LR^o-(i3I3o1lw0!B2(w`OG+k#_wq>&e#3aUJSsf*WB9M)J+8r4W0d(TFtbkVVL zl7VSZ46U4*TW-Ipx*MK{i|U|CAm56asTG)}puWa=u%4oi>_z^drZu;}bNDtd*@1Db zL%ScMb@E~by%qvpA$>Xma~e*7CG91QU`ugf#l3OLAZm&Sw-|?E+p29NEzgmkr{FXq z|Gi5dxXM!ULs9>aD=hvm>;cMp14=7FT_a6y0i-ZD z#XKgwU>tsA{|Rpj?3x#2Ho+5*H+$@ED7$Bl^%l~2uZCwHJ?o=g?+!YQ{vA;0j!@_} z#GnE&sASQI0o5>0vV76&831)41=WdK_NrxqYu0gi6O2KW3 zcVo?NKk9Mog81kE`kn(vVskpDl|tO23OW>gSoT_A8L_RFobCF*MJ5g z99uC}GskWnPY6Y44(d5~XCw8=GSuVEgpY26EdFK*Kj}7Of5T(rxIE&?Hz?(spMlFj zoBuvDuC&<;%j6tn_3lGt&B3fbuR5pZoGJHEFWrY$^;;$E`oQsPhZsE4`Ma>SNttlb z7-20ac!yxcyNEe-W|Uf(Y}7_NGD=OD=~?=dD;cF*kF@EqseE=N&OZI<+X->yB)5oO z(_BBdrbm$Xfa4^+B>2UTRp^lMs01S@^-HK}@a?CMHCNW@Ve52G0;Z4}}giHy* zQ|_&a-3xU_Gx>yTS_5;4vNSaZ%-!{o$Ak+D5_m0Tb-yx)_QW7CO z)k>WaA@$fjrKF76)Z-gY7u}TEof?NA87Bs1po8d_YQP{@oj>8T*#E*mR#&iu-Tav; z$s>ccp1lpD#g1-eT(}JS%B;OGA8kiZAx5zd#0<^eH0NV{UB z`|g$7c*YqY$*nrlI!igKh{O*gtyl1^%Ir<#46Ub;)*on{i?v=Bte2tkXMCP({I|}3 ztN1?)3XjYyal$CM+Vi~MEU%i|nJ0N-!oO>HtYs^RAgX7%#mL2C*cpt0kSO=nZjTHy*bIF!5 zm(JBM`?=JPH)V1@v;m{yHuB&&0XUD9``C{^?j=7SB|q+buMEPR=2d%|HA>KOr z_-CyLKYDzilhHrF?|%qP_BZP6PXKfCPaI})Tk7+(vUZEOOz#S>8C)Sh;W3 zH_qm4+&9}B2jU;@o1NR+iTft)ypa$QpVMajj+f0zMU;o-fb%~?IE9}2ZX_i<93r8V zkspyR4mabZ&nBn4H}0#R^D7r~?`f(~y}2x;%Sn+m8?DScH2KfS^jIf0ghD0|>GOgs zxxy*k1OLR9qX1>LrNLKEx0nJCF%vWX4Kbu{oaM9{Z0zSjJC5Ey$*E}Xp$(^bP7HPt z-C|7Z4%>aaXaDn_(>h797XTmiD4EnZX*xp)(IZZ&f~ zsbIyVk=#{X54U7&`i4UVGMd?ap6C+$RQMtD@ETzr!04@DTjy9FbJygFoR*zu*3+Wb zun#LF+{e67YvP|eCFC$yF9)14Roi+XN3D0&@7&hbBpAJ|Mco#l+=+8$v$s6v5F2OUbn)895_z-TH21^}&f2r`12jxfw4B`2&GlYMJ2dI1!1AovmF047nDVuLyskJ{c*~YI- zR=9m4l|}PUy#IUpS7sYHK$z}76}0U?1lq&A%FMkNe)%-VE(gRFCKJ%zZ6X2P`~wK+ z<{Jd`=c`VI zIpFpD_fka#%R7jN|df;B!0k96&ATxhv>S7aBtq3PN#&Ja@u27v^(f1q8b$vXtia+<%pKUlGxpS&BI%AzZeUou`-osn^N{hA+`fI~J#FrTTt=_yyQHjG z&&qo`xexM{J!S6>W!U<-x3?l2OfzVBUT2X$({T2oL^;$i?g2id%nO{=k~-})!kk#} zvP)VdSO#&!W>cYr zgXx3qPTVzQ>xUfm&l+}%!{iDOH*BIEM>9Cl_FzgA39FEnxOX`D;gFnX0^jUn~_7(g&)RG2sc}zrTdZmFb95`J~>Q(a~5^wzehie`fS8}c+6MM zKbvItjkE7P-tX@``NPvc=}mD_6?GH`Uvwjm5lBh?q2blVUk~ipHKL!!{nkjuv>D*(9V2uXJKGdfvhG20eW|C@3}JJoELE8}EuR(@$n=aX43T z!$!Yx#4`0y)?q#ii%sHY&@%$ysk0gdsf4kxLR>!G?&kQ`3GF%ast#Bx3;>+ZEUB+;%jy`)n`SS4P(;UT6Cpx zj+`p#uzYnK5(KDCDbyJ+%R9CQONL?FJ#pWZU`|-n+fO$2HU6D?M9{^scu@^$@~-Nn ze)+gX8e+utR1hyxKe?q*-y}zS43>m=spNSCE9+_Ngl+moYbj4ka4KnSkbt%M;pouQ zULrhdl5h|3=+?dq57v{{hPTLT|1W?C-+knY{xv+F#W(7J)a?Liewhd)&deVGssC*t z@v<7@TS+ke4+2t5hH-&p{q?7R7HKFrGla+R+wf>GO`qPv74KgF539-g2GYp&@Tn56 zd2%C;l%&8YaS-#ffJ2u2%(0<*$KK;o-`62^RaTrdg^zoQOTIjvp1r6JY663NkC$u7 zFt90nnX*0U=Bfr|N9Eo^F=Q;ZC^v?U_}!WL!(m;<1Dy5Ym%!pue6~XhM~71I*Jeu{ zMP|GG)!8m&wz(Ty*3G*;CLOPtmcZnn@-#+&DuyQZS?o{f8dX&$j|z;VgAp*@0;>kP zRmT+DtA-Lf3kN0kWMNJd*%C6M!V8psL_uGxR3$nNds^&2xov(Jw4D8gULR@B`zLG1dGczJtJhP|G*F#u0QgzKp6((qdE3+z_GkipB(v?H8h;%v@Rms}hKyqQ_7m=v@GL(tr zEg2NOUF1V^8)%C>j{UFj$!YLeDRm##bi>`@u!$NR*ugcBWC; zYNdlvqj@13YQ*ZK{%xpCobjgB*Ux)lM8i*lk0RaF4t8^<73Iwfwd3C`-Iu{C@`YnC=!}cMZz?>Ox1p;iv!U;Ch_s=N3Ac+FADoTPD^lN z<#95zWDV+|T8X`5gB>W}x*mJ3?4PSdq8;wsNQkxP23>5tJuN_7OW<3l5w2=s)@Dyv zutc7TpqqR(L07Sggm-Kr;T@R81%IAL;6~&}sKvn4DMlSXILw{2(ce;5*t=y}%+`b5 zH@D|?X59Pr@8+1gxMS7%IfaJH?{og0zGaJ6=@g;z<8SxasngL?7Zk-Tzc2VVClsKh zjfs+TS+0T$7Cp8ab!V!RI%!rfoGK*mq3I!0O5M3BkDD|PWOgq9U6 zt4u&Vvc#!-b94R}TIw7HA^MqPWeZY{@Lm!}yT-!}x%d&&N&LYU&pz1Ob*_c!-Qnp; zokN&8IHsM(vr}3wvHn~t!kHO`K@I{dq2xYYJ|9l2`Vi_LwuNDB4>oWE0p})=XvYBY z$OTMjptL^Bh&~A;dYj1b+k$CsRxf+Q|8P3IFEeJC9{cz4j6;;jAyffXSZRCE_5)?T zEl>Asg%QS=jw=p?34=;ZcN&D6qEG>9o_(chdUX^*6h|9hxizFre}tsp+MB_>>+30^ zrWAC#VB`%7Isu@c7Ifk-RCCPPck-U~Iwf1#Em8`^{h=?|dEKTacm%&o|4+r2BPt= zAwxrFd~oR5JsW5j@xjLN!N!-L40a-e^*}L3lD|BHvS|(Q zZ3vo#U6mvUpn?9G*PNpfn-kty1M)AFT>Q9aE5+{K{vz&Xe#e}D(ZNoWQ0a}TSsY05 z$Sg==lKr9g6UZ!n2$|;jQy|CyM}}S}tS=XD-M3-r+;CS9OLBSIsKT{*vJ(2w=}A&Azz zKBQ_k8GW&T2ho3bm;VG5zF>EtR{q}pqR4#q9&*cuevQJ1@6SJl&6B@BHnTo#S993L zBVLkljl<>-`4n*p;*tmEi&7l5a1Pl*WDcE%&`7MK`TNY$;W8QD!`mq7cik{^zT<}Z zUE~rEuQCz@eHP>@buom;=`&@h9bGX_<=7i?8DOoIo-PH(^fZ59-}((Cvj2|+6LO}5KWec zxqp~hWkuQ{c$)iTb37@VVHJ*Qy?gfbf%atyIc>#K#2WcC;J#Y9fRef(MO!UvciBgp z*DM`o^Uy1WRWp!n)bCZ#OWd@WcZx-*hsWq#$PqkWaMR84Z#KvlT& zBIl~44871ypTaQ*JA>fSatBV_-5|$%IoPOSVfo6FoxnWQE2AJYA(ofb$HwH03O%t{ zgei$q+wgAMWc}`+M*NwX7M(YZgiqoPW33yXH#|6r1~>d_)Nl6qnAGEM%~38ue^_Mj zRuvyLkkT~gDy^RIKb3R~HIkXrV5BbdBQFJu!zsULI!g7O4igSy-)^vPB}EFEKm?e# z(8A-m2~R>`N?cHIs!#c?m%+FnEo(?pS38~35(d3DgRTtV7{V?s@PKDi|54Shf;8792DM3PK%`!jl%^$UE4`fFV*dSt1623_c?o+1VMk*eevbT^YS|O_ z8;mVKuH5fGc)m3s-y5!nOE`kO#Efhz_-}do3dV>p=*eqho37iYliX(6a@s6fiEZX? zn^|(3{+rXL_mf5&Ej`Ya9`H!at0=w~s#!KHU7j+{ZD&vmvG0rL z5_Nvj#6X_%7?n$xwtwd040^7>m6un~Nb|;2tG<1Cu7+-rpiP}dyZ>Tdpn3nwj zjFp_b`nA4z;XZQr?tFOh@IM2C{>JQI0n$2MGbor_4?82bw$GM$X=4n{5Xo-aX=fs; z&Kuy(;d)Y%z4MhRg?BOB-QGw`=no}hKN}eaw1=MPl9?5MhZA%I@(V%t9!OFmX8thP ze9E|f_*)x+ctvtuSbRi(1Mjt6msGjmf%I?(IzDfhUJ7=w8r8KLW$ksvy7NC8O zb<4#ygyY-@!rL-(@Z4yHkJUfL8e6szYte22M~J_zqRyp(m#vvLG@aO<)RN z-VN%{zmZw9V|N>s-q$RU*G>R8iH+U9xKrX?k-`ceKmaI`qU$Bn=`D*mu{4`g1e}sr z4cGiO{Su<*){P({A>tvo;A)OiIXv|cI>vP#-T121Yf|tRiD(~>76ZMPrTIpPmlyk} zZ@v!XihnaVUxkRpzewpX!@%|?R`@E2?=e1z`6{5#kA1NZHjuVNG3b&#(o7tUel zBDZAEX&4jxAmOAG9)4D|H8;$gj6~V5b6%KM^}>@a_K+++DCJ|NRdUfQS>sKWVsaYc z*GN-Ny?XD$>y(xE68zVHF*X*?dzBe@+*Yi(9!Vv^xy0QAiIlF)rF-IUV}7hF)=5?R z9VqlpUR;*|sQ|QkXTPz$UcaLhz%?LQR_664C_!?aMauYdRAHJuu-Wi+C_RUdQI%Gd zsU^8Y{M)fKT)o4XCxeAEswil1j9R=|cR%lL=pY!chW3!61x4dP|?2jPkz<06+i=`vIIWJ5kXT5|VS z#kGS{;jqvpe#ASe;zaO<@|E?7WdC?)^irc*=$M>sx**)a5%hv@E<`7FMY8ELMV&F4 zb#<@cJY4AR6}zk!9oOHZr*M$mr-QWOgKVU~u@_cYIdi&8|6X?l+jFP847xjeXBi{k zqPB7_czZ_;)J^(^A9pa_l>_4GQ{)?VI}Ur_+yzyc&IN@)&IyB>#J3KC?1Y z?vVP{?bXW!y@^{@G^Qv|kkUia?* zPQL5@pYdHccVGCfdpq-+zUx$dc3 z6%LNLvL9Df3C4xIy>R3n$pKX^-tBEk&KQOKyGs|~u3ql&sew7AGT~ubsp!r4qj`Bt zI+=wM(vNWC=e}&pqw==oLFlXewVf}L^|1`2QNE?y{q@n!)bqF^H@9mIW#A?wCl7*X zjQ;P8kt+-OBL0BgC@U6ex97$&xSWb!qF)E{h0G*1MUh9?KdhT_kci(K{N*OKCy7*bIDD zTlq?+@f^+qHs2I*p$1!0K6Av2MP5DT&0S$HKcF}Gw z*mRoLptZYiV<9V1>QbP{VtR1uUzpK4Bc+4i)wb77S98{idn}ai09=uou8v$AYuuI- zk$E8%; zDMJy(pj?!H|ICh=ER=m*0#)U`bJvgXR(^tp=9;YAc|Fv@>1Nw$!s#|C!$$h&Dd04D zp!FQdVJGFd$!pdbjSQZ#*6fJgxu2z{8Tt16eQ#3{EQb`s@hUnmt37%bw9T^~tkj4u zjTY60sW-ft9|K)nm33t|svs)Ustq+hj-~)#ZyN~0Tt%+ySZqhS`{ruf7Ce;}LmbAXmLH_e=@)a@>WgcLZidBw;v*UK z_nGU!7lrn)q5QWg05oCOQ*+aWId)V)I3ARa@=zh>eu?_0oM^;j$079!y)5qN4=m;t z<;_YTM88W@v*WW`x~GmO+;EE%R$|XM&Ua{1S~!cvJIbI{9VTZhQq&f?N4gOCHkMda zm3hT|S|T?~?=AfsUEQyVhPfzA*gY;eCyBG2Joe4x1(gR$JDlsqPW=&h?{Q_1&srNx z|4*ZYp1hhX%ltJa7-y?KoA#}rn5LECfSK{DRV_)vN@=7B< zfsfNloM|v~F$K2LI2xz;2jvE*oMLKhpb&^(4G({a=&u=!rSqG>W7@>{KThJ9Oj#EN zWnLy8Jv-4mZ;!6#ObqovJ-Hr6gnXtRKPR800pK9ak}b2`d4f2{b`@sJb{c$pb10>t zFj(Zy7;a zX{w$;=qD_Q-VC2W=-F(+lOHj}n{%*evn#2TWuu2ndA_47%R)S08JW#hb<=b^*pM>R z8-qu^06{3Y4Hiuf{WJZiD9*9l^2%eIAb=0|-rpl9sRFx46rpv%X>KVap03O3IwFMl7L-(yXoOK;9x8Pmt5L(yzFdFa%4~W+>@A5vn6k`;mL17%xVh z(wkb8&ogtq$KuTkfxD;Qk6k>(k~7Mw$1JPe9wTPXnlkC);?C`n6wYVbe(_8U=f#`b zAbvzMvG>I9PbB(SVmrJqC`R5ap1)`af{};j=}f2wwm00oCS*jWc|dkieo-tAcJyX{ zLrZF;Jt7uE&3A~(#0bp8-;cg@4$+riWh4nUylV;A-iIP_`h5m->oJD3SZ&fmnboW? zCmL=LZMQQ7q_rB@ep36dd)g^=e-%1Y!5M47Q#Kh73`qhb%j1~)`AvkAt*i1_hZp0P z^#Qlo!0&OWK1UcAS=FgpoSAVQC82Zx;tXI#l{pt{QO(%KuG0ACLJDdJ9ugqVue5s` z&Fb_PPo<-?todITPoDxWYM&*5qPp25aMYjg_V-AbmIG_eC7&og2~D^E0F7XWlSRUR zi3EL`U9ZO&@wkTKVf7NY##FB*4}&4z#aE?L#S$U&8oFe3p@VjPG6sE-x`%z1B!;Gg zMrEY0p=cVz_ek};j+4QG_#MpyH@%=9Zr2OFQrfSq;O0aNH6HG{4(*t;*$8kiUSQzM zVjOBYOwBu?P)Lu|8m5Q^8szJHr6~+FU4WOBIR~HDCOuq9)SLfyAFBUiSTWFKo26sM zk;JALUhQNZw0l4YFx}UYOa4@=($ZFUPs&76J(!8)l%q9HUtw7*Deonumi8{?dnK(= zle)DwaWdXF;QWGD@f)C9SaqT;4pRDY;i&mlOD6SR%5+fkySRw`(Qfv^G&k#K%Nv%u+AU8odyPk(%_sK;yin zVHDmzeuJ?2Q*#=XEXa-Gg!DVU_4;l684fbETTRHl!>sjOj>^eEOBt?R!Qmzw5}F3t zt-0%j8G^Rn`Bh|f5K2eJe%>O3Sr?Y41+_7^>*om3#tlkN8Gg#T>;7A)Eh@^(2w|)# zPl@LI$GQj#1-k`-4D8b>*#42m{5Ib6ImBU9UZXxKD`wDV&}{e)@6-p|jNcZJYbQ7O zRCO{c11IxQ(`q)NrOv!KrguTTvrD^B2LrL}bfAJ4qpX-?lMMNZh-^{VcJnhL9@_Ti zrip-}D=6Y01q4MKNLE)q2cmk4<@-wSm9}H0=V0Nk;nGPWNP(|PrkUMC{BDm+3Q6Mg z4ZLsj1-J!pfYV($WHZm7ty7)%lzxsJEjoKEE@P2#?&B=G6x^N`B8Q5cfp)LLFow8A zmi5IQX9b%F^e!}L{;J9g8peIJ!7n- zs{CycZl}U)*&Eu-3we+*Bp~7o&0k-C?I%HZQ-*nqJmz0>Lc0*?GcAS@hXEFK*klur z>>44^ChdWqoG{;2hm2ZNY^~(|Q3%7Wr?23@&TQDp6|`w$mTi#dvQWOx5GA`)1$aBy zE&ExbHmS+LNj$zd5)I|giG#7eT<~ldA)RNc`YZUdEXdvj-a1wI$dU%OM0V}~$r(S) z?JmN+r4f545AB*Hu?t6He|gNkvDrLDfcz-juIHSX!3&=l!1{%Cj0m*671xk52c6KP z8^$SI=UY2y$YDnBsdYmzzS6AvuiMjn*{$JhckITJ`j+>Gjc`J-V zj~)Naw$Ok71tM{-)qP)oA~zlW^hm3^I9M@TGvlkL$-W-uDRi9QvG-MN(L%jqkV3xX zDQp;8JHA8MS*kR}ZFN$G$!&wAg!Um%RBJ913I3#tP_I9b;G4fht_1j`MH^QnrO1)QU(1K!8Zw2WnwZE)+12I2 zDzC^r36TjDy4!P%XsV+x*bqK7QHQb=P#jq`p?5Ba2a<{b%#j>TfRBs=PeQj(SO;>Q zcXE1{!&)UK^h-CkZk@S1@xm5;$&UQ2%-zRzSbA(HAqxt4(vhf*lJXEgR@-vaI7eER zxJZXrWc$O&T-%T)RhI^c)YP${MPn5)d87{YCWD6F4!-rpm4{JI?Xa#tsoA8Y!$%rRjqM zaY{S#-1c5hq3)=qSfHvzHX91?N>7eyN+!4=Inkf%iDV(o$|ZF1Ao>o}m8j+8C@=X5 z_px}&gAetHO`^rCkSwTrpY9TGr@K!f;|0}Eq=nf9^VpDAkzt!~WyKL#59#~RgTUO5 zD_`&0#;`_%xKr=5UF*J3<_FM0tJdUr$Fx8z+&ODuSX4fP=a~V3>}t+Xw#lN}#e>kM z#qA*y^oSVQeUih)FiQY+2XPn{*4$ZpTY$S?60DsTCUpqb5|U;-yS5)PCf`08{#=Ky z<`C!FSq-HzJJXeZ$X;y`V4cy9rl{+=wnmXlBqLp!UBDeL_Vi^CC{tM>)zP~3Cn5`u zpz46xsWxCmV;jMt6_Gl?-O$PNtrfszuXgo4-iQaM7?sv9=CqzW{^=)7%qz>+grFFl zS@GQq6fEgm+`vSr&fpm_=1eO)GZJSCV!plCJ=M&}2SyA>aX)wOQ$P2gt&k9Ftba*A zevVAtVf4o-ptBbL{-)@8Va|-ioP4GP`YxWBtS21y&sIG9^%WDa?1~=|?n1K8oL=KD zMlRYNCT~-$e{^|CodSw@LNsz;*7y>u(jCsa6P8A5n=54W;ri399}K&<+*?5yr^UP_V zED8B~b`N$U9MI2!YpbUqx7!V(;n*ts1Om2uI&P}cgACN%ALuQ#w@sUS<~G=F8rwdy z+@(#Jk^_Q2%A-{#ykQMGseBSgth|1Nb3ticiAm`utp^RHU!iAnEbkk;V+N zdWLVM=B&U8n5Jfh^i>S|ETvrb`WlIpAX1HP107i@`RcU6GHpExEdK~6%{^Y9T_&Wd`nctgmMxRgI)2@6xn4#MzwT1t zx;ZVqxt$gca@7z8MEa7{(vQl#4{j}o?Z4&w5ub53j1LQLhB3C7KQGv=teO%6J!o=t z`*{Ufx%xLYCRUly%tSd#tY-g(aXX@t%@$yGsPkuOHbYkjRrj+_lZCzYUHHyha#ETr z=c2l0<<;!#V-LWu__AH*@kB$ z@>KGc2vqz8xunc&m-JA&=|IW0Hm0=DTVhQLT0 zDHSk0xS0dSottUl@3fm$<&PLMM=Ol`+O|woHYPCK*hhaLw#!EJ5=Fvu}|*f z1@DJ?t~qj!c>WAbkZ2*>2)(?{@c$<%V#Q?^hp(`AFxkUJ?}Wyt^^h~XlsgHhIQ8|b3zxSxbvmf`IC>h zUuAP^sS;B|Ge$%e0;~9ipD|W7gR;D912;T*HEE zlAEbU3LSeVo+4xRP}~RY?NsL7i4AlajN^S{9IIL+%CP=)Fe-s*3X(I-&`~C@rLCtR59ZTbAkSvzz_9n^hX{ zW~rWu#)H!TnK>?O=sC(99q+wFfr?q7zA0-=jH;#_Rrm!g z{AYX&pCl8_2X93ixqT}cAGSa;s-oU^T+TGCJqipED<-v-`K#;Eux$nMLEg#-7h@aU zmlq^huqq>?m+#KE9Z8L}eE&_EkR^`|Z_h#xuW>vjqd`Ki9f(C(Jr`P>A+N_AdJ6f{ z)ufzRG0qvjv@0xFvZ&hR340Kk+X%Y>wDjJ+BgCE=MAxws@jEU$aX4Hs#=r{<5n#=+ zcoW?~Hs{y@{-$Y}$Pb3`ROd^!<)e-HZ6b@^7wo3EB|ZJUm`?H&DagwoTb6`tmTrXTM}&CvC+=a&?;R$N(Ugbb5%eKd(OYACIHfrnx>kKfRy0-N z!V5MincT4dQ6Wk`c%bJ$6J$w@%6Q zzAjslc1Lu^1mC{5>(7*!k4=aS-bc^{1bPN1VNpz(t0SZox#a9wDIr6G z9Zg_AJKA}yYxkhMK$_SGiD-OQepbV1kVny->HzXhk7dPLwuh%E1k1<#0#{G|oprk2 zNpWv0X8Ht02+|`VN;HTA+csE(L5On6`M2UP}b$;M!vLnNt*J;Jc=fhbt!($O?U z30anqYLAeuxZDf7v6qn!P-?WbI9o-at*hNgcz`b{$ai{<%&#l_a|=a(>gjNBY3CUf zpdM#8P1Z!y$R3I`ottqn9})yWR0+FN1=Oxg3TC`SFynpXj;m0RT5!h>uKyf{mU3qM7R84k%ggAR zUVP~F0FV+(Ya8B5ySMPV6fPzx4By}~dQ#|?t3eO-6pDiis^3^IUg%@bo_Ldxvib2t zBUBX`KRF5L{qpjA_(TS3R=`f%0VlMLa6%i~B4wD9GYPB^Y7L)`q~*Bn@j55A`^X4U??{6#|29+Gpp+9-IhE+qpa#(rG`^Z1i(S6}jaN_)gt!h5 zab5CpJ9F=7Z>D;~ux`%~-aoAenGd%H&l;#+goNYLY+R4#IV2pXO_)j3nlfGAN!yh6 z5_IL5PaSl0KGvamdm-D9zS{Tro9bBsSq4}o^T57b^J1u%&q=BvI@)86{iUl8vNkd* zW=B#b9WqmeEETf9rThqM;SvYcgP(JDle4bgA2^n_f}A8XdWDw!DXpm-cXchX7cU&4X^2HdKO8>d+{#iu1mHW3hR8ILfTwS;Y+VGw;mc)qiwCnFfiv) zYhp0R+M!@6A+gNVA~yrsn@AgkU{(<61eSfVefw+icI=Zf2FEa6d^>o#)_Qn!m@(jPg19SK;51N}+i$Oq>e)ttg?*e_o2&DYGp zAa_dod^07d7g}?wFPF-IZ^AL4Q z_zuo(V-bE!fK z`rz%X9zo^d4==z?AIVr$|0b4dzSq}IDPK~GKuklD98TyBJuF|< zL2xTnTx%_f`-xk)wi%h(3%e4gt-lX)#$$KYxEt0ny`%In0T@`hvxNsIA{${HIVZnh zX3kJ`MooB&h@w-{0c&`xgwnuFpA{stR!R9++hVw6He$Xq$;`neWVYb*bUR;&Wo2P= zw-JfWb+p48lN;v6J5O*e1Q(xM|8v{PWPuc8b0NTN!CvYvIEmFlGsAhkwqwfV>&iT( z^^e5Lkfmk3`Vm#Xl%YK)wb4G zG0>_;$~ZYpdwr1(wlbBEh0RPb1f9;A7Q9F#$t%{PW*RB{%os^mB+hrt&KX8usHc}vz@1Ryrq{I!^Y%8r=s2#^{HW|6FMK-VC zw|PM+Pr>1EZs31tcv28!ZuO4OlRD!hbz`~VSe1F*mDO3?UFqekY-;Ts6p1POrYG~~3(ZTp>4t#cHot+@2@eXC zI+=ZN$DY;c8YQkd&bk3lLlFbiuBUAoh!K~<;E^UwXaje+$^!PyfnM@sRR?@#*OvIJ zD$3Z_q*A6Yg89~4EgVt4qjRs87dKgb1ZVyuc!yymhe?lFl7zv1zg6*9B=iMTRvXbq%{iWhB4=RnB_^p~;Lq4C+pIP6UtS>H z1&(&)#|Qt|>2ucYq2Tt?Y+pi6z*2v_NEHVT{O@)mbC4vrYy@Dz8}FF4NJY9qD5+={ zO70|m_s51m8W{M!S~qW21ll_D9`iq6>nD0J@) z*e%M)Xy`k|u)-Iuv7S(d8G|NL2w?JAV<%6sQujLs(Bqo*g>_QIuR`cef4r*4KfJ09 zo8j2&-mc1raoK8#T7r6!Mdk{2k)(?G)h(+1-eOj)W?0%Kt%6{ZDyu5kfmc)^rtjyV zdi`?Oo_~Ek)jzyBqOl<+*KSTldC>jhzq`wWQ)D}Wu+r&*tuNdrdm*o`_`}6f)y|Bu zQI6i-#r}+9nA3*IB%n`}hruj`qSd4ZmNHH-dcPpY4Ahp7%L%!v={;gcNT~bbg5dTR zMgbw)WCLO2voTAzq-60ZR^*LX`_r)wFUt|42-fiVIwP)>*miLH zshdyKy-(p6stt8px0tp>nTYPD$_g<_SY%OvltFWSA{EW70(c>0WT@wbhzgj_z(PX@ zOnQy2Eb}Ay;5$lS0bu};bTd?d=P$E2d)xyrVDV>xBbxBvhX=jrezk6?X{<`?PY{Ed z^A01%ygYXiLyqdRv-FJa!l#d9p}X^eKC~fp8grw=wB{k{9G~c4KFGvq-uYi0UZFj0 z#}r_T0@nh!=_V4#fy)?PLh~%uf$ff+Gdez4^fFIpbySbRjkvjI|89Xp=H-X^7(;hjSL3t1L#i4uK+$L`=??iB|Pii3_IQA?bNPd%_ z@`0ygO=>pF$@Ck4Q$A46+u4|K*}V5(zIQ!8B6)O#WY`5puIvm7B%Y6h(yVk{7uTcj zaT|+YW}nUlg{J|QHTfZHQCj5qw=De8wQdXsL;=NMK)6u^$9=&XY;9`cL#2FA(Eeg+2zf4{!t~yb+I#1wvxoMja-(kN(OiWU*7*d%EfoI$9Z>n{e>Uy zXlKH~v1Z6cQoq{KFHpJd0J;-lth`Sl-JWF&}S~tYkvahVT9}S zr$Fzq3$YpM>F>kbMegUn707#k9OOsZ3W&>}f_yO1keKJc5AsSfJ^7CW`EQVxkp=nk z?@L)Mjc-b@cTX;(Q;k>TK=M6TJ?Ej#!}JX9V>%I?$3*;pND;D|i2Gv2S|FXF4DR>M zXOn;+faLY`MKP|{f{76)!s(`W-CbdLk58%A^r{$KA-^a(RAW@}+J$W;peB!TPDre& z^I}}!o?VBNof>++qD;y=(chYF^^eT9^=q@0`YtB(-Pu&gkMknb?0lXuEu>R9)hbOD1BV-NNW@z{MnyT>^s@;Er-AAsUDpPs6 zuIfqQ3-s=T&0K38^wj2=Cb&y{w%qRXr^`KY&c*h27g_FkjEZ-kzg+LRrQ$=O;>ngS zvTV%t+yuTf`!_#heCXCc3FrKH_)Z!)+Lzqb+6$GYlOp0qzIRKvZ9w+eTTZ`eU9K}D zl60MhG=FDle(m5%=Uzp1jiokc!X3jnSDX(boXAI@Ly&FCeuEW}kJOCwl##DOK26E&ipA$Q#3>Ly9Bk)5A^-64OWT5IlZ zSUkNsAU}x>d-rvZ_(Tl|@5mLecz%;8X34%}zV4B~Aj#>5BNK~>~w8IHrxuyFJY@fw2k`2^0O5$_I)0$h&ucQ1|=E{+q(Xx>z^+93O2AYN)u#iHa-MwBd1#i0Y2CW4z=1o9AWZ-<)$S z;kyK~oo;NDfDogdBylewHla-s?wnk;qtpE5+y0jTmVB8qVeH(3zkFU6Q6-_uRSaru zPv>;^cPH$0J(J=K^kL3O|6I+Ap;GGW?Srki1d^WS3Sm2&_0)aN)k5~?Nc+44f0r>~ zy_d5h>b(?E$#3s7&}&&*-h_$ZC;VY+${)V$e+cxD4|C3kCmdkYLJdp%;n~I#$TUz) z(w?1mL`Rz2NRgb47Mx#pBoutojx#1Nzu|3Udi}xYuTvJAL|o zr|koM)~V(tudOlUwcRE6iKER){i*t6I3MIT?iSG}sj{Vm-qxa93h^yv8|30i9gR*` zBZ+#AaHHFmv?N@jv}cRFmXvpcj6ZZl&HHq#53iZ$=kwKXyu;D31Ez0nNd!6DGI{Y+ zNai3}Tlj-(#1ig_f5IpU2PKS>xZOmX$S?L1Wy6iK=@WV0S;6?l7BTDyIwnEctQ}I- ze+@tB-XZGCN6V4~fpTU%mw2pd;WsEi9DL(*1XQs9XN`aYR;TZg`3&p!3+3-#zpkkJ z%$#SK2>L=o-RVBxuA*xt2PXqehSRkY$G%o?4r;EKVR4i^7Y=OH>tAuv9-c0Y0UbCowQp$h#;~C zs-0|c%Z^(TH7U$3Zy!=ig+-2hhfK5!lvy8jXV{8=37$T@FU9Ln3t0}5SY=+Otw$Xn{Myq?MO zB+2aL!-n=wW4*UUHX(j0Tb#?=k;S309JvpRvtu~v=8e1=yn|fD+f6xtWyZ*h%?q{) zMYdLG=I!)a2Hbq`HSS$+R?#M2T4#Bb*X5wq5Kcd8VhE&f5&X;01Y_*k5 zZbPTPv^4hZ$%eplS>!rZ9;X{JloQP(mh6hMlh)koC5=2BylnYpl1oxrlC!qg+c>46 z#3Kd~zK=^5sord((Z*s0IQNXUZ#tVm1|$B84!cuIInV@p!g-w)!yFouSNcCngYpf< z8IEoYo|gG(S$vAG*!d5vGO~M2q^bq{!o#c}A3)L)D6TM}Y;w7%yPIO+}{<#(9ovMf@Kq9ZV)hnr^x!gs!r(;-g zwlupo8hnF_`>Hhe1}$)p{T7Ct-haV9ny#0`J{k`6o@>-yX1|6xr;SmA!V-GkxnA(D zcw6JNJ=Gg2nuMu;I)(Eo96*b9{W66OeOlslrJMm+qTzG1#Ax^hrGnsU1E|?;QzCOh-wGdo<$G^V%*CY#^!=B84bluH7xV>Dmf2?NMyK{oWy=J8x8fr zNS}E@O6H}Z@gC`Ftx?P~0_3Y7tTHkWmUWBP%FH7b-UV0pW0Bu~aH?$g)6Y6;M4U+hH1TI@GyR0E~HIUU8SsFmaQH`&s*O$m906I&1)a zM7Ll+`T++TFxDvY>FtC;T~_?@|FYjf7rr(@(e|Yhd6;~J7Y}~|KFteJIMj!flJM36oHRUq0bZlWD0UG z$UKIHkjhtpp=op^$saF3+D?~900_wuh6qQHMXg+KE8sg{TScdlRB!@j6f;dDbyc*$ zm9R97Wh*#cacqX@1Vt6Z88%Zj+zC`iHrGoOP{hH5Bca!w1Do350$!0~DY)RK^>`T+ zbQ8jve4kU)!e% zvlt-5QE)<%o0JIn4IZ!)8Srgy!0I0vu&n&B$xr&O^Em~$2$C2R{qVc|V#M>o_9Zpv`r6U|-|c3>h; zFX>|F3xOn&l`-ycRJdL0De`H3tfDa>W#j@O&u1c&OC+m%vFwS(*}+0ix)FLFE}Acu z;(yqp>4G_eP|BCqN{-2R9l<0{gJRx+(J>6ZfNzGu%@g#x-0yT6@6`5WFO3mQlst-5 z&7AD`d0&;L8Yat% zQum0uG0JHu>5!x)jUb^pfyhv{Wl`9Mb4g_b`3p+&mJt);=^WKU_^_1$xgGqH>#;8}Bwg!$m`Ie!+<28Eu;+d?M8 zH4wtF&wo7jC|v64Rcuvnzq6>5a8aixl2QJG-I%ByGIuvq?n0h^aS1)6N=qbaBL%7b zc&d-h@$AaRHww>z65#o1c`sLS_QK;UA>#y^|LR< zL&(2E?C+aNBWzIZN__%eG)f>L0!UzBJ|FQS({c+pYqUcwFbzBc=Q`F4pEqUyn$adqs ztPf z74B~VAPJBlhcl8AXYaIo*BSy?02US&78cgyId4eIfabZik($$NIX1R^Z{&#S;+pTc zYiC@HPnxw0*wt6s`0z9?Hg*8cP7GyYdTOj6IPI3@81<2}f?>^fdQSyzHiz~-VxKVoFxLUF*-fAgYb58XhywS9vI#+)56Dn+@we=I7s(2+I9_= zLGd-Lt}hHZ)#q@{Ul^)X{IwQ#8VFx(Ij-;R+b1cbogSwD=&WW1E9%U`Pym>#UdIj7 z#{2fse|4i-KTQ8r<`*>#jnaBQ%>LEM^yb3Zk-mJ{*N);Zo1UhG^HbMd?6+MTMKe~{ zR}2^7%6exu_=s%9RoBgig6G{um9>DsgW1hO6Q=^7D(mKqt64L9N*XJiS?_daStB1B z)eOs0oS?1dXwl!csyVt<*;9$dKY<+^m~S%NQ} zV)3Nww6N>1k!tJMZa1-OR4qKSr>HGqf5z>o9nIF=3Xg$>p|(w%*B6HN1ZY3K)~q_# zzJ2sx-FHs=u4ylwF_!l2OY1XPS6g2(tTvum7&<{HWMQbIYH7_EhR&VCUQjV;x~E77 z?N>xXH5*E4AKtf5@hdP5Rh!y}gXQvP&4w}tr4oYj_w9rK)1%I!X0Wtwg$=OgV#CLZ z-L@rE4J=cifTuh7iiul zbn0OQn1kh{OBL-}2j)sUo?jRu>|mq?DAs~s&$TfBbIEKh3@z%O)5Hp{9Kw}K#aBD9 z##q&YS=J1D#qfORh~XP&Pd&XbBx5H=M@_Z>!AD-b##gUXz*+S@Y5n6c33&rcXyB~c zfgmQYUgxVfObhpzZiBB+aOpd9WY+TfOMLydYx&NTmQ$72T}{-@m}gVKyVGpB*h?8h zOIG!XTCMFGKDO56jjDX3qhugw)>W^ zia?hg#l3V%aVzT`RV9>eibsGAhd{6+@v359x}?~ZldjV=J*=uqG(bl))%9?f7-VGb z+Im}YbsJywfpd0hhF@ET5>xTjPA9Bg<7@lNuCtn1y&bZfSzoU^Ha_eqzD{_bI-}qU z`&+}vv_0RjYry#I!+6HVtH|cY481B??Wn4%`^(r?46UYi+KS>9S^5T!QovT_zO^RvfdAiori&-}|E#brf4AXk`F2Uk`VNVryi4 z0S~I%{DcxfOf9xTrVDq(^2Heg9!~c0`>oEzZ(bX2tNGs$$QV7HJEkV(J#Qm;7Z` zqgH_#o;7WM>Iv61))YgXg+qPT7#^NgYxBlp#nfxdhCAof@e@82hm?lZeft!*0w)h% zMT9!$Ym3@C9GgUH<4Mhmjyi$16gVa;huAb-G91FSW?kJOhd@P9D~B)$G4KVuuH%wV zwgPpJ!fz#h#wh9xVqcKyA=9$(l3^_jsQ|=tYZbr4jjc|XB*1jtskNKf4rHmL7KUF6 z5g*i9TVHl@qq1t+b!SySd+KRcjS3F1&3wXu*%4O3mo6PKe5~8fs-lKsrZPIAYGFrJ zr@jW%gYEjQ8t9SMt>kWhBc#Fp_>4$r54S>zxou%ei?86LJmDGnZ^-y#qqAn@;yNCMc7u2H_mE4<9ZBwwg>bjc2i zSpAWp?xjoYi)L2r@EdElKd3e02Y`Yvv)-x+R5L%WO=y$a6qD2a$|1i}so1*Xn%MRY zSPb>B;<8p1LvtylimA>-pUv>I0egmTyk0Xrj7Dc1-F1Ap?UkmA`%f7DvVQXTNNK7F zSM<7TtWs9!Yr_l@{6V1yu(jZWI$L$IabcD~o`@h%X96xppyQAQfKw5`@?@`}GC0L- zkmVUi_g%yGEPxt}g1{q`pbVF^QgXb-?3s_{g}OV4AMdmKomrj9K6~APC1khunH;8T^2v0YafUn`{DvXduF>Dw#Lp7dNLE=7MI)Tj8LhxF-bAP5eaK0U66L`VDHuat*5;QL`%npxpSr`3Y0Q9W9% z9Vgs+rJaj#mt};z91w0jM!2gX;kH$+84~WQlyJ#7*0fedA7{<0m3gAhhW}Y4@-I~J zE2UZgU}bXFKX5=@Ukj@K_93qFYQS}r6=re%BraCMX;HUs_$ByC-$k+$5TAeQ~ zR@SuEaD_B#Ijf33uK5Q_>MRJ(bj!e)RC1JHvAw(k zd%3d+?0j}e8#0^lq=eRyi|smgPg{h2jIjB14G-Vj!KWoT#+@@ifKf`mD;ZgL8p8{y{ z9$8lmdGyKLT){j>!;f^T;m>FlqfZ(-<{C@QU`@gw9n^50CR!L;Y2$^V*#(X=ty9{dP-3dqF3tp}kHE+ITAKh4voWdz@=H zwtvo8#c+K;XVx4WRgz3WSr~$P!>ryg)PrMQ3K3i9s%_s-g@mnPTAl>~Rx7k77*w;Ua!3j^te`UREz7789Ki0VI==5TVHdja zj!$clYxE2nEeE6aU2|y(yU-xe4+leSIjt6Uhskz>VJ3NIKpSBbZ`oNLHeA@S%Q$w4h1weLNbMVS6Sl7GVz7@Xs8lIc(a)zSDx;j!-9D1{XK5i|rbo z2@gm`Q2}f7lH*-j81h<%4Ya}9b1a2TX_%p9c+~|3d^AOb9D5G%6s}rPShXUonkad& zp{#c_G!NzyF#bhVrSRY*C&my?rSJ7D$M-bCipem@SUVaDty?sLTXj)g43<97og^_J z9-xXc$lfW#-XRo7*mUZq=>cX`3s;0LMHYMImIrH!?m{SV%v}LMySI| zhWUX}IYnnh;p!&|US!JxA;EgbiD}ue>lO}6a#2!Ph7b%7sL%qTg6Rc#EYRm%9o7$3DwQ;hMa?^lYB<&bc~QWPU~oDm0bECiQK8|0S@tl{ zeF4n`zYAJox*#HwsyvG#10qTTwxwv{Vt&pwF5z4RJ+{%rbPsE&++!n?)g00YyK-6{ z{WD3N8j)lo5`qJ55g5h%d{VMw61L8ME^?>VxfwLd&T`s+C>3R~5#f{x?|`CIR$^fD z5o5HKh^(4={KpUfvT*p9;qX^vGo&T*2xx%R!EgxqXwMtIx1jdR3^L%U=y+{BO7|qSN%w24Nl34;*a8zX3cUu zoRBnuX$>zE!-GWG&xVN!IeZ^27DHjv^g(b>IR-s!;abE^3c-leR0+X-M-)$M|#-Nkg1-lcy;usfA$D``{!oM&VG4ic2yI`|Ag3DN}u25Epl)h{W&}9b%&Y*(C zv6!wdV?BZR7o)zJ_~F3bYZAMyPzV--$tuJrEq`!$!|fT;GaPSSkgkY^Mb#q$?Z?6UX$71nzoHy@`+() zHbM=sjJA*K;SfSqaD=cBWneO(b3LF#6*M_9J)1!IDm*!dAVma&NzhLWi-T@9Q1T<9 zy(J|HMV$?&jflM>*Jfk{bsv1W`R6ygFaG1vn;&;?-RR!`eCzAqZM^bU_vU*WS1)h8 zdv)uTpKt#B%WocBd-VL*-50Mvy!-0LU*F%j`m64P%NuWg-hKJr=8aEj{q8HbH($FS zLHDqK#%yAz?FU*+p0C3+_K-ox^wRtG(Yfq(al_M@Y@mvbgO>pCi-+4lvVl&DX2nJg z$3@JV^a5T3ds0$M2S(?eFj|RTP^`lI1-!NxodOj~w6R_~{7>#jM?>Xeky{UO`wLrV zx0ik6m9M&gyV`Tv`(I4)o+e#OD(CgRqO{rLxvrxb>l!~FlB-DP3PxyW%-V${egV5l zd;oGK1c9WR0sC`w82^UD0dUjn^y-WvzmG11)yms(M@{m@rqi~4T#r~QuldKw`AR>}0Xma%>OgVXPWvOo~$qBSy;{5iYO=ExxPiGR&aDkB^=y2%A-% zO>nEAL*2QMU=L6sEC)-3wnru~RxC+aiGU=!6B3tgqwOyrBgVT0HO^KN{5d~Z54$Va zC6$h$PXv~oCnUG{Dzf`Hf05gTn@e+`Brb0tu?rX(YtfT60*^T zQsUm2QJVQzzd89Pzc5fQwMmFm1!K))K-@#EQg2ICiYY zv>IfMxoHDSqI!ZzXE4jlQlxO-KC}n^(21dg2kb^Ej1*J>e+*1vq<{_}0S-eB;U`d# z(kwoO;Jn05(^m>qLtM~E165?b36l*GCDLPnuR;$~FmD>thDP?Iw%xMYOQt=%(grK7 zAQ}y-n;yhysH6QOF>}etI8INEw6)U4`{1rx@o}>S9v}P6dS#-Fjq1d-vCpeHEnKgV z4LuZI(!H8%w){R|(+2x2!(OU9=K&;kb>F`&AmM=WwfEO7ypOyBRElY{q~L3w$4$3y z=p_L<4>5#E=O5Xb258Vn^jIhySZ(4#>5kM*&mW;JpTbs)gn|O7%(Chn3&3*j9IBv^ z{r}_Kxszv49X)q$|46Jig`yHPKm|%E1&#i@sLdD7og?@-4%!K#V;Wu=4koiOv!r0CleaSMhLhH0oFXC6JxgjN*P5zThk;bmz>2F~5^-mlo}abarQ~vxCfUnf z>apJC9_wB1Z@q`v+opWim*q3aSc&pzuazi|^{g>2@3x8Ir9`5 z7C`!JI&N<_cyFUIfyZY%!BW!_h38sVsN2lm)_edIKnD0l>|cza}~Z z{C70dcO1(%TN#%6w8G$q?xHD^W@?|W zW;wOyav3Vp=hbw3h_(=2m#`FO50U#3cC-)pj&E3}h!EpN+7BYmgk}s-WsV3qfU?jw z1LecVSjH1~L`7WJB={v~x+D&m#-8|ziB}65J_7komHM!%q2@o(Nv7e9?<_4@7)E#k zOb7Zlniy#=sLBuG4Q2-nP#2Ua~9=0GzO`*qge;<}NX>aIk9R=fooml^x zg$*|#*vEnb0%NPXVK2%3DnimAgJ(1OmIwo^SPXA@*sy%g%H!Ky;TRSrILzUI5?NkS zx}aJrVl7z+4NM1J>O6LUAar?=abFTG)OCezM0PO2MVomeqeH0JrwyabB`a~q4Oc-6 zJ%_mBxmc-VpRT!%Wn~$;%FTVLW|OuS41W27q{%NoUt-DI)8v_*kCCQA3AuZsskcE7j3NM}4(OH{(9tWr zkDG$|Tuy?R5`8ymNFCB0v6Rb;ShKk#8+VZ#ujkg-MB1*!TOkEDP76bp@iX2?82H3d zYU-5k$eG0^$ZQA%39E<-MRp-j@mP^JDkS#39JYR9*0D1HwpO5>3}2-j_-axcD>%1g z;uEL7%IoMMxn`8K?H>0H(Og-kDG>#M+>(5$od3Ess`V#XrN~y1!Fm+Fn|ql{HFM{M zugGU36vLd>+S8_eK?zowr$25;J1mezYXk#`79l2&@e-L_ChN}`U?9|nL_;-4!&TpA ziou*X2IButaf~ne*tHF7*fQ-4qWJqbB0TjLk&Wg$wy;lx}cXW7Gl9tZ&x&4n7-jRuK8eW;-yZ@Li1#4b8}G z_7t+0SzHbcjgO6O1AXOf5e>svNHj4EjY!v(PCu>wiH87ZKOzbue$Ap^FdS|!9)8Xn z32a`mryG!dMsKyfWn$zy%UR<}YMVZGNp4DFf#J4mG*4yzb~Ko7e@z^B7#p?z#@94j zdFq4fhE5agnT@p^Ex-YdwrUwJ@%q- z-Jy*oe3~4wqeZ^{#+{oRe|^9E%6nU1eYNrWr;lE~8NMx1f4Gyz66Wu(+_{kOn-0xF zW>7Kdlq|Xr1Iod(JLWpNBJ&${v4{O9>^d+?CF#JJ;rGnW!!)mF33olnd}hMA#9YvZA5`sHEyGqkbBkN|dsO3dMq~J{f^3sd_%< z>a&MVex40!G3MSAD@}DrO4KC0kxFs1f+HqJ$fwEXH+<}&I`(SVCJ|M|HD`g%FW@zg zs;ayonz*5%Dv|p_j8|1O9Q`s>75JG#*X0o61CI!=!-(8xy%~NAi_w_#c#n>ZARu(I z%}L-Y)Cz-th88j4f^4kdI(>abmQypV)4t;xOJvE2*jr#E7Z@Ie9!{`UVe7byW%Q;S z^&lB_%#~E!qA`#h>5Gd_N;yV@DyTS{aQJ*8z!MMP!FVVR$0bv^_$5u@9jf<8~JOp_EI&uNIbP4TYp3Q`x zt8q8cM2pZtm_O@ozrXS7@463uzVY#g^u!CpMLc@ze)s*~o;@B0#mWdH5Ci})+z|0R z3GZhvaqPfN@M~;?<34SEphsOBuL9M1k_GlGvxXG{Mgy3M6^d;-UDxBEHKgl$&;YnV zN54g43As5PI4~=Beq^YQIY4S?ycpk*f=v)koSLDzE~+5R(&o*IRXo!6j05JyVRb$H zDy{t#Nu(rcKnr4RY8E6KleFOrM3UP2;y0Uryx+a|`lDamMx|o0brC_d5h_mo`m^o_ z@9=aj3~HF0(XiO}K>(#nJx&E~m)KCEp{bI=+GD@v#-ZfPY$W+{{Lo7~V>A(ToDO(< z$He&d)*QQGx=kf?)|FU#&e1w2u;&>|xS(n%N9{AzXj+TyV<>u(sHh+=-Ao=x&t53- zDx4Z*(Xsl3F-IB+aOjnzuxhwAXdxnrfo6qDFrn;obz4lj$FUqE1R9P)dN#%(?rqXF z)4g`B21%t-P(?lHyg9%a_+|4#pH4G!1>wfy< zQ{lPR5=4H31ncl`%O?LUnGN`-+HAo;tGG)3^;SrsZ#GD&S#wCxxD{G?8Jjf%szHCZ zLYU9B3X8D=9|xlV8HSA)9S;9wIkyUWL4^nhB!}_S&MJ223=a<189vlZkgi;uT@=JF z>??^d`gop-F!DwoLs+vl#&FVvf1M>V$L58VZ)1+J0p*w@_hd?}=6$2tO3X8^^N4E3 zrnH6)m&VJ8={jQdnxN-E71WRVV>UjfwIqNveMqeBveS0GWb3EkbB^Xs({6({BRPIr zkOPE=YmQx)fH+MHGC{D#KEHPz@C|Aqf=~FPZmf0C-gPp;&dlC*HdOeNbs4ILLb)$^ zREF2iXyt8V#ayD=Y|Cs_9mB2btFB4o1e3a1@=sny39p=UPRq;|CenaYR+)C_I<2)J zeoRa`6%UUknLdlE1*K4;p~AVUW!M)A^6L|4sl&60;KBr1R7tR*|7e>oRtof7LiBxzZATm%&m}vJB>qq%u&xK*MsDhCQ03Aa|G)RzEuq$!Kab79=5OsFa{p z=;oF)T8f8#p9C9V7NWUAr38%zj+T<6*QtSeogQR@rQ$$+l}ZD3RvxUg(ZR^FG&UGr zmc|Dn%+kbwlv$b_aDGz*&To34`IU&Z<}l5jtN1e($2_xJKP{(j(xI;-2l#F+cW9D1qbo&c)-A z!Js%y2SLlTAke^}=@4jn76h_U(*cm;%n^_XF&QHu<(Uu&$H;&{%6rb?oZW6#v*1vc zL~HGCtR}kKG7=h-@;s56Wcie6>+mroo_mbyP)<`m;RPX$G)bY7iWZCh|KO>1SELQUMhAXot(6F;C39uq7&G_C$5I0guLKmx0*eW_;gV}*({1iBH}th; zMqB|cpkg%{tc0EzHN&mbV}qDV8Z|yx$ly_j0_+HnpDd-#!jO+GyyO~9xerY=Fu{xO z+i=ln84w$?Wf`{UC&!JB(MT*tLSQ{knTr@Or!<-#zD4v*SQt9?;I+&<0#6r`8v90O)7A}ka5lO2Mlu!&&~HpCf#V|qm?WizW2SIP+#sF`!Rx#-kUKNL+32l_&DjXul*I9*2$<%LCwFfc#27^wsam+GRPgg zs?^6Km$!Ac5&lDzw7Yz?MIHTcvPn-if}0$>2@rV-`&^3nUgw%5q*dm*7WTlMYQ48Y z-@)ZZ^M?={>tjER_rdg-tu7y(qMrbB^E<56By!(cE5F1di71^zs~L3DpIVbd;4NP) ze+zoe%pjTHsTN`>?Q%v(CBK?&Ka@&Hur?vqBXoih&F=L5m>6O{cIaO=yk*~bJeJ@% zU}*Oiz;Vqb(|-IE6cBCBGnZ_`Z@c)hScqo{rgm>7yk*CI963?5b(kmDvwwEdo*UEvaz{Fc3ch!{tW@Ot`r-1mt;?5y%iLnRBnwHlVo{)uelKCUcgAQR z?!qc+@sy98;UgTug?%sSgdgq=NpX#Q2zjLpr z4YX~WeD@1OC!UO6!gD{~>@>UY%FSc;a$8`vkwac8I@9GC8--F+bmUfuQ z|IfBznSTCf1JRabDmS-b{iJf7qCPJ2oD7agc~DU=?b?CRG%jxUWXKGxJow4b?|O+m zar!Y?ua=8zCPXgjb(HYk?EYaAEzXg^PI9(Gr_i`MQa&BRXf96cPVxyEYb-^VA#`R}Sy8=c5cHhmcBjZXDJHrNLH zs9n)Ah{TfLdQ9XVrQSX!G14F8v3&;(i$LqUM4aK6#TleB=ox4~7}XKt^;VF^i%v0{ zip7722&*sux%K*3M4-bfXwXa&zgx^Cz&kGvl23q@3g>775(}e~02H0IvEW;g z321&;aTp0Z$^@tYvNB^gOzZjyg2?5{YUc&+%h zXdr$|-_9I4DL4V<87lH8pp45wFhM*wm@yHIc$^G0r)clNZuMr+e6V4o-3Q?iQ=BB_ zhS4c|US@5UYNwR;GLoUNmn*^2FFz@#@}fNb1v{!ZEH7bSQ6;9&g!@J4=KAF$LkN$BREA(W$44KPv2EKs)giOOI<; z9&L<|mTOZzW7%Z^%pcOOKPcaa_;dY4m+K>NT(0 zD1#do66>Y}gqvR&T6S?`VQ4WU@*5XIhlElL`BErkLa(LbN|Z`*VW{f3psD~np|;0r zlv@{rU<&ZRz?@n>SdUto5+#tmcnf*Dr)}R^Y1yu$JpA z!FilNv|R$k_dNWOk1u9K>VeYT4D=J=KOIE0LMc!nN^eSYD9RjtEh{8XCgx}m_msx8 zFi$9+UU}YA)m#RrCI&tps+qt_hD*Cm0}TV=(m=(@Jd2V&foXDFrf--}qz&i08Z3J_ zAHF6{k>|8s;=3Lupo6U9DYIlcBLaV<*%}K6pG+=37HQ@s58nxm&cYD--%i^_Ro7Yd zu#4&r_K@xP$ZNOAR`-`N4X}=UV@XGmIzE{Wet-6-35&YPqmZs?DgY=CnufQR&G+72tK}Hh_yPOmy~7>6%yFzR*&Yl zFYaL{0-QRWK(;s#PRV!McFhRouKt2uWhgyEst-CiW?C3}PLjW<{tUI8{1X+a?D>Y@ z_UHpu-Ldh&k5kk64Z4dt-d{DD9+4k-!?X?S?5U^o213hn7MHO>pv# z@@@x9LtWmVuq;@|V9%3$qhXb{Yk^6HNER&@x3FDLl7+78O8OK3yo9lyJ@qu>mWyhJ zraP|Q4)blp4;XUKq~`fns#(v!Oqsrq380VT8cCk@WovZ8a4#HjR_z^IsKMNo2Vd1? zzuCw3%k+GdfPEZSR{CNnTid73oOrA@V7pq)zfzgT?@6eSwokHB^Xoz@Mo;1NgrAX|`eFo6dL`u^U}6v2QGaaK1O^M3 zu_J!uL9EuKxCQ8U?O`GzQoR5?DI@vk;rI)8{CzvOdjaIMNfDPd<1j2vW3x23h2Xt$QDIb`AxbQESVtBY^ zwY?D-mIv=Bg;1Y${KOMKK6>ux|2lK@nbXIgedhGHnZiv&1=m=Ge`;Uk^D~eUT>mo8%GowyD+D`8M5;y*PGnI;7!hJ8kR*~<$_o7-YLU- zW(uUL#GIMx;(5#BL@H#d>pKVEwuTZXxy+#??zj#1hX!V?Pt$mG6;v+9a%S%d>H(h$ z{tn{T9jru+gWTC+rC8E9%kcaoj!!}dusKsuhDSd>+aNQK@&aQY(E;L%QA%YPlK|=v z5>pzJv2yUec9mwyREnA~2tE&Gv<|U0@&+A*Ee~h(ngGpZJM4&fxqxx&D9PQ8FNT2u z51_HxWVO>QH+ZyQ!(sDbG%DaIs(-Ko7>X^9h!!5;C^$hBbX`y6XH2#WI|7IJ0xW4Q%kNhZLI|)1iF~-n9JfjG z@||X_R6edizv=&^<6#=dzD5&d2}~KxE?P1K$5Xlu!`Rf=RIOYs_LZAY4mQ6fL*Dk1 z?0hLrO1);HH9FeA=LvdX5{kA zFboLd)Z|L(*D^dG({aSXAODh3H@szXdc_{!dzx3Ut0cQcvUEH-Eh|{ty6d#+ z&Z?cqJY%}Y0Jz(&j%HqDacJ(@=C>H{2yp6&$8`UmuVo2&faz3I@lW z-nBxYsyG-68{B9lFWr5N=4pV{dpM+8G@h7Nw|5pUs@)wgmE#_>Cx~v0*&{FwTB=Ec zEFw7tBO3G+MN^ZQkP6cw)~N!fv<2Z5I*+yY44qbF=TbM(;PHY&n_hxew0 zbGQyWg%TRvISX;G+Y)ctHk$F2%MhU@HWhu>Wt$}U8SD@(xec^9scRxJ=L;I3q0vkx zNUnARTV;)9KeYk7il2Xy1&^+m-x71&fqflIb|BbBkiN;J>StZc+nLDhai|H)h!hC} zwvgdsgEJ=0N|iu+IO|&S+z5fit^_I=+NK~L9Y$kl29?IrUD?wTC1@n?)T-A{1eWnW zUDsuL4u-<;)w{Qwd(6Cqz#;+-*=&Q_cJ{iJVay0r(( zMa@wJE0x7TGJ2+LnX?>=+L_4rDZsNf5Jw2~H8r@c_r2OX7#%-JxO`x0V+9Wyce-DC zIc==qod~g=IU#(}$F6Ny-`1p#vi^1?YBk5rc4`ewuUIwvP@(#I$Ode(*hi%*LIYD$@+_!fe@n={uVlRa@`E#E1%nPAl(0 z+C%KkABU?)z~E#^H5A%Ga2$+%V)4`XP-H0q*ob+?6P8ur=b9Ghv){ek%Um_aO%m^S zvAh{^yHttYx?Jta<|ybm**8(4*_$2aPyf+c6O(!@X3$e0bOb9(#S|{|Tc6?fc8E4y z2>KG(?(716$R-oKOvqUUD;x+Sd0mMC%y^Whk1TxUPNMO4CP*HSq_Z4cmXLWkZYzfj zvEYj0{|pkuk24cX+%73(L6^+`XIp{JlRZdomjZKH25W(YIQT>`ds;4OO7EQuL&OkR zB$*tlm7wF;g(U4@OWb$ll@e8UhFAB&t#dhH$oVzlJLE7HSa$ST#a(J;Z#A3|i)ozYYH9yN0(+v(|lkOpyFnL+~uNBl*uor4cps zS9KS!U>CepG~#2hokZxO>5D8IdKj2Nz!`ONYD91M;Z|^3YYEu{KE~>uVumQOn)Gw5 z?n&zNB!(D~L~3aOCK}*;Js`JoPL7=D}48dIbJ~|Bptp@!ppk*FS+^FvpLe?k}&= z9=f-#)BZQEUfy{3YS=#voHhKHmf;#rv`$@GIt;=vq5!u3?+Y9EZlU8xQfd>YpP+L0 z*7cNXuH*P;T?-8(I?3+U>zfZQ2bJm8@X-1?3W8BLo9nHw-uH`G`?18~*`{o}dcb(_s_31%nxoI6Pbl zo5}e-^Ly8!)6Sx@cfIXe9re6WFP!4}gJyFHdaNuA(V7cG$gq6!lR#J)LL`DvrBp2b z2#p*P0R^ZzKW{dd7Ab`J5%~LjP>o=#lTJ>=ONl%`!(9z+-T0z=^NsGEFT3|%6Nm|Q zFF%N_y+eE}JCqlOBy#7=t-rnh&4X**YcF&NQ?B?V%r9FhZp-jiu;yz%MgJ1-bHa+==wYSQPnNcy-Z9%N=#s5lHT z!%7`BTyNp{I{nlWvcL)8ev0|L2{%PG$e!F=C)}Z_Q-#&Wz zX3((vt1I2R*ETy2B|Y$t=EbZ#w7e* zD@|7$rO7d_8$32$otUl>(6~{>W0O-8@OQCMD^1sH6ST`>%_!AsJfzx->?<7bj}Q#OOE~ZfUGMU7ntpfIFV`mO4Klj%(b1`5y+lAyj2Df`(eW`l>ItK0RLMF`m1^bMbeSTsJXtQ+rueln z%GCy*GD>tdC1YY@j5Mp2$Es7+$s+lCa-ud~GUyCS(`7sbS)7X(>l4${#fdWMvN2Y~ zqvLeArQ(EP6eo*ZH>GJ~tX3+KH7McH$%$H#%%(g!HZ?gpMrJcQRxMU*RYqy0TCr9o zU5?@Ulwpj~wW&_mYQ`8@vx%uPo@g{ixo#%MrW#XaOeQ-yWsFaZ(&e2Rt4&Q#l_*8k zYLmq>?S8sg#f?UTfHua)ixV|WW?#jPX=Aj()^D;jIn^jbFNBaAsG&&}{d?kLX$rnZUkLt3 zRSC$F2(k=~;~>e$X%1qU0xT6(86H`$6N@0o7SRDjKTML}C6zQSN-+Y+m^U<3)lf}C zbq#?iq#+Q<0rFG5);9}zr^A_I4NZhI#2PA<_+RC537Uwjje^lW)F5d1f8oz1NkwqV zhK>{nEpWPo4nWfb=-&V}1QCm|`EvsdSJ!~6VlX5_L#0vvSGg?dw`n{Fy&7mAs*(}H zUp4YqmHZ_iD)^Err(unn#&g`r1UV5^(9$egf;;vsT(c48iy<0=Qbz~q)FrcnCyUxF zs)6h=i>j!C48GWa_7rUtMmdW@o??C~YHc$5{7 zLUBD&JjRO0pcp5L$64_>6gLvZ6RenQjHN{JBr7KSWSJ|LNYLFYzXol9L`>?weOq$j zWw{-Y0y?D`!ZxP}*ChOT#WCv|s+&vL3)8*ix#&{0(&=TRJU*dtn+|s6Q&~b5J(nho z;xwL^Am>T7Ix%TrdQy(oCU9ePlFAa}V~xi6sG*5X$4f;#UY=}F0jM}WF*QX_%Ti-% zv_5T6S*(hSwR&kfXt}7ySxvRwXkeEc=#+4hh}FW#Ek(Y}cYMPVi?XimbREblNW^#^ z*ntY7c2Cq+ELIb`b{Y*2`|)1+tAsFc7QV$zKK)U4U}Ib-PL>m6XjqtYdK=#XJsGN? z6NbO6H%(iiP&9t*s;oVQuR~4}Qq^l$4TAfk#-OU2Fo+B&5yogsSpuGP3!4#nM zyLUgDlHp)v1f4YM#Bw!OLWe!ikN&^`I1u2nmveuQPh{h=VOkdKFTRUH77C zDLG`0X?#LWK_BbIv;p-VQmW?CFt+QaVZ%&@tER8YR|?(`7^gpC_{L96yvnAf(|;1} zpasw$J;9Xm35~M3hUGY}60Q6Qx!ke;z^e>ND%b?l!t;a#Ogf!>g&zdZc}NgFJ)4wEChX7sAJyxH@hFauzBkxR4$%)5^Y@l zRrmU*5AR;y`0M+y-uM0(SN$@$KSD~mC@zAE4sv~^97m3Yb<0^&&NDI#JUnO6-t`cf zrDBnx)^*x;J?L{JLMZ97sH&YGombPhVob_qI1J89UJ)Dy|Ehr(>T}*m5QYnTbWQYD z+gm1aw`RFeVQIC88P~33A0B_}eK+)7!}c01($^pjhka+bVP3@bVJcYU0c85vrIGf4 zK;3o?{_dw;!?b+dZxg%TUjxS-#zw8b2{nyYU-eyFZ`W|1CeL|}tyA73Bit z

-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,i.uX)(),(0,i.CE)("div",{key:e.index,class:(0,n.C4)(["menu-item",{"is-active":s.activeIndex===e.index}]),onClick:t=>h.handleSelect(e.index)},[(0,i.bF)(c,{icon:e.icon,class:"menu-icon"},null,8,["icon"]),(0,i.Lk)("span",r,(0,n.v_)(t.$t(e.titleKey)),1)],10,o))),128))]),(0,i.Lk)("div",{class:"toggle-button",onClick:e[0]||(e[0]=(...t)=>h.toggleCollapse&&h.toggleCollapse(...t))},[(0,i.bF)(c,{icon:s.isCollapse?"angle-double-right":"angle-double-left"},null,8,["icon"])])],6)}var d={name:"SysConfigTabs",props:{activeIndex:{type:String,default:"status"},isCollapse:{type:Boolean,default:!1}},data(){return{expandedWidth:null,menuItems:[{index:"status",icon:"chart-bar",titleKey:"sysConfigTabs.systemStatus"},{index:"upload",icon:"cloud-upload",titleKey:"sysConfigTabs.uploadSettings"},{index:"security",icon:"shield",titleKey:"sysConfigTabs.securitySettings"},{index:"page",icon:"pager",titleKey:"sysConfigTabs.pageSettings"},{index:"others",icon:"cog",titleKey:"sysConfigTabs.otherSettings"}]}},computed:{collapsedWidth(){return window.innerWidth<=768?50:56},sidebarStyle(){return this.isCollapse?{width:this.collapsedWidth+"px"}:this.expandedWidth?{width:this.expandedWidth+"px"}:{}}},watch:{"$i18n.locale"(){this.$nextTick(()=>this.measureWidth())}},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)},measureWidth(){const t=this.$refs.sidebar;if(!t)return;const e=t.style.width,s=t.style.transition,i=t.classList.contains("is-collapsed");t.style.transition="none",i&&t.classList.remove("is-collapsed"),t.style.width="auto",t.offsetWidth;const n=t.scrollWidth;t.style.width=e,i&&t.classList.add("is-collapsed"),t.offsetWidth,t.style.transition=s,this.expandedWidth=n}},mounted(){this.checkMobile(),this.$nextTick(()=>this.measureWidth()),window.addEventListener("resize",this.checkMobile)},beforeDestroy(){window.removeEventListener("resize",this.checkMobile)}},h=s(71241);const c=(0,h.A)(d,[["render",l],["__scopeId","data-v-2718059d"]]);var u=c,p=s(54880),g=(s(85331),s(77128),s(78507)),f=(s(213),s(97247));const m={class:"container"},b={class:"header-content"},y={class:"header-action"};function x(t,e,s,a,o,r){const l=f.A,d=(0,i.g2)("font-awesome-icon"),h=g.R7,c=p.bZ,x=u;return(0,i.uX)(),(0,i.CE)("div",m,[(0,i.bF)(c,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",b,[(0,i.bF)(l,{activeTab:"systemConfig"}),(0,i.Lk)("div",y,[(0,i.bF)(h,{disabled:r.disableTooltip,content:t.$t("sysConfig.logout"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{icon:"sign-out-alt",class:"header-icon",onClick:r.handleLogout},null,8,["onClick"])]),_:1},8,["disabled","content"])])])]),_:1}),(0,i.bF)(x,{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,i.uX)(),(0,i.Wv)((0,i.$y)(r.currentComponent),{class:(0,n.C4)(["main-container",{collapsed:o.isSidebarCollapse}])},null,8,["class"]))])}s(44114),s(33110);var v=s(99114),_=(s(30694),s(57009)),k=(s(78450),s(69655)),w=(s(2893),s(9267)),C=(s(15616),s(45130));const S={class:"date-range-calendar"},F={class:"selected-range"},T={class:"selected-range-inputs"},P=["aria-label"],D={class:"date-range-separator"},M=["aria-label"],A={class:"calendar-header"},$=["aria-label"],L={class:"calendar-title"},V=["aria-label"],E={class:"calendar-weekdays"},U={class:"calendar-grid"},I=["onClick"];function O(t,e,s,a,o,r){const l=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",S,[(0,i.Lk)("div",F,[(0,i.Lk)("div",T,[(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":e[0]||(e[0]=t=>o.inputStart=t),class:"date-input",type:"text",inputmode:"numeric","aria-label":r.startDateLabel,onChange:e[1]||(e[1]=(...t)=>r.handleManualInput&&r.handleManualInput(...t))},null,40,P),[[C.Jo,o.inputStart,void 0,{trim:!0}]]),(0,i.Lk)("span",D,(0,n.v_)(r.rangeSeparator),1),(0,i.bo)((0,i.Lk)("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>o.inputEnd=t),class:"date-input",type:"text",inputmode:"numeric","aria-label":r.endDateLabel,onChange:e[3]||(e[3]=(...t)=>r.handleManualInput&&r.handleManualInput(...t))},null,40,M),[[C.Jo,o.inputEnd,void 0,{trim:!0}]])])]),(0,i.Lk)("div",A,[(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":r.previousMonthLabel,onClick:e[4]||(e[4]=(...t)=>r.goToPreviousMonth&&r.goToPreviousMonth(...t))},[(0,i.bF)(l,{icon:"chevron-left"})],8,$),(0,i.Lk)("div",L,(0,n.v_)(r.monthTitle),1),(0,i.Lk)("button",{type:"button",class:"calendar-nav","aria-label":r.nextMonthLabel,onClick:e[5]||(e[5]=(...t)=>r.goToNextMonth&&r.goToNextMonth(...t))},[(0,i.bF)(l,{icon:"chevron-right"})],8,V)]),(0,i.Lk)("div",E,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(r.weekdayLabels,t=>((0,i.uX)(),(0,i.CE)("span",{key:t},(0,n.v_)(t),1))),128))]),(0,i.Lk)("div",U,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(r.calendarDays,t=>((0,i.uX)(),(0,i.CE)("button",{key:t.key,type:"button",class:(0,n.C4)(["calendar-day",{"is-muted":!t.isCurrentMonth,"is-today":t.isToday,"is-range-start":t.key===o.draftStart,"is-range-end":t.key===o.draftEnd,"is-in-range":r.isInRange(t.key)}]),onClick:e=>r.selectDay(t.key)},(0,n.v_)(t.dayOfMonth),11,I))),128))])])}const R=864e5;function W(t){return String(t).padStart(2,"0")}function B(t){return`${t.getFullYear()}-${W(t.getMonth()+1)}-${W(t.getDate())}`}function N(t){if("string"!==typeof t)return null;const e=t.trim().match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/);if(!e)return null;const s=Number(e[1]),i=Number(e[2])-1,n=Number(e[3]),a=new Date(s,i,n);return a.getFullYear()!==s||a.getMonth()!==i||a.getDate()!==n?null:(a.setHours(0,0,0,0),a)}function z(t,e){return new Date(t.getFullYear(),t.getMonth()+e,1)}var j={name:"DateRangeCalendar",props:{modelValue:{type:Array,default:()=>[]}},emits:["update:modelValue","change"],data(){const t=new Date;return t.setHours(0,0,0,0),{displayYear:t.getFullYear(),displayMonth:t.getMonth(),draftStart:"",draftEnd:"",inputStart:"",inputEnd:"",awaitingEnd:!1}},computed:{previousMonthLabel(){return this.$t("dateRangeCalendar.previousMonth")},nextMonthLabel(){return this.$t("dateRangeCalendar.nextMonth")},startDateLabel(){return this.$t("dateRangeCalendar.startDate")},endDateLabel(){return this.$t("dateRangeCalendar.endDate")},rangeSeparator(){return this.$t("dateRangeCalendar.rangeSeparator")},monthTitle(){return this.$t("dateRangeCalendar.monthTitle",{year:this.displayYear,month:W(this.displayMonth+1)})},weekdayLabels(){return[this.$t("dateRangeCalendar.weekdaySun"),this.$t("dateRangeCalendar.weekdayMon"),this.$t("dateRangeCalendar.weekdayTue"),this.$t("dateRangeCalendar.weekdayWed"),this.$t("dateRangeCalendar.weekdayThu"),this.$t("dateRangeCalendar.weekdayFri"),this.$t("dateRangeCalendar.weekdaySat")]},calendarDays(){const t=new Date(this.displayYear,this.displayMonth,1),e=new Date(this.displayYear,this.displayMonth,1-t.getDay()),s=B(new Date);return Array.from({length:42},(t,i)=>{const n=new Date(e.getTime()+i*R),a=B(n);return{key:a,dayOfMonth:n.getDate(),isCurrentMonth:n.getMonth()===this.displayMonth,isToday:a===s}})}},watch:{modelValue:{immediate:!0,handler(t){this.syncFromModel(t)}}},methods:{syncFromModel(t){const e=N(t?.[0]),s=N(t?.[1]);this.draftStart=e?B(e):"",this.draftEnd=s?B(s):"",this.inputStart=this.draftStart,this.inputEnd=this.draftEnd,this.awaitingEnd=!1;const i=e||s;i&&(this.displayYear=i.getFullYear(),this.displayMonth=i.getMonth())},goToPreviousMonth(){const t=z(new Date(this.displayYear,this.displayMonth,1),-1);this.displayYear=t.getFullYear(),this.displayMonth=t.getMonth()},goToNextMonth(){const t=z(new Date(this.displayYear,this.displayMonth,1),1);this.displayYear=t.getFullYear(),this.displayMonth=t.getMonth()},selectDay(t){if(!this.draftStart||this.draftEnd||!this.awaitingEnd)return this.draftStart=t,this.draftEnd="",this.inputStart=t,this.inputEnd="",void(this.awaitingEnd=!0);const e=tthis.draftStart&&tr.fetchIndexInfo&&r.fetchIndexInfo(...t))},[(0,i.Lk)("div",G,[(0,i.bF)(l,{icon:"database"})]),(0,i.Lk)("div",J,[(0,i.Lk)("div",Z,(0,n.v_)(t.$t("sysStatus.totalFiles")),1),(0,i.Lk)("div",tt,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",et,(0,n.v_)(t.$t("sysStatus.clickToRefresh")),1)])]),(0,i.Lk)("div",st,[(0,i.Lk)("div",it,[(0,i.bF)(l,{icon:"clock"})]),(0,i.Lk)("div",nt,[(0,i.Lk)("div",at,(0,n.v_)(t.$t("sysStatus.indexUpdateTime")),1),(0,i.Lk)("div",ot,(0,n.v_)(r.formatTime(o.indexInfo.lastUpdated)),1),(0,i.Lk)("div",rt,(0,n.v_)(r.getTimeAgo(o.indexInfo.lastUpdated)),1)])]),(0,i.Lk)("div",{class:"overview-card system-version",onClick:e[1]||(e[1]=(...t)=>r.openReleases&&r.openReleases(...t))},[(0,i.Lk)("div",lt,[(0,i.bF)(l,{icon:"code-branch"})]),(0,i.Lk)("div",dt,[(0,i.Lk)("div",ht,(0,n.v_)(t.$t("sysStatus.systemVersion")),1),(0,i.Lk)("div",ct,"v"+(0,n.v_)(o.version),1),(0,i.Lk)("div",ut,(0,n.v_)(t.$t("sysStatus.clickToViewChangelog")),1)])])]),(0,i.Lk)("div",pt,[(0,i.Lk)("div",gt,[(0,i.Lk)("div",ft,[(0,i.Lk)("div",mt,[(0,i.bF)(l,{icon:"chart-line"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.uploadTrend")),1),(0,i.bF)(d,{class:"trend-calendar-btn",circle:"","aria-label":t.$t("sysStatus.selectDateRange"),onClick:r.openTrendDateDialog},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"calendar"})]),_:1},8,["aria-label","onClick"])]),(0,i.Lk)("div",bt,[(0,i.bF)(c,{modelValue:o.trendGroupBy,"onUpdate:modelValue":e[2]||(e[2]=t=>o.trendGroupBy=t),size:"small",class:"trend-group-switch","aria-label":t.$t("sysStatus.uploadTrendGroupBy")},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:"channel"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.byChannelType")),1)]),_:1}),(0,i.bF)(h,{label:"channelName"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.byChannelName")),1)]),_:1})]),_:1},8,["modelValue","aria-label"])])]),(0,i.bF)(p,{modelValue:o.trendDatePickerVisible,"onUpdate:modelValue":e[4]||(e[4]=t=>o.trendDatePickerVisible=t),title:t.$t("sysStatus.selectDateRange"),width:"420px",class:"trend-date-dialog","align-center":"","append-to-body":""},{default:(0,i.k6)(()=>[(0,i.Lk)("div",yt,[(0,i.bF)(u,{modelValue:o.trendDateRange,"onUpdate:modelValue":e[3]||(e[3]=t=>o.trendDateRange=t),onChange:r.handleTrendDateRangeChange},null,8,["modelValue","onChange"])])]),_:1},8,["modelValue","title"]),(0,i.Lk)("div",xt,[r.hasTrendData?((0,i.uX)(),(0,i.CE)("div",_t,[(0,i.bF)(f,{data:r.uploadTrendChartData,options:r.lineChartOptions},null,8,["data","options"])])):((0,i.uX)(),(0,i.CE)("div",vt,[(0,i.bF)(l,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)]))])]),(0,i.Lk)("div",kt,[(0,i.Lk)("div",wt,[(0,i.bF)(l,{icon:"share-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.channelDistribution")),1)]),(0,i.Lk)("div",Ct,[0===Object.keys(o.indexInfo.channelStats||{}).length?((0,i.uX)(),(0,i.CE)("div",St,[(0,i.bF)(l,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Ft,[(0,i.Lk)("div",Tt,[(0,i.bF)(m,{data:r.channelChartData,options:r.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Pt,[(0,i.Lk)("div",Dt,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",Mt,(0,n.v_)(t.$t("sysStatus.totalFilesLabel")),1)])]),(0,i.Lk)("div",At,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.indexInfo.channelStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:r.getChartColor(s)})},null,4),(0,i.Lk)("span",$t,(0,n.v_)(e),1),(0,i.Lk)("span",Lt,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",Vt,(0,n.v_)(r.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])]),(0,i.Lk)("div",Et,[(0,i.Lk)("div",Ut,[(0,i.bF)(l,{icon:"file-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.fileStatusDistribution")),1)]),(0,i.Lk)("div",It,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,i.uX)(),(0,i.CE)("div",Ot,[(0,i.bF)(l,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",Rt,[(0,i.Lk)("div",Wt,[(0,i.bF)(m,{data:r.typeChartData,options:r.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Bt,[(0,i.Lk)("div",Nt,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),(0,i.Lk)("div",zt,(0,n.v_)(t.$t("sysStatus.statusTypes")),1)])]),(0,i.Lk)("div",jt,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(r.aggregatedTypeStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:r.getTypeChartColor(s)})},null,4),(0,i.Lk)("span",Ht,(0,n.v_)(e),1),(0,i.Lk)("span",qt,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",Xt,(0,n.v_)(r.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,i.Lk)("div",Kt,[(0,i.Lk)("div",Yt,[(0,i.Lk)("div",Qt,[(0,i.bF)(l,{icon:"tools"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.systemMaintenance")),1)]),(0,i.Lk)("div",Gt,[o.isProcessing?((0,i.uX)(),(0,i.CE)("div",Jt,[(0,i.Lk)("div",Zt,[(0,i.Lk)("span",te,(0,n.v_)(r.phaseDescription),1),(0,i.Lk)("span",ee,(0,n.v_)(Math.round(o.processingProgress.percentage))+"%",1)]),(0,i.bF)(b,{percentage:o.processingProgress.percentage,"stroke-width":12,"show-text":!1,class:"progress-bar"},null,8,["percentage"]),(0,i.Lk)("div",se,[o.processingProgress.current>0?((0,i.uX)(),(0,i.CE)("span",ie,[(0,i.bF)(l,{icon:"file-alt"}),(0,i.eW)(" "+(0,n.v_)(o.processingProgress.current.toLocaleString())+" ",1),o.processingProgress.total>0?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.eW)(" / "+(0,n.v_)(o.processingProgress.total.toLocaleString()),1)],64)):(0,i.Q3)("",!0),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.records")),1)])):(0,i.Q3)("",!0),r.estimatedTimeRemaining?((0,i.uX)(),(0,i.CE)("span",ne,[(0,i.bF)(l,{icon:"clock"}),(0,i.eW)(" "+(0,n.v_)(r.estimatedTimeRemaining),1)])):(0,i.Q3)("",!0)]),o.processingProgress.message?((0,i.uX)(),(0,i.CE)("div",ae,(0,n.v_)(o.processingProgress.message),1)):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"danger",plain:"",size:"small",onClick:r.cancelOperation,class:"cancel-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"times"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.cancelOperation")),1)]),_:1},8,["onClick"])])):o.processingError?((0,i.uX)(),(0,i.CE)("div",oe,[(0,i.Lk)("div",re,[(0,i.bF)(l,{icon:"exclamation-triangle"})]),(0,i.Lk)("div",le,[(0,i.Lk)("div",de,(0,n.v_)(o.processingError.message),1),o.processingError.suggestion?((0,i.uX)(),(0,i.CE)("div",he,(0,n.v_)(o.processingError.suggestion),1)):(0,i.Q3)("",!0)]),(0,i.Lk)("div",ce,[o.processingError.recoverable?((0,i.uX)(),(0,i.Wv)(d,{key:0,type:"primary",size:"small",onClick:r.retryOperation},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"redo"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.retry")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0),(0,i.bF)(d,{type:"default",size:"small",onClick:r.dismissError},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.close")),1)]),_:1},8,["onClick"])])])):((0,i.uX)(),(0,i.CE)("div",ue,[(0,i.bF)(y,{content:t.$t("sysStatus.rebuildTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"primary",loading:o.rebuilding,disabled:o.isProcessing,onClick:r.rebuildIndex,class:"action-btn rebuild-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"sync-alt"}),(0,i.eW)(" "+(0,n.v_)(o.rebuilding?t.$t("sysStatus.rebuilding"):t.$t("sysStatus.rebuildIndex")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:t.$t("sysStatus.backupTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{type:"success",loading:o.backing,disabled:o.isProcessing,onClick:r.backupData,class:"action-btn backup-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"download"}),(0,i.eW)(" "+(0,n.v_)(o.backing?t.$t("sysStatus.backingUp"):t.$t("sysStatus.backupData")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(y,{content:t.$t("sysStatus.restoreTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",pe,[(0,i.Lk)("input",{type:"file",ref:"fileInput",accept:".json",onChange:e[5]||(e[5]=(...t)=>r.handleFileSelect&&r.handleFileSelect(...t)),style:{display:"none"}},null,544),(0,i.bF)(d,{type:"warning",loading:o.restoring,disabled:o.isProcessing,onClick:r.selectRestoreFile,class:"action-btn restore-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"upload"}),(0,i.eW)(" "+(0,n.v_)(o.restoring?t.$t("sysStatus.restoring"):t.$t("sysStatus.restoreData")),1)]),_:1},8,["loading","disabled","onClick"])])]),_:1},8,["content"])]))])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",ge,[o.indexInfo.newestFile?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"file-info-card info-card-newest",onClick:e[8]||(e[8]=t=>r.openFileInNewTab(o.indexInfo.newestFile))},[r.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[6]||(e[6]=t=>r.handleImageError("newest"))},null,8,["src"])):r.isVideoFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[7]||(e[7]=t=>r.handleImageError("newest"))},null,40,fe)):((0,i.uX)(),(0,i.CE)("div",me,[(0,i.bF)(l,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",be,[(0,i.bF)(l,{icon:"arrow-up"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.latestUpload")),1)]),(0,i.Lk)("div",ye,[(0,i.Lk)("div",xe,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,i.Lk)("div",ve,(0,n.v_)(r.formatTime(o.indexInfo.newestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0),o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",{key:1,class:"file-info-card info-card-oldest",onClick:e[11]||(e[11]=t=>r.openFileInNewTab(o.indexInfo.oldestFile))},[r.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.Wv)(x,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[9]||(e[9]=t=>r.handleImageError("oldest"))},null,8,["src"])):r.isVideoFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[10]||(e[10]=t=>r.handleImageError("oldest"))},null,40,_e)):((0,i.uX)(),(0,i.CE)("div",ke,[(0,i.bF)(l,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",we,[(0,i.bF)(l,{icon:"arrow-down"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.earliestUpload")),1)]),(0,i.Lk)("div",Ce,[(0,i.Lk)("div",Se,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,i.Lk)("div",Fe,(0,n.v_)(r.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0)])):(0,i.Q3)("",!0)])),[[C,o.loading]])}s(18111),s(7588),s(61701),s(18237),s(17642),s(58004),s(33853),s(45876),s(32475),s(15024),s(31698),s(58335),s(14603),s(47566),s(98721);var Pe=s(70797),De={rE:"2.7.3"},Me=(s(20116),s(91114));s(22489),s(13579); +/*! + * @kurkle/color v0.3.4 + * https://github.com/kurkle/color#readme + * (c) 2024 Jukka Kurkela + * Released under the MIT License + */ +function Ae(t){return t+.5|0}const $e=(t,e,s)=>Math.max(Math.min(t,s),e);function Le(t){return $e(Ae(2.55*t),0,255)}function Ve(t){return $e(Ae(255*t),0,255)}function Ee(t){return $e(Ae(t/2.55)/100,0,1)}function Ue(t){return $e(Ae(100*t),0,100)}const Ie={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},Oe=[..."0123456789ABCDEF"],Re=t=>Oe[15&t],We=t=>Oe[(240&t)>>4]+Oe[15&t],Be=t=>(240&t)>>4===(15&t),Ne=t=>Be(t.r)&&Be(t.g)&&Be(t.b)&&Be(t.a);function ze(t){var e,s=t.length;return"#"===t[0]&&(4===s||5===s?e={r:255&17*Ie[t[1]],g:255&17*Ie[t[2]],b:255&17*Ie[t[3]],a:5===s?17*Ie[t[4]]:255}:7!==s&&9!==s||(e={r:Ie[t[1]]<<4|Ie[t[2]],g:Ie[t[3]]<<4|Ie[t[4]],b:Ie[t[5]]<<4|Ie[t[6]],a:9===s?Ie[t[7]]<<4|Ie[t[8]]:255})),e}const je=(t,e)=>t<255?e(t):"";function He(t){var e=Ne(t)?Re:We;return t?"#"+e(t.r)+e(t.g)+e(t.b)+je(t.a,e):void 0}const qe=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Xe(t,e,s){const i=e*Math.min(s,1-s),n=(e,n=(e+t/30)%12)=>s-i*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Ke(t,e,s){const i=(i,n=(i+t/60)%6)=>s-s*e*Math.max(Math.min(n,4-n,1),0);return[i(5),i(3),i(1)]}function Ye(t,e,s){const i=Xe(t,1,.5);let n;for(e+s>1&&(n=1/(e+s),e*=n,s*=n),n=0;n<3;n++)i[n]*=1-e-s,i[n]+=e;return i}function Qe(t,e,s,i,n){return t===n?(e-s)/i+(e.5?h/(2-a-o):h/(a+o),l=Qe(s,i,n,h,a),l=60*l+.5),[0|l,d||0,r]}function Je(t,e,s,i){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,s,i)).map(Ve)}function Ze(t,e,s){return Je(Xe,t,e,s)}function ts(t,e,s){return Je(Ye,t,e,s)}function es(t,e,s){return Je(Ke,t,e,s)}function ss(t){return(t%360+360)%360}function is(t){const e=qe.exec(t);let s,i=255;if(!e)return;e[5]!==s&&(i=e[6]?Le(+e[5]):Ve(+e[5]));const n=ss(+e[2]),a=+e[3]/100,o=+e[4]/100;return s="hwb"===e[1]?ts(n,a,o):"hsv"===e[1]?es(n,a,o):Ze(n,a,o),{r:s[0],g:s[1],b:s[2],a:i}}function ns(t,e){var s=Ge(t);s[0]=ss(s[0]+e),s=Ze(s),t.r=s[0],t.g=s[1],t.b=s[2]}function as(t){if(!t)return;const e=Ge(t),s=e[0],i=Ue(e[1]),n=Ue(e[2]);return t.a<255?`hsla(${s}, ${i}%, ${n}%, ${Ee(t.a)})`:`hsl(${s}, ${i}%, ${n}%)`}const os={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},rs={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function ls(){const t={},e=Object.keys(rs),s=Object.keys(os);let i,n,a,o,r;for(i=0;i>16&255,a>>8&255,255&a]}return t}let ds;function hs(t){ds||(ds=ls(),ds.transparent=[0,0,0,0]);const e=ds[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const cs=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function us(t){const e=cs.exec(t);let s,i,n,a=255;if(e){if(e[7]!==s){const t=+e[7];a=e[8]?Le(t):$e(255*t,0,255)}return s=+e[1],i=+e[3],n=+e[5],s=255&(e[2]?Le(s):$e(s,0,255)),i=255&(e[4]?Le(i):$e(i,0,255)),n=255&(e[6]?Le(n):$e(n,0,255)),{r:s,g:i,b:n,a:a}}}function ps(t){return t&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${Ee(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`)}const gs=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,fs=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function ms(t,e,s){const i=fs(Ee(t.r)),n=fs(Ee(t.g)),a=fs(Ee(t.b));return{r:Ve(gs(i+s*(fs(Ee(e.r))-i))),g:Ve(gs(n+s*(fs(Ee(e.g))-n))),b:Ve(gs(a+s*(fs(Ee(e.b))-a))),a:t.a+s*(e.a-t.a)}}function bs(t,e,s){if(t){let i=Ge(t);i[e]=Math.max(0,Math.min(i[e]+i[e]*s,0===e?360:1)),i=Ze(i),t.r=i[0],t.g=i[1],t.b=i[2]}}function ys(t,e){return t?Object.assign(e||{},t):t}function xs(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=Ve(t[3]))):(e=ys(t,{r:0,g:0,b:0,a:1}),e.a=Ve(e.a)),e}function vs(t){return"r"===t.charAt(0)?us(t):is(t)}class _s{constructor(t){if(t instanceof _s)return t;const e=typeof t;let s;"object"===e?s=xs(t):"string"===e&&(s=ze(t)||hs(t)||vs(t)),this._rgb=s,this._valid=!!s}get valid(){return this._valid}get rgb(){var t=ys(this._rgb);return t&&(t.a=Ee(t.a)),t}set rgb(t){this._rgb=xs(t)}rgbString(){return this._valid?ps(this._rgb):void 0}hexString(){return this._valid?He(this._rgb):void 0}hslString(){return this._valid?as(this._rgb):void 0}mix(t,e){if(t){const s=this.rgb,i=t.rgb;let n;const a=e===n?.5:e,o=2*a-1,r=s.a-i.a,l=((o*r===-1?o:(o+r)/(1+o*r))+1)/2;n=1-l,s.r=255&l*s.r+n*i.r+.5,s.g=255&l*s.g+n*i.g+.5,s.b=255&l*s.b+n*i.b+.5,s.a=a*s.a+(1-a)*i.a,this.rgb=s}return this}interpolate(t,e){return t&&(this._rgb=ms(this._rgb,t._rgb,e)),this}clone(){return new _s(this.rgb)}alpha(t){return this._rgb.a=Ve(t),this}clearer(t){const e=this._rgb;return e.a*=1-t,this}greyscale(){const t=this._rgb,e=Ae(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){const e=this._rgb;return e.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return bs(this._rgb,2,t),this}darken(t){return bs(this._rgb,2,-t),this}saturate(t){return bs(this._rgb,1,t),this}desaturate(t){return bs(this._rgb,1,-t),this}rotate(t){return ns(this._rgb,t),this}} +/*! + * Chart.js v4.5.1 + * https://www.chartjs.org + * (c) 2025 Chart.js Contributors + * Released under the MIT License + */ +function ks(){}const ws=(()=>{let t=0;return()=>t++})();function Cs(t){return null===t||void 0===t}function Ss(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function Fs(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function Ts(t){return("number"===typeof t||t instanceof Number)&&isFinite(+t)}function Ps(t,e){return Ts(t)?t:e}function Ds(t,e){return"undefined"===typeof t?e:t}const Ms=(t,e)=>"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,As=(t,e)=>"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function $s(t,e,s){if(t&&"function"===typeof t.call)return t.apply(s,e)}function Ls(t,e,s,i){let n,a,o;if(Ss(t))if(a=t.length,i)for(n=a-1;n>=0;n--)e.call(s,t[n],n);else for(n=0;nt,x:t=>t.x,y:t=>t.y};function Ns(t){const e=t.split("."),s=[];let i="";for(const n of e)i+=n,i.endsWith("\\")?i=i.slice(0,-1)+".":(s.push(i),i="");return s}function zs(t){const e=Ns(t);return t=>{for(const s of e){if(""===s)break;t=t&&t[s]}return t}}function js(t,e){const s=Bs[e]||(Bs[e]=zs(e));return s(t)}function Hs(t){return t.charAt(0).toUpperCase()+t.slice(1)}const qs=t=>"undefined"!==typeof t,Xs=t=>"function"===typeof t,Ks=(t,e)=>{if(t.size!==e.size)return!1;for(const s of t)if(!e.has(s))return!1;return!0};function Ys(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const Qs=Math.PI,Gs=2*Qs,Js=Gs+Qs,Zs=Number.POSITIVE_INFINITY,ti=Qs/180,ei=Qs/2,si=Qs/4,ii=2*Qs/3,ni=Math.log10,ai=Math.sign;function oi(t,e,s){return Math.abs(t-e)t-e).pop(),e}function di(t){return"symbol"===typeof t||"object"===typeof t&&null!==t&&!(Symbol.toPrimitive in t||"toString"in t||"valueOf"in t)}function hi(t){return!di(t)&&!isNaN(parseFloat(t))&&isFinite(t)}function ci(t,e){const s=Math.round(t);return s-e<=t&&s+e>=t}function ui(t,e,s){let i,n,a;for(i=0,n=t.length;il&&d=Math.min(e,s)-i&&t<=Math.max(e,s)+i}function Ci(t,e,s){s=s||(s=>t[s]1)i=a+n>>1,s(i)?a=i:n=i;return{lo:a,hi:n}}const Si=(t,e,s,i)=>Ci(t,s,i?i=>{const n=t[i][e];return nt[i][e]Ci(t,s,i=>t[i][e]>=s);function Ti(t,e,s){let i=0,n=t.length;while(ii&&t[n-1]>s)n--;return i>0||n{const s="_onData"+Hs(e),i=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=i.apply(this,e);return t._chartjs.listeners.forEach(t=>{"function"===typeof t[s]&&t[s](...e)}),n}})}))}function Mi(t,e){const s=t._chartjs;if(!s)return;const i=s.listeners,n=i.indexOf(e);-1!==n&&i.splice(n,1),i.length>0||(Pi.forEach(e=>{delete t[e]}),delete t._chartjs)}function Ai(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const $i=function(){return"undefined"===typeof window?function(t){return t()}:window.requestAnimationFrame}();function Li(t,e){let s=[],i=!1;return function(...n){s=n,i||(i=!0,$i.call(window,()=>{i=!1,t.apply(e,s)}))}}function Vi(t,e){let s;return function(...i){return e?(clearTimeout(s),s=setTimeout(t,e,i)):t.apply(this,i),e}}const Ei=t=>"start"===t?"left":"end"===t?"right":"center",Ui=(t,e,s)=>"start"===t?e:"end"===t?s:(e+s)/2,Ii=(t,e,s,i)=>{const n=i?"left":"right";return t===n?s:"center"===t?(e+s)/2:e};function Oi(t,e,s){const i=e.length;let n=0,a=i;if(t._sorted){const{iScale:o,vScale:r,_parsed:l}=t,d=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null,h=o.axis,{min:c,max:u,minDefined:p,maxDefined:g}=o.getUserBounds();if(p){if(n=Math.min(Si(l,h,c).lo,s?i:Si(e,h,o.getPixelForValue(c)).lo),d){const t=l.slice(0,n+1).reverse().findIndex(t=>!Cs(t[r.axis]));n-=Math.max(0,t)}n=_i(n,0,i-1)}if(g){let t=Math.max(Si(l,o.axis,u,!0).hi+1,s?0:Si(e,h,o.getPixelForValue(u),!0).hi+1);if(d){const e=l.slice(t-1).findIndex(t=>!Cs(t[r.axis]));t+=Math.max(0,e)}a=_i(t,n,i)-n}else a=i-n}return{start:n,count:a}}function Ri(t){const{xScale:e,yScale:s,_scaleRanges:i}=t,n={xmin:e.min,xmax:e.max,ymin:s.min,ymax:s.max};if(!i)return t._scaleRanges=n,!0;const a=i.xmin!==e.min||i.xmax!==e.max||i.ymin!==s.min||i.ymax!==s.max;return Object.assign(i,n),a}const Wi=t=>0===t||1===t,Bi=(t,e,s)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*Gs/s),Ni=(t,e,s)=>Math.pow(2,-10*t)*Math.sin((t-e)*Gs/s)+1,zi={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*ei),easeOutSine:t=>Math.sin(t*ei),easeInOutSine:t=>-.5*(Math.cos(Qs*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>Wi(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>Wi(t)?t:Bi(t,.075,.3),easeOutElastic:t=>Wi(t)?t:Ni(t,.075,.3),easeInOutElastic(t){const e=.1125,s=.45;return Wi(t)?t:t<.5?.5*Bi(2*t,e,s):.5+.5*Ni(2*t-1,e,s)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-zi.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,s=2.75;return t<1/s?e*t*t:t<2/s?e*(t-=1.5/s)*t+.75:t<2.5/s?e*(t-=2.25/s)*t+.9375:e*(t-=2.625/s)*t+.984375},easeInOutBounce:t=>t<.5?.5*zi.easeInBounce(2*t):.5*zi.easeOutBounce(2*t-1)+.5};function ji(t){if(t&&"object"===typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function Hi(t){return ji(t)?t:new _s(t)}function qi(t){return ji(t)?t:new _s(t).saturate(.5).darken(.1).hexString()}const Xi=["x","y","borderWidth","radius","tension"],Ki=["color","borderColor","backgroundColor"];function Yi(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:Ki},numbers:{type:"number",properties:Xi}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})}function Qi(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}const Gi=new Map;function Ji(t,e){e=e||{};const s=t+JSON.stringify(e);let i=Gi.get(s);return i||(i=new Intl.NumberFormat(t,e),Gi.set(s,i)),i}function Zi(t,e,s){return Ji(e,s).format(t)}const tn={values(t){return Ss(t)?t:""+t},numeric(t,e,s){if(0===t)return"0";const i=this.chart.options.locale;let n,a=t;if(s.length>1){const e=Math.max(Math.abs(s[0].value),Math.abs(s[s.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),a=en(t,s)}const o=ni(Math.abs(a)),r=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),Zi(t,i,l)},logarithmic(t,e,s){if(0===t)return"0";const i=s[e].significand||t/Math.pow(10,Math.floor(ni(t)));return[1,2,3,5,10,15].includes(i)||e>.8*s.length?tn.numeric.call(this,t,e,s):""}};function en(t,e){let s=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;return Math.abs(s)>=1&&t!==Math.floor(t)&&(s=t-Math.floor(t)),s}var sn={formatters:tn};function nn(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:sn.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}const an=Object.create(null),on=Object.create(null);function rn(t,e){if(!e)return t;const s=e.split(".");for(let i=0,n=s.length;it.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>qi(e.backgroundColor),this.hoverBorderColor=(t,e)=>qi(e.borderColor),this.hoverColor=(t,e)=>qi(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return ln(this,t,e)}get(t){return rn(this,t)}describe(t,e){return ln(on,t,e)}override(t,e){return ln(an,t,e)}route(t,e,s,i){const n=rn(this,t),a=rn(this,s),o="_"+e;Object.defineProperties(n,{[o]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[o],e=a[i];return Fs(t)?Object.assign({},e,t):Ds(t,e)},set(t){this[o]=t}}})}apply(t){t.forEach(t=>t(this))}}var hn=new dn({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[Yi,Qi,nn]);function cn(t){return!t||Cs(t.size)||Cs(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function un(t,e,s,i,n){let a=e[n];return a||(a=e[n]=t.measureText(n).width,s.push(n)),a>i&&(i=a),i}function pn(t,e,s,i){i=i||{};let n=i.data=i.data||{},a=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(n=i.data={},a=i.garbageCollect=[],i.font=e),t.save(),t.font=e;let o=0;const r=s.length;let l,d,h,c,u;for(l=0;ls.length){for(l=0;l0&&t.stroke()}}function yn(t,e,s){return s=s||.5,!e||t&&t.x>e.left-s&&t.xe.top-s&&t.y0&&""!==a.strokeColor;let l,d;for(t.save(),t.font=n.string,wn(t,a),l=0;l+t||0;function $n(t,e){const s={},i=Fs(e),n=i?Object.keys(e):e,a=Fs(t)?i?s=>Ds(t[s],t[e[s]]):e=>t[e]:()=>t;for(const o of n)s[o]=An(a(o));return s}function Ln(t){return $n(t,{top:"y",right:"x",bottom:"y",left:"x"})}function Vn(t){return $n(t,["topLeft","topRight","bottomLeft","bottomRight"])}function En(t){const e=Ln(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Un(t,e){t=t||{},e=e||hn.font;let s=Ds(t.size,e.size);"string"===typeof s&&(s=parseInt(s,10));let i=Ds(t.style,e.style);i&&!(""+i).match(Dn)&&(console.warn('Invalid font style specified: "'+i+'"'),i=void 0);const n={family:Ds(t.family,e.family),lineHeight:Mn(Ds(t.lineHeight,e.lineHeight),s),size:s,style:i,weight:Ds(t.weight,e.weight),string:""};return n.string=cn(n),n}function In(t,e,s,i){let n,a,o,r=!0;for(n=0,a=t.length;ns&&0===t?0:t+e;return{min:o(i,-Math.abs(a)),max:o(n,a)}}function Rn(t,e){return Object.assign(Object.create(t),e)}function Wn(t,e=[""],s,i,n=()=>t[0]){const a=s||t;"undefined"===typeof i&&(i=sa("_fallback",t));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:a,_fallback:i,_getTarget:n,override:s=>Wn([s,...t],e,a,i)};return new Proxy(o,{deleteProperty(e,s){return delete e[s],delete e._keys,delete t[0][s],!0},get(s,i){return Hn(s,i,()=>ea(i,e,t,s))},getOwnPropertyDescriptor(t,e){return Reflect.getOwnPropertyDescriptor(t._scopes[0],e)},getPrototypeOf(){return Reflect.getPrototypeOf(t[0])},has(t,e){return ia(t).includes(e)},ownKeys(t){return ia(t)},set(t,e,s){const i=t._storage||(t._storage=n());return t[e]=i[e]=s,delete t._keys,!0}})}function Bn(t,e,s,i){const n={_cacheable:!1,_proxy:t,_context:e,_subProxy:s,_stack:new Set,_descriptors:Nn(t,i),setContext:e=>Bn(t,e,s,i),override:n=>Bn(t.override(n),e,s,i)};return new Proxy(n,{deleteProperty(e,s){return delete e[s],delete t[s],!0},get(t,e,s){return Hn(t,e,()=>qn(t,e,s))},getOwnPropertyDescriptor(e,s){return e._descriptors.allKeys?Reflect.has(t,s)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,s)},getPrototypeOf(){return Reflect.getPrototypeOf(t)},has(e,s){return Reflect.has(t,s)},ownKeys(){return Reflect.ownKeys(t)},set(e,s,i){return t[s]=i,delete e[s],!0}})}function Nn(t,e={scriptable:!0,indexable:!0}){const{_scriptable:s=e.scriptable,_indexable:i=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:s,indexable:i,isScriptable:Xs(s)?s:()=>s,isIndexable:Xs(i)?i:()=>i}}const zn=(t,e)=>t?t+Hs(e):e,jn=(t,e)=>Fs(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function Hn(t,e,s){if(Object.prototype.hasOwnProperty.call(t,e)||"constructor"===e)return t[e];const i=s();return t[e]=i,i}function qn(t,e,s){const{_proxy:i,_context:n,_subProxy:a,_descriptors:o}=t;let r=i[e];return Xs(r)&&o.isScriptable(e)&&(r=Xn(e,r,t,s)),Ss(r)&&r.length&&(r=Kn(e,r,t,o.isIndexable)),jn(e,r)&&(r=Bn(r,n,a&&a[e],o)),r}function Xn(t,e,s,i){const{_proxy:n,_context:a,_subProxy:o,_stack:r}=s;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t);let l=e(a,o||i);return r.delete(t),jn(t,l)&&(l=Jn(n._scopes,n,t,l)),l}function Kn(t,e,s,i){const{_proxy:n,_context:a,_subProxy:o,_descriptors:r}=s;if("undefined"!==typeof a.index&&i(t))return e[a.index%e.length];if(Fs(e[0])){const s=e,i=n._scopes.filter(t=>t!==s);e=[];for(const l of s){const s=Jn(i,n,t,l);e.push(Bn(s,a,o&&o[t],r))}}return e}function Yn(t,e,s){return Xs(t)?t(e,s):t}const Qn=(t,e)=>!0===t?e:"string"===typeof t?js(e,t):void 0;function Gn(t,e,s,i,n){for(const a of e){const e=Qn(s,a);if(e){t.add(e);const a=Yn(e._fallback,s,n);if("undefined"!==typeof a&&a!==s&&a!==i)return a}else if(!1===e&&"undefined"!==typeof i&&s!==i)return null}return!1}function Jn(t,e,s,i){const n=e._rootScopes,a=Yn(e._fallback,s,i),o=[...t,...n],r=new Set;r.add(i);let l=Zn(r,o,s,a||s,i);return null!==l&&(("undefined"===typeof a||a===s||(l=Zn(r,o,a,l,i),null!==l))&&Wn(Array.from(r),[""],n,a,()=>ta(e,s,i)))}function Zn(t,e,s,i,n){while(s)s=Gn(t,e,s,i,n);return s}function ta(t,e,s){const i=t._getTarget();e in i||(i[e]={});const n=i[e];return Ss(n)&&Fs(s)?s:n||{}}function ea(t,e,s,i){let n;for(const a of e)if(n=sa(zn(a,t),s),"undefined"!==typeof n)return jn(t,n)?Jn(s,i,t,n):n}function sa(t,e){for(const s of e){if(!s)continue;const e=s[t];if("undefined"!==typeof e)return e}}function ia(t){let e=t._keys;return e||(e=t._keys=na(t._scopes)),e}function na(t){const e=new Set;for(const s of t)for(const t of Object.keys(s).filter(t=>!t.startsWith("_")))e.add(t);return Array.from(e)}function aa(t,e,s,i){const{iScale:n}=t,{key:a="r"}=this._parsing,o=new Array(i);let r,l,d,h;for(r=0,l=i;re"x"===t?"y":"x";function da(t,e,s,i){const n=t.skip?e:t,a=e,o=s.skip?e:s,r=bi(a,n),l=bi(o,a);let d=r/(r+l),h=l/(r+l);d=isNaN(d)?0:d,h=isNaN(h)?0:h;const c=i*d,u=i*h;return{previous:{x:a.x-c*(o.x-n.x),y:a.y-c*(o.y-n.y)},next:{x:a.x+u*(o.x-n.x),y:a.y+u*(o.y-n.y)}}}function ha(t,e,s){const i=t.length;let n,a,o,r,l,d=ra(t,0);for(let h=0;h!t.skip)),"monotone"===e.cubicInterpolationMode)ua(t,n);else{let s=i?t[t.length-1]:t[0];for(a=0,o=t.length;at.ownerDocument.defaultView.getComputedStyle(t,null);function va(t,e){return xa(t).getPropertyValue(e)}const _a=["top","right","bottom","left"];function ka(t,e,s){const i={};s=s?"-"+s:"";for(let n=0;n<4;n++){const a=_a[n];i[a]=parseFloat(t[e+"-"+a+s])||0}return i.width=i.left+i.right,i.height=i.top+i.bottom,i}const wa=(t,e,s)=>(t>0||e>0)&&(!s||!s.shadowRoot);function Ca(t,e){const s=t.touches,i=s&&s.length?s[0]:t,{offsetX:n,offsetY:a}=i;let o,r,l=!1;if(wa(n,a,t.target))o=n,r=a;else{const t=e.getBoundingClientRect();o=i.clientX-t.left,r=i.clientY-t.top,l=!0}return{x:o,y:r,box:l}}function Sa(t,e){if("native"in t)return t;const{canvas:s,currentDevicePixelRatio:i}=e,n=xa(s),a="border-box"===n.boxSizing,o=ka(n,"padding"),r=ka(n,"border","width"),{x:l,y:d,box:h}=Ca(t,s),c=o.left+(h&&r.left),u=o.top+(h&&r.top);let{width:p,height:g}=e;return a&&(p-=o.width+r.width,g-=o.height+r.height),{x:Math.round((l-c)/p*s.width/i),y:Math.round((d-u)/g*s.height/i)}}function Fa(t,e,s){let i,n;if(void 0===e||void 0===s){const a=t&&ba(t);if(a){const t=a.getBoundingClientRect(),o=xa(a),r=ka(o,"border","width"),l=ka(o,"padding");e=t.width-l.width-r.width,s=t.height-l.height-r.height,i=ya(o.maxWidth,a,"clientWidth"),n=ya(o.maxHeight,a,"clientHeight")}else e=t.clientWidth,s=t.clientHeight}return{width:e,height:s,maxWidth:i||Zs,maxHeight:n||Zs}}const Ta=t=>Math.round(10*t)/10;function Pa(t,e,s,i){const n=xa(t),a=ka(n,"margin"),o=ya(n.maxWidth,t,"clientWidth")||Zs,r=ya(n.maxHeight,t,"clientHeight")||Zs,l=Fa(t,e,s);let{width:d,height:h}=l;if("content-box"===n.boxSizing){const t=ka(n,"border","width"),e=ka(n,"padding");d-=e.width+t.width,h-=e.height+t.height}d=Math.max(0,d-a.width),h=Math.max(0,i?d/i:h-a.height),d=Ta(Math.min(d,o,l.maxWidth)),h=Ta(Math.min(h,r,l.maxHeight)),d&&!h&&(h=Ta(d/2));const c=void 0!==e||void 0!==s;return c&&i&&l.height&&h>l.height&&(h=l.height,d=Ta(Math.floor(h*i))),{width:d,height:h}}function Da(t,e,s){const i=e||1,n=Ta(t.height*i),a=Ta(t.width*i);t.height=Ta(t.height),t.width=Ta(t.width);const o=t.canvas;return o.style&&(s||!o.style.height&&!o.style.width)&&(o.style.height=`${t.height}px`,o.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==i||o.height!==n||o.width!==a)&&(t.currentDevicePixelRatio=i,o.height=n,o.width=a,t.ctx.setTransform(i,0,0,i,0,0),!0)}const Ma=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};ma()&&(window.addEventListener("test",null,e),window.removeEventListener("test",null,e))}catch(e){}return t}();function Aa(t,e){const s=va(t,e),i=s&&s.match(/^(\d+)(\.\d+)?px$/);return i?+i[1]:void 0}function $a(t,e,s,i){return{x:t.x+s*(e.x-t.x),y:t.y+s*(e.y-t.y)}}function La(t,e,s,i){return{x:t.x+s*(e.x-t.x),y:"middle"===i?s<.5?t.y:e.y:"after"===i?s<1?t.y:e.y:s>0?e.y:t.y}}function Va(t,e,s,i){const n={x:t.cp2x,y:t.cp2y},a={x:e.cp1x,y:e.cp1y},o=$a(t,n,s),r=$a(n,a,s),l=$a(a,e,s),d=$a(o,r,s),h=$a(r,l,s);return $a(d,h,s)}const Ea=function(t,e){return{x(s){return t+t+e-s},setWidth(t){e=t},textAlign(t){return"center"===t?t:"right"===t?"left":"right"},xPlus(t,e){return t-e},leftForLtr(t,e){return t-e}}},Ua=function(){return{x(t){return t},setWidth(t){},textAlign(t){return t},xPlus(t,e){return t+e},leftForLtr(t,e){return t}}};function Ia(t,e,s){return t?Ea(e,s):Ua()}function Oa(t,e){let s,i;"ltr"!==e&&"rtl"!==e||(s=t.canvas.style,i=[s.getPropertyValue("direction"),s.getPropertyPriority("direction")],s.setProperty("direction",e,"important"),t.prevTextDirection=i)}function Ra(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Wa(t){return"angle"===t?{between:vi,compare:yi,normalize:xi}:{between:wi,compare:(t,e)=>t-e,normalize:t=>t}}function Ba({start:t,end:e,count:s,loop:i,style:n}){return{start:t%s,end:e%s,loop:i&&(e-t+1)%s===0,style:n}}function Na(t,e,s){const{property:i,start:n,end:a}=s,{between:o,normalize:r}=Wa(i),l=e.length;let d,h,{start:c,end:u,loop:p}=t;if(p){for(c+=l,u+=l,d=0,h=l;dl(n,b,f)&&0!==r(n,b),_=()=>0===r(a,f)||l(a,b,f),k=()=>y||v(),w=()=>!y||_();for(let C=h,S=h;C<=c;++C)m=e[C%o],m.skip||(f=d(m[i]),f!==b&&(y=l(f,n,a),null===x&&k()&&(x=0===r(f,n)?C:S),null!==x&&w()&&(g.push(Ba({start:x,end:C,loop:u,count:o,style:p})),x=null),S=C,b=f));return null!==x&&g.push(Ba({start:x,end:c,loop:u,count:o,style:p})),g}function ja(t,e){const s=[],i=t.segments;for(let n=0;nn&&t[a%e].skip)a--;return a%=e,{start:n,end:a}}function qa(t,e,s,i){const n=t.length,a=[];let o,r=e,l=t[e];for(o=e+1;o<=s;++o){const s=t[o%n];s.skip||s.stop?l.skip||(i=!1,a.push({start:e%n,end:(o-1)%n,loop:i}),e=r=s.stop?o:null):(r=o,l.skip&&(e=o)),l=s}return null!==r&&a.push({start:e%n,end:r%n,loop:i}),a}function Xa(t,e){const s=t.points,i=t.options.spanGaps,n=s.length;if(!n)return[];const a=!!t._loop,{start:o,end:r}=Ha(s,n,a,i);if(!0===i)return Ka(t,[{start:o,end:r,loop:a}],s,e);const l=ri({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(s-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=$i.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((s,i)=>{if(!s.running||!s.items.length)return;const n=s.items;let a,o=n.length-1,r=!1;for(;o>=0;--o)a=n[o],a._active?(a._total>s.duration&&(s.duration=a._total),a.tick(t),r=!0):(n[o]=n[n.length-1],n.pop());r&&(i.draw(),this._notify(i,s,t,"progress")),n.length||(s.running=!1,this._notify(i,s,t,"complete"),s.initial=!1),e+=n.length}),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let s=e.get(t);return s||(s={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,s)),s}listen(t,e,s){this._getAnims(t).listeners[e].push(s)}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 s=e.items;let i=s.length-1;for(;i>=0;--i)s[i].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var so=new eo;const io="transparent",no={boolean(t,e,s){return s>.5?e:t},color(t,e,s){const i=Hi(t||io),n=i.valid&&Hi(e||io);return n&&n.valid?n.mix(i,s).hexString():e},number(t,e,s){return t+(e-t)*s}};class ao{constructor(t,e,s,i){const n=e[s];i=In([t.to,i,n,t.from]);const a=In([t.from,n,i]);this._active=!0,this._fn=t.fn||no[t.type||typeof a],this._easing=zi[t.easing]||zi.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=s,this._from=a,this._to=i,this._promises=void 0}active(){return this._active}update(t,e,s){if(this._active){this._notify(!1);const i=this._target[this._prop],n=s-this._start,a=this._duration-n;this._start=s,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=In([t.to,e,i,t.from]),this._from=In([t.from,i,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,s=this._duration,i=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[i]=this._fn(n,o,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise((e,s)=>{t.push({res:e,rej:s})})}_notify(t){const e=t?"res":"rej",s=this._promises||[];for(let i=0;i{const n=t[i];if(!Fs(n))return;const a={};for(const t of e)a[t]=n[t];(Ss(n.properties)&&n.properties||[i]).forEach(t=>{t!==i&&s.has(t)||s.set(t,a)})})}_animateOptions(t,e){const s=e.options,i=lo(t,s);if(!i)return[];const n=this._createAnimations(i,s);return s.$shared&&ro(t.options.$animations,s).then(()=>{t.options=s},()=>{}),n}_createAnimations(t,e){const s=this._properties,i=[],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){i.push(...this._animateOptions(t,e));continue}const d=e[l];let h=n[l];const c=s.get(l);if(h){if(c&&h.active()){h.update(c,d,o);continue}h.cancel()}c&&c.duration?(n[l]=h=new ao(c,t,l,d),i.push(h)):t[l]=d}return i}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const s=this._createAnimations(t,e);return s.length?(so.add(this._chart,s),!0):void 0}}function ro(t,e){const s=[],i=Object.keys(e);for(let n=0;n0||!s&&e<0)return n.index}return null}function _o(t,e){const{chart:s,_cachedMeta:i}=t,n=s._stacks||(s._stacks={}),{iScale:a,vScale:o,index:r}=i,l=a.axis,d=o.axis,h=bo(a,o,i),c=e.length;let u;for(let p=0;ps[t].axis===e).shift()}function wo(t,e){return Rn(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}function Co(t,e,s){return Rn(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:s,index:e,mode:"default",type:"data"})}function So(t,e){const s=t.controller.index,i=t.vScale&&t.vScale.axis;if(i){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[i]||void 0===e[i][s])return;delete e[i][s],void 0!==e[i]._visualValues&&void 0!==e[i]._visualValues[s]&&delete e[i]._visualValues[s]}}}const Fo=t=>"reset"===t||"none"===t,To=(t,e)=>e?t:Object.assign({},t),Po=(t,e,s)=>t&&!e.hidden&&e._stacked&&{keys:po(s,!0),values:null};class Do{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=mo(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&&So(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,s=this.getDataset(),i=(t,e,s,i)=>"x"===t?e:"r"===t?i:s,n=e.xAxisID=Ds(s.xAxisID,ko(t,"x")),a=e.yAxisID=Ds(s.yAxisID,ko(t,"y")),o=e.rAxisID=Ds(s.rAxisID,ko(t,"r")),r=e.indexAxis,l=e.iAxisID=i(r,n,a,o),d=e.vAxisID=i(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(d)}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&&Mi(this._data,this),t._stacked&&So(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),s=this._data;if(Fs(e)){const t=this._cachedMeta;this._data=fo(e,t)}else if(s!==e){if(s){Mi(s,this);const t=this._cachedMeta;So(t),t._parsed=[]}e&&Object.isExtensible(e)&&Di(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,s=this.getDataset();let i=!1;this._dataCheck();const n=e._stacked;e._stacked=mo(e.vScale,e),e.stack!==s.stack&&(i=!0,So(e),e.stack=s.stack),this._resyncElements(t),(i||n!==e._stacked)&&(_o(this,e._parsed),e._stacked=mo(e.vScale,e))}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),s=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(s,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:s,_data:i}=this,{iScale:n,_stacked:a}=s,o=n.axis;let r,l,d,h=0===t&&e===i.length||s._sorted,c=t>0&&s._parsed[t-1];if(!1===this._parsing)s._parsed=i,s._sorted=!0,d=i;else{d=Ss(i[t])?this.parseArrayData(s,i,t,e):Fs(i[t])?this.parseObjectData(s,i,t,e):this.parsePrimitiveData(s,i,t,e);const n=()=>null===l[o]||c&&l[o]e||h=0;--c)if(!p()){this.updateRangeFromParsed(l,t,u,r);break}return l}getAllParsedValues(t){const e=this._cachedMeta._parsed,s=[];let i,n,a;for(i=0,n=e.length;i=0&&tthis.getContext(s,i,e),g=l.resolveNamedOptions(c,u,p,h);return g.$shared&&(g.$shared=r,n[a]=Object.freeze(To(g,r))),g}_resolveAnimations(t,e,s){const i=this.chart,n=this._cachedDataOpts,a=`animation-${e}`,o=n[a];if(o)return o;let r;if(!1!==i.options.animation){const i=this.chart.config,n=i.datasetAnimationScopeKeys(this._type,e),a=i.getOptionScopes(this.getDataset(),n);r=i.createResolver(a,this.getContext(t,s,e))}const l=new oo(i,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||Fo(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const s=this.resolveDataElementOptions(t,e),i=this._sharedOptions,n=this.getSharedOptions(s),a=this.includeOptions(e,n)||n!==i;return this.updateSharedOptions(n,e,s),{sharedOptions:n,includeOptions:a}}updateElement(t,e,s,i){Fo(i)?Object.assign(t,s):this._resolveAnimations(e,i).update(t,s)}updateSharedOptions(t,e,s){t&&!Fo(e)&&this._resolveAnimations(void 0,e).update(t,s)}_setStyle(t,e,s,i){t.active=i;const n=this.getStyle(e,i);this._resolveAnimations(e,s,i).update(t,{options:!i&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,s){this._setStyle(t,s,"active",!1)}setHoverStyle(t,e,s){this._setStyle(t,s,"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,s=this._cachedMeta.data;for(const[o,r,l]of this._syncList)this[o](r,l);this._syncList=[];const i=s.length,n=e.length,a=Math.min(n,i);a&&this.parse(0,a),n>i?this._insertElements(i,n-i,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 Ao(t){const e=t.iScale,s=Mo(e,t.type);let i,n,a,o,r=e._length;const l=()=>{32767!==a&&-32768!==a&&(qs(o)&&(r=Math.min(r,Math.abs(a-o)||r)),o=a)};for(i=0,n=s.length;i0?n[t-1]:null,r=tMath.abs(r)&&(l=r,d=o),e[s.axis]=d,e._custom={barStart:l,barEnd:d,start:n,end:a,min:o,max:r}}function Eo(t,e,s,i){return Ss(t)?Vo(t,e,s,i):e[s.axis]=s.parse(t,i),e}function Uo(t,e,s,i){const n=t.iScale,a=t.vScale,o=n.getLabels(),r=n===a,l=[];let d,h,c,u;for(d=s,h=s+i;d=s?1:-1)}function Ro(t){let e,s,i,n,a;return t.horizontal?(e=t.base>t.x,s="left",i="right"):(e=t.baset.controller.options.grouped),n=s.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(e),r=o&&o[s.axis],l=t=>{const e=t._parsed.find(t=>t[s.axis]===r),i=e&&e[t.vScale.axis];if(Cs(i)||isNaN(i))return!0};for(const d of i)if((void 0===e||!l(d))&&((!1===n||-1===a.indexOf(d.stack)||void 0===n&&void 0===d.stack)&&a.push(d.stack),d.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(s=>t[s].axis===e).shift()}_getAxis(){const t={},e=this.getFirstScaleIdForIndexAxis();for(const s of this.chart.data.datasets)t[Ds("x"===this.chart.options.indexAxis?s.xAxisID:s.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,s){const i=this._getStacks(t,s),n=void 0!==e?i.indexOf(e):-1;return-1===n?i.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,s=e.iScale,i=[];let n,a;for(n=0,a=e.data.length;n=0;--s)e=Math.max(e,t[s].size(this.resolveDataElementOptions(s))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart.data.labels||[],{xScale:i,yScale:n}=e,a=this.getParsed(t),o=i.getLabelForValue(a.x),r=n.getLabelForValue(a.y),l=a._custom;return{label:s[t]||"",value:"("+o+", "+r+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,s,i){const n="reset"===i,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,i),d=a.axis,h=o.axis;for(let c=e;cvi(t,r,l,!0)?1:Math.max(e,e*s,i,i*s),g=(t,e,i)=>vi(t,r,l,!0)?-1:Math.min(e,e*s,i,i*s),f=p(0,d,c),m=p(ei,h,u),b=g(Qs,d,c),y=g(Qs+ei,h,u);i=(f-b)/2,n=(m-y)/2,a=-(f+b)/2,o=-(m+y)/2}return{ratioX:i,ratioY:n,offsetX:a,offsetY:o}}(0,Me.A)(qo,"id","bubble"),(0,Me.A)(qo,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),(0,Me.A)(qo,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class Ko extends Do{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 s=this.getDataset().data,i=this._cachedMeta;if(!1===this._parsing)i._parsed=s;else{let n,a,o=t=>+s[t];if(Fs(s[t])){const{key:t="value"}=this._parsing;o=e=>+js(s[e],t)}for(n=t,a=t+e;n0&&!isNaN(t)?Gs*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=Zi(e._parsed[t],s.options.locale);return{label:i[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const s=this.chart;let i,n,a,o,r;if(!t)for(i=0,n=s.data.datasets.length;i"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),(0,Me.A)(Ko,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data,{labels:{pointStyle:s,textAlign:i,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),d=l.controller.getStyle(r);return{text:e,fillStyle:d.backgroundColor,fontColor:n,hidden:!t.getDataVisibility(r),lineDash:d.borderDash,lineDashOffset:d.borderDashOffset,lineJoin:d.borderJoinStyle,lineWidth:d.borderWidth,strokeStyle:d.borderColor,textAlign:i,pointStyle:s,borderRadius:a&&(o||d.borderRadius),index:r}}):[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}}});class Yo extends Do{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:s,data:i=[],_dataset:n}=e,a=this.chart._animationsDisabled;let{start:o,count:r}=Oi(e,i,a);this._drawStart=o,this._drawCount=r,Ri(e)&&(o=0,r=i.length),s._chart=this.chart,s._datasetIndex=this.index,s._decimated=!!n._decimated,s.points=i;const l=this.resolveDatasetElementOptions(t);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(s,void 0,{animated:!a,options:l},t),this.updateElements(i,o,r,t)}updateElements(t,e,s,i){const n="reset"===i,{iScale:a,vScale:o,_stacked:r,_dataset:l}=this._cachedMeta,{sharedOptions:d,includeOptions:h}=this._getSharedOptions(e,i),c=a.axis,u=o.axis,{spanGaps:p,segment:g}=this.options,f=hi(p)?p:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||"none"===i,b=e+s,y=t.length;let x=e>0&&this.getParsed(e-1);for(let v=0;v=b){p.skip=!0;continue}const y=this.getParsed(v),_=Cs(y[u]),k=p[c]=a.getPixelForValue(y[c],v),w=p[u]=n||_?o.getBasePixel():o.getPixelForValue(r?this.applyStack(o,y,r):y[u],v);p.skip=isNaN(k)||isNaN(w)||_,p.stop=v>0&&Math.abs(y[c]-x[c])>f,g&&(p.parsed=y,p.raw=l.data[v]),h&&(p.options=d||this.resolveDataElementOptions(v,s.active?"active":i)),m||this.updateElement(s,v,p,i),x=y}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,s=e.options&&e.options.borderWidth||0,i=t.data||[];if(!i.length)return s;const n=i[0].size(this.resolveDataElementOptions(0)),a=i[i.length-1].size(this.resolveDataElementOptions(i.length-1));return Math.max(s,n,a)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}(0,Me.A)(Yo,"id","line"),(0,Me.A)(Yo,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,Me.A)(Yo,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class Qo extends Do{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=Zi(e._parsed[t].r,s.options.locale);return{label:i[t]||"",value:n}}parseObjectData(t,e,s,i){return aa.bind(this)(t,e,s,i)}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,s)=>{const i=this.getParsed(s).r;!isNaN(i)&&this.chart.getDataVisibility(s)&&(ie.max&&(e.max=i))}),e}_updateRadius(){const t=this.chart,e=t.chartArea,s=t.options,i=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(i/2,0),a=Math.max(s.cutoutPercentage?n/100*s.cutoutPercentage:1,0),o=(n-a)/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,s,i){const n="reset"===i,a=this.chart,o=a.options,r=o.animation,l=this._cachedMeta.rScale,d=l.xCenter,h=l.yCenter,c=l.getIndexAngle(0)-.5*Qs;let u,p=c;const g=360/this.countVisibleElements();for(u=0;u{!isNaN(this.getParsed(s).r)&&this.chart.getDataVisibility(s)&&e++}),e}_computeAngle(t,e,s){return this.chart.getDataVisibility(t)?pi(this.resolveDataElementOptions(t,e).angle||s):0}}(0,Me.A)(Qo,"id","polarArea"),(0,Me.A)(Qo,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),(0,Me.A)(Qo,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:s,color:i}}=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:i,lineWidth:o.borderWidth,pointStyle:s,hidden:!t.getDataVisibility(n),index:n}})}return[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});class Go extends Ko{}(0,Me.A)(Go,"id","pie"),(0,Me.A)(Go,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class Jo extends Do{getLabelAndValue(t){const e=this._cachedMeta.vScale,s=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(s[e.axis])}}parseObjectData(t,e,s,i){return aa.bind(this)(t,e,s,i)}update(t){const e=this._cachedMeta,s=e.dataset,i=e.data||[],n=e.iScale.getLabels();if(s.points=i,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const a={_loop:!0,_fullLoop:n.length===i.length,options:e};this.updateElement(s,void 0,a,t)}this.updateElements(i,0,i.length,t)}updateElements(t,e,s,i){const n=this._cachedMeta.rScale,a="reset"===i;for(let o=e;o0&&this.getParsed(e-1);for(let x=e;x0&&Math.abs(s[u]-y[u])>m,f&&(d.parsed=s,d.raw=l.data[x]),c&&(d.options=h||this.resolveDataElementOptions(x,e.active?"active":i)),b||this.updateElement(e,x,d,i),y=s}this.updateSharedOptions(h,i,d)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let s=e.length-1;s>=0;--s)t=Math.max(t,e[s].size(this.resolveDataElementOptions(s))/2);return t>0&&t}const s=t.dataset,i=s.options&&s.options.borderWidth||0;if(!e.length)return i;const n=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(i,n,a)/2}}(0,Me.A)(Zo,"id","scatter"),(0,Me.A)(Zo,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,Me.A)(Zo,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function tr(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class er{static override(t){Object.assign(er.prototype,t)}constructor(t){(0,Me.A)(this,"options",void 0),this.options=t||{}}init(){}formats(){return tr()}parse(){return tr()}format(){return tr()}add(){return tr()}diff(){return tr()}startOf(){return tr()}endOf(){return tr()}}var sr={_date:er};function ir(t,e,s,i){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?Fi:Si;if(!i){const i=o(a,e,s);if(l){const{vScale:e}=n._cachedMeta,{_parsed:s}=t,a=s.slice(0,i.lo+1).reverse().findIndex(t=>!Cs(t[e.axis]));i.lo-=Math.max(0,a);const o=s.slice(i.hi).findIndex(t=>!Cs(t[e.axis]));i.hi+=Math.max(0,o)}return i}if(n._sharedOptions){const t=a[0],i="function"===typeof t.getRange&&t.getRange(e);if(i){const t=o(a,e,s-i),n=o(a,e,s+i);return{lo:t.lo,hi:n.hi}}}}return{lo:0,hi:a.length-1}}function nr(t,e,s,i,n){const a=t.getSortedVisibleDatasetMetas(),o=s[e];for(let r=0,l=a.length;r{t[o]&&t[o](e[s],n)&&(a.push({element:t,datasetIndex:i,index:l}),r=r||t.inRange(e.x,e.y,n))}),i&&!r?[]:a}var cr={evaluateInteractionItems:nr,modes:{index(t,e,s,i){const n=Sa(e,t),a=s.axis||"x",o=s.includeInvisible||!1,r=s.intersect?or(t,n,a,i,o):dr(t,n,a,!1,i,o),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach(t=>{const e=r[0].index,s=t.data[e];s&&!s.skip&&l.push({element:s,datasetIndex:t.index,index:e})}),l):[]},dataset(t,e,s,i){const n=Sa(e,t),a=s.axis||"xy",o=s.includeInvisible||!1;let r=s.intersect?or(t,n,a,i,o):dr(t,n,a,!1,i,o);if(r.length>0){const e=r[0].datasetIndex,s=t.getDatasetMeta(e).data;r=[];for(let t=0;tt.pos===e)}function gr(t,e){return t.filter(t=>-1===ur.indexOf(t.pos)&&t.box.axis===e)}function fr(t,e){return t.sort((t,s)=>{const i=e?s:t,n=e?t:s;return i.weight===n.weight?i.index-n.index:i.weight-n.weight})}function mr(t){const e=[];let s,i,n,a,o,r;for(s=0,i=(t||[]).length;st.box.fullSize),!0),i=fr(pr(e,"left"),!0),n=fr(pr(e,"right")),a=fr(pr(e,"top"),!0),o=fr(pr(e,"bottom")),r=gr(e,"x"),l=gr(e,"y");return{fullSize:s,leftAndTop:i.concat(a),rightAndBottom:n.concat(l).concat(o).concat(r),chartArea:pr(e,"chartArea"),vertical:i.concat(n).concat(l),horizontal:a.concat(o).concat(r)}}function vr(t,e,s,i){return Math.max(t[s],e[s])+Math.max(t[i],e[i])}function _r(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 kr(t,e,s,i){const{pos:n,box:a}=s,o=t.maxPadding;if(!Fs(n)){s.size&&(t[n]-=s.size);const e=i[s.stack]||{size:0,count:1};e.size=Math.max(e.size,s.horizontal?a.height:a.width),s.size=e.size/e.count,t[n]+=s.size}a.getPadding&&_r(o,a.getPadding());const r=Math.max(0,e.outerWidth-vr(o,t,"left","right")),l=Math.max(0,e.outerHeight-vr(o,t,"top","bottom")),d=r!==t.w,h=l!==t.h;return t.w=r,t.h=l,s.horizontal?{same:d,other:h}:{same:h,other:d}}function wr(t){const e=t.maxPadding;function s(s){const i=Math.max(e[s]-t[s],0);return t[s]+=i,i}t.y+=s("top"),t.x+=s("left"),s("right"),s("bottom")}function Cr(t,e){const s=e.maxPadding;function i(t){const i={left:0,top:0,right:0,bottom:0};return t.forEach(t=>{i[t]=Math.max(e[t],s[t])}),i}return i(t?["left","right"]:["top","bottom"])}function Sr(t,e,s,i){const n=[];let a,o,r,l,d,h;for(a=0,o=t.length,d=0;a{"function"===typeof t.beforeLayout&&t.beforeLayout()});const h=l.reduce((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1,0)||1,c=Object.freeze({outerWidth:e,outerHeight:s,padding:n,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/h,hBoxMaxHeight:o/2}),u=Object.assign({},n);_r(u,En(i));const p=Object.assign({maxPadding:u,w:a,h:o,x:n.left,y:n.top},n),g=yr(l.concat(d),c);Sr(r.fullSize,p,c,g),Sr(l,p,c,g),Sr(d,p,c,g)&&Sr(l,p,c,g),wr(p),Tr(r.leftAndTop,p,c,g),p.x+=p.w,p.y+=p.h,Tr(r.rightAndBottom,p,c,g),t.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},Ls(r.chartArea,e=>{const s=e.box;Object.assign(s,t.chartArea),s.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}};class Dr{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,s){}removeEventListener(t,e,s){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,s,i){return e=Math.max(0,e||t.width),s=s||t.height,{width:e,height:Math.max(0,i?Math.floor(e/i):s)}}isAttached(t){return!0}updateConfig(t){}}class Mr extends Dr{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Ar="$chartjs",$r={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Lr=t=>null===t||""===t;function Vr(t,e){const s=t.style,i=t.getAttribute("height"),n=t.getAttribute("width");if(t[Ar]={initial:{height:i,width:n,style:{display:s.display,height:s.height,width:s.width}}},s.display=s.display||"block",s.boxSizing=s.boxSizing||"border-box",Lr(n)){const e=Aa(t,"width");void 0!==e&&(t.width=e)}if(Lr(i))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Aa(t,"height");void 0!==e&&(t.height=e)}return t}const Er=!!Ma&&{passive:!0};function Ur(t,e,s){t&&t.addEventListener(e,s,Er)}function Ir(t,e,s){t&&t.canvas&&t.canvas.removeEventListener(e,s,Er)}function Or(t,e){const s=$r[t.type]||t.type,{x:i,y:n}=Sa(t,e);return{type:s,chart:e,native:t,x:void 0!==i?i:null,y:void 0!==n?n:null}}function Rr(t,e){for(const s of t)if(s===e||s.contains(e))return!0}function Wr(t,e,s){const i=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const s of t)e=e||Rr(s.addedNodes,i),e=e&&!Rr(s.removedNodes,i);e&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}function Br(t,e,s){const i=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const s of t)e=e||Rr(s.removedNodes,i),e=e&&!Rr(s.addedNodes,i);e&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}const Nr=new Map;let zr=0;function jr(){const t=window.devicePixelRatio;t!==zr&&(zr=t,Nr.forEach((e,s)=>{s.currentDevicePixelRatio!==t&&e()}))}function Hr(t,e){Nr.size||window.addEventListener("resize",jr),Nr.set(t,e)}function qr(t){Nr.delete(t),Nr.size||window.removeEventListener("resize",jr)}function Xr(t,e,s){const i=t.canvas,n=i&&ba(i);if(!n)return;const a=Li((t,e)=>{const i=n.clientWidth;s(t,e),i{const e=t[0],s=e.contentRect.width,i=e.contentRect.height;0===s&&0===i||a(s,i)});return o.observe(n),Hr(t,a),o}function Kr(t,e,s){s&&s.disconnect(),"resize"===e&&qr(t)}function Yr(t,e,s){const i=t.canvas,n=Li(e=>{null!==t.ctx&&s(Or(e,t))},t);return Ur(i,e,n),n}class Qr extends Dr{acquireContext(t,e){const s=t&&t.getContext&&t.getContext("2d");return s&&s.canvas===t?(Vr(t,e),s):null}releaseContext(t){const e=t.canvas;if(!e[Ar])return!1;const s=e[Ar].initial;["height","width"].forEach(t=>{const i=s[t];Cs(i)?e.removeAttribute(t):e.setAttribute(t,i)});const i=s.style||{};return Object.keys(i).forEach(t=>{e.style[t]=i[t]}),e.width=e.width,delete e[Ar],!0}addEventListener(t,e,s){this.removeEventListener(t,e);const i=t.$proxies||(t.$proxies={}),n={attach:Wr,detach:Br,resize:Xr},a=n[e]||Yr;i[e]=a(t,e,s)}removeEventListener(t,e){const s=t.$proxies||(t.$proxies={}),i=s[e];if(!i)return;const n={attach:Kr,detach:Kr,resize:Kr},a=n[e]||Ir;a(t,e,i),s[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,s,i){return Pa(t,e,s,i)}isAttached(t){const e=t&&ba(t);return!(!e||!e.isConnected)}}function Gr(t){return!ma()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?Mr:Qr}class Jr{constructor(){(0,Me.A)(this,"x",void 0),(0,Me.A)(this,"y",void 0),(0,Me.A)(this,"active",!1),(0,Me.A)(this,"options",void 0),(0,Me.A)(this,"$animations",void 0)}tooltipPosition(t){const{x:e,y:s}=this.getProps(["x","y"],t);return{x:e,y:s}}hasValue(){return hi(this.x)&&hi(this.y)}getProps(t,e){const s=this.$animations;if(!e||!s)return this;const i={};return t.forEach(t=>{i[t]=s[t]&&s[t].active()?s[t]._to:this[t]}),i}}function Zr(t,e){const s=t.options.ticks,i=tl(t),n=Math.min(s.maxTicksLimit||i,i),a=s.major.enabled?sl(e):[],o=a.length,r=a[0],l=a[o-1],d=[];if(o>n)return il(e,d,a,o/n),d;const h=el(a,e,n);if(o>0){let t,s;const i=o>1?Math.round((l-r)/(o-1)):null;for(nl(e,d,h,Cs(i)?0:r-i,r),t=0,s=o-1;tn)return t}return Math.max(n,1)}function sl(t){const e=[];let s,i;for(s=0,i=t.length;s"left"===t?"right":"right"===t?"left":t,rl=(t,e,s)=>"top"===e||"left"===e?t[e]+s:t[e]-s,ll=(t,e)=>Math.min(e||t,t);function dl(t,e){const s=[],i=t.length/e,n=t.length;let a=0;for(;ao+r)))return d}function cl(t,e){Ls(t,t=>{const s=t.gc,i=s.length/2;let n;if(i>e){for(n=0;ni?i:s,i=n&&s>i?s:i,{min:Ps(s,Ps(i,s)),max:Ps(i,Ps(s,i))}}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(){$s(this.options.beforeUpdate,[this])}update(t,e,s){const{beginAtZero:i,grace:n,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=s=Object.assign({left:0,right:0,top:0,bottom:0},s),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+s.left+s.right:this.height+s.top+s.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=On(this,n,i),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=o=n||s<=1||!this.isHorizontal())return void(this.labelRotation=i);const d=this._getLabelSizes(),h=d.widest.width,c=d.highest.height,u=_i(this.chart.width-h,0,this.maxWidth);a=t.offset?this.maxWidth/s:u/(s-1),h+6>a&&(a=u/(s-(t.offset?.5:1)),o=this.maxHeight-ul(t.grid)-e.padding-pl(t.title,this.chart.options.font),r=Math.sqrt(h*h+c*c),l=gi(Math.min(Math.asin(_i((d.highest.height+6)/a,-1,1)),Math.asin(_i(o/r,-1,1))-Math.asin(_i(c/r,-1,1)))),l=Math.max(i,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){$s(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){$s(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:s,title:i,grid:n}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){const a=pl(i,e.options.font);if(o?(t.width=this.maxWidth,t.height=ul(n)+a):(t.height=this.maxHeight,t.width=ul(n)+a),s.display&&this.ticks.length){const{first:e,last:i,widest:n,highest:a}=this._getLabelSizes(),r=2*s.padding,l=pi(this.labelRotation),d=Math.cos(l),h=Math.sin(l);if(o){const e=s.mirror?0:h*n.width+d*a.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=s.mirror?0:d*n.width+h*a.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,i,h,d)}}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,s,i){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,d=this.right-this.getPixelForTick(this.ticks.length-1);let h=0,c=0;r?l?(h=i*t.width,c=s*e.height):(h=s*t.height,c=i*e.width):"start"===n?c=e.width:"end"===n?h=t.width:"inner"!==n&&(h=t.width/2,c=e.width/2),this.paddingLeft=Math.max((h-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((c-d+a)*this.width/(this.width-d),0)}else{let s=e.height/2,i=t.height/2;"start"===n?(s=0,i=t.height):"end"===n&&(s=e.height,i=0),this.paddingTop=s+a,this.paddingBottom=i+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(){$s(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,s;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,s=t.length;e({width:a[t]||0,height:o[t]||0});return{first:w(0),last:w(e-1),widest:w(_),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 ki(this._alignToPixels?gn(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*i?o/s:r/i:r*i0}_computeGridLineItems(t){const e=this.axis,s=this.chart,i=this.options,{grid:n,position:a,border:o}=i,r=n.offset,l=this.isHorizontal(),d=this.ticks,h=d.length+(r?1:0),c=ul(n),u=[],p=o.setContext(this.getContext()),g=p.display?p.width:0,f=g/2,m=function(t){return gn(s,t,g)};let b,y,x,v,_,k,w,C,S,F,T,P;if("top"===a)b=m(this.bottom),k=this.bottom-c,C=b-f,F=m(t.top)+f,P=t.bottom;else if("bottom"===a)b=m(this.top),F=t.top,P=m(t.bottom)-f,k=b+f,C=this.top+c;else if("left"===a)b=m(this.right),_=this.right-c,w=b-f,S=m(t.left)+f,T=t.right;else if("right"===a)b=m(this.left),S=t.left,T=m(t.right)-f,_=b+f,w=this.left+c;else if("x"===e){if("center"===a)b=m((t.top+t.bottom)/2+.5);else if(Fs(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}F=t.top,P=t.bottom,k=b+f,C=k+c}else if("y"===e){if("center"===a)b=m((t.left+t.right)/2);else if(Fs(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}_=b-f,w=_-c,S=t.left,T=t.right}const D=Ds(i.ticks.maxTicksLimit,h),M=Math.max(1,Math.ceil(h/D));for(y=0;y0&&(a-=i/2);break}c={left:a,top:n,width:i+e.width,height:s+e.height,color:t.backdropColor}}f.push({label:x,font:C,textOffset:T,options:{rotation:g,color:s,strokeColor:r,strokeWidth:d,textAlign:u,textBaseline:P,translation:[v,_],backdrop:c}})}return f}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options,s=-pi(this.labelRotation);if(s)return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:s,mirror:i,padding:n}}=this.options,a=this._getLabelSizes(),o=t+n,r=a.widest.width;let l,d;return"left"===e?i?(d=this.right+n,"near"===s?l="left":"center"===s?(l="center",d+=r/2):(l="right",d+=r)):(d=this.right-o,"near"===s?l="right":"center"===s?(l="center",d-=r/2):(l="left",d=this.left)):"right"===e?i?(d=this.left+n,"near"===s?l="right":"center"===s?(l="center",d-=r/2):(l="left",d-=r)):(d=this.left+o,"near"===s?l="left":"center"===s?(l="center",d+=r/2):(l="right",d=this.right)):l="right",{textAlign:l,x:d}}_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:s,top:i,width:n,height:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(s,i,n,a),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const s=this.ticks,i=s.findIndex(e=>e.value===t);if(i>=0){const t=e.setContext(this.getContext(i));return t.lineWidth}return 0}drawGrid(t){const e=this.options.grid,s=this.ctx,i=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,a;const o=(t,e,i)=>{i.width&&i.color&&(s.save(),s.lineWidth=i.width,s.strokeStyle=i.color,s.setLineDash(i.borderDash||[]),s.lineDashOffset=i.borderDashOffset,s.beginPath(),s.moveTo(t.x,t.y),s.lineTo(e.x,e.y),s.stroke(),s.restore())};if(e.display)for(n=0,a=i.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),s=this.axis+"AxisID",i=[];let n,a;for(n=0,a=e.length;n{const i=s.split("."),n=i.pop(),a=[t].concat(i).join("."),o=e[s].split("."),r=o.pop(),l=o.join(".");hn.route(a,n,l,r)})}function kl(t){return"id"in t&&"defaults"in t}class wl{constructor(){this.controllers=new xl(Do,"datasets",!0),this.elements=new xl(Jr,"elements"),this.plugins=new xl(Object,"plugins"),this.scales=new xl(yl,"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,s){[...e].forEach(e=>{const i=s||this._getRegistryForType(e);s||i.isForType(e)||i===this.plugins&&e.id?this._exec(t,i,e):Ls(e,e=>{const i=s||this._getRegistryForType(e);this._exec(t,i,e)})})}_exec(t,e,s){const i=Hs(t);$s(s["before"+i],[],s),e[t](s),$s(s["after"+i],[],s)}_getRegistryForType(t){for(let e=0;et.filter(t=>!e.some(e=>t.plugin.id===e.plugin.id));this._notify(i(e,s),t,"stop"),this._notify(i(s,e),t,"start")}}function Fl(t){const e={},s=[],i=Object.keys(Cl.plugins.items);for(let a=0;a1&&Ll(t[0].toLowerCase());if(e)return e}throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function Ul(t,e,s){if(s[e+"AxisID"]===t)return{axis:e}}function Il(t,e){if(e.data&&e.data.datasets){const s=e.data.datasets.filter(e=>e.xAxisID===t||e.yAxisID===t);if(s.length)return Ul(t,"x",s[0])||Ul(t,"y",s[0])}return{}}function Ol(t,e){const s=an[t.type]||{scales:{}},i=e.scales||{},n=Ml(t.type,e),a=Object.create(null);return Object.keys(i).forEach(e=>{const o=i[e];if(!Fs(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=El(e,o,Il(e,t),hn.scales[o.type]),l=$l(r,n),d=s.scales||{};a[e]=Rs(Object.create(null),[{axis:r},o,d[r],d[l]])}),t.data.datasets.forEach(s=>{const n=s.type||t.type,o=s.indexAxis||Ml(n,e),r=an[n]||{},l=r.scales||{};Object.keys(l).forEach(t=>{const e=Al(t,o),n=s[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),Rs(a[n],[{axis:e},i[n],l[t]])})}),Object.keys(a).forEach(t=>{const e=a[t];Rs(e,[hn.scales[e.type],hn.scale])}),a}function Rl(t){const e=t.options||(t.options={});e.plugins=Ds(e.plugins,{}),e.scales=Ol(t,e)}function Wl(t){return t=t||{},t.datasets=t.datasets||[],t.labels=t.labels||[],t}function Bl(t){return t=t||{},t.data=Wl(t.data),Rl(t),t}const Nl=new Map,zl=new Set;function jl(t,e){let s=Nl.get(t);return s||(s=e(),Nl.set(t,s),zl.add(s)),s}const Hl=(t,e,s)=>{const i=js(e,s);void 0!==i&&t.add(i)};class ql{constructor(t){this._config=Bl(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=Wl(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(),Rl(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return jl(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return jl(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return jl(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,s=this.type;return jl(`${s}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){const s=this._scopeCache;let i=s.get(t);return i&&!e||(i=new Map,s.set(t,i)),i}getOptionScopes(t,e,s){const{options:i,type:n}=this,a=this._cachedScopes(t,s),o=a.get(e);if(o)return o;const r=new Set;e.forEach(e=>{t&&(r.add(t),e.forEach(e=>Hl(r,t,e))),e.forEach(t=>Hl(r,i,t)),e.forEach(t=>Hl(r,an[n]||{},t)),e.forEach(t=>Hl(r,hn,t)),e.forEach(t=>Hl(r,on,t))});const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),zl.has(e)&&a.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,an[e]||{},hn.datasets[e]||{},{type:e},hn,on]}resolveNamedOptions(t,e,s,i=[""]){const n={$shared:!0},{resolver:a,subPrefixes:o}=Xl(this._resolverCache,t,i);let r=a;if(Yl(a,e)){n.$shared=!1,s=Xs(s)?s():s;const e=this.createResolver(t,s,o);r=Bn(a,s,e)}for(const l of e)n[l]=r[l];return n}createResolver(t,e,s=[""],i){const{resolver:n}=Xl(this._resolverCache,t,s);return Fs(e)?Bn(n,e,void 0,i):n}}function Xl(t,e,s){let i=t.get(e);i||(i=new Map,t.set(e,i));const n=s.join();let a=i.get(n);if(!a){const t=Wn(e,s);a={resolver:t,subPrefixes:s.filter(t=>!t.toLowerCase().includes("hover"))},i.set(n,a)}return a}const Kl=t=>Fs(t)&&Object.getOwnPropertyNames(t).some(e=>Xs(t[e]));function Yl(t,e){const{isScriptable:s,isIndexable:i}=Nn(t);for(const n of e){const e=s(n),a=i(n),o=(a||e)&&t[n];if(e&&(Xs(o)||Kl(o))||a&&Ss(o))return!0}return!1}var Ql="4.5.1";const Gl=["top","bottom","left","right","chartArea"];function Jl(t,e){return"top"===t||"bottom"===t||-1===Gl.indexOf(t)&&"x"===e}function Zl(t,e){return function(s,i){return s[t]===i[t]?s[e]-i[e]:s[t]-i[t]}}function td(t){const e=t.chart,s=e.options.animation;e.notifyPlugins("afterRender"),$s(s&&s.onComplete,[t],e)}function ed(t){const e=t.chart,s=e.options.animation;$s(s&&s.onProgress,[t],e)}function sd(t){return ma()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const id={},nd=t=>{const e=sd(t);return Object.values(id).filter(t=>t.canvas===e).pop()};function ad(t,e,s){const i=Object.keys(t);for(const n of i){const i=+n;if(i>=e){const a=t[n];delete t[n],(s>0||i>e)&&(t[i+s]=a)}}}function od(t,e,s,i){return s&&"mouseout"!==t.type?i?e:t:null}class rd{static register(...t){Cl.add(...t),ld()}static unregister(...t){Cl.remove(...t),ld()}constructor(t,e){const s=this.config=new ql(e),i=sd(t),n=nd(i);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=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||Gr(i)),this.platform.updateConfig(s);const o=this.platform.acquireContext(i,a.aspectRatio),r=o&&o.canvas,l=r&&r.height,d=r&&r.width;this.id=ws(),this.ctx=o,this.canvas=r,this.width=d,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 Sl,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Vi(t=>this.update(t),a.resizeDelay||0),this._dataChanges=[],id[this.id]=this,o&&r?(so.listen(this,"complete",td),so.listen(this,"progress",ed),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:s,height:i,_aspectRatio:n}=this;return Cs(t)?e&&n?n:i?s/i: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 Cl}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Da(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return fn(this.canvas,this.ctx),this}stop(){return so.stop(this),this}resize(t,e){so.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const s=this.options,i=this.canvas,n=s.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(i,t,e,n),o=s.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Da(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),$s(s.onResize,[this,a],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){const t=this.options,e=t.scales||{};Ls(e,(t,e)=>{t.id=e})}buildOrUpdateScales(){const t=this.options,e=t.scales,s=this.scales,i=Object.keys(s).reduce((t,e)=>(t[e]=!1,t),{});let n=[];e&&(n=n.concat(Object.keys(e).map(t=>{const s=e[t],i=El(t,s),n="r"===i,a="x"===i;return{options:s,dposition:n?"chartArea":a?"bottom":"left",dtype:n?"radialLinear":a?"category":"linear"}}))),Ls(n,e=>{const n=e.options,a=n.id,o=El(a,n),r=Ds(n.type,e.dtype);void 0!==n.position&&Jl(n.position,o)===Jl(e.dposition)||(n.position=e.dposition),i[a]=!0;let l=null;if(a in s&&s[a].type===r)l=s[a];else{const t=Cl.getScale(r);l=new t({id:a,type:r,ctx:this.ctx,chart:this}),s[l.id]=l}l.init(n,t)}),Ls(i,(t,e)=>{t||delete s[e]}),Ls(s,t=>{Pr.configure(this,t,t.options),Pr.addBox(this,t)})}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,s=t.length;if(t.sort((t,e)=>t.index-e.index),s>e){for(let t=e;te.length&&delete this._stacks,t.forEach((t,s)=>{0===e.filter(e=>e===t._dataset).length&&this._destroyDatasetMeta(s)})}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let s,i;for(this._removeUnreferencedMetasets(),s=0,i=e.length;s{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const s=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),i=this._animationsDisabled=!s.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,d=this.data.datasets.length;l{t.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Zl("z","_idx"));const{_active:o,_lastEvent:r}=this;r?this._eventHandler(r,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){Ls(this.scales,t=>{Pr.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),s=new Set(t.events);Ks(e,s)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:s,start:i,count:n}of e){const e="_removeElements"===s?-n:n;ad(t,i,e)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,s=e=>new Set(t.filter(t=>t[0]===e).map((t,e)=>e+","+t.splice(1).join(","))),i=s(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;Pr.update(this,this.width,this.height,t);const e=this.chartArea,s=e.width<=0||e.height<=0;this._layers=[],Ls(this.boxes,t=>{s&&"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,s={meta:t,index:t.index,cancelable:!0},i=to(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",s)&&(i&&xn(e,i),t.controller.draw(),i&&vn(e),s.cancelable=!1,this.notifyPlugins("afterDatasetDraw",s))}isPointInArea(t){return yn(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,s,i){const n=cr.modes[e];return"function"===typeof n?n(this,t,s,i):[]}getDatasetMeta(t){const e=this.data.datasets[t],s=this._metasets;let i=s.filter(t=>t&&t._dataset===e).pop();return i||(i={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},s.push(i)),i}getContext(){return this.$context||(this.$context=Rn(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const s=this.getDatasetMeta(t);return"boolean"===typeof s.hidden?!s.hidden:!e.hidden}setDatasetVisibility(t,e){const s=this.getDatasetMeta(t);s.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,s){const i=s?"show":"hide",n=this.getDatasetMeta(t),a=n.controller._resolveAnimations(void 0,i);qs(e)?(n.data[e].hidden=!s,this.update()):(this.setDatasetVisibility(t,s),a.update(n,{visible:s}),this.update(e=>e.datasetIndex===t?i: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(),so.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,s,i),t[s]=i},i=(t,e,s)=>{t.offsetX=e,t.offsetY=s,this._eventHandler(t)};Ls(this.options.events,t=>s(t,i))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,s=(s,i)=>{e.addEventListener(this,s,i),t[s]=i},i=(s,i)=>{t[s]&&(e.removeEventListener(this,s,i),delete t[s])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let a;const o=()=>{i("attach",o),this.attached=!0,this.resize(),s("resize",n),s("detach",a)};a=()=>{this.attached=!1,i("resize",n),this._stop(),this._resize(0,0),s("attach",o)},e.isAttached(this.canvas)?o():a()}unbindEvents(){Ls(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},Ls(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,s){const i=s?"set":"remove";let n,a,o,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+i+"DatasetHoverStyle"]()),o=0,r=t.length;o{const s=this.getDatasetMeta(t);if(!s)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:s.data[e],index:e}}),i=!Vs(s,e);i&&(this._active=s,this._lastEvent=null,this._updateHoverStyles(s,e))}notifyPlugins(t,e,s){return this._plugins.notify(this,t,e,s)}isPluginEnabled(t){return 1===this._plugins._cache.filter(e=>e.plugin.id===t).length}_updateHoverStyles(t,e,s){const i=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=s?t:n(t,e);a.length&&this.updateHoverStyle(a,i.mode,!1),o.length&&i.mode&&this.updateHoverStyle(o,i.mode,!0)}_eventHandler(t,e){const s={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},i=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",s,i))return;const n=this._handleEvent(t,e,s.inChartArea);return s.cancelable=!1,this.notifyPlugins("afterEvent",s,i),(n||s.changed)&&this.render(),this}_handleEvent(t,e,s){const{_active:i=[],options:n}=this,a=e,o=this._getActiveElements(t,i,s,a),r=Ys(t),l=od(t,this._lastEvent,s,r);s&&(this._lastEvent=null,$s(n.onHover,[t,o,this],this),r&&$s(n.onClick,[t,o,this],this));const d=!Vs(o,i);return(d||e)&&(this._active=o,this._updateHoverStyles(o,i,e)),this._lastEvent=l,d}_getActiveElements(t,e,s,i){if("mouseout"===t.type)return[];if(!s)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,i)}}function ld(){return Ls(rd.instances,t=>t._plugins.invalidate())}function dd(t,e,s){const{startAngle:i,x:n,y:a,outerRadius:o,innerRadius:r,options:l}=e,{borderWidth:d,borderJoinStyle:h}=l,c=Math.min(d/o,xi(i-s));if(t.beginPath(),t.arc(n,a,o-d/2,i+c/2,s-c/2),r>0){const e=Math.min(d/r,xi(i-s));t.arc(n,a,r+d/2,s-e/2,i+e/2,!0)}else{const e=Math.min(d/2,o*xi(i-s));if("round"===h)t.arc(n,a,e,s-Qs/2,i+Qs/2,!0);else if("bevel"===h){const o=2*e*e,r=-o*Math.cos(s+Qs/2)+n,l=-o*Math.sin(s+Qs/2)+a,d=o*Math.cos(i+Qs/2)+n,h=o*Math.sin(i+Qs/2)+a;t.lineTo(r,l),t.lineTo(d,h)}}t.closePath(),t.moveTo(0,0),t.rect(0,0,t.canvas.width,t.canvas.height),t.clip("evenodd")}function hd(t,e,s){const{startAngle:i,pixelMargin:n,x:a,y:o,outerRadius:r,innerRadius:l}=e;let d=n/r;t.beginPath(),t.arc(a,o,r,i-d,s+d),l>n?(d=n/l,t.arc(a,o,l,s+d,i-d,!0)):t.arc(a,o,n,s+ei,i-ei),t.closePath(),t.clip()}function cd(t){return $n(t,["outerStart","outerEnd","innerStart","innerEnd"])}function ud(t,e,s,i){const n=cd(t.options.borderRadius),a=(s-e)/2,o=Math.min(a,i*e/2),r=t=>{const e=(s-Math.min(a,t))*i/2;return _i(t,0,Math.min(a,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:_i(n.innerStart,0,o),innerEnd:_i(n.innerEnd,0,o)}}function pd(t,e,s,i){return{x:s+t*Math.cos(e),y:i+t*Math.sin(e)}}function gd(t,e,s,i,n,a){const{x:o,y:r,startAngle:l,pixelMargin:d,innerRadius:h}=e,c=Math.max(e.outerRadius+i+s-d,0),u=h>0?h+i+s+d:0;let p=0;const g=n-l;if(i){const t=h>0?h-i:0,e=c>0?c-i:0,s=(t+e)/2,n=0!==s?g*s/(s+i):g;p=(g-n)/2}const f=Math.max(.001,g*c-s/Qs)/c,m=(g-f)/2,b=l+m+p,y=n-m-p,{outerStart:x,outerEnd:v,innerStart:_,innerEnd:k}=ud(e,u,c,y-b),w=c-x,C=c-v,S=b+x/w,F=y-v/C,T=u+_,P=u+k,D=b+_/T,M=y-k/P;if(t.beginPath(),a){const e=(S+F)/2;if(t.arc(o,r,c,S,e),t.arc(o,r,c,e,F),v>0){const e=pd(C,F,o,r);t.arc(e.x,e.y,v,F,y+ei)}const s=pd(P,y,o,r);if(t.lineTo(s.x,s.y),k>0){const e=pd(P,M,o,r);t.arc(e.x,e.y,k,y+ei,M+Math.PI)}const i=(y-k/u+(b+_/u))/2;if(t.arc(o,r,u,y-k/u,i,!0),t.arc(o,r,u,i,b+_/u,!0),_>0){const e=pd(T,D,o,r);t.arc(e.x,e.y,_,D+Math.PI,b-ei)}const n=pd(w,b,o,r);if(t.lineTo(n.x,n.y),x>0){const e=pd(w,S,o,r);t.arc(e.x,e.y,x,b-ei,S)}}else{t.moveTo(o,r);const e=Math.cos(S)*c+o,s=Math.sin(S)*c+r;t.lineTo(e,s);const i=Math.cos(F)*c+o,n=Math.sin(F)*c+r;t.lineTo(i,n)}t.closePath()}function fd(t,e,s,i,n){const{fullCircles:a,startAngle:o,circumference:r}=e;let l=e.endAngle;if(a){gd(t,e,s,i,l,n);for(let e=0;e=Qs&&0===p&&"miter"!==h&&dd(t,e,f),a||(gd(t,e,s,i,f,n),t.stroke())}(0,Me.A)(rd,"defaults",hn),(0,Me.A)(rd,"instances",id),(0,Me.A)(rd,"overrides",an),(0,Me.A)(rd,"registry",Cl),(0,Me.A)(rd,"version",Ql),(0,Me.A)(rd,"getChart",nd);class bd extends Jr{constructor(t){super(),(0,Me.A)(this,"circumference",void 0),(0,Me.A)(this,"endAngle",void 0),(0,Me.A)(this,"fullCircles",void 0),(0,Me.A)(this,"innerRadius",void 0),(0,Me.A)(this,"outerRadius",void 0),(0,Me.A)(this,"pixelMargin",void 0),(0,Me.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,s){const i=this.getProps(["x","y"],s),{angle:n,distance:a}=mi(i,{x:t,y:e}),{startAngle:o,endAngle:r,innerRadius:l,outerRadius:d,circumference:h}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],s),c=(this.options.spacing+this.options.borderWidth)/2,u=Ds(h,r-o),p=vi(n,o,r)&&o!==r,g=u>=Gs||p,f=wi(a,l+c,d+c);return g&&f}getCenterPoint(t){const{x:e,y:s,startAngle:i,endAngle:n,innerRadius:a,outerRadius:o}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:r,spacing:l}=this.options,d=(i+n)/2,h=(a+o+l+r)/2;return{x:e+Math.cos(d)*h,y:s+Math.sin(d)*h}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:s}=this,i=(e.offset||0)/4,n=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=s>Gs?Math.floor(s/Gs):0,0===s||this.innerRadius<0||this.outerRadius<0)return;t.save();const o=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(o)*i,Math.sin(o)*i);const r=1-Math.sin(Math.min(Qs,s||0)),l=i*r;t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,fd(t,this,l,n,a),md(t,this,l,n,a),t.restore()}}function yd(t,e,s=e){t.lineCap=Ds(s.borderCapStyle,e.borderCapStyle),t.setLineDash(Ds(s.borderDash,e.borderDash)),t.lineDashOffset=Ds(s.borderDashOffset,e.borderDashOffset),t.lineJoin=Ds(s.borderJoinStyle,e.borderJoinStyle),t.lineWidth=Ds(s.borderWidth,e.borderWidth),t.strokeStyle=Ds(s.borderColor,e.borderColor)}function xd(t,e,s){t.lineTo(s.x,s.y)}function vd(t){return t.stepped?_n:t.tension||"monotone"===t.cubicInterpolationMode?kn:xd}function _d(t,e,s={}){const i=t.length,{start:n=0,end:a=i-1}=s,{start:o,end:r}=e,l=Math.max(n,o),d=Math.min(a,r),h=nr&&a>r;return{count:i,start:l,loop:e.loop,ilen:d(o+(d?r-t:t))%a,x=()=>{p!==g&&(t.lineTo(m,g),t.lineTo(m,p),t.lineTo(m,f))};for(l&&(c=n[y(0)],t.moveTo(c.x,c.y)),h=0;h<=r;++h){if(c=n[y(h)],c.skip)continue;const e=c.x,s=c.y,i=0|e;i===u?(sg&&(g=s),m=(b*m+e)/++b):(x(),t.lineTo(e,s),u=i,b=0,p=g=s),f=s}x()}function Cd(t){const e=t.options,s=e.borderDash&&e.borderDash.length,i=!t._decimated&&!t._loop&&!e.tension&&"monotone"!==e.cubicInterpolationMode&&!e.stepped&&!s;return i?wd:kd}function Sd(t){return t.stepped?La:t.tension||"monotone"===t.cubicInterpolationMode?Va:$a}function Fd(t,e,s,i){let n=e._path;n||(n=e._path=new Path2D,e.path(n,s,i)&&n.closePath()),yd(t,e.options),t.stroke(n)}function Td(t,e,s,i){const{segments:n,options:a}=e,o=Cd(e);for(const r of n)yd(t,a,r.style),t.beginPath(),o(t,e,r,{start:s,end:s+i-1})&&t.closePath(),t.stroke()}(0,Me.A)(bd,"id","arc"),(0,Me.A)(bd,"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,Me.A)(bd,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,Me.A)(bd,"descriptors",{_scriptable:!0,_indexable:t=>"borderDash"!==t});const Pd="function"===typeof Path2D;function Dd(t,e,s,i){Pd&&!e.options.segment?Fd(t,e,s,i):Td(t,e,s,i)}class Md extends Jr{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 s=this.options;if((s.tension||"monotone"===s.cubicInterpolationMode)&&!s.stepped&&!this._pointsUpdated){const i=s.spanGaps?this._loop:this._fullLoop;fa(this._points,s,t,i,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=Xa(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,s=t.length;return s&&e[t[s-1].end]}interpolate(t,e){const s=this.options,i=t[e],n=this.points,a=ja(this,{property:e,start:i,end:i});if(!a.length)return;const o=[],r=Sd(s);let l,d;for(l=0,d=a.length;l"borderDash"!==t&&"fill"!==t});class $d extends Jr{constructor(t){super(),(0,Me.A)(this,"parsed",void 0),(0,Me.A)(this,"skip",void 0),(0,Me.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,s){const i=this.options,{x:n,y:a}=this.getProps(["x","y"],s);return Math.pow(t-n,2)+Math.pow(e-a,2){e=qd(t,e,n);const o=n[t],r=n[e];null!==i?(a.push({x:o.x,y:i}),a.push({x:r.x,y:i})):null!==s&&(a.push({x:s,y:o.y}),a.push({x:s,y:r.y}))}),a}function qd(t,e,s){for(;e>t;e--){const t=s[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function Xd(t,e,s,i){return t&&e?i(t[s],e[s]):t?t[s]:e?e[s]:0}function Kd(t,e){let s=[],i=!1;return Ss(t)?(i=!0,s=t):s=Hd(t,e),s.length?new Md({points:s,options:{tension:0},_loop:i,_fullLoop:i}):null}function Yd(t){return t&&!1!==t.fill}function Qd(t,e,s){const i=t[e];let n=i.fill;const a=[e];let o;if(!s)return n;while(!1!==n&&-1===a.indexOf(n)){if(!Ts(n))return n;if(o=t[n],!o)return!1;if(o.visible)return n;a.push(n),n=o.fill}return!1}function Gd(t,e,s){const i=eh(t);if(Fs(i))return!isNaN(i.value)&&i;let n=parseFloat(i);return Ts(n)&&Math.floor(n)===n?Jd(i[0],e,n,s):["origin","start","end","stack","shape"].indexOf(i)>=0&&i}function Jd(t,e,s,i){return"-"!==t&&"+"!==t||(s=e+s),!(s===e||s<0||s>=i)&&s}function Zd(t,e){let s=null;return"start"===t?s=e.bottom:"end"===t?s=e.top:Fs(t)?s=e.getPixelForValue(t.value):e.getBasePixel&&(s=e.getBasePixel()),s}function th(t,e,s){let i;return i="start"===t?s:"end"===t?e.options.reverse?e.min:e.max:Fs(t)?t.value:e.getBaseValue(),i}function eh(t){const e=t.options,s=e.fill;let i=Ds(s&&s.target,s);return void 0===i&&(i=!!e.backgroundColor),!1!==i&&null!==i&&(!0===i?"origin":i)}function sh(t){const{scale:e,index:s,line:i}=t,n=[],a=i.segments,o=i.points,r=ih(e,s);r.push(Kd({x:null,y:e.bottom},i));for(let l=0;l=0;--o){const e=n[o].$filler;e&&(e.line.updateControlPoints(a,e.axis),i&&e.fill&&uh(t.ctx,e,a))}},beforeDatasetsDraw(t,e,s){if("beforeDatasetsDraw"!==s.drawTime)return;const i=t.getSortedVisibleDatasetMetas();for(let n=i.length-1;n>=0;--n){const e=i[n].$filler;Yd(e)&&uh(t.ctx,e,t.chartArea)}},beforeDatasetDraw(t,e,s){const i=e.meta.$filler;Yd(i)&&"beforeDatasetDraw"===s.drawTime&&uh(t.ctx,i,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const vh=(t,e)=>{let{boxHeight:s=e,boxWidth:i=e}=t;return t.usePointStyle&&(s=Math.min(s,e),i=t.pointStyleWidth||Math.min(i,e)),{boxWidth:i,boxHeight:s,itemHeight:Math.max(e,s)}},_h=(t,e)=>null!==t&&null!==e&&t.datasetIndex===e.datasetIndex&&t.index===e.index;class kh extends Jr{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,s){this.maxWidth=t,this.maxHeight=e,this._margins=s,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=$s(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(e=>t.filter(e,this.chart.data))),t.sort&&(e=e.sort((e,s)=>t.sort(e,s,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 s=t.labels,i=Un(s.font),n=i.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:r}=vh(s,n);let l,d;e.font=i.string,this.isHorizontal()?(l=this.maxWidth,d=this._fitRows(a,n,o,r)+10):(d=this.maxHeight,l=this._fitCols(a,i,o,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(d,t.maxHeight||this.maxHeight)}_fitRows(t,e,s,i){const{ctx:n,maxWidth:a,options:{labels:{padding:o}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],d=i+o;let h=t;n.textAlign="left",n.textBaseline="middle";let c=-1,u=-d;return this.legendItems.forEach((t,p)=>{const g=s+e/2+n.measureText(t.text).width;(0===p||l[l.length-1]+g+2*o>a)&&(h+=d,l[l.length-(p>0?0:1)]=0,u+=d,c++),r[p]={left:0,top:u,row:c,width:g,height:i},l[l.length-1]+=g+o}),h}_fitCols(t,e,s,i){const{ctx:n,maxHeight:a,options:{labels:{padding:o}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],d=a-t;let h=o,c=0,u=0,p=0,g=0;return this.legendItems.forEach((t,a)=>{const{itemWidth:f,itemHeight:m}=wh(s,e,n,t,i);a>0&&u+m+2*o>d&&(h+=c+o,l.push({width:c,height:u}),p+=c+o,g++,c=u=0),r[a]={left:p,top:u,col:g,width:f,height:m},c=Math.max(c,f),u+=m+o}),h+=c,l.push({width:c,height:u}),h}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:s,labels:{padding:i},rtl:n}}=this,a=Ia(n,this.left,this.width);if(this.isHorizontal()){let n=0,o=Ui(s,this.left+i,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,o=Ui(s,this.left+i,this.right-this.lineWidths[n])),r.top+=this.top+t+i,r.left=a.leftForLtr(a.x(o),r.width),o+=r.width+i}else{let n=0,o=Ui(s,this.top+t+i,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,o=Ui(s,this.top+t+i,this.bottom-this.columnSizes[n].height)),r.top=o,r.left+=this.left+i,r.left=a.leftForLtr(a.x(r.left),r.width),o+=r.height+i}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;xn(t,this),this._draw(),vn(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:s,ctx:i}=this,{align:n,labels:a}=t,o=hn.color,r=Ia(t.rtl,this.left,this.width),l=Un(a.font),{padding:d}=a,h=l.size,c=h/2;let u;this.drawTitle(),i.textAlign=r.textAlign("left"),i.textBaseline="middle",i.lineWidth=.5,i.font=l.string;const{boxWidth:p,boxHeight:g,itemHeight:f}=vh(a,h),m=function(t,e,s){if(isNaN(p)||p<=0||isNaN(g)||g<0)return;i.save();const n=Ds(s.lineWidth,1);if(i.fillStyle=Ds(s.fillStyle,o),i.lineCap=Ds(s.lineCap,"butt"),i.lineDashOffset=Ds(s.lineDashOffset,0),i.lineJoin=Ds(s.lineJoin,"miter"),i.lineWidth=n,i.strokeStyle=Ds(s.strokeStyle,o),i.setLineDash(Ds(s.lineDash,[])),a.usePointStyle){const o={radius:g*Math.SQRT2/2,pointStyle:s.pointStyle,rotation:s.rotation,borderWidth:n},l=r.xPlus(t,p/2),d=e+c;bn(i,o,l,d,a.pointStyleWidth&&p)}else{const a=e+Math.max((h-g)/2,0),o=r.leftForLtr(t,p),l=Vn(s.borderRadius);i.beginPath(),Object.values(l).some(t=>0!==t)?Tn(i,{x:o,y:a,w:p,h:g,radius:l}):i.rect(o,a,p,g),i.fill(),0!==n&&i.stroke()}i.restore()},b=function(t,e,s){Fn(i,s.text,t,e+f/2,l,{strikethrough:s.hidden,textAlign:r.textAlign(s.textAlign)})},y=this.isHorizontal(),x=this._computeTitleHeight();u=y?{x:Ui(n,this.left+d,this.right-s[0]),y:this.top+d+x,line:0}:{x:this.left+d,y:Ui(n,this.top+x+d,this.bottom-e[0].height),line:0},Oa(this.ctx,t.textDirection);const v=f+d;this.legendItems.forEach((o,h)=>{i.strokeStyle=o.fontColor,i.fillStyle=o.fontColor;const g=i.measureText(o.text).width,f=r.textAlign(o.textAlign||(o.textAlign=a.textAlign)),_=p+c+g;let k=u.x,w=u.y;r.setWidth(this.width),y?h>0&&k+_+d>this.right&&(w=u.y+=v,u.line++,k=u.x=Ui(n,this.left+d,this.right-s[u.line])):h>0&&w+v>this.bottom&&(k=u.x=k+e[u.line].width+d,u.line++,w=u.y=Ui(n,this.top+x+d,this.bottom-e[u.line].height));const C=r.x(k);if(m(C,w,o),k=Ii(f,k+p+c,y?k+_:this.right,t.rtl),b(r.x(k),w,o),y)u.x+=_+d;else if("string"!==typeof o.text){const t=l.lineHeight;u.y+=Fh(o,t)+d}else u.y+=v}),Ra(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,s=Un(e.font),i=En(e.padding);if(!e.display)return;const n=Ia(t.rtl,this.left,this.width),a=this.ctx,o=e.position,r=s.size/2,l=i.top+r;let d,h=this.left,c=this.width;if(this.isHorizontal())c=Math.max(...this.lineWidths),d=this.top+l,h=Ui(t.align,h,this.right-c);else{const e=this.columnSizes.reduce((t,e)=>Math.max(t,e.height),0);d=l+Ui(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=Ui(o,h,h+c);a.textAlign=n.textAlign(Ei(o)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=s.string,Fn(a,e.text,u,d,s)}_computeTitleHeight(){const t=this.options.title,e=Un(t.font),s=En(t.padding);return t.display?e.lineHeight+s.height:0}_getLegendItemAt(t,e){let s,i,n;if(wi(t,this.left,this.right)&&wi(e,this.top,this.bottom))for(n=this.legendHitBoxes,s=0;st.length>e.length?t:e)),e+s.size/2+i.measureText(n).width}function Sh(t,e,s){let i=t;return"string"!==typeof e.text&&(i=Fh(e,s)),i}function Fh(t,e){const s=t.text?t.text.length:0;return e*s}function Th(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}var Ph={id:"legend",_element:kh,start(t,e,s){const i=t.legend=new kh({ctx:t.ctx,options:s,chart:t});Pr.configure(t,i,s),Pr.addBox(t,i)},stop(t){Pr.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,s){const i=t.legend;Pr.configure(t,i,s),i.options=s},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,s){const i=e.datasetIndex,n=s.chart;n.isDatasetVisible(i)?(n.hide(i),e.hidden=!0):(n.show(i),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:s,pointStyle:i,textAlign:n,color:a,useBorderRadius:o,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map(t=>{const l=t.controller.getStyle(s?0:void 0),d=En(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:(d.width+d.height)/4,strokeStyle:l.borderColor,pointStyle:i||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 Dh={average(t){if(!t.length)return!1;let e,s,i=new Set,n=0,a=0;for(e=0,s=t.length;et+e)/i.size;return{x:o,y:n/a}},nearest(t,e){if(!t.length)return!1;let s,i,n,a=e.x,o=e.y,r=Number.POSITIVE_INFINITY;for(s=0,i=t.length;s-1?t.split("\n"):t}function $h(t,e){const{element:s,datasetIndex:i,index:n}=e,a=t.getDatasetMeta(i).controller,{label:o,value:r}=a.getLabelAndValue(n);return{chart:t,label:o,parsed:a.getParsed(n),raw:t.data.datasets[i].data[n],formattedValue:r,dataset:a.getDataset(),dataIndex:n,datasetIndex:i,element:s}}function Lh(t,e){const s=t.chart.ctx,{body:i,footer:n,title:a}=t,{boxWidth:o,boxHeight:r}=e,l=Un(e.bodyFont),d=Un(e.titleFont),h=Un(e.footerFont),c=a.length,u=n.length,p=i.length,g=En(e.padding);let f=g.height,m=0,b=i.reduce((t,e)=>t+e.before.length+e.lines.length+e.after.length,0);if(b+=t.beforeBody.length+t.afterBody.length,c&&(f+=c*d.lineHeight+(c-1)*e.titleSpacing+e.titleMarginBottom),b){const t=e.displayColors?Math.max(r,l.lineHeight):l.lineHeight;f+=p*t+(b-p)*l.lineHeight+(b-1)*e.bodySpacing}u&&(f+=e.footerMarginTop+u*h.lineHeight+(u-1)*e.footerSpacing);let y=0;const x=function(t){m=Math.max(m,s.measureText(t).width+y)};return s.save(),s.font=d.string,Ls(t.title,x),s.font=l.string,Ls(t.beforeBody.concat(t.afterBody),x),y=e.displayColors?o+2+e.boxPadding:0,Ls(i,t=>{Ls(t.before,x),Ls(t.lines,x),Ls(t.after,x)}),y=0,s.font=h.string,Ls(t.footer,x),s.restore(),m+=g.width,{width:m,height:f}}function Vh(t,e){const{y:s,height:i}=e;return st.height-i/2?"bottom":"center"}function Eh(t,e,s,i){const{x:n,width:a}=i,o=s.caretSize+s.caretPadding;return"left"===t&&n+a+o>e.width||("right"===t&&n-a-o<0||void 0)}function Uh(t,e,s,i){const{x:n,width:a}=s,{width:o,chartArea:{left:r,right:l}}=t;let d="center";return"center"===i?d=n<=(r+l)/2?"left":"right":n<=a/2?d="left":n>=o-a/2&&(d="right"),Eh(d,t,e,s)&&(d="center"),d}function Ih(t,e,s){const i=s.yAlign||e.yAlign||Vh(t,s);return{xAlign:s.xAlign||e.xAlign||Uh(t,e,s,i),yAlign:i}}function Oh(t,e){let{x:s,width:i}=t;return"right"===e?s-=i:"center"===e&&(s-=i/2),s}function Rh(t,e,s){let{y:i,height:n}=t;return"top"===e?i+=s:i-="bottom"===e?n+s:n/2,i}function Wh(t,e,s,i){const{caretSize:n,caretPadding:a,cornerRadius:o}=t,{xAlign:r,yAlign:l}=s,d=n+a,{topLeft:h,topRight:c,bottomLeft:u,bottomRight:p}=Vn(o);let g=Oh(e,r);const f=Rh(e,l,d);return"center"===l?"left"===r?g+=d:"right"===r&&(g-=d):"left"===r?g-=Math.max(h,u)+n:"right"===r&&(g+=Math.max(c,p)+n),{x:_i(g,0,i.width-e.width),y:_i(f,0,i.height-e.height)}}function Bh(t,e,s){const i=En(s.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-i.right:t.x+i.left}function Nh(t){return Mh([],Ah(t))}function zh(t,e,s){return Rn(t,{tooltip:e,tooltipItems:s,type:"tooltip"})}function jh(t,e){const s=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return s?t.override(s):t}const Hh={beforeTitle:ks,title(t){if(t.length>0){const e=t[0],s=e.chart.data.labels,i=s?s.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(i>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=jh(s,t);Mh(e.before,Ah(qh(n,"beforeLabel",this,t))),Mh(e.lines,qh(n,"label",this,t)),Mh(e.after,Ah(qh(n,"afterLabel",this,t))),i.push(e)}),i}getAfterBody(t,e){return Nh(qh(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:s}=e,i=qh(s,"beforeFooter",this,t),n=qh(s,"footer",this,t),a=qh(s,"afterFooter",this,t);let o=[];return o=Mh(o,Ah(i)),o=Mh(o,Ah(n)),o=Mh(o,Ah(a)),o}_createItems(t){const e=this._active,s=this.chart.data,i=[],n=[],a=[];let o,r,l=[];for(o=0,r=e.length;ot.filter(e,i,n,s))),t.itemSort&&(l=l.sort((e,i)=>t.itemSort(e,i,s))),Ls(l,e=>{const s=jh(t.callbacks,e);i.push(qh(s,"labelColor",this,e)),n.push(qh(s,"labelPointStyle",this,e)),a.push(qh(s,"labelTextColor",this,e))}),this.labelColors=i,this.labelPointStyles=n,this.labelTextColors=a,this.dataPoints=l,l}update(t,e){const s=this.options.setContext(this.getContext()),i=this._active;let n,a=[];if(i.length){const t=Dh[s.position].call(this,i,this._eventPosition);a=this._createItems(s),this.title=this.getTitle(a,s),this.beforeBody=this.getBeforeBody(a,s),this.body=this.getBody(a,s),this.afterBody=this.getAfterBody(a,s),this.footer=this.getFooter(a,s);const e=this._size=Lh(this,s),o=Object.assign({},t,e),r=Ih(this.chart,s,o),l=Wh(s,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&&s.external&&s.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,s,i){const n=this.getCaretPosition(t,s,i);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,s){const{xAlign:i,yAlign:n}=this,{caretSize:a,cornerRadius:o}=s,{topLeft:r,topRight:l,bottomLeft:d,bottomRight:h}=Vn(o),{x:c,y:u}=t,{width:p,height:g}=e;let f,m,b,y,x,v;return"center"===n?(x=u+g/2,"left"===i?(f=c,m=f-a,y=x+a,v=x-a):(f=c+p,m=f+a,y=x-a,v=x+a),b=f):(m="left"===i?c+Math.max(r,d)+a:"right"===i?c+p-Math.max(l,h)-a:this.caretX,"top"===n?(y=u,x=y-a,f=m-a,b=m+a):(y=u+g,x=y+a,f=m+a,b=m-a),v=y),{x1:f,x2:m,x3:b,y1:y,y2:x,y3:v}}drawTitle(t,e,s){const i=this.title,n=i.length;let a,o,r;if(n){const l=Ia(s.rtl,this.x,this.width);for(t.x=Bh(this,s.titleAlign,s),e.textAlign=l.textAlign(s.titleAlign),e.textBaseline="middle",a=Un(s.titleFont),o=s.titleSpacing,e.fillStyle=s.titleColor,e.font=a.string,r=0;r0!==t)?(t.beginPath(),t.fillStyle=n.multiKeyBackground,Tn(t,{x:e,y:p,w:l,h:r,radius:o}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),Tn(t,{x:s,y:p+1,w:l-2,h:r-2,radius:o}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,p,l,r),t.strokeRect(e,p,l,r),t.fillStyle=a.backgroundColor,t.fillRect(s,p+1,l-2,r-2))}t.fillStyle=this.labelTextColors[s]}drawBody(t,e,s){const{body:i}=this,{bodySpacing:n,bodyAlign:a,displayColors:o,boxHeight:r,boxWidth:l,boxPadding:d}=s,h=Un(s.bodyFont);let c=h.lineHeight,u=0;const p=Ia(s.rtl,this.x,this.width),g=function(s){e.fillText(s,p.x(t.x+u),t.y+c/2),t.y+=c+n},f=p.textAlign(a);let m,b,y,x,v,_,k;for(e.textAlign=a,e.textBaseline="middle",e.font=h.string,t.x=Bh(this,f,s),e.fillStyle=s.bodyColor,Ls(this.beforeBody,g),u=o&&"right"!==f?"center"===a?l/2+d:l+2+d:0,x=0,_=i.length;x<_;++x){for(m=i[x],b=this.labelTextColors[x],e.fillStyle=b,Ls(m.before,g),y=m.lines,o&&y.length&&(this._drawColorBox(e,t,x,p,s),c=Math.max(h.lineHeight,r)),v=0,k=y.length;v0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,s=this.$animations,i=s&&s.x,n=s&&s.y;if(i||n){const s=Dh[t.position].call(this,this._active,this._eventPosition);if(!s)return;const a=this._size=Lh(this,t),o=Object.assign({},s,this._size),r=Ih(e,t,o),l=Wh(t,o,r,e);i._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=s.x,this.caretY=s.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let s=this.opacity;if(!s)return;this._updateAnimationTarget(e);const i={width:this.width,height:this.height},n={x:this.x,y:this.y};s=Math.abs(s)<.001?0:s;const a=En(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=s,this.drawBackground(n,t,i,e),Oa(t,e.textDirection),n.y+=a.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Ra(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const s=this._active,i=t.map(({datasetIndex:t,index:e})=>{const s=this.chart.getDatasetMeta(t);if(!s)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:s.data[e],index:e}}),n=!Vs(s,i),a=this._positionChanged(i,e);(n||a)&&(this._active=i,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,s=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const i=this.options,n=this._active||[],a=this._getActiveElements(t,n,e,s),o=this._positionChanged(a,t),r=e||!Vs(a,n)||o;return r&&(this._active=a,(i.enabled||i.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,s,i){const n=this.options;if("mouseout"===t.type)return[];if(!i)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,s);return n.reverse&&a.reverse(),a}_positionChanged(t,e){const{caretX:s,caretY:i,options:n}=this,a=Dh[n.position].call(this,t,e);return!1!==a&&(s!==a.x||i!==a.y)}}(0,Me.A)(Xh,"positioners",Dh);var Kh={id:"tooltip",_element:Xh,positioners:Dh,afterInit(t,e,s){s&&(t.tooltip=new Xh({chart:t,options:s}))},beforeUpdate(t,e,s){t.tooltip&&t.tooltip.initialize(s)},reset(t,e,s){t.tooltip&&t.tooltip.initialize(s)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const s={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...s,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",s)}},afterEvent(t,e){if(t.tooltip){const s=e.replay;t.tooltip.handleEvent(e.event,s,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:Hh},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 Yh=(t,e,s,i)=>("string"===typeof e?(s=t.push(e)-1,i.unshift({index:s,label:e})):isNaN(e)&&(s=null),s);function Qh(t,e,s,i){const n=t.indexOf(e);if(-1===n)return Yh(t,e,s,i);const a=t.lastIndexOf(e);return n!==a?s:n}const Gh=(t,e)=>null===t?null:_i(Math.round(t),0,e);function Jh(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 tc(t,e){const s=[],i=1e-14,{bounds:n,step:a,min:o,max:r,precision:l,count:d,maxTicks:h,maxDigits:c,includeBounds:u}=t,p=a||1,g=h-1,{min:f,max:m}=e,b=!Cs(o),y=!Cs(r),x=!Cs(d),v=(m-f)/(c+1);let _,k,w,C,S=ri((m-f)/g/p)*p;if(Sg&&(S=ri(C*S/g/p)*p),Cs(l)||(_=Math.pow(10,l),S=Math.ceil(S*_)/_),"ticks"===n?(k=Math.floor(f/S)*S,w=Math.ceil(m/S)*S):(k=f,w=m),b&&y&&a&&ci((r-o)/a,S/1e3)?(C=Math.round(Math.min((r-o)/S,h)),S=(r-o)/C,k=o,w=r):x?(k=b?o:k,w=y?r:w,C=d-1,S=(w-k)/C):(C=(w-k)/S,C=oi(C,Math.round(C),S/1e3)?Math.round(C):Math.ceil(C));const F=Math.max(fi(S),fi(k));_=Math.pow(10,Cs(l)?F:l),k=Math.round(k*_)/_,w=Math.round(w*_)/_;let T=0;for(b&&(u&&k!==o?(s.push({value:o}),kr)break;s.push({value:t})}return y&&u&&w!==r?s.length&&oi(s[s.length-1].value,r,ec(r,v,t))?s[s.length-1].value=r:s.push({value:r}):y&&w!==r||s.push({value:w}),s}function ec(t,e,{horizontal:s,minRotation:i}){const n=pi(i),a=(s?Math.sin(n):Math.cos(n))||.001,o=.75*e*(""+t).length;return Math.min(e/a,o)}(0,Me.A)(Zh,"id","category"),(0,Me.A)(Zh,"defaults",{ticks:{callback:Jh}});class sc extends yl{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 Cs(t)||("number"===typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:s}=this.getUserBounds();let{min:i,max:n}=this;const a=t=>i=e?i:t,o=t=>n=s?n:t;if(t){const t=ai(i),e=ai(n);t<0&&e<0?o(0):t>0&&e>0&&a(0)}if(i===n){let e=0===n?1:Math.abs(.05*n);o(n+e),t||a(i-e)}this.min=i,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:s,stepSize:i}=t;return i?(e=Math.ceil(this.max/i)-Math.floor(this.min/i)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${i} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),s=s||11),s&&(e=Math.min(s,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let s=this.getTickLimit();s=Math.max(2,s);const i={maxTicks:s,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=tc(i,n);return"ticks"===t.bounds&&ui(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,s=this.max;if(super.configure(),this.options.offset&&t.length){const i=(s-e)/Math.max(t.length-1,1)/2;e-=i,s+=i}this._startValue=e,this._endValue=s,this._valueRange=s-e}getLabelForValue(t){return Zi(t,this.chart.options.locale,this.options.ticks.format)}}class ic extends sc{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ts(t)?t:0,this.max=Ts(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,s=pi(this.options.ticks.minRotation),i=(t?Math.sin(s):Math.cos(s))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/i))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}(0,Me.A)(ic,"id","linear"),(0,Me.A)(ic,"defaults",{ticks:{callback:sn.formatters.numeric}});const nc=t=>Math.floor(ni(t)),ac=(t,e)=>Math.pow(10,nc(t)+e);function oc(t){const e=t/Math.pow(10,nc(t));return 1===e}function rc(t,e,s){const i=Math.pow(10,s),n=Math.floor(t/i),a=Math.ceil(e/i);return a-n}function lc(t,e){const s=e-t;let i=nc(s);while(rc(t,e,i)>10)i++;while(rc(t,e,i)<10)i--;return Math.min(i,nc(t))}function dc(t,{min:e,max:s}){e=Ps(t.min,e);const i=[],n=nc(e);let a=lc(e,s),o=a<0?Math.pow(10,Math.abs(a)):1;const r=Math.pow(10,a),l=n>a?Math.pow(10,n):0,d=Math.round((e-l)*o)/o,h=Math.floor((e-l)/r/10)*r*10;let c=Math.floor((d-h)/Math.pow(10,a)),u=Ps(t.min,Math.round((l+h+c*Math.pow(10,a))*o)/o);while(u=10?c=c<15?15:20:c++,c>=20&&(a++,c=2,o=a>=0?1:o),u=Math.round((l+h+c*Math.pow(10,a))*o)/o;const p=Ps(t.max,u);return i.push({value:p,major:oc(p),significand:c}),i}class hc extends yl{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const s=sc.prototype.parse.apply(this,[t,e]);if(0!==s)return Ts(s)&&s>0?s:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ts(t)?Math.max(0,t):null,this.max=Ts(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Ts(this._userMin)&&(this.min=t===ac(this.min,0)?ac(this.min,-1):ac(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let s=this.min,i=this.max;const n=e=>s=t?s:e,a=t=>i=e?i:t;s===i&&(s<=0?(n(1),a(10)):(n(ac(s,-1)),a(ac(i,1)))),s<=0&&n(ac(i,-1)),i<=0&&a(ac(s,1)),this.min=s,this.max=i}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},s=dc(e,this);return"ticks"===t.bounds&&ui(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}getLabelForValue(t){return void 0===t?"0":Zi(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=ni(t),this._valueRange=ni(this.max)-ni(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(ni(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function cc(t){const e=t.ticks;if(e.display&&t.display){const t=En(e.backdropPadding);return Ds(e.font&&e.font.size,hn.font.size)+t.height}return 0}function uc(t,e,s){return s=Ss(s)?s:[s],{w:pn(t,e.string,s),h:s.length*e.lineHeight}}function pc(t,e,s,i,n){return t===i||t===n?{start:e-s/2,end:e+s/2}:tn?{start:e-s,end:e}:{start:e,end:e+s}}function gc(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},s=Object.assign({},e),i=[],n=[],a=t._pointLabels.length,o=t.options.pointLabels,r=o.centerPointLabels?Qs/a:0;for(let l=0;le.r&&(r=(i.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 mc(t,e,s){const i=t.drawingArea,{extra:n,additionalAngle:a,padding:o,size:r}=s,l=t.getPointPosition(e,i+n+o,a),d=Math.round(gi(xi(l.angle+ei))),h=_c(l.y,r.h,d),c=xc(d),u=vc(l.x,r.w,c);return{visible:!0,x:l.x,y:h,textAlign:c,left:u,top:h,right:u+r.w,bottom:h+r.h}}function bc(t,e){if(!e)return!0;const{left:s,top:i,right:n,bottom:a}=t,o=yn({x:s,y:i},e)||yn({x:s,y:a},e)||yn({x:n,y:i},e)||yn({x:n,y:a},e);return!o}function yc(t,e,s){const i=[],n=t._pointLabels.length,a=t.options,{centerPointLabels:o,display:r}=a.pointLabels,l={extra:cc(a)/2,additionalAngle:o?Qs/n:0};let d;for(let h=0;h270||s<90)&&(t-=e),t}function kc(t,e,s){const{left:i,top:n,right:a,bottom:o}=s,{backdropColor:r}=e;if(!Cs(r)){const s=Vn(e.borderRadius),l=En(e.backdropPadding);t.fillStyle=r;const d=i-l.left,h=n-l.top,c=a-i+l.width,u=o-n+l.height;Object.values(s).some(t=>0!==t)?(t.beginPath(),Tn(t,{x:d,y:h,w:c,h:u,radius:s}),t.fill()):t.fillRect(d,h,c,u)}}function wc(t,e){const{ctx:s,options:{pointLabels:i}}=t;for(let n=e-1;n>=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const a=i.setContext(t.getPointLabelContext(n));kc(s,a,e);const o=Un(a.font),{x:r,y:l,textAlign:d}=e;Fn(s,t._pointLabels[n],r,l+o.lineHeight/2,o,{color:a.color,textAlign:d,textBaseline:"middle"})}}function Cc(t,e,s,i){const{ctx:n}=t;if(s)n.arc(t.xCenter,t.yCenter,e,0,Gs);else{let s=t.getPointPosition(0,e);n.moveTo(s.x,s.y);for(let a=1;a{const s=$s(this.options.pointLabels.callback,[t,e],this);return s||0===s?s:""}).filter((t,e)=>this.chart.getDataVisibility(e))}fit(){const t=this.options;t.display&&t.pointLabels.display?gc(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,s,i){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((s-i)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,s,i))}getIndexAngle(t){const e=Gs/(this._pointLabels.length||1),s=this.options.startAngle||0;return xi(t*e+pi(s))}getDistanceFromCenterForValue(t){if(Cs(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(Cs(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 s=this.getContext(e),o=i.setContext(s),l=n.setContext(s);Sc(this,o,r,a,l)}}),s.display){for(t.save(),o=a-1;o>=0;o--){const i=s.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:a}=i;a&&n&&(t.lineWidth=a,t.strokeStyle=n,t.setLineDash(i.borderDash),t.lineDashOffset=i.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,s=e.ticks;if(!s.display)return;const i=this.getIndexAngle(0);let n,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(i),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((i,o)=>{if(0===o&&this.min>=0&&!e.reverse)return;const r=s.setContext(this.getContext(o)),l=Un(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[o].value),r.showLabelBackdrop){t.font=l.string,a=t.measureText(i.label).width,t.fillStyle=r.backdropColor;const e=En(r.backdropPadding);t.fillRect(-a/2-e.left,-n-l.size/2-e.top,a+e.width,l.size+e.height)}Fn(t,i.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})}),t.restore()}drawTitle(){}}(0,Me.A)(Tc,"id","radialLinear"),(0,Me.A)(Tc,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:sn.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),(0,Me.A)(Tc,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,Me.A)(Tc,"descriptors",{angleLines:{_fallback:"grid"}});const Pc={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}},Dc=Object.keys(Pc);function Mc(t,e){return t-e}function Ac(t,e){if(Cs(e))return null;const s=t._adapter,{parser:i,round:n,isoWeekday:a}=t._parseOpts;let o=e;return"function"===typeof i&&(o=i(o)),Ts(o)||(o="string"===typeof i?s.parse(o,i):s.parse(o)),null===o?null:(n&&(o="week"!==n||!hi(a)&&!0!==a?s.startOf(o,n):s.startOf(o,"isoWeek",a)),+o)}function $c(t,e,s,i){const n=Dc.length;for(let a=Dc.indexOf(t);a=Dc.indexOf(s);a--){const s=Dc[a];if(Pc[s].common&&t._adapter.diff(n,i,s)>=e-1)return s}return Dc[s?Dc.indexOf(s):0]}function Vc(t){for(let e=Dc.indexOf(t)+1,s=Dc.length;e=e?s[i]:s[n];t[a]=!0}}else t[e]=!0}function Uc(t,e,s,i){const n=t._adapter,a=+n.startOf(e[0].value,i),o=e[e.length-1].value;let r,l;for(r=a;r<=o;r=+n.add(r,1,i))l=s[r],l>=0&&(e[l].major=!0);return e}function Ic(t,e,s){const i=[],n={},a=e.length;let o,r;for(o=0;o+t.value))}initOffsets(t=[]){let e,s,i=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),i=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,s=this.getDecimalForValue(t[t.length-1]),n=1===t.length?s:(s-this.getDecimalForValue(t[t.length-2]))/2);const a=t.length<3?.5:.25;i=_i(i,0,a),n=_i(n,0,a),this._offsets={start:i,end:n,factor:1/(i+1+n)}}_generate(){const t=this._adapter,e=this.min,s=this.max,i=this.options,n=i.time,a=n.unit||$c(n.minUnit,e,s,this._getLabelCapacity(e)),o=Ds(i.ticks.stepSize,1),r="week"===a&&n.isoWeekday,l=hi(r)||!0===r,d={};let h,c,u=e;if(l&&(u=+t.startOf(u,"isoWeek",r)),u=+t.startOf(u,l?"day":a),t.diff(s,e,a)>1e5*o)throw new Error(e+" and "+s+" are too far apart with stepSize of "+o+" "+a);const p="data"===i.ticks.source&&this.getDataTimestamps();for(h=u,c=0;h+t)}getLabelForValue(t){const e=this._adapter,s=this.options.time;return s.tooltipFormat?e.format(t,s.tooltipFormat):e.format(t,s.displayFormats.datetime)}format(t,e){const s=this.options,i=s.time.displayFormats,n=this._unit,a=e||i[n];return this._adapter.format(t,a)}_tickFormatFunction(t,e,s,i){const n=this.options,a=n.ticks.callback;if(a)return $s(a,[t,e,s],this);const o=n.time.displayFormats,r=this._unit,l=this._majorUnit,d=r&&o[r],h=l&&o[l],c=s[e],u=l&&h&&c&&c.major;return this._adapter.format(t,i||(u?h:d))}generateTickLabels(t){let e,s,i;for(e=0,s=t.length;e0?o:1}getDataTimestamps(){let t,e,s=this._cache.data||[];if(s.length)return s;const i=this.getMatchingVisibleMetas();if(this._normalized&&i.length)return this._cache.data=i[0].controller.getAllParsedValues(this);for(t=0,e=i.length;t=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=Si(t,"pos",e)),({pos:i,time:a}=t[r]),({pos:n,time:o}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=Si(t,"time",e)),({time:i,pos:a}=t[r]),({time:n,pos:o}=t[l]));const d=n-i;return d?a+(o-a)*(e-i)/d:a}(0,Me.A)(Oc,"id","time"),(0,Me.A)(Oc,"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 Wc extends Oc{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=Rc(e,this.min),this._tableRange=Rc(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:s}=this,i=[],n=[];let a,o,r,l,d;for(a=0,o=t.length;a=e&&l<=s&&i.push(l);if(i.length<2)return[{time:e,pos:0},{time:s,pos:1}];for(a=0,o=i.length;at-e)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),s=this.getLabelTimestamps();return t=e.length&&s.length?this.normalize(e.concat(s)):e.length?e:s,t=this._cache.all=t,t}getDecimalForValue(t){return(Rc(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,s=this.getDecimalForPixel(t)/e.factor-e.end;return Rc(this._table,s*this._tableRange+this._minPos,!0)}}(0,Me.A)(Wc,"id","timeseries"),(0,Me.A)(Wc,"defaults",Oc.defaults);var Bc=s(90144);const Nc={data:{type:Object,required:!0},options:{type:Object,default:()=>({})},plugins:{type:Array,default:()=>[]},datasetIdKey:{type:String,default:"label"},updateMode:{type:String,default:void 0}},zc={ariaLabel:{type:String},ariaDescribedby:{type:String}},jc={type:{type:String,required:!0},destroyDelay:{type:Number,default:0},...Nc,...zc},Hc="2"===i.rE[0]?(t,e)=>Object.assign(t,{attrs:e}):(t,e)=>Object.assign(t,e);function qc(t){return(0,Bc.ju)(t)?(0,Bc.ux)(t):t}function Xc(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return(0,Bc.ju)(e)?new Proxy(t,{}):t}function Kc(t,e){const s=t.options;s&&e&&Object.assign(s,e)}function Yc(t,e){t.labels=e}function Qc(t,e,s){const i=[];t.datasets=e.map(e=>{const n=t.datasets.find(t=>t[s]===e[s]);return n&&e.data&&!i.includes(n)?(i.push(n),Object.assign(n,e),n):{...e}})}function Gc(t,e){const s={labels:[],datasets:[]};return Yc(s,t.labels),Qc(s,t.datasets,e),s}const Jc=(0,i.pM)({props:jc,setup(t,e){let{expose:s,slots:n}=e;const a=(0,Bc.KR)(null),o=(0,Bc.IJ)(null);s({chart:o});const r=()=>{if(!a.value)return;const{type:e,data:s,options:i,plugins:n,datasetIdKey:r}=t,l=Gc(s,r),d=Xc(l,s);o.value=new rd(a.value,{type:e,data:d,options:{...i},plugins:n})},l=()=>{const e=(0,Bc.ux)(o.value);e&&(t.destroyDelay>0?setTimeout(()=>{e.destroy(),o.value=null},t.destroyDelay):(e.destroy(),o.value=null))},d=e=>{e.update(t.updateMode)};return(0,i.sV)(r),(0,i.hi)(l),(0,i.wB)([()=>t.options,()=>t.data],(e,s)=>{let[n,a]=e,[r,l]=s;const h=(0,Bc.ux)(o.value);if(!h)return;let c=!1;if(n){const t=qc(n),e=qc(r);t&&t!==e&&(Kc(h,t),c=!0)}if(a){const e=qc(a.labels),s=qc(l.labels),i=qc(a.datasets),n=qc(l.datasets);e!==s&&(Yc(h.config.data,e),c=!0),i&&i!==n&&(Qc(h.config.data,i,t.datasetIdKey),c=!0)}c&&(0,i.dY)(()=>{d(h)})},{deep:!0}),()=>(0,i.h)("canvas",{role:"img","aria-label":t.ariaLabel,"aria-describedby":t.ariaDescribedby,ref:a},[(0,i.h)("p",{},[n.default?n.default():""])])}});function Zc(t,e){return rd.register(e),(0,i.pM)({props:Nc,setup(e,s){let{expose:n}=s;const a=(0,Bc.IJ)(null),o=t=>{a.value=t?.chart};return n({chart:a}),()=>(0,i.h)(Jc,Hc({ref:o},{type:t,...e}))}})}const tu=Zc("doughnut",Ko),eu=Zc("line",Yo);s(16573),s(78100),s(77936),s(79577),s(41549),s(49797),s(49631),s(35623);class su extends Error{constructor(t,e,s=!1,i=""){super(t),this.name="BatchOperationError",this.code=e,this.recoverable=s,this.suggestion=i}}const iu={401:()=>new su("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录"),403:()=>new su("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限"),400:t=>new su(`请求数据无效: ${t}`,"INVALID_DATA",!0,"请检查数据格式后重试"),500:()=>new su("服务器内部错误","SERVER_ERROR",!0,"请稍后重试,如果问题持续请联系管理员"),NETWORK:()=>new su("网络连接失败","NETWORK_ERROR",!0,"请检查网络连接后重试"),ABORT:()=>new su("操作已取消","ABORTED",!1,"")};function nu(t,e=""){if("AbortError"===t.name)return iu.ABORT();if(t instanceof Response||t&&"number"===typeof t.status){const s=iu[t.status];return s?s(e):new su(`请求失败: ${t.status}`,"HTTP_ERROR",!0,"请稍后重试")}return t instanceof TypeError&&t.message.includes("fetch")?iu.NETWORK():new su(t.message||"未知错误","UNKNOWN_ERROR",!0,"请稍后重试")}class au{constructor(t={}){this.batchSize=t.batchSize||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.abortController=null}async fetchAllRecords(t=!1){this.abortController=new AbortController;const e=[];let s=null,i=0,n=0;try{do{if(this.abortController.signal.aborted)break;const a=await this.fetchBatch(s,t);e.push(...a.records),s=a.nextCursor,i+=a.records.length,n++,this.onProgress({phase:"fetching",current:i,batchCount:n,message:`已获取 ${i} 条记录...`})}while(s&&!this.abortController.signal.aborted);if(this.abortController.signal.aborted)throw iu.ABORT();return e}catch(a){const t=a instanceof su?a:nu(a);throw this.onError(t),t}}async fetchBatch(t,e){const s=new URLSearchParams;t&&s.set("cursor",t),e&&s.set("includeValue","true"),s.set("limit",String(this.batchSize));try{const t=await(0,Pe.A)(`/api/manage/batch/list?${s}`,{signal:this.abortController.signal});if(!t.ok){let e="";try{const s=await t.json();e=s.error||""}catch{}throw nu(t,e)}const e=await t.json();if(!e.success)throw new su(e.error||"请求失败","API_ERROR",!0,"请稍后重试");return{records:e.records||[],nextCursor:e.nextCursor||null,totalProcessed:e.totalProcessed||0}}catch(i){if(i instanceof su)throw i;throw nu(i)}}abort(){this.abortController&&this.abortController.abort()}isAborted(){return!!this.abortController&&this.abortController.signal.aborted}reset(){this.abortController=null}}var ou=au;class ru{constructor(t={}){this.chunkSize=t.chunkSize||null,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.sessionId=this.generateSessionId(),this.aborted=!1}async fetchConfig(){try{const t=await(0,Pe.A)("/api/manage/batch/index/config");if(!t.ok)throw new Error("获取配置失败");const e=await t.json();if(e.success)return{chunkSize:e.chunkSize||500,databaseType:e.databaseType||"unknown"};throw new Error(e.error||"获取配置失败")}catch(t){return console.warn("Failed to fetch index config, using default:",t),{chunkSize:500,databaseType:"unknown"}}}async rebuild(){this.aborted=!1;try{if(!this.chunkSize){const t=await this.fetchConfig();this.chunkSize=t.chunkSize}this.onProgress({phase:"fetching",message:"正在获取数据...",current:0});const t=new ou({onProgress:t=>this.onProgress({...t,phase:"fetching"}),onError:t=>this.onError(t)}),e=await t.fetchAllRecords(!1);if(this.aborted)throw new su("操作已取消","ABORTED",!1,"");if(this.onProgress({phase:"sorting",message:"正在排序...",current:0,total:e.length}),this.sortByTimestampDescending(e),this.aborted)throw new su("操作已取消","ABORTED",!1,"");const s=this.splitIntoChunks(e);for(let i=0;i{const s=t.metadata&&t.metadata.TimeStamp||0,i=e.metadata&&e.metadata.TimeStamp||0;return i-s})}splitIntoChunks(t){const e=[];for(let s=0;st.toString(16).padStart(2,"0")).join("")}let n=2166136261,a=2166136261;for(let o=0;o>>0,a=Math.imul(a^i[o],16777635)>>>0;return n.toString(16).padStart(8,"0")+a.toString(16).padStart(8,"0")}createHttpError(t,e=""){switch(t){case 401:return new su("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录");case 403:return new su("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限");case 400:return new su(`请求数据无效: ${e}`,"INVALID_DATA",!0,"请检查数据格式后重试");case 404:return new su("会话不存在","SESSION_NOT_FOUND",!1,"请重新开始索引重建");case 410:return new su("会话已过期","SESSION_EXPIRED",!1,"请重新开始索引重建");case 500:default:return new su(`服务器错误: ${e||t}`,"SERVER_ERROR",!0,"请稍后重试")}}sleep(t){return new Promise(e=>setTimeout(e,t))}abort(){this.aborted=!0}reset(){this.aborted=!1,this.sessionId=this.generateSessionId()}}var lu=ru;class du{constructor(t={}){this.onProgress=t.onProgress||(()=>{}),this.processor=null}async generateBackup(){this.processor=new ou({onProgress:t=>this.onProgress({...t,phase:"fetching"})});const t=await this.processor.fetchAllRecords(!0);this.onProgress({phase:"building",message:"正在构建备份数据..."});const e={timestamp:Date.now(),version:De.rE,data:{fileCount:t.length,files:{},settings:{}}};for(const n of t)e.data.files[n.id]={metadata:n.metadata,value:n.value||null};const s=await this.fetchSettings();e.data.settings=s,this.onProgress({phase:"downloading",message:"正在生成下载..."}),this.downloadBackup(e);const i=Object.keys(s).length;return{success:!0,fileCount:t.length,settingsCount:i}}async fetchSettings(){try{const t=await(0,Pe.A)("/api/manage/batch/settings");if(!t.ok)return console.warn("Failed to fetch settings:",t.status),{};const e=await t.json();return e.settings||{}}catch(t){return console.warn("Failed to fetch settings:",t),{}}}downloadBackup(t){const e=JSON.stringify(t,null,2),s=new Blob([e],{type:"application/json"}),i=URL.createObjectURL(s),n=document.createElement("a");n.href=i,n.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i)}abort(){this.processor&&this.processor.abort()}isAborted(){return!!this.processor&&this.processor.isAborted()}}var hu=du;class cu{constructor(t={}){this.chunkSize=t.chunkSize||50,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.aborted=!1}async restore(t){if(this.aborted=!1,!t||!t.data)throw new su("备份文件格式无效","INVALID_BACKUP",!1,"请选择有效的备份文件");const{files:e={},settings:s={}}=t.data,i=Object.entries(e),n=Object.entries(s),a=i.length,o=n.length,r=a+o;let l=0,d=0,h=0,c=0;try{this.onProgress({phase:"restoring_files",message:"正在恢复文件数据...",current:0,total:r});const e=this.splitIntoChunks(i,this.chunkSize);for(let t=0;tsetTimeout(e,t))}abort(){this.aborted=!0}}var uu=cu;rd.register(bd,Kh,Ph,Zh,ic,$d,Md,xh);const pu=864e5;function gu(t){return String(t).padStart(2,"0")}function fu(t){return`${t.getFullYear()}-${gu(t.getMonth()+1)}-${gu(t.getDate())}`}function mu(){const t=new Date;t.setHours(0,0,0,0);const e=new Date(t.getTime()-6*pu);return[fu(e),fu(t)]}var bu={name:"SysCogStatus",components:{Doughnut:tu,Line:eu,DateRangeCalendar:q},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:De.rE,loadErrors:{newest:!1,oldest:!1},trendGroupBy:"channel",trendDatePickerVisible:!1,trendDateRange:mu(),channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#6366F1","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"],trendColors:["#2563EB","#10B981","#F59E0B","#EF4444","#8B5CF6","#06B6D4","#EC4899","#84CC16","#64748B"],isProcessing:!1,processingPhase:"",processingProgress:{current:0,total:0,message:"",percentage:0},processingError:null,processingStartTime:null,currentRebuilder:null,currentBackupGenerator:null,currentRestoreProcessor:null}},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.aggregatedTypeStats;return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.typeColors.slice(0,Object.keys(t).length),borderWidth:0}]}},aggregatedTypeStats(){const t=this.indexInfo.typeStats||{},e={};for(const[s,i]of Object.entries(t)){const t="Block"===s?this.$t("sysStatus.blocked"):this.$t("sysStatus.normalStatus");e[t]=(e[t]||0)+i}return e},currentTrendGroup(){const t=this.indexInfo.uploadTrend||{},e=t.groupBy||{};return e[this.trendGroupBy]||{series:[]}},trendRawLabels(){const t=this.indexInfo.uploadTrend||{};return t.labels||[]},trendRangeCrossesYear(){const t=new Set;return this.trendRawLabels.forEach(e=>{this.extractTrendLabelDates(e).forEach(e=>t.add(e.year))}),t.size>1},trendDisplayLabels(){return this.trendRawLabels.map(t=>this.formatTrendAxisLabel(t))},hasTrendData(){const t=this.indexInfo.uploadTrend||{};return(t.labels||[]).length>0},uploadTrendChartData(){const t=this.indexInfo.uploadTrend||{},e=this.currentTrendGroup.series||[],s="#F97316";return{labels:this.trendDisplayLabels,datasets:[{label:this.$t("sysStatus.totalUploads"),data:t.total||[],borderColor:s,backgroundColor:this.hexToRgba(s,.1),pointBackgroundColor:s,pointBorderColor:s,borderWidth:3,pointRadius:2,pointHoverRadius:5,tension:.28,fill:!1},...e.map((t,e)=>{const s=this.getTrendColor(e);return{label:this.formatTrendSeriesName(t),data:t.data||[],borderColor:s,backgroundColor:this.hexToRgba(s,.12),pointBackgroundColor:s,pointBorderColor:s,borderWidth:2,pointRadius:2,pointHoverRadius:5,tension:.32,fill:!1}})]}},lineChartOptions(){const t="#64748B";return{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},plugins:{legend:{display:!0,position:"bottom",labels:{usePointStyle:!0,boxWidth:8,boxHeight:8,padding:16,color:t}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,callbacks:{title:t=>{const e=t?.[0]?.dataIndex;return this.trendRawLabels[e]||""},label:t=>{const e=t.parsed||{},s=void 0!==e.y?e.y:t.raw;return` ${t.dataset.label}: ${Number(s||0).toLocaleString()} ${this.$t("sysStatus.uploadsUnit")}`}}}},scales:{x:{grid:{display:!1},ticks:{color:t,maxTicksLimit:8,autoSkip:!0}},y:{beginAtZero:!0,grid:{color:"rgba(148, 163, 184, 0.18)"},ticks:{color:t,precision:0,callback:t=>Number(t).toLocaleString()}}}}},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",hoverOffset:8,layout:{padding:10},plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,z:100,callbacks:{label:t=>{const e=t.raw,s=t.dataset.data.reduce((t,e)=>t+e,0),i=(e/s*100).toFixed(1);return` ${e.toLocaleString()} (${i}%)`}}}},animation:{animateRotate:!0,animateScale:!0}}},estimatedTimeRemaining(){if(!this.isProcessing||!this.processingStartTime)return"";if(0===this.processingProgress.current||0===this.processingProgress.percentage)return"";const t=Date.now()-this.processingStartTime,e=this.processingProgress.percentage/100;if(e<=0)return"";const s=t/e,i=s-t;if(i<=0)return this.$t("sysStatus.aboutToComplete");const n=Math.ceil(i/1e3);if(n<60)return this.$t("sysStatus.seconds",{count:n});const a=Math.ceil(n/60);if(a<60)return this.$t("sysStatus.minutes",{count:a});const o=Math.floor(a/60),r=a%60;return this.$t("sysStatus.hoursMinutes",{hours:o,minutes:r})},phaseDescription(){const t={fetching:this.$t("sysStatus.phaseFetching"),sorting:this.$t("sysStatus.phaseSorting"),uploading:this.$t("sysStatus.phaseUploading"),finalizing:this.$t("sysStatus.phaseFinalizing"),building:this.$t("sysStatus.phaseBuilding"),downloading:this.$t("sysStatus.phaseDownloading"),restoring_files:this.$t("sysStatus.phaseRestoringFiles"),restoring_settings:this.$t("sysStatus.phaseRestoringSettings"),completed:this.$t("sysStatus.phaseCompleted"),retrying:this.$t("sysStatus.phaseRetrying")};return t[this.processingPhase]||this.processingPhase}},mounted(){this.fetchIndexInfo()},methods:{getChartColor(t){return this.channelColors[t%this.channelColors.length]},getTypeChartColor(t){return this.typeColors[t%this.typeColors.length]},getTrendColor(t){return this.trendColors[t%this.trendColors.length]},formatTrendSeriesName(t){return t?.isOther||"__other__"===t?.name?this.$t("sysStatus.otherChannels"):t?.name||this.$t("sysStatus.unknown")},hexToRgba(t,e){const s=(t||"").replace("#","");if(6!==s.length)return`rgba(37, 99, 235, ${e})`;const i=parseInt(s.slice(0,2),16),n=parseInt(s.slice(2,4),16),a=parseInt(s.slice(4,6),16);return`rgba(${i}, ${n}, ${a}, ${e})`},extractTrendLabelDates(t){const e=String(t||"").match(/\d{4}-\d{2}-\d{2}/g)||[];return e.map(t=>{const[e,s,i]=t.split("-").map(Number);return{year:e,month:s,day:i}})},formatTrendAxisLabel(t){const e=this.extractTrendLabelDates(t);if(0===e.length)return t;const s=(t,e)=>{const s=`${t.month}/${t.day}`;return e?`${t.year}/${s}`:s};if(1===e.length)return s(e[0],this.trendRangeCrossesYear);const[i,n]=e;if(!this.trendRangeCrossesYear)return`${s(i,!1)}-${s(n,!1)}`;const a=i.year===n.year?s(n,!1):s(n,!0);return`${s(i,!0)}-${a}`},openTrendDateDialog(){this.trendDatePickerVisible=!0},handleTrendDateRangeChange(t){Array.isArray(t)&&2===t.length&&t[0]&&t[1]&&(this.trendDatePickerVisible=!1,this.fetchIndexInfo())},getTrendDateRangeParams(){return Array.isArray(this.trendDateRange)&&2===this.trendDateRange.length||(this.trendDateRange=mu()),{startDate:this.trendDateRange[0],endDate:this.trendDateRange[1]}},async fetchIndexInfo(){this.loading=!0;try{const{startDate:t,endDate:e}=this.getTrendDateRangeParams(),s=new URLSearchParams({action:"info",timezoneOffset:String((new Date).getTimezoneOffset()),trendMaxPoints:"90",trendSeriesLimit:"8",trendStartDate:t,trendEndDate:e}),i=await(0,Pe.A)(`/api/manage/list?${s.toString()}`,{method:"GET"});if(!i.ok)throw new Error("API请求失败");{const t=await i.json();this.indexInfo=t}}catch(t){console.error("获取索引信息失败:",t),this.$message.error(this.$t("sysStatus.fetchIndexFailed"))}finally{this.loading=!1}},async rebuildIndex(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.rebuilding=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentRebuilder=new lu({onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});try{const t=await this.currentRebuilder.rebuild();this.$message.success(this.$t("sysStatus.rebuildSuccess",{count:t.totalFiles.toLocaleString()})),setTimeout(()=>{this.fetchIndexInfo()},1e3)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.rebuilding=!1,this.isProcessing=!1,this.currentRebuilder=null,this.processingStartTime=null}}},async backupData(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.backing=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentBackupGenerator=new hu({onProgress:t=>this.handleProgress(t)});try{const t=await this.currentBackupGenerator.generateBackup(),e=t.settingsCount>0?this.$t("sysStatus.backupSuccessWithSettings",{fileCount:t.fileCount.toLocaleString(),settingsCount:t.settingsCount}):this.$t("sysStatus.backupSuccess",{count:t.fileCount.toLocaleString()});this.$message.success(e)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.backing=!1,this.isProcessing=!1,this.currentBackupGenerator=null,this.processingStartTime=null}}},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(this.$t("sysStatus.restoreConfirmMessage"),this.$t("sysStatus.restoreConfirmTitle"),{confirmButtonText:this.$t("sysStatus.restoreConfirmOk"),cancelButtonText:this.$t("sysStatus.restoreConfirmCancel"),type:"warning"}),await this.restoreData(e)}catch(s){"cancel"!==s&&console.error("确认恢复失败:",s)}t.target.value=""}else this.$message.error(this.$t("sysStatus.selectJsonFile"))},async restoreData(t){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.restoring=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0};try{const s=await t.text();let i;try{i=JSON.parse(s)}catch(e){throw new Error(this.$t("sysStatus.invalidBackupFile"))}this.currentRestoreProcessor=new uu({chunkSize:100,onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});const n=await this.currentRestoreProcessor.restore(i);this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,this.$message.success(this.$t("sysStatus.restoreSuccess",{files:n.restoredFiles,settings:n.restoredSettings})),await new Promise(t=>setTimeout(t,500)),await this.rebuildIndex()}catch(s){if(console.error("恢复数据失败:",s),this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,"ABORTED"!==s.code){const t=s.suggestion?`${s.message}。${s.suggestion}`:s.message;this.$message.error(this.$t("sysStatus.restoreFailed")+": "+t),this.processingError={message:s.message,suggestion:s.suggestion,recoverable:s.recoverable}}}}},formatTime(t){if(!t)return this.$t("sysStatus.unknown");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(),s=e-t,i=Math.floor(s/6e4),n=Math.floor(s/36e5),a=Math.floor(s/864e5);return a>0?this.$t("sysStatus.daysAgo",{count:a}):n>0?this.$t("sysStatus.hoursAgo",{count:n}):i>0?this.$t("sysStatus.minutesAgo",{count:i}):this.$t("sysStatus.justNow")},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||"",s=e.substring(e.lastIndexOf(".")+1).toLowerCase(),i=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","avif","heic","heif"];return i.includes(s)},isVideoFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("video"))return!0;const e=t.metadata?.FileName||t.id||"",s=e.substring(e.lastIndexOf(".")+1).toLowerCase(),i=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","m4v","3gp","mpeg","mpg"];return i.includes(s)},openFileInNewTab(t){t?.id&&window.open("/file/"+t.id+"?from=admin","_blank")},handleProgress(t){this.processingPhase=t.phase,this.processingProgress.message=t.message||"",this.processingProgress.current=t.current||0,"fetching"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0?this.processingProgress.percentage=Math.min(60,t.current/t.total*60):this.processingProgress.percentage=Math.min(50,15*Math.log10(t.current+1))):"sorting"===t.phase?(this.processingProgress.percentage=65,this.processingProgress.total=t.total||this.processingProgress.total):"uploading"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0&&(this.processingProgress.percentage=70+t.current/t.total*25)):"finalizing"===t.phase?this.processingProgress.percentage=97:"building"===t.phase?this.processingProgress.percentage=80:"downloading"===t.phase?this.processingProgress.percentage=95:"restoring_files"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||0):"restoring_settings"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||80):"completed"===t.phase?this.processingProgress.percentage=100:"retrying"===t.phase&&(this.processingProgress.message=t.message)},handleError(t){console.error("批量操作错误:",t),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}},cancelOperation(){this.currentRebuilder&&(this.currentRebuilder.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentBackupGenerator&&(this.currentBackupGenerator.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentRestoreProcessor&&(this.currentRestoreProcessor.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild")))},retryOperation(){this.processingError=null,this.rebuilding?(this.rebuilding=!1,this.isProcessing=!1,this.$nextTick(()=>{this.rebuildIndex()})):this.backing&&(this.backing=!1,this.isProcessing=!1,this.$nextTick(()=>{this.backupData()}))},dismissError(){this.processingError=null}}};const yu=(0,h.A)(bu,[["render",Te],["__scopeId","data-v-f8e4c870"]]);var xu=yu,vu=s(59869),_u=(s(70415),s(73565),s(82006)),ku=(s(98642),s(81418)),wu=(s(50333),s(39623)),Cu=(s(29092),s(63003),s(76018)),Su=(s(96808),s(67819),s(55558)),Fu=(s(10456),s(12687));s(18785);const Tu=["onClick"];function Pu(t,e,s,a,o,r){const l=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["custom-select",{"is-open":o.isOpen}]),style:(0,n.Tr)({width:s.width})},[(0,i.Lk)("div",{class:"custom-select-trigger",onClick:e[0]||(e[0]=(...t)=>r.toggleDropdown&&r.toggleDropdown(...t))},[(0,i.Lk)("span",{class:(0,n.C4)(["custom-select-value",{"is-placeholder":!s.modelValue}])},(0,n.v_)(r.displayLabel),3),(0,i.bF)(l,{icon:"chevron-down",class:"custom-select-arrow"})]),(0,i.bF)(C.eB,{name:"dropdown-fade"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:"custom-select-dropdown",onClick:e[1]||(e[1]=(0,C.D$)(()=>{},["stop"]))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.options,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.value,class:(0,n.C4)(["custom-select-option",{"is-selected":s.modelValue===e.value}]),onClick:t=>r.selectOption(e.value)},[(0,i.RG)(t.$slots,"option",{option:e},()=>[e.icon?((0,i.uX)(),(0,i.Wv)(l,{key:0,icon:e.icon,class:"option-icon"},null,8,["icon"])):(0,i.Q3)("",!0),(0,i.Lk)("span",null,(0,n.v_)(e.label),1)],!0)],10,Tu))),128))],512),[[C.aG,o.isOpen]])]),_:3})],6)}var Du={name:"CustomSelect",props:{modelValue:{type:[String,Number],default:""},options:{type:Array,required:!0},placeholder:{type:String,default:""},width:{type:String,default:"160px"}},emits:["update:modelValue","change"],data(){return{isOpen:!1}},computed:{resolvedPlaceholder(){return this.placeholder||this.$t("common.select")},displayLabel(){const t=this.options.find(t=>t.value===this.modelValue);return t?t.label:this.resolvedPlaceholder}},mounted(){document.addEventListener("click",this.handleClickOutside)},beforeUnmount(){document.removeEventListener("click",this.handleClickOutside)},methods:{toggleDropdown(){this.isOpen=!this.isOpen},selectOption(t){this.$emit("update:modelValue",t),this.$emit("change",t),this.isOpen=!1},handleClickOutside(t){this.$el.contains(t.target)||(this.isOpen=!1)}}};const Mu=(0,h.A)(Du,[["render",Pu],["__scopeId","data-v-55080c16"]]);var Au=Mu;const $u={class:"upload-settings"},Lu={class:"page-header"},Vu={class:"first-title"},Eu={class:"header-actions"},Uu={class:"group-header"},Iu={class:"group-title"},Ou={key:0,class:"load-balance-switch"},Ru={class:"switch-label"},Wu={key:0,class:"channel-cards"},Bu=["onMousemove","onMouseleave"],Nu={class:"card-header"},zu={class:"card-title"},ju={class:"channel-name"},Hu={class:"card-body"},qu={class:"card-info"},Xu={class:"info-item"},Ku={class:"info-text"},Yu={key:0,class:"info-item"},Qu={class:"info-text"},Gu={key:1,class:"info-item"},Ju=["title"],Zu={class:"info-item"},tp={class:"info-text"},ep={key:0,class:"info-item"},sp=["title"],ip={class:"info-item"},np={class:"info-text"},ap={class:"info-item"},op={class:"info-text"},rp={class:"info-item"},lp={class:"info-text"},dp={class:"info-item"},hp=["title"],cp={key:0,class:"info-item"},up=["title"],pp={key:0,class:"quota-mini"},gp={class:"quota-text"},fp={class:"card-actions"},mp={key:1,class:"empty-tip"},bp={key:0,class:"form-warning",style:{"margin-top":"0"}},yp=["innerHTML"],xp={class:"form-tip"},vp={class:"form-tip"},_p={class:"form-tip"},kp={class:"form-warning"},wp={class:"form-tip"},Cp={class:"form-tip"},Sp={class:"form-tip"},Fp={class:"quota-label"},Tp={class:"quota-status"},Pp={class:"form-tip"},Dp={class:"form-tip"},Mp={class:"form-tip"};function Ap(t,e,s,a,o,r){const l=(0,i.g2)("font-awesome-icon"),d=g.R7,h=Au,c=K.S2,u=Fu.u,p=Su.qi,f=k.ve,m=Cu.P9,b=Cu.AV,y=_u.xE,x=wu.WK,_=ku.lq,S=_u.US,F=w.kZ,T=vu.MF,P=vu.TS,D=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",$u,[(0,i.Lk)("div",Lu,[(0,i.Lk)("h3",Vu,[(0,i.eW)((0,n.v_)(t.$t("sysUpload.title"))+" ",1),(0,i.bF)(d,{content:t.$t("sysUpload.titleTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"question-circle",class:"help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Eu,[(0,i.bF)(h,{modelValue:o.channelFilter,"onUpdate:modelValue":e[0]||(e[0]=t=>o.channelFilter=t),options:r.filterOptions,placeholder:t.$t("sysUpload.filterPlaceholder"),width:"160px"},null,8,["modelValue","options","placeholder"]),(0,i.bF)(c,{type:"primary",onClick:e[1]||(e[1]=t=>o.showAddDialog=!0),class:"add-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"plus",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysUpload.addChannel")),1)]),_:1})])]),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(r.filteredChannels,s=>((0,i.uX)(),(0,i.CE)("div",{key:s.value,class:"channel-group"},[(0,i.Lk)("div",Uu,[(0,i.Lk)("div",Iu,[(0,i.bF)(l,{icon:r.getChannelIcon(s.value),class:"group-icon"},null,8,["icon"]),(0,i.Lk)("span",null,(0,n.v_)(s.label),1),(0,i.bF)(u,{size:"small",type:"info",class:"channel-count"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(r.getChannelList(s.value).length),1)]),_:2},1024)]),r.hasLoadBalance(s.value)?((0,i.uX)(),(0,i.CE)("div",Ou,[(0,i.Lk)("span",Ru,(0,n.v_)(t.$t("sysUpload.loadBalance")),1),(0,i.bF)(p,{modelValue:r.getSettings(s.value).loadBalance.enabled,"onUpdate:modelValue":t=>r.getSettings(s.value).loadBalance.enabled=t,size:"small",onChange:r.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])])):(0,i.Q3)("",!0)]),r.getChannelList(s.value).length>0?((0,i.uX)(),(0,i.CE)("div",Wu,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(r.getChannelList(s.value),(a,o)=>((0,i.uX)(),(0,i.CE)("div",{key:a.name||o,class:(0,n.C4)(["channel-card",[s.value,{disabled:!a.enabled,fixed:a.fixed}]]),onMousemove:t=>r.handleCardMouseMove(t,s.value,o),onMouseleave:t=>r.handleCardMouseLeave(s.value,o)},[(0,i.Lk)("div",{class:"card-glow",ref_for:!0,ref:`glow-${s.value}-${o}`},null,512),(0,i.Lk)("div",Nu,[(0,i.Lk)("div",zu,[(0,i.Lk)("span",ju,(0,n.v_)(a.name||t.$t("sysUpload.unnamedChannel")),1),a.fixed?((0,i.uX)(),(0,i.Wv)(u,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.envVariable")),1)]),_:1})):(0,i.Q3)("",!0)]),(0,i.bF)(p,{modelValue:a.enabled,"onUpdate:modelValue":t=>a.enabled=t,size:"small",onClick:e[2]||(e[2]=(0,C.D$)(()=>{},["stop"])),onChange:r.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])]),(0,i.Lk)("div",Hu,[(0,i.Lk)("div",qu,["telegram"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.Lk)("div",Xu,[(0,i.bF)(l,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",Ku,"Bot: "+(0,n.v_)(r.maskText(a.botToken)),1)]),a.chatId?((0,i.uX)(),(0,i.CE)("div",Yu,[(0,i.bF)(l,{icon:"comments",class:"info-icon"}),(0,i.Lk)("span",Qu,"Channel: "+(0,n.v_)(r.maskText(a.chatId)),1)])):(0,i.Q3)("",!0)],64)):"cfr2"===s.value?((0,i.uX)(),(0,i.CE)("div",Gu,[(0,i.bF)(l,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl||t.$t("sysUpload.notSet")),9,Ju)])):"s3"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.Lk)("div",Zu,[(0,i.bF)(l,{icon:"server",class:"info-icon"}),(0,i.Lk)("span",tp,(0,n.v_)(a.bucketName||t.$t("sysUpload.notSet")),1)]),a.endpoint?((0,i.uX)(),(0,i.CE)("div",ep,[(0,i.bF)(l,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.endpoint},(0,n.v_)(a.endpoint),9,sp)])):(0,i.Q3)("",!0)],64)):"discord"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.Lk)("div",ip,[(0,i.bF)(l,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",np,"Bot: "+(0,n.v_)(r.maskText(a.botToken)),1)]),(0,i.Lk)("div",ap,[(0,i.bF)(l,{icon:"hashtag",class:"info-icon"}),(0,i.Lk)("span",op,"Channel: "+(0,n.v_)(r.maskText(a.channelId)),1)]),a.isNitro?((0,i.uX)(),(0,i.Wv)(u,{key:0,size:"small",type:"success"},{default:(0,i.k6)(()=>[...e[78]||(e[78]=[(0,i.eW)("Nitro",-1)])]),_:1})):(0,i.Q3)("",!0)],64)):"huggingface"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.Lk)("div",rp,[(0,i.bF)(l,{icon:"database",class:"info-icon"}),(0,i.Lk)("span",lp,(0,n.v_)(a.repo||t.$t("sysUpload.notSet")),1)]),a.isPrivate?((0,i.uX)(),(0,i.Wv)(u,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo")),1)]),_:1})):(0,i.Q3)("",!0)],64)):"webdav"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.Lk)("div",dp,[(0,i.bF)(l,{icon:"folder",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.baseUrl},(0,n.v_)(a.baseUrl||t.$t("sysUpload.notSet")),9,hp)]),a.publicUrl?((0,i.uX)(),(0,i.CE)("div",cp,[(0,i.bF)(l,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl),9,up)])):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),a.quota?.enabled?((0,i.uX)(),(0,i.CE)("div",pp,[(0,i.bF)(f,{percentage:r.getQuotaPercentage(a),status:r.getQuotaStatus(a),"stroke-width":6},null,8,["percentage","status"]),(0,i.Lk)("span",gp,(0,n.v_)(r.getQuotaText(a)),1)])):(0,i.Q3)("",!0)]),(0,i.Lk)("div",fp,[(0,i.bF)(c,{text:"",type:"primary",size:"small",onClick:t=>r.openDetailDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"eye",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.detail")),1)]),_:1},8,["onClick"]),(0,i.bF)(c,{text:"",type:"primary",size:"small",onClick:t=>r.openEditDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"edit",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(c,{text:"",type:"danger",size:"small",onClick:t=>r.deleteChannel(s.value,o),disabled:a.fixed},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"trash-alt",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.deleteBtn")),1)]),_:1},8,["onClick","disabled"])])],42,Bu))),128))])):((0,i.uX)(),(0,i.CE)("div",mp,[(0,i.bF)(l,{icon:"inbox",class:"empty-icon"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysUpload.noChannels",{type:s.label})),1)]))]))),128)),(0,i.bF)(F,{modelValue:o.showAddDialog,"onUpdate:modelValue":e[35]||(e[35]=t=>o.showAddDialog=t),title:t.$t("sysUpload.addDialogTitle"),class:"channel-dialog","destroy-on-close":"",onClosed:r.resetAddForm},{footer:(0,i.k6)(()=>[(0,i.bF)(c,{onClick:e[34]||(e[34]=t=>o.showAddDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cancel")),1)]),_:1}),"cfr2"!==o.newChannel.type?((0,i.uX)(),(0,i.Wv)(c,{key:0,type:"primary",onClick:r.confirmAddChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.confirmAdd")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>[(0,i.bF)(S,{model:o.newChannel,"label-position":"top",ref:"addForm",rules:r.addRules},{default:(0,i.k6)(()=>[(0,i.bF)(y,{label:t.$t("sysUpload.channelTypeLabel"),prop:"type"},{default:(0,i.k6)(()=>[(0,i.bF)(b,{modelValue:o.newChannel.type,"onUpdate:modelValue":e[3]||(e[3]=t=>o.newChannel.type=t),placeholder:t.$t("sysUpload.channelTypePlaceholder"),style:{width:"100%"},onChange:r.onChannelTypeChange},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.addableChannels,t=>((0,i.uX)(),(0,i.Wv)(m,{key:t.value,label:t.label,value:t.value},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:r.getChannelIcon(t.value),class:"select-option-icon"},null,8,["icon"]),(0,i.eW)(" "+(0,n.v_)(t.label),1)]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue","placeholder","onChange"])]),_:1},8,["label"]),"cfr2"===o.newChannel.type?((0,i.uX)(),(0,i.CE)("div",bp,[(0,i.bF)(l,{icon:"info-circle",style:{"margin-right":"6px"}}),(0,i.Lk)("span",{innerHTML:t.$t("sysUpload.r2ConfigNote")},null,8,yp)])):((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(y,{label:t.$t("sysUpload.channelNameLabel"),prop:"name"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.name,"onUpdate:modelValue":e[4]||(e[4]=t=>o.newChannel.name=t),placeholder:t.$t("sysUpload.channelNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),"telegram"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[5]||(e[5]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.chatId,"onUpdate:modelValue":e[6]||(e[6]=t=>o.newChannel.chatId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.chatIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[7]||(e[7]=t=>o.newChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"s3"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(y,{label:t.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.endpoint,"onUpdate:modelValue":e[8]||(e[8]=t=>o.newChannel.endpoint=t),placeholder:t.$t("sysUpload.endpointPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.cdnDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.cdnDomain,"onUpdate:modelValue":e[9]||(e[9]=t=>o.newChannel.cdnDomain=t),placeholder:t.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"]),(0,i.Lk)("span",xp,(0,n.v_)(t.$t("sysUpload.cdnDomainTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.bucketName,"onUpdate:modelValue":e[10]||(e[10]=t=>o.newChannel.bucketName=t),placeholder:t.$t("sysUpload.bucketNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.region,"onUpdate:modelValue":e[11]||(e[11]=t=>o.newChannel.region=t),placeholder:t.$t("sysUpload.bucketRegionPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.accessKeyId,"onUpdate:modelValue":e[12]||(e[12]=t=>o.newChannel.accessKeyId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.accessKeyIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.secretAccessKey,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newChannel.secretAccessKey=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.secretAccessKeyPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.pathStyle")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.newChannel.pathStyle,"onUpdate:modelValue":e[14]||(e[14]=t=>o.newChannel.pathStyle=t)},null,8,["modelValue"]),(0,i.Lk)("span",vp,(0,n.v_)(t.$t("sysUpload.pathStyleTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[15]||(e[15]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[16]||(e[16]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[17]||(e[17]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(y,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[18]||(e[18]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.channelId,"onUpdate:modelValue":e[19]||(e[19]=t=>o.newChannel.channelId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.channelIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.nitroMember")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.newChannel.isNitro,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newChannel.isNitro=t)},null,8,["modelValue"]),(0,i.Lk)("span",_p,(0,n.v_)(t.$t("sysUpload.nitroTip")),1)]),_:1},8,["label"]),(0,i.Lk)("div",kp,[(0,i.bF)(l,{icon:"exclamation-triangle",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysUpload.discordWarning")),1)])],64)):"huggingface"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(y,{label:t.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.repo,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newChannel.repo=t),placeholder:t.$t("sysUpload.repoNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.token,"onUpdate:modelValue":e[23]||(e[23]=t=>o.newChannel.token=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.accessTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.privateRepo")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.newChannel.isPrivate,"onUpdate:modelValue":e[24]||(e[24]=t=>o.newChannel.isPrivate=t)},null,8,["modelValue"]),(0,i.Lk)("span",wp,(0,n.v_)(t.$t("sysUpload.privateRepoTip")),1)]),_:1},8,["label"])],64)):"webdav"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(y,{label:t.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.baseUrl,"onUpdate:modelValue":e[25]||(e[25]=t=>o.newChannel.baseUrl=t),placeholder:t.$t("sysUpload.webdavBaseUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.username,"onUpdate:modelValue":e[26]||(e[26]=t=>o.newChannel.username=t),placeholder:t.$t("sysUpload.webdavUsernamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.password,"onUpdate:modelValue":e[27]||(e[27]=t=>o.newChannel.password=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.webdavPasswordPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.publicUrl,"onUpdate:modelValue":e[28]||(e[28]=t=>o.newChannel.publicUrl=t),placeholder:t.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"]),(0,i.Lk)("span",Cp,(0,n.v_)(t.$t("sysUpload.webdavPublicUrlTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.headersText,"onUpdate:modelValue":e[29]||(e[29]=t=>o.newChannel.headersText=t),type:"textarea",autosize:{minRows:2},placeholder:t.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavCreateDirectory")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.newChannel.createDirectory,"onUpdate:modelValue":e[30]||(e[30]=t=>o.newChannel.createDirectory=t)},null,8,["modelValue"]),(0,i.Lk)("span",Sp,(0,n.v_)(t.$t("sysUpload.webdavCreateDirectoryTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[31]||(e[31]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[32]||(e[32]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[33]||(e[33]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)],64))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(F,{modelValue:o.showDetailDialog,"onUpdate:modelValue":e[37]||(e[37]=t=>o.showDetailDialog=t),title:t.$t("sysUpload.detailDialogTitle",{name:o.currentChannel?.name||""}),class:"channel-dialog",onClosed:r.resetDetailData},{footer:(0,i.k6)(()=>[(0,i.bF)(c,{onClick:e[36]||(e[36]=t=>o.showDetailDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.closeBtn")),1)]),_:1}),(0,i.bF)(c,{type:"primary",onClick:r.openEditFromDetail},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(P,{column:1,border:""},{default:(0,i.k6)(()=>[(0,i.bF)(T,{label:t.$t("sysUpload.channelNameDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.name),1)]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.channelTypeDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(r.getChannelTypeLabel(o.currentChannelType)),1)]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.statusLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(u,{type:o.currentChannel?.enabled?"success":"info"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.enabled?t.$t("sysUpload.enabled"):t.$t("sysUpload.disabled")),1)]),_:1},8,["type"])]),_:1},8,["label"]),o.currentChannel?.fixed?((0,i.uX)(),(0,i.Wv)(T,{key:0,label:t.$t("sysUpload.configSource")},{default:(0,i.k6)(()=>[(0,i.bF)(u,{type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.envVariable")),1)]),_:1})]),_:1},8,["label"])):(0,i.Q3)("",!0),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(T,{label:t.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(r.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.chatIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(r.maskText(o.currentChannel?.chatId,6)),1)]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.Wv)(T,{key:2,label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{"model-value":o.currentChannel?.publicUrl||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"])):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(T,{label:t.$t("sysUpload.endpointLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{"model-value":o.currentChannel?.endpoint,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.cdnDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{"model-value":o.currentChannel?.cdnDomain||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.bucketName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.bucketName),1)]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.bucketRegion")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.region),1)]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.pathStyle")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.pathStyle?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(T,{label:t.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(r.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.channelIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(r.maskText(o.currentChannel?.channelId,6)),1)]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.nitroMember")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isNitro?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(T,{label:t.$t("sysUpload.repoName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.repo),1)]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.privateRepo")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isPrivate?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:6},[(0,i.bF)(T,{label:t.$t("sysUpload.webdavBaseUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{"model-value":o.currentChannel?.baseUrl,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{"model-value":o.currentChannel?.publicUrl||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.username||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{"model-value":r.formatHeaders(o.currentChannel?.headers),type:"textarea",autosize:{minRows:2},readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.webdavCreateDirectory")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(!1!==o.currentChannel?.createDirectory?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):(0,i.Q3)("",!0),o.currentChannel?.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:7},[(0,i.bF)(T,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.limitGB)+" GB",1)]),_:1},8,["label"]),(0,i.bF)(T,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.threshold)+"%",1)]),_:1},8,["label"]),(0,i.bF)(T,null,{label:(0,i.k6)(()=>[(0,i.Lk)("span",Fp,[(0,i.eW)((0,n.v_)(t.$t("sysUpload.currentUsage"))+" ",1),(0,i.bF)(c,{link:"",type:"primary",onClick:r.refreshQuota,class:"refresh-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"sync-alt",class:(0,n.C4)({"fa-spin":o.quotaLoading})},null,8,["class"])]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",Tp,[(0,i.bF)(f,{percentage:r.getQuotaPercentage(o.currentChannel),status:r.getQuotaStatus(o.currentChannel),"stroke-width":16,"text-inside":!0,format:()=>r.getQuotaText(o.currentChannel)},null,8,["percentage","status","format"]),(0,i.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":r.isQuotaExceeded(o.currentChannel)}])},(0,n.v_)(r.getQuotaStatusText(o.currentChannel)),3)])]),_:1})],64)):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(F,{modelValue:o.showEditDialog,"onUpdate:modelValue":e[77]||(e[77]=t=>o.showEditDialog=t),title:t.$t("sysUpload.editDialogTitle",{name:o.editChannel?.name||""}),class:"channel-dialog","destroy-on-close":"",onClosed:r.resetEditData},{footer:(0,i.k6)(()=>[(0,i.bF)(c,{onClick:e[76]||(e[76]=t=>o.showEditDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cancel")),1)]),_:1}),(0,i.bF)(c,{type:"primary",onClick:r.confirmEditChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.saveChanges")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(S,{model:o.editChannel,"label-position":"top",ref:"editForm",rules:r.editRules},{default:(0,i.k6)(()=>[(0,i.bF)(y,{label:t.$t("sysUpload.channelNameLabel"),prop:"name"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.name,"onUpdate:modelValue":e[38]||(e[38]=t=>o.editChannel.name=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.enableChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.enabled,"onUpdate:modelValue":e[39]||(e[39]=t=>o.editChannel.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[40]||(e[40]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.chatId,"onUpdate:modelValue":e[41]||(e[41]=t=>o.editChannel.chatId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[42]||(e[42]=t=>o.editChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(y,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[43]||(e[43]=t=>o.editChannel.publicUrl=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[44]||(e[44]=t=>o.editChannel.quota.enabled=t),onChange:e[45]||(e[45]=t=>r.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[46]||(e[46]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[47]||(e[47]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(y,{label:t.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.endpoint,"onUpdate:modelValue":e[48]||(e[48]=t=>o.editChannel.endpoint=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.cdnDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.cdnDomain,"onUpdate:modelValue":e[49]||(e[49]=t=>o.editChannel.cdnDomain=t),placeholder:t.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"]),(0,i.Lk)("span",Pp,(0,n.v_)(t.$t("sysUpload.cdnDomainTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.bucketName,"onUpdate:modelValue":e[50]||(e[50]=t=>o.editChannel.bucketName=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.region,"onUpdate:modelValue":e[51]||(e[51]=t=>o.editChannel.region=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.accessKeyId,"onUpdate:modelValue":e[52]||(e[52]=t=>o.editChannel.accessKeyId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.secretAccessKey,"onUpdate:modelValue":e[53]||(e[53]=t=>o.editChannel.secretAccessKey=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.pathStyle")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.pathStyle,"onUpdate:modelValue":e[54]||(e[54]=t=>o.editChannel.pathStyle=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[55]||(e[55]=t=>o.editChannel.quota.enabled=t),onChange:e[56]||(e[56]=t=>r.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[57]||(e[57]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[58]||(e[58]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(y,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[59]||(e[59]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.channelId,"onUpdate:modelValue":e[60]||(e[60]=t=>o.editChannel.channelId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[61]||(e[61]=t=>o.editChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.nitroMember")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.isNitro,"onUpdate:modelValue":e[62]||(e[62]=t=>o.editChannel.isNitro=t)},null,8,["modelValue"])]),_:1},8,["label"])],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(y,{label:t.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.repo,"onUpdate:modelValue":e[63]||(e[63]=t=>o.editChannel.repo=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.token,"onUpdate:modelValue":e[64]||(e[64]=t=>o.editChannel.token=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.privateRepo")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.isPrivate,"onUpdate:modelValue":e[65]||(e[65]=t=>o.editChannel.isPrivate=t)},null,8,["modelValue"])]),_:1},8,["label"])],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(y,{label:t.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.baseUrl,"onUpdate:modelValue":e[66]||(e[66]=t=>o.editChannel.baseUrl=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.username,"onUpdate:modelValue":e[67]||(e[67]=t=>o.editChannel.username=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.password,"onUpdate:modelValue":e[68]||(e[68]=t=>o.editChannel.password=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[69]||(e[69]=t=>o.editChannel.publicUrl=t),placeholder:t.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"]),(0,i.Lk)("span",Dp,(0,n.v_)(t.$t("sysUpload.webdavPublicUrlTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.headersText,"onUpdate:modelValue":e[70]||(e[70]=t=>o.editChannel.headersText=t),type:"textarea",autosize:{minRows:2},placeholder:t.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavCreateDirectory")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.createDirectory,"onUpdate:modelValue":e[71]||(e[71]=t=>o.editChannel.createDirectory=t)},null,8,["modelValue"]),(0,i.Lk)("span",Mp,(0,n.v_)(t.$t("sysUpload.webdavCreateDirectoryTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[72]||(e[72]=t=>o.editChannel.quota.enabled=t),onChange:e[73]||(e[73]=t=>r.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[74]||(e[74]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[75]||(e[75]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"])])),[[D,o.loading]])}var $p={components:{CustomSelect:Au},data(){return{channelFilter:"",channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],addableChannels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],telegramSettings:{loadBalance:{enabled:!1},channels:[]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{enabled:!1},channels:[]},discordSettings:{loadBalance:{enabled:!1},channels:[]},huggingfaceSettings:{loadBalance:{enabled:!1},channels:[]},webdavSettings:{loadBalance:{enabled:!1},channels:[]},showAddDialog:!1,showDetailDialog:!1,showEditDialog:!1,currentChannelType:"",currentChannelIndex:-1,currentChannel:null,editChannel:{},newChannel:{type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0},quotaStats:{},quotaLoading:!1,loading:!1}},computed:{filterOptions(){const t={telegram:"paper-plane",cfr2:"cloud",s3:"database",discord:"comments",huggingface:"robot",webdav:"folder"};return[{value:"",label:this.$t("common.all")},...this.channels.map(e=>({value:e.value,label:e.label,icon:t[e.value]||"server"}))]},filteredChannels(){return this.channelFilter?this.channels.filter(t=>t.value===this.channelFilter):this.channels},addRules(){return{type:[{required:!0,message:this.$t("sysUpload.channelTypePlaceholder"),trigger:"change"}],name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}},editRules(){return{name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}}},methods:{handleCardMouseMove(t,e,s){const i=t.currentTarget,n=i.getBoundingClientRect(),a=t.clientX-n.left,o=t.clientY-n.top,r=`glow-${e}-${s}`,l=this.$refs[r];l&&l[0]&&(l[0].style.opacity="1",l[0].style.left=`${a}px`,l[0].style.top=`${o}px`)},handleCardMouseLeave(t,e){const s=`glow-${t}-${e}`,i=this.$refs[s];i&&i[0]&&(i[0].style.opacity="0")},getChannelIcon(t){const e={telegram:"paper-plane",cfr2:"cloud",s3:"database",discord:"comments",huggingface:"robot",webdav:"folder"};return e[t]||"server"},getChannelTypeLabel(t){const e=this.channels.find(e=>e.value===t);return e?e.label:t},getChannelList(t){return this.getSettings(t)?.channels||[]},getSettings(t){const e={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};return e[t]},hasLoadBalance(t){return["telegram","s3","discord","huggingface","webdav"].includes(t)},maskText(t,e=4){return t?t.length<=2*e?"****":t.slice(0,e)+"****"+t.slice(-e):this.$t("sysUpload.notSet")},formatHeaders(t){return!t||"object"===typeof t&&0===Object.keys(t).length?this.$t("sysUpload.notSet"):"string"===typeof t?t:JSON.stringify(t,null,2)},headersToText(t){return t?"string"===typeof t?t:JSON.stringify(t,null,2):""},parseHeadersText(t){if(!t||!t.trim())return{};try{const e=JSON.parse(t);return!e||"object"!==typeof e||Array.isArray(e)?null:e}catch(e){return null}},openDetailDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e,this.currentChannel=this.getChannelList(t)[e],this.showDetailDialog=!0},openEditDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e;const s=this.getChannelList(t)[e];this.editChannel=JSON.parse(JSON.stringify(s)),"webdav"===t&&(this.editChannel.headersText=this.headersToText(this.editChannel.headers),this.editChannel.createDirectory=!1!==this.editChannel.createDirectory),this.editChannel.quota||(this.editChannel.quota={enabled:!1,limitGB:10,threshold:95}),this.showEditDialog=!0},openEditFromDetail(){this.showDetailDialog=!1,this.openEditDialog(this.currentChannelType,this.currentChannelIndex)},resetAddForm(){this.newChannel={type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},resetDetailData(){this.currentChannel=null},resetEditData(){this.editChannel={}},onChannelTypeChange(){const{type:t,name:e}=this.newChannel;this.newChannel={type:t,name:e,enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},confirmAddChannel(){this.$refs.addForm.validate(t=>{if(!t)return;const{type:e,name:s}=this.newChannel,i=this.getSettings(e),n=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env","WebDAV_env"];if(n.includes(s))return void this.$message.warning(this.$t("sysUpload.reservedName"));const a=i.channels.some(t=>t.name===s);if(a)return void this.$message.warning(this.$t("sysUpload.duplicateName"));let o={id:i.channels.length+1,name:this.newChannel.name,type:e,savePath:"database",enabled:!0,fixed:!1};if("telegram"===e)Object.assign(o,{botToken:this.newChannel.botToken,chatId:this.newChannel.chatId,proxyUrl:this.newChannel.proxyUrl});else if("s3"===e)Object.assign(o,{endpoint:this.newChannel.endpoint,cdnDomain:this.newChannel.cdnDomain,bucketName:this.newChannel.bucketName,region:this.newChannel.region,accessKeyId:this.newChannel.accessKeyId,secretAccessKey:this.newChannel.secretAccessKey,pathStyle:this.newChannel.pathStyle,quota:{...this.newChannel.quota}});else if("discord"===e)Object.assign(o,{botToken:this.newChannel.botToken,channelId:this.newChannel.channelId,proxyUrl:this.newChannel.proxyUrl,isNitro:this.newChannel.isNitro});else if("huggingface"===e)Object.assign(o,{repo:this.newChannel.repo,token:this.newChannel.token,isPrivate:this.newChannel.isPrivate});else if("webdav"===e){const t=this.parseHeadersText(this.newChannel.headersText);if(null===t)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));Object.assign(o,{baseUrl:this.newChannel.baseUrl,username:this.newChannel.username,password:this.newChannel.password,publicUrl:this.newChannel.publicUrl,headers:t,createDirectory:!1!==this.newChannel.createDirectory,quota:{...this.newChannel.quota}})}i.channels.push(o),this.showAddDialog=!1,this.saveSettings()})},confirmEditChannel(){this.$refs.editForm.validate(t=>{if(!t)return;const e=this.getSettings(this.currentChannelType),s=this.editChannel.name,i=this.currentChannelIndex,n=this.editChannel.fixed;if(!n){const t=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env","WebDAV_env"];if(t.includes(s))return void this.$message.warning(this.$t("sysUpload.reservedName"));const n=e.channels.some((t,e)=>e!==i&&t.name===s);if(n)return void this.$message.warning(this.$t("sysUpload.duplicateName"))}const a={...this.editChannel};if("webdav"===this.currentChannelType){const t=this.parseHeadersText(a.headersText);if(null===t)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));a.headers=t,a.createDirectory=!1!==a.createDirectory,delete a.headersText}e.channels[this.currentChannelIndex]=a,this.showEditDialog=!1,this.saveSettings()})},deleteChannel(t,e){const s=this.getChannelList(t)[e];s.fixed?this.$message.warning(this.$t("sysUpload.fixedChannelCannotDelete")):this.$confirm(this.$t("sysUpload.deleteChannelConfirm"),this.$t("common.info"),{confirmButtonText:this.$t("common.confirm"),cancelButtonText:this.$t("common.cancel"),type:"warning"}).then(()=>{const s=this.getSettings(t);s.channels.splice(e,1),s.channels.forEach((t,e)=>{t.id=e+1}),this.saveSettings()}).catch(()=>{})},saveSettings(){const t={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};(0,Pe.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then(()=>{this.$message.success(this.$t("sysOthers.settingsSaved"))})},async refreshQuota(){this.quotaLoading=!0;try{const t=await(0,Pe.A)("/api/manage/quota",{method:"POST"}),e=await t.json();if(e.success)this.quotaStats=e.channelStats||{};else{const t=await(0,Pe.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,Pe.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),s=t.quota?.limitGB||10,i=e/s*100;return Math.min(100,Math.round(10*i)/10)},getQuotaStatus(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s?"exception":e>=80?"warning":"success"},getQuotaText(t){const e=this.getChannelUsedGB(t),s=t.quota?.limitGB||10;return`${e.toFixed(2)} / ${s} GB`},isQuotaExceeded(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s},getQuotaStatusText(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s?`⚠️ 已达到容量阈值 (${s}%),渠道写入已暂停`:e>=80?"⚡ 容量使用较高,接近阈值":"✓ 容量正常"},async onQuotaEnabledChange(t,e){if(t&&e.name){const t=this.quotaStats[e.name];t||this.$confirm(this.$t("sysUpload.quotaInitConfirm"),this.$t("sysUpload.quotaInitTitle"),{confirmButtonText:this.$t("sysUpload.quotaInitConfirmBtn"),cancelButtonText:this.$t("sysUpload.quotaInitCancelBtn"),type:"info"}).then(async()=>{await this.recalculateQuota()}).catch(()=>{this.$message.info(this.$t("sysUpload.quotaInitLater"))})}},async recalculateQuota(){this.quotaLoading=!0;try{this.$message.info(this.$t("sysUpload.quotaCalculating"));const t=await(0,Pe.A)("/api/manage/quota",{method:"POST"}),e=await t.json();e.success?(this.quotaStats=e.channelStats||{},this.$message.success(this.$t("sysUpload.quotaCalculateSuccess"))):this.$message.error(this.$t("sysUpload.quotaCalculateError")+(e.error||""))}catch(t){console.error("Failed to recalculate quota:",t),this.$message.error(this.$t("sysUpload.quotaCalculateFailed"))}finally{this.quotaLoading=!1}}},mounted(){this.loading=!0,(0,Pe.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:[]},t.webdav&&t.webdav.channels&&(t.webdav.channels=t.webdav.channels.map(t=>({...t,username:t.username||"",password:t.password||"",publicUrl:t.publicUrl||"",headers:t.headers||{},createDirectory:!1!==t.createDirectory,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.webdavSettings=t.webdav||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const Lp=(0,h.A)($p,[["render",Ap],["__scopeId","data-v-d225d330"]]);var Vp=Lp,Ep=s(98469);s(49187);const Up={class:"save-text"};function Ip(t,e,s,a,o,r){const l=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.Wv)(C.eB,{name:"fade-up"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:(0,n.C4)(["floating-save-btn",{"is-loading":s.loading}]),onClick:e[0]||(e[0]=(...t)=>r.handleClick&&r.handleClick(...t))},[s.loading?((0,i.uX)(),(0,i.Wv)(l,{key:0,icon:"spinner",spin:""})):((0,i.uX)(),(0,i.Wv)(l,{key:1,icon:"save"})),(0,i.Lk)("span",Up,(0,n.v_)(s.loading?t.$t("floatingSave.saving"):t.$t("floatingSave.save")),1)],2),[[C.aG,o.visible]])]),_:1})}var Op={name:"FloatingSaveButton",emits:["click"],props:{loading:{type:Boolean,default:!1},show:{type:Boolean,default:!0}},data(){return{visible:!1}},watch:{show:{immediate:!0,handler(t){t?setTimeout(()=>{this.visible=!0},600):this.visible=!1}}},methods:{handleClick(){this.loading||this.$emit("click")}}};const Rp=(0,h.A)(Op,[["render",Ip],["__scopeId","data-v-53091626"]]);var Wp=Rp,Bp=s(84757);s(5802),s(64752),s(38736);const Np={class:"security-settings"},zp={class:"first-settings"},jp={class:"first-title"},Hp={class:"second-title"},qp={style:{display:"flex",gap:"8px",width:"100%"}},Xp={class:"second-title"},Kp={style:{display:"flex",gap:"8px",width:"100%"}},Yp={class:"second-title token-title"},Qp={class:"token-actions"},Gp={class:"token-table-container"},Jp={class:"table-cell-content"},Zp={class:"table-cell-content"},tg={class:"token-display"},eg={class:"table-cell-content"},sg={class:"table-cell-content"},ig={class:"table-cell-content"},ng={class:"table-cell-content"},ag={class:"table-cell-content action-buttons"},og={class:"first-settings"},rg={class:"first-title"},lg={class:"second-title"},dg={class:"first-settings"},hg={class:"first-title"},cg={class:"second-title"},ug={class:"second-title"},pg={class:"second-title"},gg={class:"form-item-hint"},fg={class:"form-item-hint"},mg={style:{display:"flex",gap:"10px",width:"100%"}},bg={class:"dialog-footer"},yg={style:{display:"flex",gap:"10px",width:"100%"}},xg={class:"dialog-footer"},vg={class:"token-result"},_g={style:{"margin-bottom":"15px",color:"#e6a23c"}},kg={class:"dialog-footer"};function wg(t,e,s,a,o,r){const l=wu.WK,d=Ep.dI,h=_u.xE,c=_u.US,u=(0,i.g2)("font-awesome-icon"),p=K.S2,f=Bp.o8,m=Fu.u,b=Bp.Up,y=g.R7,x=Su.qi,_=Cu.P9,k=Cu.AV,S=ku.lq,F=Wp,T=Ep.o5,P=w.kZ,D=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Np,[(0,i.Lk)("div",zp,[(0,i.Lk)("h3",jp,(0,n.v_)(t.$t("sysSecurity.authManagement")),1),(0,i.Lk)("h4",Hp,(0,n.v_)(t.$t("sysSecurity.userAuth")),1),(0,i.bF)(c,{model:o.authSettings.user,rules:r.userPassRules,ref:"userPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysSecurity.uploadPassword"),prop:"authCode"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",qp,[(0,i.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",placeholder:o.authSettings.user._hasPassword?t.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearUserPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.user._hasPassword?((0,i.uX)(),(0,i.Wv)(d,{key:0,modelValue:o.clearUserPassword,"onUpdate:modelValue":e[1]||(e[1]=t=>o.clearUserPassword=t),onChange:r.handleClearUserPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(C.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showUserPassConfirm?((0,i.uX)(),(0,i.Wv)(h,{label:t.$t("sysSecurity.confirmPassword"),prop:"confirmNewUserPassword",key:"user-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{modelValue:o.authSettings.user.confirmNewUserPassword,"onUpdate:modelValue":e[2]||(e[2]=t=>o.authSettings.user.confirmNewUserPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Xp,(0,n.v_)(t.$t("sysSecurity.adminAuth")),1),(0,i.bF)(c,{model:o.authSettings.admin,rules:r.adminPassRules,ref:"adminPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysSecurity.adminUsername"),prop:"adminUsername"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{modelValue:o.authSettings.admin.adminUsername,"onUpdate:modelValue":e[3]||(e[3]=t=>o.authSettings.admin.adminUsername=t),autocomplete:"new-password",disabled:o.clearAdminPassword},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysSecurity.adminPassword"),prop:"adminPassword"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Kp,[(0,i.bF)(l,{modelValue:o.authSettings.admin.adminPassword,"onUpdate:modelValue":e[4]||(e[4]=t=>o.authSettings.admin.adminPassword=t),type:"password","show-password":"",onInput:r.handleAdminPassInput,autocomplete:"new-password",placeholder:o.authSettings.admin._hasPassword?t.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearAdminPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.admin._hasPassword?((0,i.uX)(),(0,i.Wv)(d,{key:0,modelValue:o.clearAdminPassword,"onUpdate:modelValue":e[5]||(e[5]=t=>o.clearAdminPassword=t),onChange:r.handleClearAdminPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(C.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showAdminPassConfirm?((0,i.uX)(),(0,i.Wv)(h,{label:t.$t("sysSecurity.confirmPassword"),prop:"confirmNewAdminPassword",key:"admin-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{modelValue:o.authSettings.admin.confirmNewAdminPassword,"onUpdate:modelValue":e[6]||(e[6]=t=>o.authSettings.admin.confirmNewAdminPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Yp,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.apiTokenManagement"))+" ",1),(0,i.Lk)("a",Qp,[(0,i.bF)(p,{type:"primary",size:"small",onClick:e[7]||(e[7]=t=>o.showCreateTokenDialog=!0),circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"})]),_:1})])]),(0,i.Lk)("div",Gp,[(0,i.bo)(((0,i.uX)(),(0,i.Wv)(b,{data:o.apiTokens,class:"token-table"},{default:(0,i.k6)(()=>[(0,i.bF)(f,{prop:"name",label:t.$t("sysSecurity.tokenName"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Jp,(0,n.v_)(t.row.name),1)]),_:1},8,["label"]),(0,i.bF)(f,{prop:"token",label:t.$t("sysSecurity.tokenValue"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Zp,[(0,i.Lk)("span",tg,(0,n.v_)(t.row.token),1)])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"permissions",label:t.$t("sysSecurity.permissions"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",eg,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(t.row.permissions,t=>((0,i.uX)(),(0,i.Wv)(m,{key:t,size:"small",class:"permission-tag"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(r.getPermissionText(t)),1)]),_:2},1024))),128))])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"createdAt",label:t.$t("sysSecurity.createdAt"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",sg,(0,n.v_)(r.formatDate(t.row.createdAt)),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.status"),"header-align":"center",width:"90"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",ig,[(0,i.bF)(m,{type:"active"===r.getTokenStatus(t.row.expiresAt).status?"success":"danger",size:"small"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(r.getTokenStatus(t.row.expiresAt).label),1)]),_:2},1032,["type"])])]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.expiresAt"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",ng,(0,n.v_)(r.getTokenStatus(t.row.expiresAt).expiresText),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.operation"),fixed:"right","header-align":"center"},{default:(0,i.k6)(e=>[(0,i.Lk)("div",ag,[(0,i.bF)(p,{class:"action-button",size:"small",onClick:t=>r.editToken(e.row)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(p,{class:"action-button",size:"small",type:"danger",onClick:t=>r.deleteToken(e.row.id)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.deleteBtn")),1)]),_:1},8,["onClick"])])]),_:1},8,["label"])]),_:1},8,["data"])),[[D,o.tokenLoading]])])]),(0,i.Lk)("div",og,[(0,i.Lk)("h3",rg,(0,n.v_)(t.$t("sysSecurity.uploadManagement")),1),(0,i.Lk)("h4",lg,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.imageReview"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.imageReviewTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(c,{model:o.uploadSettings.moderate,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysSecurity.enableReview")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.uploadSettings.moderate.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>o.uploadSettings.moderate.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysSecurity.reviewChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(k,{modelValue:o.uploadSettings.moderate.channel,"onUpdate:modelValue":e[9]||(e[9]=t=>o.uploadSettings.moderate.channel=t),placeholder:t.$t("sysSecurity.reviewChannelPlaceholder")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{label:"moderatecontent.com",value:"moderatecontent.com"}),(0,i.bF)(_,{label:"nsfwjs",value:"nsfwjs"})]),_:1},8,["modelValue","placeholder"])]),_:1},8,["label"]),"moderatecontent.com"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(h,{key:0,label:t.$t("sysSecurity.apiKey")},{default:(0,i.k6)(()=>[(0,i.bF)(l,{modelValue:o.uploadSettings.moderate.moderateContentApiKey,"onUpdate:modelValue":e[10]||(e[10]=t=>o.uploadSettings.moderate.moderateContentApiKey=t)},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0),"nsfwjs"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(h,{key:1,label:t.$t("sysSecurity.apiPath")},{default:(0,i.k6)(()=>[(0,i.bF)(l,{modelValue:o.uploadSettings.moderate.nsfwApiPath,"onUpdate:modelValue":e[11]||(e[11]=t=>o.uploadSettings.moderate.nsfwApiPath=t),placeholder:"https://nsfwjs.your.domain"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.Lk)("div",dg,[(0,i.Lk)("h3",hg,(0,n.v_)(t.$t("sysSecurity.accessManagement")),1),(0,i.Lk)("h4",cg,(0,n.v_)(t.$t("sysSecurity.domainFilter")),1),(0,i.bF)(c,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.allowedDomains"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.allowedDomainsTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(l,{modelValue:o.accessSettings.allowedDomains,"onUpdate:modelValue":e[12]||(e[12]=t=>o.accessSettings.allowedDomains=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h4",ug,(0,n.v_)(t.$t("sysSecurity.whiteListMode")),1),(0,i.bF)(c,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.enableWhiteList"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.enableWhiteListTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.whiteListMode,"onUpdate:modelValue":e[13]||(e[13]=t=>o.accessSettings.whiteListMode=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h4",pg,(0,n.v_)(t.$t("sysSecurity.sessionSecurityPolicy")),1),(0,i.bF)(c,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.secureMode"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.secureModeTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.sessionSecure,"onUpdate:modelValue":e[14]||(e[14]=t=>o.accessSettings.sessionSecure=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(h,{label:t.$t("sysSecurity.userSessionMaxAge")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.accessSettings.userSessionMaxAge,"onUpdate:modelValue":e[15]||(e[15]=t=>o.accessSettings.userSessionMaxAge=t),min:1,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",gg,(0,n.v_)(t.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysSecurity.adminSessionMaxAge")},{default:(0,i.k6)(()=>[(0,i.bF)(S,{modelValue:o.accessSettings.adminSessionMaxAge,"onUpdate:modelValue":e[16]||(e[16]=t=>o.accessSettings.adminSessionMaxAge=t),min:1,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",fg,(0,n.v_)(t.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"])]),_:1},8,["model"])]),(0,i.bF)(F,{show:!o.loading,onClick:r.saveSettings},null,8,["show","onClick"]),(0,i.bF)(P,{modelValue:o.showCreateTokenDialog,"onUpdate:modelValue":e[24]||(e[24]=t=>o.showCreateTokenDialog=t),title:t.$t("sysSecurity.createTokenTitle"),width:r.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",bg,[(0,i.bF)(p,{onClick:e[23]||(e[23]=t=>o.showCreateTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:r.createToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.createBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(c,{model:o.newToken,rules:r.tokenRules,ref:"tokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysSecurity.tokenNameLabel"),prop:"name"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{modelValue:o.newToken.name,"onUpdate:modelValue":e[17]||(e[17]=t=>o.newToken.name=t),placeholder:t.$t("sysSecurity.tokenNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(T,{modelValue:o.newToken.permissions,"onUpdate:modelValue":e[18]||(e[18]=t=>o.newToken.permissions=t)},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(d,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(d,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(d,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.neverExpire,"onUpdate:modelValue":e[19]||(e[19]=t=>o.newToken.neverExpire=t),onChange:r.onCreateNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(h,{key:0,label:t.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",mg,[(0,i.bF)(S,{modelValue:o.newToken.expirationValue,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newToken.expirationValue=t),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(k,{modelValue:o.newToken.expirationUnit,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newToken.expirationUnit=t),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.value,label:t.$t(e.labelKey),value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(h,{key:1,label:t.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.autoDelete,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newToken.autoDelete=t)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(P,{modelValue:o.showEditTokenDialog,"onUpdate:modelValue":e[32]||(e[32]=t=>o.showEditTokenDialog=t),title:t.$t("sysSecurity.editTokenTitle"),width:r.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",xg,[(0,i.bF)(p,{onClick:e[31]||(e[31]=t=>o.showEditTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:r.updateToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.updateBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(c,{model:o.editingToken,rules:r.editTokenRules,ref:"editTokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(l,{modelValue:o.editingToken.name,"onUpdate:modelValue":e[25]||(e[25]=t=>o.editingToken.name=t),disabled:""},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(T,{modelValue:o.editingToken.permissions,"onUpdate:modelValue":e[26]||(e[26]=t=>o.editingToken.permissions=t)},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(d,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(d,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(d,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.neverExpire,"onUpdate:modelValue":e[27]||(e[27]=t=>o.editingToken.neverExpire=t),onChange:r.onEditNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(h,{key:0,label:t.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",yg,[(0,i.bF)(S,{modelValue:o.editingToken.expirationValue,"onUpdate:modelValue":e[28]||(e[28]=t=>o.editingToken.expirationValue=t),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(k,{modelValue:o.editingToken.expirationUnit,"onUpdate:modelValue":e[29]||(e[29]=t=>o.editingToken.expirationUnit=t),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.value,label:t.$t(e.labelKey),value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(h,{key:1,label:t.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.autoDelete,"onUpdate:modelValue":e[30]||(e[30]=t=>o.editingToken.autoDelete=t)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(P,{modelValue:o.showTokenResultDialog,"onUpdate:modelValue":e[35]||(e[35]=t=>o.showTokenResultDialog=t),title:t.$t("sysSecurity.tokenCreatedTitle"),width:r.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",kg,[(0,i.bF)(p,{type:"primary",onClick:e[34]||(e[34]=t=>o.showTokenResultDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.savedBtn")),1)]),_:1})])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",vg,[(0,i.Lk)("p",_g,[(0,i.bF)(u,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysSecurity.tokenCreatedWarning")),1)]),(0,i.bF)(c,{"label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:t.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(o.createdToken.name),1)]),_:1},8,["label"]),(0,i.bF)(h,{label:t.$t("sysSecurity.fullToken")},{default:(0,i.k6)(()=>[(0,i.bF)(l,{modelValue:o.createdToken.token,"onUpdate:modelValue":e[33]||(e[33]=t=>o.createdToken.token=t),readonly:""},{append:(0,i.k6)(()=>[(0,i.bF)(p,{onClick:r.copyToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.copyBtn")),1)]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1},8,["label"])]),_:1})])]),_:1},8,["modelValue","title","width"])])),[[D,o.loading]])}s(81148);const Cg={s:1e3,m:6e4,h:36e5,d:864e5};function Sg(t,e,s){if(!Number.isFinite(e)||e<=0)throw new Error("有效期数值必须大于 0");const i="string"===typeof t?new Date(t):new Date(t.getTime());if(Cg[s])return new Date(i.getTime()+e*Cg[s]).toISOString();if("M"===s)return i.setUTCMonth(i.getUTCMonth()+e),i.toISOString();if("Y"===s)return i.setUTCFullYear(i.getUTCFullYear()+e),i.toISOString();throw new Error(`无效的时间单位: ${s}`)}function Fg(t){const e=new Date(t),s=e.getFullYear(),i=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),a=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0"),r=String(e.getSeconds()).padStart(2,"0");return`${s}-${i}-${n} ${a}:${o}:${r}`}function Tg(t,e=new Date){if(null===t||void 0===t)return{status:"active",label:"有效",expiresText:"永不过期"};const s=new Date(t),i=e instanceof Date?e:new Date(e),n=Fg(t);return i.getTime()>s.getTime()?{status:"expired",label:"已过期",expiresText:n}:{status:"active",label:"有效",expiresText:n}}var Pg={components:{FloatingSaveButton:Wp},data(){return{authSettings:{user:{},admin:{}},uploadSettings:{moderate:{}},accessSettings:{},apiTokens:[],loading:!0,tokenLoading:!1,oriUserPassword:"",oriAdminPassword:"",showUserPassConfirm:!1,showAdminPassConfirm:!1,clearUserPassword:!1,clearAdminPassword:!1,showCreateTokenDialog:!1,showEditTokenDialog:!1,showTokenResultDialog:!1,timeUnitOptions:[{labelKey:"sysSecurity.timeUnitSeconds",value:"s"},{labelKey:"sysSecurity.timeUnitMinutes",value:"m"},{labelKey:"sysSecurity.timeUnitHours",value:"h"},{labelKey:"sysSecurity.timeUnitDays",value:"d"},{labelKey:"sysSecurity.timeUnitMonths",value:"M"},{labelKey:"sysSecurity.timeUnitYears",value:"Y"}],newToken:{name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},editingToken:{id:"",name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},createdToken:{name:"",token:""}}},computed:{dialogWidth(){return window.innerWidth>768?"50%":"90%"},userPassRules(){return{authCode:[{validator:(t,e,s)=>{const i=["%","&","?","#","/"],n=i.some(t=>e&&e.includes(t));n?s(new Error(this.$t("sysSecurity.passwordUrlReserved"))):s()},trigger:"blur"}],confirmNewUserPassword:[{validator:(t,e,s)=>{e?e!==this.authSettings.user.authCode?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmUploadPassword")))},trigger:"blur"}]}},adminPassRules(){return{confirmNewAdminPassword:[{validator:(t,e,s)=>{e?e!==this.authSettings.admin.adminPassword?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmAdminPassword")))},trigger:"blur"}]}},tokenRules(){return{name:[{required:!0,message:this.$t("sysSecurity.tokenNameRequired"),trigger:"blur"}],permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(t,e,s)=>{this.newToken.neverExpire||e&&!(e<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}},editTokenRules(){return{permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(t,e,s)=>{this.editingToken.neverExpire||e&&!(e<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}}},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},handleClearUserPassword(t){t&&(this.authSettings.user.authCode="",this.showUserPassConfirm=!1)},handleClearAdminPassword(t){t&&(this.authSettings.admin.adminPassword="",this.authSettings.admin.adminUsername="",this.showAdminPassConfirm=!1)},getPermissionText(t){const e={upload:this.$t("sysSecurity.permUpload"),delete:this.$t("sysSecurity.permDelete"),list:this.$t("sysSecurity.permList"),manage:this.$t("sysSecurity.permManage")};return e[t]||t},formatDate(t){return new Date(t).toLocaleString("zh-CN")},async loadApiTokens(){this.tokenLoading=!0;try{const t=await(0,Pe.A)("/api/manage/apiTokens"),e=await t.json();this.apiTokens=e.tokens||[]}catch(t){this.$message.error(this.$t("sysSecurity.tokenListFailed"))}finally{this.tokenLoading=!1}},createToken(){this.$refs.tokenForm.validate(async t=>{if(t)try{this.newToken.owner="admin";let t=null,e=!1;this.newToken.neverExpire||(t=Sg(new Date,this.newToken.expirationValue,this.newToken.expirationUnit),e=this.newToken.autoDelete);const s=await(0,Pe.A)("/api/manage/apiTokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:this.newToken.name,owner:this.newToken.owner,permissions:this.newToken.permissions,expiresAt:t,autoDelete:e})}),i=await s.json();s.ok?(this.createdToken={name:i.name,token:i.token},this.showCreateTokenDialog=!1,this.showTokenResultDialog=!0,this.newToken={name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenCreateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenCreateFailed"))}catch(e){this.$message.error(this.$t("sysSecurity.tokenCreateFailed"))}})},editToken(t){const e=null!==t.expiresAt&&void 0!==t.expiresAt;this.editingToken={id:t.id,name:t.name,owner:t.owner,permissions:[...t.permissions],neverExpire:!e,expirationValue:1,expirationUnit:"d",autoDelete:t.autoDelete||!1},this.showEditTokenDialog=!0},updateToken(){this.$refs.editTokenForm.validate(async t=>{if(t)try{let t=null,e=!1;this.editingToken.neverExpire||(t=Sg(new Date,this.editingToken.expirationValue,this.editingToken.expirationUnit),e=this.editingToken.autoDelete);const s=await(0,Pe.A)("/api/manage/apiTokens",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tokenId:this.editingToken.id,permissions:this.editingToken.permissions,expiresAt:t,autoDelete:e})}),i=await s.json();s.ok?(this.showEditTokenDialog=!1,await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenUpdateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenUpdateFailed"))}catch(e){this.$message.error(this.$t("sysSecurity.tokenUpdateFailed"))}})},async deleteToken(t){try{await this.$confirm(this.$t("sysSecurity.tokenDeleteConfirm"),this.$t("sysSecurity.tokenDeleteConfirmTitle"),{confirmButtonText:this.$t("sysSecurity.tokenDeleteConfirmOk"),cancelButtonText:this.$t("sysSecurity.tokenDeleteConfirmCancel"),type:"warning"});const e=await(0,Pe.A)(`/api/manage/apiTokens?id=${t}`,{method:"DELETE"}),s=await e.json();e.ok?(await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenDeleteSuccess"))):this.$message.error(s.error||this.$t("sysSecurity.tokenDeleteFailed"))}catch(e){"cancel"!==e&&this.$message.error(this.$t("sysSecurity.tokenDeleteFailed"))}},async copyToken(){try{await navigator.clipboard.writeText(this.createdToken.token),this.$message.success(this.$t("sysSecurity.tokenCopied"))}catch(t){this.$message.error(this.$t("sysSecurity.copyFailed"))}},onCreateNeverExpireChange(t){t&&(this.newToken.autoDelete=!1)},onEditNeverExpireChange(t){t&&(this.editingToken.autoDelete=!1)},getTokenStatus(t){return Tg(t)},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;if(this.accessSettings.userSessionMaxAge<1||!Number.isInteger(this.accessSettings.userSessionMaxAge)||this.accessSettings.adminSessionMaxAge<1||!Number.isInteger(this.accessSettings.adminSessionMaxAge))return void this.$message.error(this.$t("sysSecurity.sessionMaxAgeInvalid"));const s={auth:this.authSettings,upload:this.uploadSettings,access:this.accessSettings};delete s.auth.user.confirmNewUserPassword,delete s.auth.admin.confirmNewAdminPassword,this.clearUserPassword&&(s.auth.user._clear=!0,s.auth.user.authCode=""),this.clearAdminPassword&&(s.auth.admin._clear=!0,s.auth.admin.adminPassword=""),(0,Pe.A)("/api/manage/sysConfig/security",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}).then(t=>t.json()).then(t=>{if(t.adminPasswordChanged){const t=this.$t("sysSecurity.adminPasswordChangedRelogin");return this.$message.warning(t),void setTimeout(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")},1500)}this.$message.success(this.$t("sysSecurity.settingsSaved")),this.authSettings.user.authCode="",this.authSettings.admin.adminPassword="",this.oriUserPassword="",this.oriAdminPassword="",s.auth.user.authCode&&!s.auth.user._clear?this.authSettings.user._hasPassword=!0:s.auth.user._clear&&(this.authSettings.user._hasPassword=!1),s.auth.admin.adminPassword&&!s.auth.admin._clear?this.authSettings.admin._hasPassword=!0:s.auth.admin._clear&&(this.authSettings.admin._hasPassword=!1),this.showUserPassConfirm=!1,this.showAdminPassConfirm=!1,this.clearUserPassword=!1,this.clearAdminPassword=!1}).catch(()=>{})})}},mounted(){this.loading=!0,(0,Pe.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.oriAdminPassword="",this.authSettings.user.confirmNewUserPassword="",this.authSettings.admin.confirmNewAdminPassword="",this.loadApiTokens()}).finally(()=>{this.loading=!1})}};const Dg=(0,h.A)(Pg,[["render",wg],["__scopeId","data-v-2962b112"]]);var Mg=Dg;const Ag={class:"page-settings"},$g={class:"first-title"};function Lg(t,e,s,a,o,r){const l=(0,i.g2)("font-awesome-icon"),d=g.R7,h=Cu.P9,c=Cu.AV,u=Su.qi,p=wu.WK,f=_u.xE,m=_u.US,b=Wp,y=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Ag,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(r.groupedSettings,(e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"first-settings"},[(0,i.Lk)("h3",$g,(0,n.v_)(s),1),(0,i.bF)(m,{model:o.settings,"label-width":"150px"},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e,(e,s)=>((0,i.uX)(),(0,i.Wv)(f,{key:e.id},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(r.localized(e,"label"))+" ",1),e.tooltip?((0,i.uX)(),(0,i.Wv)(d,{key:0,content:r.localized(e,"tooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>["select"===e.type?((0,i.uX)(),(0,i.Wv)(c,{key:0,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,disabled:e.fixed,placeholder:r.localized(e,"placeholder"),style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.options,t=>((0,i.uX)(),(0,i.Wv)(h,{key:t.value,label:r.localizedOption(t),value:t.value},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"channelName"===e.type?((0,i.uX)(),(0,i.Wv)(c,{key:1,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,disabled:!r.currentUploadChannel||0===r.currentChannelList.length,placeholder:t.$t("sysPage.channelSelectPlaceholder"),clearable:"",style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(r.currentChannelList,t=>((0,i.uX)(),(0,i.Wv)(h,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"boolean"===e.type?((0,i.uX)(),(0,i.Wv)(u,{key:2,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,disabled:e.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])):"textarea"===e.type?((0,i.uX)(),(0,i.Wv)(p,{key:3,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,type:"textarea",autosize:{minRows:2},resize:"vertical",disabled:e.fixed,placeholder:r.localized(e,"placeholder")},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"])):((0,i.uX)(),(0,i.Wv)(p,{key:4,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,disabled:e.fixed,placeholder:r.localized(e,"placeholder")},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"]))]),_:2},1024))),128))]),_:2},1032,["model"])]))),128)),(0,i.bF)(b,{show:!o.loading,onClick:r.saveSettings},null,8,["show","onClick"])])),[[y,o.loading]])}var Vg=s(457),Eg={components:{FloatingSaveButton:Wp},data(){return{settings:{config:[]},loading:!0,availableChannels:{}}},computed:{isEn(){return"en"===this.$i18n.locale},groupedSettings(){const t={};return this.settings.config&&this.settings.config.forEach(e=>{const s=this.isEn?e.category_en||e.category||this.$t("sysPage.otherSettings"):e.category||this.$t("sysPage.otherSettings");t[s]||(t[s]=[]),t[s].push(e)}),t},currentUploadChannel(){const t=this.settings.config?.find(t=>"defaultUploadChannel"===t.id);return t?.value||""},currentChannelList(){return this.availableChannels[this.currentUploadChannel]||[]}},watch:{currentUploadChannel(t,e){if(t!==e){const e=this.settings.config?.find(t=>"defaultChannelName"===t.id);if(e){const s=this.availableChannels[t]||[];s.some(t=>t.name===e.value)||(e.value="")}}}},methods:{localized(t,e){return this.isEn&&t[e+"_en"]?t[e+"_en"]:t[e]||""},localizedOption(t){return this.isEn&&t.label_en?t.label_en:t.label},saveSettings(){(0,Pe.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success(this.$t("sysPage.settingsSaved")))},async fetchAvailableChannels(){try{const t=await Vg.A.get("/api/channels");t.data&&(this.availableChannels=t.data)}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,this.fetchAvailableChannels(),(0,Pe.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 Ug=(0,h.A)(Eg,[["render",Lg],["__scopeId","data-v-e4c3a742"]]);var Ig=Ug;const Og={class:"others-settings"},Rg={class:"first-settings"},Wg={class:"first-title"},Bg={class:"first-title"},Ng={class:"first-title"},zg={class:"first-title"},jg=["innerHTML"],Hg={class:"first-title"};function qg(t,e,s,a,o,r){const l=(0,i.g2)("font-awesome-icon"),d=g.R7,h=Su.qi,c=_u.xE,u=_u.US,p=wu.WK,f=Cu.P9,m=Cu.AV,b=Wp,y=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Og,[(0,i.Lk)("div",Rg,[(0,i.Lk)("h3",Wg,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.remoteTelemetry"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.remoteTelemetryTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.telemetry,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(h,{modelValue:o.settings.telemetry.enabled,"onUpdate:modelValue":e[0]||(e[0]=t=>o.settings.telemetry.enabled=t),disabled:o.settings.telemetry.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"])]),_:1},8,["model"]),(0,i.Lk)("h3",Bg,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.cloudflareApiToken"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.cloudflareApiTokenTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.cloudflareApiToken,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysOthers.zoneId")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_ZONE_ID,"onUpdate:modelValue":e[1]||(e[1]=t=>o.settings.cloudflareApiToken.CF_ZONE_ID=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysOthers.accountEmail")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_EMAIL,"onUpdate:modelValue":e[2]||(e[2]=t=>o.settings.cloudflareApiToken.CF_EMAIL=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:"API Key"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_API_KEY,"onUpdate:modelValue":e[3]||(e[3]=t=>o.settings.cloudflareApiToken.CF_API_KEY=t),disabled:o.settings.cloudflareApiToken.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Ng,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.randomImageApi"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.randomImageApiTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.randomImageAPI,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(h,{modelValue:o.settings.randomImageAPI.enabled,"onUpdate:modelValue":e[4]||(e[4]=t=>o.settings.randomImageAPI.enabled=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{prop:"randomImageAPI.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysOthers.directory")),1),(0,i.bF)(d,{content:t.$t("sysOthers.directoryTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.randomImageAPI.allowedDir,"onUpdate:modelValue":e[5]||(e[5]=t=>o.settings.randomImageAPI.allowedDir=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",zg,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.publicBrowse"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.publicBrowseTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.publicBrowse,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(h,{modelValue:o.settings.publicBrowse.enabled,"onUpdate:modelValue":e[6]||(e[6]=t=>o.settings.publicBrowse.enabled=t),disabled:o.settings.publicBrowse.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{prop:"publicBrowse.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysOthers.openDirectory")),1),(0,i.bF)(d,{placement:"right","raw-content":""},{content:(0,i.k6)(()=>[(0,i.Lk)("div",{style:{"max-width":"320px","line-height":"1.6"},innerHTML:t.$t("sysOthers.openDirectoryTooltip")},null,8,jg)]),default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.publicBrowse.allowedDir,"onUpdate:modelValue":e[7]||(e[7]=t=>o.settings.publicBrowse.allowedDir=t),disabled:o.settings.publicBrowse.fixed,placeholder:"wallpaper,photos,album"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Hg,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.webdav"))+" ",1),(0,i.bF)(d,{content:t.$t("sysOthers.webdavTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(l,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.webDAV,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(h,{modelValue:o.settings.webDAV.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>o.settings.webDAV.enabled=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysOthers.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.username,"onUpdate:modelValue":e[9]||(e[9]=t=>o.settings.webDAV.username=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysOthers.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.password,"onUpdate:modelValue":e[10]||(e[10]=t=>o.settings.webDAV.password=t),disabled:o.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysOthers.webdavUploadChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.uploadChannel,"onUpdate:modelValue":e[11]||(e[11]=t=>o.settings.webDAV.uploadChannel=t),disabled:o.settings.webDAV.fixed,placeholder:t.$t("sysOthers.webdavDefaultChannel"),clearable:""},{default:(0,i.k6)(()=>[(0,i.bF)(f,{label:"Telegram",value:"telegram"}),(0,i.bF)(f,{label:"Cloudflare R2",value:"cfr2"}),(0,i.bF)(f,{label:"S3",value:"s3"}),(0,i.bF)(f,{label:"Discord",value:"discord"}),(0,i.bF)(f,{label:"HuggingFace",value:"huggingface"}),(0,i.bF)(f,{label:"WebDAV",value:"webdav"})]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"]),o.settings.webDAV.uploadChannel&&r.webdavChannelList.length>1?((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysOthers.webdavChannelName")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.channelName,"onUpdate:modelValue":e[12]||(e[12]=t=>o.settings.webDAV.channelName=t),disabled:o.settings.webDAV.fixed,placeholder:t.$t("uploadSettings.autoSelect"),clearable:""},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(r.webdavChannelList,t=>((0,i.uX)(),(0,i.Wv)(f,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.bF)(b,{show:!o.loading,onClick:r.saveSettings},null,8,["show","onClick"])])),[[y,o.loading]])}var Xg={components:{FloatingSaveButton:Wp},data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{},publicBrowse:{}},availableChannels:{},loading:!0}},computed:{webdavChannelList(){const t=this.settings.webDAV?.uploadChannel;return t&&this.availableChannels[t]||[]}},watch:{"settings.webDAV.uploadChannel"(){this.settings.webDAV&&(this.settings.webDAV.channelName="")}},methods:{saveSettings(){(0,Pe.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success(this.$t("sysOthers.settingsSaved")))},async fetchAvailableChannels(){try{const t=await(0,Pe.A)("/api/channels");t.ok&&(this.availableChannels=await t.json())}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,(0,Pe.A)("/api/manage/sysConfig/others").then(t=>t.json()).then(t=>{this.settings=t}).finally(()=>{this.loading=!1}),this.fetchAvailableChannels()}};const Kg=(0,h.A)(Xg,[["render",qg],["__scopeId","data-v-67b1b002"]]);var Yg=Kg,Qg=s(48903),Gg={name:"SystemConfig",mixins:[Qg.A],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:xu,SysCogUpload:Vp,SysCogSecurity:Mg,SysCogPage:Ig,SysCogOthers:Yg},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const t=this.$route.hash.replace("#","");switch(t){case"status":return xu;case"upload":return Vp;case"security":return Mg;case"page":return Ig;case"others":return Yg;default:return xu}}},methods:{handleLogout(){const t="/api/auth/logout";fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:"admin"})}).finally(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")})},setDefaultHash(){const t="#status";window.location.hash=t,this.activeIndex=t.replace("#","")}},mounted(){this.initializeBackground("adminBkImg",".container",!1,!0),window.location.hash||this.setDefaultHash()}};const Jg=(0,h.A)(Gg,[["render",x],["__scopeId","data-v-7607b77d"]]);var Zg=Jg},15616:function(t,e,s){s(85331),s(97197)},34396:function(t,e,s){s(85331),s(4885)},49187:function(t,e,s){s(85331),s(38736)},50333:function(t,e,s){s(85331),s(29092)},63003:function(t,e,s){s(85331)},64752:function(t,e,s){s(85331),s(38736),s(18785)},70415:function(t,e,s){s(85331),s(73565)},73565:function(t,e,s){s(85331)},91114:function(t,e,s){function i(t){return i="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},i(t)}function n(t,e){if("object"!=i(t)||!t)return t;var s=t[Symbol.toPrimitive];if(void 0!==s){var n=s.call(t,e||"default");if("object"!=i(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"==i(e)?e:e+""}function o(t,e,s){return(e=a(e))in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}s.d(e,{A:function(){return o}})},98642:function(t,e,s){s(85331)}}]); +//# sourceMappingURL=369.df3ca2df.js.map \ No newline at end of file diff --git a/frontend-dist/js/369.df3ca2df.js.gz b/frontend-dist/js/369.df3ca2df.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..e8b632bb59276fd0ffa4c7bd9a2d9f46576ef1be GIT binary patch literal 100294 zcmV(`K-0e;iwFP!000023e>%Md*ZmVIQ;+p6p3#S#}2~5BxG^g;q7&%XL?VjH-_6s zU;&yKo3TU^2KespQzglkfuy_7Ilpb@c{*6TN~Kb%HaRoFc7)9NKsslxV9BuS+_3(X z4z8YzXX%xo>3qh%^2umC>pQ*ZnnOM<`|#wXeNT4#q}jSNn+W&d?W9UFH$t$1Wp_m<{PHk!2}wkuy2V)15D))yg}&ruhz!gxfwkK05J88VR>`*g9x= zXM-#ia)(BXK|+NHoe4{4jf4y7tVkAhoh*Hl@WGYSBYCxqWVg~;otYkY5;ZcCkeH0U zg=%*YxlO|TQOk3kVV24UyJ5;_$uc0%EE@kD>FdLGHyFf{cXBIG<_s>RFP zbH~2Uxqx(UMY=eImse&8lyu!=sfnGCu7lq_JpqJ^n9|fCIl%#6fAw7HKY(r|mkIlg z%{`9exI2JE$UWHuTltkIuInWauK57uq=mP;4@M6U1q(u0Yq!e(`A zwe=KLa_dxWwCFfAg-+va)=yX?=cBQ7!fIl|hH?uWdR~tlc`MjaakNP3goVzvZl^SjS^Sa5avb6?3*-yC3taP}3xXhU24kAb2JQp1SfL~A(feX9B%55Ak(qX8 z(9m_+ z`)EaM>QmN{V_rem#SJbpCRh8ZJJVZdrE)45QK?hO(Nz|!)r#CuIT(iv=K&8+Qa{NC zG+~bGEwI*ul-r@kB^T1y2bplIrHp#BpdVNwEN#xL(%p4;9Y&aB5;`H>OQyAnR&yqx?Rx7gg?r0ou>C0-CY#F&A zn|K(dfIitQl`J;sQo#W7omfaThR`^EcFj@=!(=JTT_k zXLHwE=r$BEzq^?g8ArlB4qAtS;iZu08T*esHzwV#le07is+9Cd*ZKNY46-SE5j(^I zYTmeRw2p(5X8SaDdOgLb&7uLB0a?VliluPU&DXOia&|V8cdMB^N-~n0&5=Yy{}GArXZ6T9 z8u{;!$sn5g{V(J;nthY`n^X>QJm3mO7c;JoJj980maT79Oo%>*FKHjixnvVX(Vf)> zOER}Aj>#hCg7y;@hqJv zdiL0`F{cOI@JhIche2?N7r%obXsXSB9SQgJ6w|-L&OT@!ono2xakF{qdE^RGk53NU zO-MaDJ!-ds03sDQIaOq!bp({*38V$>qX6%ehwb2?SGr$?S{>rJpJ&8f_wyI1Qq9+k99 z52~T?-&v6d>xEx#7DfinS&?NcCks8BNSGKUZ${EV_il#G~ynx1QwJnLog$_5- zVUxV|NVogM|1~4_1ju#9?pO~o6J0Mez>Nbj^%#U+A)WoYS#nO1A3~Wg#!Bc$* zhq=$ii}XEwxLDY;C4dajMIFvh>D&~srFAi#zZv4FJrV@ug|!epZ>3JL_tDAGA#0as z-AA}VYx#r{WVzDwr!>YnxGmx|9dA_>e_R&-=YxgxM@&ASCCO(-bJtrn9xOh(n5fX# zs|R)>kUbDD{IhKDHMGZvt|PE-XE%yq@v`BLxr6TjR#+EtAYZQMPe8=s?*EVbN4z*( zdELf-4}J!uwf6B~-@`jS+tQwhUe6|dmg6Dj5ng__dR`+SX_;`)^9YSncC&-C5QLM| z9Qr%73Wwb&63ZpE;IJD-T&E}?>_$=AfsuqR^#zl^WV2kjO@jY>gjyi~8@Q2TjfxSh z!JbsW&PbqynSUB#Ce%UHdSduNBhW05J}squl;?C_$SCnP12QoXu!yj0L@d^cNk9S# zDBLr`Oe0@0qcwn%TjmNEvS~u+FpqG3Ryq&o71~oIakVD5gDYXY4#esy=fDwMq5j|1Mo|UoSGle4s$W!r`Zjm*UA1)us9R;8 zzN>b%3N%t4so&K=S==FuIidg*ws1nV7=Co^41^a@7jH!>M^@2k_nuC5jf)wGFuq;x zRrY=5E@$k!%6(MQwQsjKo_$xj=Q;nbau-xOUT;P0b9KvRbvIUE1M@p8XT$uwG7SVa^ ziZb248dh7d^6{c$x1#ba+8ONz`T*q-TQ0>JuhlkiAmZx>)H+aA2@Q2`MK*c;5;y;L ze-Jwxfq{}WB>BxD*++~TQOS(|8>9J8494R9kY(CkTf*hCvTDoa?)tiUHaWJiN3LPb zHgs7-5XZs$q`Qe4O|N9u9DpakQZMXopki+mzq`%e+8}{t+Zbk9t{7=qu8P50 z?4M00Tq>TM6}lz+Ze6bWYj>?Xpn-NGfLQ5|mdk?QELcrooe7U%qk^f%!-#jfg79A0 z>t+t;|#EcbigtUe7d(@opodSdE`I>lDlJ>-us`^K6teAu8bh zVu9P_7tKqynK>O(f#=1xJT+5_xm z)F86;Mp&L_c?AM_IZlg`@ULTYyAZDWx6MCfw>(w;Bc<#R zTf-s+ip;`j(Stc>}cC9W5A>r^?OP(-E;fN>)cJ&L6E#6PwpMy z#r6R{-#WljTz<*^1>G=-qu>0C78ysM{4ZlNh(7tR-jP}K7nw#k{?!*S_bKYXuKh>00vffQcdMd5Zz!JMZKQ1H`(!3* z(g4Va`)zu2f5_xuj0PJo(qRUwt!m1eZmaD1=WW_9V8#1Lf3~QVe%)x}%bFE481pFO zS0AVF9B1IIDgCgjlx5va*;vDHt$H0_W-rmEQY%cnErDx_*C z-r7iBX+(?j9*wel8|mF+c3wqSWf<1DX1U;1EA(xq3)z&V?^(jAU;^;f{=O4ilkH29 z#jMfKX*w8hU66QlLB{tih?>U-J&mo997y6^J9P_n^{lrQo_!lFKX7)VOcRo9R3hi* zRHmC#8EqyFHQ=jc9(w{$3ja<&B%%JtUmE=Z`uN8Cf@ArxgReH6TyP{IH4cx4a z2jiP=TVTMuw|sEL@(*0_e!}it>eBe8TNtmToRnaR&#p0h8-wrh;ci> zoD#5sRktulZMW$Zipi|e&*C|xt-jM7cy6Qo>@JAl5buOUX>wJC1l9rw6y{mR>guvm zL}gm0pp_Lgl^x3#ce9id;B0Q`TS>amt1w;C&OI#MR~s5bvH*T5%8ou?Ps??PRP>?25L6S)??>t^FX=TIs`GM zIYXQ4A0CF@{ZBaBU>Z-VyH9?GOZFFmVms5SUbv|0z`+s)3O{wF!|SMqzV253ugH%tCV{)i#l zU3fsW*Y9_Dl#;4o34KT_yr{Ovs}>t%Nw(=5yMS9XoZ2b4K#Z8g<$D5UU4aG_%8Yaq z!yZ_$TQ`_gC0smeAM5y1lZY;d- z|4VcNYO0^#Ln>Z;gH(VG)(_E%H~)v|#QROie%wwcU`qcAm^y4O z*KeD+^m#Ms-PS!OGgPqs=pIwo`B#*KSed2+b{DDmS&}ZeAHB`90TY6!qx?4l2nLjNC_EwAF{ZbWRtwVWt>61lSBK$@R z1k8f7E7rgph7$%Y;)ro}qm(}3?xu#IkB&|SC9(7pTLfzipu1%N+F|Ux*}2d7owM&c zMc`uS>{KK(cXzqDDeBG+fRJphg*boLFp=0OrGOy_YApNT91XU+b%XZE(IK1)(Av8L z&vhJ9P`HhmuH${q1{qj1l!wb&Gr13{k_pm6K4I?}xaHlA^?I+d`-Gu)4DGI-?ig9` zjs?)_pZj(tW#oQf>o(AHVmn~9084o_#Bikq>+OW{6zR( z3dmMrY_i#6e8-~U=mh}hlCuec?{pf?;+=n#ZwNKR0?wm`^#e@rifciH?dxIns z?0y9Q1{*!Iv3Cxh$7^2b1yuSop2XT&z3PoFv+4J_qOYwpNQZbj3NzC>2C^{@@>SNO zf(Kamg%#$g&{xZJM`!;ikpUa%ZylZGFgtg^2b90wUBFWgr zl@uDTIV%25=?`3{XfS{ea5(=W!fi*n^0H~)P*ZlpgaoK8mv(xV#5(;xhGB#! z{I=FQ-x3mRF$&UFyv8g>HD)WwPZaW^H=iTYzGgRo3TnvFk99&vhyZsL ztkrfiAHa(Tu;@B^2)*r$%B`7+$Ooab4-?sU>f77)d0clo;71hEc*0YM47miI{59~+ zYi330umcmvafGaUq$Yl(C$2UZP6tc4W}u!O0t9WBJP%!XKk%4k|DmblLS93IdMSf{ z4FKCGjZV*Sg-Eh&ivE!^nJHRfL*!UNvSh&DSue1a;tN(U+nxJ@*9 z&A!9rW^0E~>O#`Vw2)eEvd}+HlBx!lcM=!XSjGCrnBN57Lte_ke1p7L1vmDX9>l*) zUdp!rJ@Rs@W`26-X3_)wLGtpiP5np6%Y6X&x5!JNtp|hVcf;hcNxpuAz+C;u2+Ykr z1O}MkA15)4<_Z5Mk$JL7WG?O?GS=FBi^x=#aT}3&{yjuyYlq)KWVR);rF93LIFFp3uVTB(p*C+!0j7whC$dt)6Qx3O@$ z*-~YKqtg>r>)=3T9Ue7Rt>g9));c{oZUxHM>n(#wfX(C6V~;##(IS5qIxYX$KLAG# zh5@>ofeOZT8bE|E@c3%A4o^<8>4Wz1sdx5Y`+K|pwX?VL|6R@UtAy>N`eo<3=^yxq zkUo}jD#HE!5trjxA3W^#?UMhUGa64AlynE)POI5E-1&8Obwzi6o8?z5p^&3372};* zirzzGw)5)6<<3h!V5xw*`~Ou~F+Z|h>}1_4Nu9VFlds;VGxif zpmBH_1_$I>7#x!4VbCTNa{G`wfZP~z8RQPbpuHk*Sk(1>-)RP|gTwaG@yY3<$4{O< zd+zkedj|CF4eJK&n(UE}=F@E*Hfz#5KR@i%i`>VUTV_R3x)Ua+q0 z2E85`RZ?2L9_d$74thO8L)CyuJM8tK%ql#F$SAeisS1$dVh5(>hYt^zMVq70G*%=Z zVpsUHZ6zOJf2Y_VCLCLtC%R+LBTOU0p9;Yt=IFy#yWIiMgpN}J>z5K((QEkKdC$U+ zWdxIs^WRQg0l%(5Usr&y|A}xX%nMbhE#2c^EZYAccPtXxS&nb|%dxoj{&4>gdv3Q; z_t_tDukN{>FlHmK)BQt`Ufs(0X*0#`gd2(OPhQ9C{2})K@E+`!bNR$fVEMvbf3Mig zf&>i#uE;LKf9i7opy~Y-w7lqCH2B`;_D>rJFU7j*k^jovPmHLvvX~T`#XfHqV_S;-wpmPw z@;q_nPX|ZM`T-#8!BMj;#D%?9e=(okvVkiVwh6*v`6@xD&OnT(h@Zh4(px^-0judVRu1Q|#jKy`4%!=eM zO#dQ_JQT1Nqfo$V^h42Y0V(CHa-OMBv8R9wP>GvaOv}})xB6h`kgl%k`2o=GBN53;2lPgs}TRpFgAw`jL{}V{6`(PnfWaq(x zuYQ6*srvIw9f2$FpCJ_6Qp)?MCeN9O7Pp{Q&95Bt1-z3Xo*wxON-Kwa3Y~s3bI8Zg z8RZW70Iw;;d^T~&@1Y|=R^X6Fp~IL%E<-0v9C8slU|RDybaLvDC!qs{Mh%>Tk+b}-S;mD!o`uesJLGNXgbqy{@*3=Q9P$d3Sq^y_I&+pJnM0n3 z4oe;K8`!5iJf&FF;Y?^);^4~N6}&>{5i*=KA43-lQuLEZMS9S2mFPRLT6WZ#tmP7h) zZ{U8_ZqXKXNPm_m^P4P-0SNt*lVgVr=qm}e+rv{vn-2Mn=JNAQ=z%sNB^z9VwYL+u zj!pySkio?p=Pg=rw<`6dj~}DUSLxe0bowVJM@>lh2$x-Y3jag)=jYHNjPQ2!+0MBd(<>f2 z{kVU81ob9#^juPCx7oy&FZngY>h1PXzXc<>KrMkY9G(oY!HdDOICM@=4_bqPLvBCE zsy5~cfPLt&)6=743g5qATPMT*-~`(G9j0@5au8!*zvHM|!^7brX5vtb&vy*`sN=vP zw|e1D51Y;Sz#;LY>GVB9FgQF_-{NWxP4^LKF`r<|N2l;Veq+k<)L%e-0TY7jHDq4u^EubjUFKEab;WY3Q_CCw(k4`%Q4f<0iH;qVGljB7>EL z{~a$PSkc7T_S46#{e(0j4`F{R?{Ik>XRn??+^t!gzM<@^OrZFL*wBPmINnb zijA|B&0pQVPJCiE=~5>^^2f3WD`(a|7=fqsB) z0gNBi=IhgT8>ahVI?Jc8L+AA1xEc2y@UI_2Jip@QrHd9fUo#* zKXi`zC#-egkb)Y~Hss^yXWUYUDggl$)8l4*;zy5Nr*rv!~W?Beghcj zkTC$#^bIQj5%-UqKwqYGO6TkXkiQyqVJZd_`Yz=nO zZy&>_7_%fn{B8qW1b?2=(4ozCs};j%a?SG488qR4hgds_^&NtEcSPH`_w}x7o-|>@ z>P@A;M4H`b5=$LoA?WaU2xh}-#~mJ>w1AXJAQW+{e+Z;WvNsA(93r0y`8ssslm0M1 zafr+&RAxv44-StVf@t1k&A90heUvbE(t>II`ilfyj#>Y}AqBlhLIhu8l3i)m14y0O z@URRoZxk9)+~W32W_GB<#fq?s0e&uk`K%a@3&qaE1qhw}@e;|S<{5v;j0lC->)ry= zvnY>Pm-qBVQkVj8pQMrKrts1l7|x(wflEmyy0qt=(P&C@!Cs`&%|$os5fCNHZr+Q! z^!z+Hs=-B&o}ZuK4-mA_-pVk-D;Qra$~lgazm7q+5{n3COk$xPY?)H9FO9l7>}s!! z(iV%ZvOB$D`4b9n{PYZ~&1$tpj{f~*gih0>kFKJGhKKl0nRZTq8wv_qG*3Mc(fONIIhtsJ%NV z+6*6PDWwro7T2yif`hBu8A&6&!4Uyn)bPFn4G3&N=*phD7}n7D60$jF^CCMn+3I?j zVs=_&!;OuMLQeW&N@z$|)=h0HY>6&}V>GuUSOynDHRpH(lKx2l?XT8vO8KaNM@jFW zMvyuZAbpe%Bfr@^2o9PjouK8Pw)SKg_|0}(iE^gd4G3WNTmGTffMhZ(s~t8E+a0-& z)xx5xyxfP}4bCHKlG73S`-6RzEb~Q|^5$Z^(lR3rl$ zAw^*<>(dDI0uWsrG(#-HVXt)#zS+7Y^C`-5i!onYc<=nUf(bQM}R-5yCAr5zHa6 zR&zy!QupN&Y4UQ31J$t)zviR9c{}UtHBERN?e2=zh{+xNS__=4ieNVEP_;x7L1kJi zg(GU~M|xX(M6QIcXJRvA?>OdFKI$9e{w+OrrgjfTs6A%4_tp7@ZL1@a`|8kb{Y?0+ z!eF&`OcYHln2-7>70pL|E#Nf|o+?4B-wqkcqShX51SF4yPaE8)B#B%%+smUUY6P7u zbhCQy?Ylue+si!&RlnalOQWEX5aH)YijzIz=k;`t`+41O6XB1FqeuayA#>CbIslo*G~D zh`Ij3oo2q_*p)(G|la@+7pN<3C^uqE`C(wdBV4W=P_^3nd8Ntw zZnGfo`e>ZynaqIH`!ZAH3SJ65zCI0j z=b~0K4eqEBVEu0nrfl`n)>XiJLw%->Kz&>-mz9%Ey=CFmYFs?$DVNNx+pWE=atzpb zM~2p6`?ONRfn^`^l*M+R9TrNx&aZ?~wOVJRDF?4lvNRSSxg5LBPmb5Yi_r5VqwuIF z=s3c<+-Ky`zuC$j3+u8(s0S6EtX6YOj@>MR+AH-9(`hny1+kS=FGZ>C!XpSSiEz0< zH1zn;rG=)Qa1ZW?X+#^rS$YmP#74toYC#2&a63%BGnNRpqYAfeXXz1m&ZcJq~>*dnSX1BcfnXMGy-B?6TJeBp;S3Klr z^|}C1q>=239)X*c=#kV1dm+IjdSmQH5v?RFm#MNe!W{L;b%yhJ7eV*xXK|jf@`7HP zsaRXJ5kyf0k*0BvfBotZr`YZ44M)SDIz2W2H^a)le_`PsEYR=P%nKDF>q>yQ=*r&N zbK$05t@d2F)a$%a%0TXgPy{Amzc%w`-W3xQC~5Qgw82eSV#J*(GqoI@7zZr&r%V&-{ZNzc<6Tc^-UFyj@i@Tf`B zsFcQFgWRJoiee5FLs5!QVNu)Et+!mJ2PU9#NOShAB1cbLcPQ3@^<1tI<856A29h!{!t3XZUY$ue8G&AuD_6Gur(U`u zsJ`ejFdxOg(cgfo<)A8?=9h|uq`V~hGW#7u3@g!BUFtap2K;}aadT2KQDB=ol3*jpl{Ih-con$k?W>a+ohA}Lc4uS5tPLN+k^s}hH6Xc6|Da(KR=HkWWix1DfzIgro z#p@TBpNZtrJFy>}Gzr6BEh6ymA>kaG**_pDS8XTRC} z)atb0PrK6&gTmw@-Lr<0REE+8380$VU%52WN3JEu!5M!jP-HBB;!zYeQ37K2ll~?5 zxrM=C_19bquU6C9V726nESIjaVrwwZpJr3HA{L3cg&JZ$>1RomF|XwuZ2aYI=11-N176+f z)nzsSYOseeUQuV~_FZ6B;8G#NH{yFVqp}VRjuLv=GQ0CG;abPkm3W$iBXE$T;0kEO6 z$Gm-@Fw$dtQP3o!Uf)8WCu?wJ{%r$J6do~u-jM#Bq!tQ`JyGX-Tp_YHJfo7PEteBf zzJK?y;kWnRfprtDM?VXXEYRH^-e2PC{t>3OV3b!5;Ig}7hni8fytQ{ z!LJy8r40%XqT{cufK3`j5nV3fPqtk0T8*k-`FT>S#Sh2j5Wa3DfQVznvhS1j^sj78 z!Uh@#t>dE;0{s!YX|z6sQHT5WF5hCO+8}au_HUekeThoR@a)rs1N%c_b_m#ATJ1R4Is> z9DkT%e*gwvubU~K11!5~Bj}wAFKsjmE7J4ka+y9fjdTppfy|=0J-_8q*8!Rj*Mn^8 zK;#=fl<;>7r5)nTQk7&qUHw#V2kC#+@|;fj(@(gNEM>Xo;+PkjSXqj>F&wEYiDN3^ zTj=SKk7gK00$w&___VS53dps3`>bdiE()uaN8WPq9(hIwW0w^xCL-r+mZGz5{TJZY z;M9c$ylWinySfLLXI5@puCMGM|02v1G;V=}86z;KTN$~o=qY|wb+YnE3J<{9yYST- zO)WdZYm!*MF zHDf|PO1X;G@;s*#wz8#wFS#X|04|G11xvhBwC?+U3S=oIe7SUawA&;PxVl`ao(M`E zIlhFYF$9f&JzHt_!R~8YABB1I4(qrmF9*k`Y$jc_ArLBvIeY{5at~b2Ep!A{&k(q0 z9Ip@R5n%vZ$HBL&!M-!r3F>`k^LB|tezz!>U6WarM2H6N`z`XKLPE<8Qgo!6KdacU z7cZr#)^uATv+f>m_=ab}nz)3}h@aub=PU55EY?LA`~tKEVMeaikDPo(hA7M@S>tKMLjT9d|?tZ3I5u(%GILdr_%LQ3Xcp47Kgx-cTGU4e{g`MFPlFY|w z6=e`r?sviR$G}Ai7bQkhWWFr!?}EDt8IytMCm9hP9$s*lkukyAZ}}}to@Y6R^mPXw z6!J)1>LQZjBAwO)&(9geW@oPF4|%F$k^uSH1z~qL$Kiu9c-pWP#L`=((N~W40K5@+ zD?W5bo|d5(<#3!D0yA*0^T)g%5YcJgGvb+7l*HM`C6O>AmyO^Xqm^}gw9H%42>Fqe zaIcZBP;5yf-bnSeeu20frUajT0c(a*K2y@E#jQdTM&{~=AYW12gz=X}$N^>2XmJax ztyuJ1SaQXc&mmP{>Ksx9q^^)A^HNf1HyEX)Pz=zB`_L|4+9y0+F5#Qrs&9G=-*c5O zO#WQuV@GCFRWJeR)n@yczHP zEcS&*Uh_52Jyop{fHU0ID)oT;&7%bbfre*yLB0g~oEPc48IAFKPo=z>Nt4u&Fp8F^ zOIkUu+>iXW_b}-A?LE0CL%0&S4O5{Jm^x2peLm35mmL(TYLbvu56WJw>}ofAGK7Ah zR!h|?2KR0T2xdB}%tfU)+_JMhS&q;yv)P}STG{2E1(A0%p4y$--Rc~>)9Ng(BAdN# z%(Ob&3!XBl8YrY0WCCu4+%w&q`~nloTKdb(LRFf=gGgqKYeTAO)429oJFkK4pQC?UC7 z?)64F1x8iUX7l_YXn`-8f7mtzX&uOqIe-pnN9ecfetYjVSHM)xQM&!dbZ}+29Qeo0 zpnX#C4tsLXby*!i)?m8Uo0+`7TCo{S)jIR)!K$2+sjg)oYn9D1sLq4B3!)Fd-D-Pk z6nlQVx@$HHL4U1sj@b-^6}XT7=DwK%ro!SDYoe2^c^&)hBZPFzKQ2Hm9|rrP!*KV? zhb{b#Q})~Y0($q4+mHdDI;-WkOy23iaXU1rM`iNK;lXj+hEXwUv!r_LW{y~ zQhTQEw=L%GPa}N-{phBk&{i@SVW7LNBj0&K(`zc;QYl%UD$V$Ext9BLPGinerT8{# zv)#ZF+S}rdKQ-DK+ZO9)^VhxQ{KBTfZ+pJB+VBI-M0>L<_>ZCSst_e zBgUR34vcjs;Kc@(;yXM&@*9-av6OY`C+4dNrL0n{JNjoFtn>wwu0zeO$AM5-5FA6< zHjsFxqAZ31JAjpjU|f!Uf;nWEn!<2DGruv~hW;(H;unPX(xz2lLKtJn-#)93;H!y; z0XOTfcr7*e?5`?BFn+?NB}+{NQ%4&!Wa*P^GKK4>Ng1a23p=dNR*4moEEl1UJf^`o zRabw`MEDzra37#`C<vst_X`+;u1NQEjB!dr`}pIv+JwJjvZn*xguj8v+ZqyHU0OsXb?y- zdx$!4j4$PCwX)Tn?`+&m=sd&tbr87aEsZfC+-{Rh_0NUOreTxd6%wp9Gbyu4*d%bZ zgrS>F^)p9d!z(&1H^Hy^n$03+>5N4r>%U&SdF?Ax4?YC1VXe9R8J~-HOR2NEI1mSEfDXO8ng_hMqnFu$w|T7Tsz2++|^&{|a8+|p=)@+Dh$c%cnr9H%Z3 zL0JwbZlNSb-bmjroTgIK@De>|wfz|+>p zp?Sng6ou&3)Zl;2J7@ycE>953Yn>IgjAda*}u}l4K*Ab2*-T*Xn@&7!{HL5}L-#rQE+?UufbI1f)d{ zNSg#r612f!W01^Z1_EvXxqq@J3TayEYjn}JTp$n9e3#>_tP>cQqY!wp!e+Vyo&{=U z8{mMTeum}G1}hNbY+a2iyz?li)#PpzS+fDXoGT*PsHAyBtkCN_jTQ>F63DPjtwE-# zMJwEVBgtJ2nJm6=ajd=P)n4g(VB^yW>9=82DTMj;!LE}<#-fHq$u;KCF9P!+Y}l=($ln2E=9nTaH} zoWhEzse*_fPm^9VqaD0=b@pShpQD1M1&x^dT+K( z6Shb3)ozjr$G};-y$cMGuV&V?Qq**;&JKt*av#^8r?WgP=G<87()KhI{8X*~2bIu*QG@pGdjU|6-F&BtvNSD8OhK|Swv$4E+^#cZD{ z16F0ZcBPLpGi{{PXTvOK4ye_u8FUDM2dh-GbcP>8IcttzHg^Z?oSMW_D#oTT!0_=# zYHWV5woG7+;Zl>@R?sZaVx6m8TU^s?Wg;6x-%_XGJ!rbs-Y?slT++5YEu0UEARarV zB?+^vtJbX1#JV+Faf*vB?}2rbvRHyY+s3fXU@b|j49lh^ECaJXJ!m*i%$MUpz%K3l z5~o$?7gQ9&Sz7Rxk-05E>e>}1Qkzmc5c+}V=wc=M-&JIwGXMMN=t!q%A-(`lOqIZ{ z`GBEZ`aKK<-NiJ!G)<@k$^-o0)3tK0_NieBMr$q`WY_rFRhChc>>73<{zjfw8%GgG zX0yRq=~46tmhGul;5FxHF{Bfo%tPlNzp&(*Nj{)Eui1?KgY1+k@bM_;H2DYF5fmSI z&-qY?pAT9(8ncrE1x*}0$bMnSIR}1=+^C;`0ebvnh$mUh2EQJ!Er>p>{^H<}R?YM5 zYSsc(s+8$=@y&t*s|aqrN4H!=a81@pl4;g0!eXn1fzaYZfPIVe)v2?sns|;8gcjYb7pea%n{N`BTGb;5T%1`%ffDKgqYd$zcOtlFgL9&GI9L&(V5D1! zBwkvzQWaQGONlRWLZH$G{&k$<1u;(D#r>x#zSF*TuqYCu&K%qtp?$hpXz#3u^%YjS zS{J0OR;2rxlXsk?Y0o-w29|mpOzuIwrc6ckZ$*T>4q$xo6ZOcb|MIE_0LD-w12R+RebhWl9_D8W#ETocgGh9f z9x2?C2Fs;(RvIjq7Xoy`+C^cYd^X~!NygE@bPzurpT+gMH;V?{*lK51v@^qYW?-0@ zMYvQdEWyn4ly0?>I`Gbz1bP`j^q)ZzWy--&Nb-3bA0 zz%E7&^y1z7%iwEkZ%E84CV;H4=S2hHnvmAsn6&m1-PCGQj|8`2DV@-Ul9_Ti^eO=L z_J$RJ!S}54UDhk{NWsdpR~|uBNkQP)DGDt2fC7asICN_|nE1bWGR4q~jk7U5JsErW zz?l7CJ5YikCI1hA5we^x(};inu&nO0jqWq--fkMjKw())9RgMAwE-Glp=v|B!QCL- zg3K!kZ!0HwSX;{2^CnmZs;5C++jeulCMVfJ8+E@;(0>&w-Gbbg4P`^%*F)x`_NtDb z^KY#ZhPFwD%qtqcDa0$vo=IAQ+WT11YGAaAK9 ziqObz6z%TvPEm^K&caIf(9+q)fGn?twCccm&m;i8e{+^UndOLSyu~EV+C2g?QtM+tU-M`kTaT~)htg(kF(pCfZln;>Ra;O!xkV(B(_z2 zBtTg};z(?(3Xc;*_BdJ_ZpTgPF&HMtXNDRmfLg%a*q?>cCrbSo-lN5(!Ib5)Rg%Gs zjIGT8M?kp0kgKmPBKhq+t%d+8 z6FdUwUg;Gv)?TklE^ejD*x}A=FI+XVSQf<27y(1!Ua7JT9Jl8Z+!Bx&!wh*{yScil zUkYd|cWEp7hQ0EO+fa~s$jMEZl5t3hy0?YdDgr!EOfEc9KE++at>5LZ0G;T_JAv;p zm9&uXI&Eb7+<=lL-)yID6eE?7cY-j!)^a^9DySXG>$GfqOXgZi^@~9$yY&vtT;Ch4 zF55P#l_JFY*(8n4AzM&1N}jhVJh7le>r3~KxbAksKm0%9y4UgC>FttDmJl`Y!9ICv zm*kQre6R%HQx2c$nB`n9XQ^Ov>1O=|B4oQejZU}OIPIx_@tFp%5_<5}8VPX0G6dq; z!$tLNs&2AkxiqqW@JE9)L!Wtp-`Znm=3X1sF%G+ckZ22JwWhaDSSp|(Ke zS6q^DN7*yJV~BB}FT}Pt^s&W((p@Pj1~}W)?g=!}C?bUl5;Q$y7NzRr zS;y30?~H>7x8u~g!NR8y{sUJiOPCLje7gU5kz(|<9T>|FR@?#Y3mb(9B z=O5spr^J!v>jXw0_OujB6K3Sowr1;9>SCEPi7=b6g4zM~V?wLPxKV^*wHs6A#uP`u zfUQj7@Tm`}Xpp+_jE5B@CEXIBhvd<&3gn_ZlnOsih>-(fT`&|0hT2h+)^BALA8dQX zASjbX8SJGz+6}z2wy4!EAZCdw&=o(K^Ru^JGArb4uzYYzg7ey7%s_E~MJ<8ro2tMS zot-#3JEhI6Yur%=H-;0k?an4d+r z2w9*+pOX{b+AER(_BVfDdVL>ad%u}Y+P)60SYrkhhP=@$-7xp!H@TQ}heQRRZ zycxRNTC($TNmm3SnArVt2tQbw$3er{P5PUPw^S*l^?mCKg|EPZ(Gf#-(0oLxTOKfI zQ-P6Hh2;o~VBKw2>|7tGn~KqejUxep@JzRJKoK1^C1m8QnDude(GN`mqG&f-@-;3X zD8kp!JojK8PfX?L-0HMMs8pr==YlOE0|6nm%~VlY6BN(!+0~B)XyeC?0AgvHy@Uil= z5dt>i#0L2qioI6!Zei54PcBT9ijtO|{Fl_S=KZe7S}-CN`>2Sk2JR-FMKnq? zV0Vp}*y`)Q)(%}wA$Un4Qj0>+DoMy-aa8CtZbhv4BwPr|2rsIatAVg{^XL=Ai&$hm2gIO*x9ubplAd#=ETM-3v&;K*ysp~Y(9j^}m)`9Ex zX&js2NlAp!@|R0qEKKgJT?Y)tpD_9a=9xslrfzDEE&?_%iRY2TdXMhMXKF8?neWz6 zU^-A?t;Vg0c&w|Fe=-)_Jspk^th7BV1`pv;F?0}DNQiwKolA^Qe+Gf2tSeRmS1eK1 z{uP~yalU6dOw?oG5GcuNwG4vO0@Ofz3#q zoj(PJu+t>H+^;`ZgpTDbs1E;TZd~th$exbRFA)crSGZz-h6qdrdqxCN_v-D7QL9nK zdc&W>)0?hL?9AOjMd{vJo7ZZ>u7);wo33fUZs8!9Z?ThP%b-zs3h#qT;2-f(2+coe ztmg*nzrd!=h#+*ignDPy;IT=q=DJ%MWx8Ba^@^ukv_eS&U7NZPbL*pdolkE>f_yn# zl8`H>=2<@bJ-*6Hsu(xI6H#S_x7_t5-NMTi%(d&CVQ4Y*<^htsSd}+Tn^ImBK`im0 zO5s9nJ?}@?u6t)2sD=?81a<#TT}ssDb1MR*X62E%q+aJ&#c#v!(7Is?s`%TjAq{uM zW)w?|5P28U7UvPOW`*pqc74^HY$24u2UK-pl+u!IuSUpE>6V}`n^6bL1PKYYGzc7{ z3X-&DHuu%>JdYWIU3nqE#EdCl|D)^lSBC<@D=WS~P9rCGRyuaKHtHl9j#`Cp*84-- z(cm=ls7VrtBK0uAaH4UP*993z3@oWKcuHlFhbfwfGWSp6;%k<1$z5m0>4};chtJ+# zymP`oMsP@SY6u`JVm5)%J$ejX@hLj4CZpHEN$M8AU z=r@S?UQA{Y-!m_PE~YuV=Gjbyi`$U;w~fJ`oB6km)W7w}Jf!|yrOX>CD9lI-2c#-m zpRE^FDY~eI!Q(BP-wqT*3bUvvhoa5Wo_-uP&&CgVBRH$q$6gY}rpy>z=plL<2vxYt zy5k;cl8kyC(H-|9(H+-=UepX>yLZREeJntAy86n?V327g$Q>kK_-dQ#70Y*nZRmce{;tr7 zGob1UDg}CEh#m+tD+W*8WxYlM=Sd2(X^^Fk!g?NmA67M^mbQkwQ6{E72<^&x-={LT#yp-k#F) zrKo#1rCQsYX%)@1Hk+}7VA4BGD3M1j;y!^oQK?<6BkGDzJrDdn(oAM4Q-S#h5Jcuh z@zw^<(pOo`JVaC-SzUWv@{a75VGMito(;m9M(_-80c-j&JFC~Jmq)Todw_)06>uTz z7OP6@0m&LJ@8BaoKV@hS|%pJh7QgJq(s40wHbm9xUS%xNX^;@Mr!PqO3kQad6+J3=syo-88k!P@{RLFVdB z0Bf+Y`Mr=wl5oul+*0Lzl-;B(f2wEgYYWp4oZToxX;S&S-dK%lAv*)^>QKW|a^ zspK6fnoyCqijaC=X@trvh%-^qS~)~TYO~@;Tx}ewixtFP?>G&oE{#XoRbBbE6@S_I7bSTL}dFOrt@jU+e9MV<9 z%Toh_1oEMKLowjJ^d(+6JTHqzo~JW0Si9<4OIvn=9Zqs3DBsUa0T z%ZsGX4T%&iiFOUl7PnzW=3!3y*=?BEwj#7}Ds)l`jzlVGa@D?$;=ppDC zyas=Z+ysrZ?`ET)A@7;`{p|LF|E*Z(E10~aoq!!sPpOo`krkKM@yOyfOvpTpan$2g z^hD7PGQh_qhO+LCmGBA74`vZ+;dL6=u>sT<%J+Fn6mCFty@C|Lc{6Q9nL?*}uFYLW zkfe&&^TPCHaU0q`07+xu?N9fFwj}4ka@zTEW9IFT_JlDn=QbPioUVm}29ziqESU9{ zjId0eYBi*7P?nZF1icGKAUH5}sRnPh1-yyQC|2SONG9es68+Zz1u$PtrIDB)1~`OA zbLwV=2@9d<%E(grQTLP<1+>bwD51U`?JxrUTQ#v)yPUyhwW!Q2svxH8kS~{C@KdXM zQ}{L#;!7l=)-qwlul>Lh4ZYoRB|<_;sK(L>%|{$Ovoe@eTFzRo%^F9N7lri9<@(IA zSP~UDVPS1-COBS2$YH2p`KjEpuS$%#V>7Y!eRmc&B5g)cH;yJ_NYc1(7JL=kQ553_ zRb}C_XQlH_ywAgNgBCj`jxK4*Nya22iERTlu4IpaIF?}YJQCMxyC6}zoE^;a>iB0;qRchE|S=%4Ur zre4nJ?LSGSyvoI&km(WkPERQiLN1qvJVIDt_`<4iDe=&b?vA<*+ZO4zb|pcm~{Nt)_$T zf{f@HI8?sWp^sfhqKhzk@iLDT(SX4M^S+YaYJf&9%v+Sc@^-l3M{9h9=EV#bp-f`- z{|5}kJXhO^O>ZCUmyv}!b$D0P#LFs8s4Rk2ob?insrO98dN`Y;KUXOjuiie4UVdK# zmf1G%2ngvWeXwwzhovbtWCTUJIB#~~FFXljSx9Xmu-GBq&F1RI99$(A%Ah)cRAo@T zB3bl6-DolB{R72C2{_6gP?zG?Br*I3W=jB(c|cvbtd}909#9wD-HO0M&n%>}*yF{m zTV9N1UDjDcpwboT7u+#eBv+)cfwmsEumcrK6VA92N?9eX$nD!?w)QA$gRRiA?0J^I zl=(*9YDIpho1v~3w{{@w>NvL!5(;hUy?#&cD?1v{i*?z7>^!4NN%K3kO;X=f1qNqM zA~D(r+{1F2IEsq9qM&%%aEwP?v3WUhVh-L699^R;`EPTc@CkN0{Ww%L_i7<6pZCDrNNJqi?>fa#@emSnw(=_rps zM4v^U$s5Mf@S2lBHi7$MIOjy!aDvU+EnkI2p_{T$`7n!B819qS#(Yd&9sgJomc}8| zQILg--p92$T)HZ7PM7{ksPaFVl5lr!$a>)Y1dqiui;9*VLiHS7=-7F4>_vrOh9>DM z5~P?|dwxCYq7OpR%}QjyH2S~XIS5;B8-l+$y9-p)pMOv`%318yTp<&Gg`=tEgBRGBOWz4atP`$s9t| z-(q|V&7@qTv0UP&q)&!ktp=MShcAzO#VokM zesxPJ^OI;yE~4?-lZVmZtX_ZOO(NEP0%EEOO3{`}cNoR)1Q%zx8%6zE&7DVyJ5-`h zZP0OBt6ly7#Jy{C+eWr7{8uDa!U4=CMS0iEIR{jmmDq8T$;}gc_MQxjr411+vd0j> zL4y(%694_JwN_sNP;!#9-}A*58;wR^SFh`{@Uq`?>d7q_&R!?)t<`Zq96n%;wKh@P zBe2Kmd2ObLPC{v?DUS72#OytP&2IQ@+_r}9hr<)CuAXRh?WGlKaSWJZ0Fceri1X1> zsMs8MfnMd;G?L&rT2nkXCZ0&GxkzIpOeT;bylW%!q(SSxNf2Hebc5%S@8O3x{y)d;TxICMQnQ6Y zLoHZNX+20=FGiQM@`@`|*gN&kqWrvA&XnF~K)uWDJU818^E9M1ZMsY1bLv!7jxXcS z3rzwcJvaxn27JFn5S=)QDh@&r8R#Mb?zIqq)Py^y8V>tEQTffMp1Vv(N2OOA_Dee@ zK>!DJ8=V`=@?vTI8qUw_$u)e)OnXV6Z}>N$N~TPW_%fU;>y+>vbYl^|Lj6q}aIdwV z6FIN0%6T;^l8R;YwcA~ue_ukZ4m4Q~hu~*bjBP>hL*Uxhh9IRD-ZQNyeHD4ub8U~IHjBE-o zP&{orz8YQ5c2|522_0uUpG2v}4yx5Kwf=%dKNsLyN|>>l=ndF*nh3VNOj5R;LdG7N z_-F@bFK63JSGM~+XW{BJAl-kB#@cu|+(s+58(*^Z1b6xd4s6Ocylz%kJ1|XkDwt!M zdC;^TqjqS)T_trJ088UFzD~FAH7^hrFb8;NpTQ5WTq7X*PpL@P`D-bQuyI?$yl7?n zlr&c!>Xz#i{PGCx*J&4h?)-8V+)jOR6hL2#cpfR=%^E1HPWQx=mud*kr8)8~%w6zZ zKIgoR#LIjh{jVLN#F9S=RlMO5pyP?htBLFo%bpPyvX?hgMR)Bgh*&B zNUWoSOd-j3F@xBlzmh9FT2W#XJ7fyAF(qz%VpNyyRCw3Wbwc6Iqyk^ctUdjb{}W^{ zjZFu@qp?k32K`0fGKG5b`7|N3$(X3OEmc~LPJ_{JR0g$)bgMcr-MmRp;Zb6wU0Cgk0ukaabpd2bc$3x!0w>JpDHjui&pj(F@|fhW zWOTq!CpFU{g$X!p<6nRi{k|4k2r|(sJNTKnynbV$ucj0eQe9W#wi0U79w-Dqgaewg za3=b4UQvzRHiNjFn4O$D-RN*=YUn;-kM!#`hiRJ>> zrPo0QILhdF&`m)UjM>Q$x&W&Jc*ic)-@$Ypip}to#jT~`ggVr~rTiPuN( zh>4}iblad;Awn}i{#zqSbzi2GSHH z2IeROglgbNDv|A0!er~UHXLw?xi*y%D!p~$;zobUB!UeVxqT`1cUf0Dk8u9%*%smH zYd~yzZuH2B9FOPXiIc0$pmk)b1EZ%SE9uC}80aWy>{cQN?_YWexSHT_z+Um@);lE) z*$6sIth;QZ0|)|Ak^iVD%>`caAZY?CN`BCZ658-FuO@#6@63iFcthJB1=&fCM_FP3 z^#r47hr@3qpwdY%0qk&C(8GB#xs!X$oa?6^NrcIB(dMW|pxcXIsHU0GC770N1mD(O zwNT5M9T|$=Q~%rrkt7-FJQn4`BoH?~=4PoV ztpxv7F6s&Wy*wU&l@m%cp)1ib@r-|NRROLNvz`F1ojC*c4AD;{)d6Dt#2p+>6H9<$ zJ+Dc6(66Dh2N(J$X!f`=L#xU=Fox;&xpbB8q!P;T1T-a4YnxGNW3EH1PxPM}8mIU2 z`DGmDfzaJsxXvv>Suply48oIx`4|^7e?nDzy1Xf}bOtPbcD7>X&FF|1Pt9KGHW7%% zW)t}n=Eob_*bGJ39e(Cy;YhIDxtvgCjK?BtK`0{gPAmB`b=Iq z9ocAvm%~CV0c3}0URj<%Ehl=}?50V;#0t;fAbeJA0T9GpYK?7Ehh9`a^>AfuyYoVS=o|nkZ1?e-bCes`@iv72_ zd{vMqUQIqzo3s+ya9EX2xi|UDB{zb*vEGOxBDuv>;i@4?2GcKhzY^+XTT2A?%_X|s zdmq9ma_=|99kG;$Fet3_*gH)vDCQ(}%uPjnO=UWe^K?;BpwDMuOUzL!{-TbivGdl4 zr+REyCq78a!D@2TT^77V@O^Dh&$w9RM#WjcpT=#6IJX>EYlB;TH5_gx=0=MTn~A=_ zRxD$s*Yd`)X3c6iT-obm9>E9r22WR7Mk|Oo1og1)_y#f^LygS(j(T^bOTN=u90EPj zZy*T`F(qoJ%T}lMSnVbGwqBx(F!oNftaVScc%%e${zbqxD`IZ1|;BQFN)=I zh77lvYis-g3Y#SXeA2zQ_P zNyQqliK&@;-P4q9TJwWgin<;G+W@z(v-~iVMS|_%@(*s`P-?u*`BmqyI+u;yTB2&<9u0Wd1sS7`#- zAN;5t*reJ*9PHzb(c_eS3Nf&zXXRBzHbQwD<0)|mFi*{7MB4+eoK=Ul)7IZJa$`E*OL%@3#(A&eJSSA~` zNFh#Tv$RTmFUbGyiSs+baDI__Iv{schePLsLlwQ~k1~{3(X&xz&E&I#(Esbkf#(3x zvH5Q=xTADQzA;teT3RlD?4wL_3-Csn(LUnJ)u(eaxX5m)Z|NKq$pI{Bbq40qRu6w`_ZevB54T{j}0(NEv+E zq);cZYV{FSfaY&xip<_m&E78wMg)x1lI1+5bn~!F@sAC^DFL$qLe5vA%h1l=qFX+l zZLh%PWb0%UvDhxzVUaHr#TMBT{BCNtBIqC8wc796jPfP$J-}3fn<3jlyl={OAl+^G zeHrao$&hNm{)^!O(OmoN(mc~Q$(rvb*Y{HG(j493;G?Y){PY^XqHT`X9&JP*V)PeI z9~=>>Gm6#}J}$DZEahb{)?3MFH(gZ7LM~fBAxcbNU>5TSOC5k46oebar=FdM3$+{$ zy|y|}8xuOUMp0KQ7LfHw+=n{=I0Mk=j+d~-??4+Zg6z31p>?q!U!dN?9Hz^weV^|Ez&1c{jZ zHL)_*(gOR1x2xj84bp)I37xKOS}3Dj!rU-H6^c%L(xN;0NO5q2a|v~&dWRXmzQWngq5)K)B!~g%<={glMRrz~XFDa(*!(A``KL2#`s_j0 zn{rpvlegH$pUxOSWC@FV@=j8Iz~0Dw;{y-V|L-mqhIGSsPhPQz`3^a>r_FV zYJfS2g-bt&&d5@~Aqn7$l@O31Cih-($_mhKhzYry*iquIw`KKhhJbsM$CHm!OayfD zaS4y*$;UZ7zCZam!~Ab{$^%0KZEZM_HeKSvE%UOmB(mo%*CW9eEr61EK;=$lMG)F(nONV%9>S^+Wnt=gY6C+0i_>{=nv3|J1aw4rv|+%{-o~l+Y%wMEbNpb zS3*?W9Da}yS#S*F+0zzwpIKgpFP4oM4)ql;)mM825-@;qZy<}go`e4Dg1RM|CLpe# zG8R31r*0ioJLzH+YERUQo12}?v!ANJ6-=Tr6`v3&Jo^UxXTVP?I~vq&C~1q)HIX7(rB8776z&+9HVKKtQOdXRiZ~Hw!o?gWLPFP-T8ED!n}euiUuB zSOwRz!D~9f=rx4ENq_+vE5D6e(TS z1?(ft`VH({#tYEKu}v4+YsGeKOHv!30$$Z@b+wy~Myq(sR{-p_Sb@r`TqYUhE1^x5 zgW_NtvqiN`Qe7sf%&NmSO>3oEL)n|5JcdL0gV@5EzLVp85m^RwcE#}1lW-W`#j*pgzjq>a&9@oc2nj*G==$#PJ(cq96k0v$@s zR{o%{u!2H6t{j+-ceow9PCHJTv&VC3m?BMMpLz+X2E2jUVBZ6&=;-ep<6CsE7f5MZ z<1SsYl3O8I`a-aw+RD@nWpz8wHRO#+nO4X#N`?$}a^iD-PK&j8Ta|ZaD%$QlYC)O| zvgoB;ANOMZWBOxK*m!lc=9(UvH{@_wqJtv!nU^f(>ynT`+jB;oAm$U3+HV8_sNi3Q z2|(`By#pM;pI|Nqj#CytkpEiS-s;UMScCLpYRw|jm*KERWjPTI&mv)6GTPiGtN1&# z<}kO25XOTV-&4w5)b^fI1vd=e&9Ks@;g4lhTEgRpgv5s(my6ZXItA<&rJibSd-|ZF zo!Joa@tD1W+zwZw(X?x}LNm(>5X#QCNOW-!{d*y2HN#_5nD9q1oe(S|Psf+D6P@|-Hs-hGPovTLYJ91UWSA)TOP_oAKbJ|$(DIZz)UlYq5shR}CHxOfK)^|MFTYQv7lsdZnnx-hV; zX-A0?Vgmhvoyez7R}vxH8CDmzkp7b#umP3;+?>GbFw3sWQAH8OX6of4Th5H06Od9T z#u+W2rzRXG5wVflq6NpX5|3hh3(W}&|fh(Y}i-uwEy9qmj6e1$kuQ+5?yz1?tO%r{RQs`TF z1{=lbE^*qeBJ*__b;Jo|aKTqzv)r9i%Zf>rKIo+0fMl(&R!H7v%n-aL0b3t>@9Uu^ z^+9)_C)UtYkH9C5AS+v+GiDX;>bpEN#*gt_umbJiT(P2ga!K1jMCD3=SJD{ zQL}c1KJ1FZHBvj}?bQPeQ!YPYT>z6D;QB)4M%qzs)EMV%kZMRwDuIEn0OQViO1V4) zQ0{WZfN0%a1j<1Gw}x*}(%z@FS-{Y#IIulgPu zua(DcP)BQX)5y^C)-op0vDxWftDxTp6GeY6b>BMcgNx9Zpc|x5^V8(*5@y#rsc9nAC{fjR z7?KrZ38_AcE9o{gqPCeT1(V|MTZbpiNdhoS$-C1_tlJ(3E%AP$tOmWDAx z(0m8f3{j!!tQ?Qy8sa$XML8Bra;LAr%vbVyR-#m1#uVx4n<_m1XBOzphQlh7PKWPJ z6p}loCt(-bG$11jgs5xNR_m!f&rN&oo>Z;4SQVqNKDcGpJ)Ed*E?3mKnF_68m{*L3 z>sM=V5?fh>8AlLnz1_!0k_A^QyID6}TPvtv>sy|}q93pkAL zb{O+)5m&1OF+bg)1>&PYFZgOLpm6drwYV z&$KrUUUAb80j|&V1OlwA8+?0K#xG~8-9l$-m~!9#d!c$e+Y6#oIuy4q>bYQ+$lUrerb*9{kmK`a09@_+s1e*tFa za5#p)|2O>|{aa@StsFJ3n9IRAF5}~|Lhpz)ZalS{>QTF)+zj}iRzal@vn!8G&IEl$ z8O__MM{g*~}Rs}CEw`dA2MWBAR>uYsMINAQ(9S-en_Ra%R6 zSv|fJ6(BjLYs!LhlUA-IPNI|-FC;7ZWy}t%&93;Eq!*H5Tnb`(A#&4X3%v$eYn)!Z z^iemuvZaTJ`0|WamUcSf;958H?YFuKO(QwlIZ0!8BW>e2r z=EH>cuA{!;z-WaiyRPJNNr|jH76PHKt-+u$$!c<5LROBM?Q9vpavi6%ZGcM!PBcdK z$}`l4?i6_G9&XYKwTns4Zqn+jB1^ImnvY@fT2$xz5ISF#9h9o~7_;FGHgVr{7rG2m z5d6LD!>h6e4C}R4whWw=HgM)fa~|5*z(%M>&dRnUi{T3VAyNJny`DHS`i~+#*P8P4YqTe2xXFG_7IcK5C#x_LJG&iXduOP*R;sp7_BsVZWiLG%( zNiS@U1j#k*kC;aVABZBuC=A>v@Lpm5hEjNHu^97L+4Y27BsbRK2r)Cf<&SkzcR#wGh@ne zOg83e({NmpnFljm42PIVMJwUH#18zNW^xDoI*Tw|dJ9qd2t8czEP*m=(JS60QM&lD zj5d_1C0@eY1<$|@5XuX`yfY&nKx+5+%6U}tAI;8WHUG6VI-5lQpa&lGX?q`|bJ|=b zXoo~(2L}z>s;f7Q@p*(zgMTakrGLRo2U*7?Yww0e2FV@Z8zKEkYB{M2jHDC~U5kBf@fC&)0r&_m;cHsV|JQLtEmZ2~AQ{EkV zzC7}G(tF}m)ze-Ky-p*))r(=ELHRMnszh`{DoS0^#!z3gzc=L*LePOvxzXQW5-Gk>a>!(}x6${2{ z1(>2+Q2PNrZiUQ-o)8{g4iyx7(+Us^FeS4lN8k`)VL>n+O)KzjWszZrtbD?G1$Gs{ z6<7p8Z)kjb4e_JLBW3-R22tdE>LZC{5d9{>dnm|$be`*oXmW-vj>qvOUZMslG}FG% zUOZf3ga^*Kd2Df%O##ca?VR)4xHK7*Y3rk_-=Wq3XW6bYdXMyhxamD$;-X@MkB0zn zd#UKf9`LulRFSQ{7WG?MDT;*nHiK9Q6Is&leoY|}f!B=P4K^sHFVwTPJ51q%_Jw-7 z{@G6-8s@0p>8^GX`JM4&y;4tG|5V8 zL%fWpY<>wTUpnfl7j>v2YMPUmX5HtzZy{32yLt%$rE z^VP*m$GrxPQV1&M-!1x|Ku%pxz<|WmTTiF}H;X&oO=^1wZuyw3`fjuWQ`tF8dDV7b zZUsNfC3OOSzAY&G0+I#hPC$(R5wy)Igg#1`zb}2_ zad|PdsgOgjr`DZEd2tQHVn1EX`^W{r(o7sl0rB}Z7aF(3Cth={K9@|r$m8TQ{}1Ywd9ys^5?IS+Fc`c95za(5}})%Spa+`l5$*Kyrf-O zj^IzdGfSo@anA|&Uw1zWr@~e`vWz*8ftkU(Lj2YO6H6DdwpVm7LVcExM+JyN#`hL~ zkOQr8K8_ow_WGt|1DQd-+q4>Z%B*ifby!#ZWw0pxB5Z_pZ@6Ugzgcj_C6oVSugUW% z^Kq~Uid7{#9RmFvFo#%{EI>a6h&}^Y1)KJf4M-Rp0CGcXB;a3C$xOgdh?PtZ*SHC< z&4)~{2RfTA^lM$oEIHWUO~bBHgJEAHpw$7p5o=j|QU6m^CDv<<%J1KS%I^#3f305xiq zLI!!Sr{J%@c&Q_7KdHyo@?1QlDGmGFQ|%9R8sJl^;c!$>s^8c7j_&YD S#iZ^{$ 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 {\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(_ctx.$t(item.titleKey)), 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\"])])], 6);\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 expandedWidth: null,\n menuItems: [{\n index: 'status',\n icon: 'chart-bar',\n titleKey: 'sysConfigTabs.systemStatus'\n }, {\n index: 'upload',\n icon: 'cloud-upload',\n titleKey: 'sysConfigTabs.uploadSettings'\n }, {\n index: 'security',\n icon: 'shield',\n titleKey: 'sysConfigTabs.securitySettings'\n }, {\n index: 'page',\n icon: 'pager',\n titleKey: 'sysConfigTabs.pageSettings'\n }, {\n index: 'others',\n icon: 'cog',\n titleKey: 'sysConfigTabs.otherSettings'\n }]\n };\n },\n computed: {\n collapsedWidth() {\n return window.innerWidth <= 768 ? 50 : 56;\n },\n sidebarStyle() {\n if (this.isCollapse) {\n return {\n width: this.collapsedWidth + 'px'\n };\n }\n return this.expandedWidth ? {\n width: this.expandedWidth + 'px'\n } : {};\n }\n },\n watch: {\n '$i18n.locale'() {\n this.$nextTick(() => this.measureWidth());\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 measureWidth() {\n const el = this.$refs.sidebar;\n if (!el) return;\n // Temporarily expand to measure natural content width\n const prevWidth = el.style.width;\n const prevTransition = el.style.transition;\n const wasCollapsed = el.classList.contains('is-collapsed');\n el.style.transition = 'none';\n if (wasCollapsed) {\n el.classList.remove('is-collapsed');\n }\n el.style.width = 'auto';\n // Force reflow to apply changes\n void el.offsetWidth;\n const natural = el.scrollWidth;\n // Restore original state\n el.style.width = prevWidth;\n if (wasCollapsed) {\n el.classList.add('is-collapsed');\n }\n void el.offsetWidth;\n el.style.transition = prevTransition;\n this.expandedWidth = natural;\n }\n },\n mounted() {\n this.checkMobile();\n this.$nextTick(() => this.measureWidth());\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=2718059d&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=2718059d&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-2718059d\"]])\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: _ctx.$t('sysConfig.logout'),\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\", \"content\"])])])]),\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 { vModelText as _vModelText, createElementVNode as _createElementVNode, withDirectives as _withDirectives, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"date-range-calendar\"\n};\nconst _hoisted_2 = {\n class: \"selected-range\"\n};\nconst _hoisted_3 = {\n class: \"selected-range-inputs\"\n};\nconst _hoisted_4 = [\"aria-label\"];\nconst _hoisted_5 = {\n class: \"date-range-separator\"\n};\nconst _hoisted_6 = [\"aria-label\"];\nconst _hoisted_7 = {\n class: \"calendar-header\"\n};\nconst _hoisted_8 = [\"aria-label\"];\nconst _hoisted_9 = {\n class: \"calendar-title\"\n};\nconst _hoisted_10 = [\"aria-label\"];\nconst _hoisted_11 = {\n class: \"calendar-weekdays\"\n};\nconst _hoisted_12 = {\n class: \"calendar-grid\"\n};\nconst _hoisted_13 = [\"onClick\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"div\", _hoisted_3, [_withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.inputStart = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.startDateLabel,\n onChange: _cache[1] || (_cache[1] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_4), [[_vModelText, $data.inputStart, void 0, {\n trim: true\n }]]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString($options.rangeSeparator), 1), _withDirectives(_createElementVNode(\"input\", {\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.inputEnd = $event),\n class: \"date-input\",\n type: \"text\",\n inputmode: \"numeric\",\n \"aria-label\": $options.endDateLabel,\n onChange: _cache[3] || (_cache[3] = (...args) => $options.handleManualInput && $options.handleManualInput(...args))\n }, null, 40, _hoisted_6), [[_vModelText, $data.inputEnd, void 0, {\n trim: true\n }]])])]), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.previousMonthLabel,\n onClick: _cache[4] || (_cache[4] = (...args) => $options.goToPreviousMonth && $options.goToPreviousMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-left\"\n })], 8, _hoisted_8), _createElementVNode(\"div\", _hoisted_9, _toDisplayString($options.monthTitle), 1), _createElementVNode(\"button\", {\n type: \"button\",\n class: \"calendar-nav\",\n \"aria-label\": $options.nextMonthLabel,\n onClick: _cache[5] || (_cache[5] = (...args) => $options.goToNextMonth && $options.goToNextMonth(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"chevron-right\"\n })], 8, _hoisted_10)]), _createElementVNode(\"div\", _hoisted_11, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.weekdayLabels, weekday => {\n return _openBlock(), _createElementBlock(\"span\", {\n key: weekday\n }, _toDisplayString(weekday), 1);\n }), 128))]), _createElementVNode(\"div\", _hoisted_12, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.calendarDays, day => {\n return _openBlock(), _createElementBlock(\"button\", {\n key: day.key,\n type: \"button\",\n class: _normalizeClass([\"calendar-day\", {\n 'is-muted': !day.isCurrentMonth,\n 'is-today': day.isToday,\n 'is-range-start': day.key === $data.draftStart,\n 'is-range-end': day.key === $data.draftEnd,\n 'is-in-range': $options.isInRange(day.key)\n }]),\n onClick: $event => $options.selectDay(day.key)\n }, _toDisplayString(day.dayOfMonth), 11, _hoisted_13);\n }), 128))])]);\n}","const DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateKey(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction parseDateKey(value) {\n if (typeof value !== 'string') return null;\n const match = value.trim().match(/^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})$/);\n if (!match) return null;\n const year = Number(match[1]);\n const month = Number(match[2]) - 1;\n const day = Number(match[3]);\n const date = new Date(year, month, day);\n if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) {\n return null;\n }\n date.setHours(0, 0, 0, 0);\n return date;\n}\nfunction shiftMonth(date, amount) {\n return new Date(date.getFullYear(), date.getMonth() + amount, 1);\n}\nexport default {\n name: 'DateRangeCalendar',\n props: {\n modelValue: {\n type: Array,\n default: () => []\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return {\n displayYear: today.getFullYear(),\n displayMonth: today.getMonth(),\n draftStart: '',\n draftEnd: '',\n inputStart: '',\n inputEnd: '',\n awaitingEnd: false\n };\n },\n computed: {\n previousMonthLabel() {\n return this.$t('dateRangeCalendar.previousMonth');\n },\n nextMonthLabel() {\n return this.$t('dateRangeCalendar.nextMonth');\n },\n startDateLabel() {\n return this.$t('dateRangeCalendar.startDate');\n },\n endDateLabel() {\n return this.$t('dateRangeCalendar.endDate');\n },\n rangeSeparator() {\n return this.$t('dateRangeCalendar.rangeSeparator');\n },\n monthTitle() {\n return this.$t('dateRangeCalendar.monthTitle', {\n year: this.displayYear,\n month: padDatePart(this.displayMonth + 1)\n });\n },\n weekdayLabels() {\n return [this.$t('dateRangeCalendar.weekdaySun'), this.$t('dateRangeCalendar.weekdayMon'), this.$t('dateRangeCalendar.weekdayTue'), this.$t('dateRangeCalendar.weekdayWed'), this.$t('dateRangeCalendar.weekdayThu'), this.$t('dateRangeCalendar.weekdayFri'), this.$t('dateRangeCalendar.weekdaySat')];\n },\n calendarDays() {\n const monthStart = new Date(this.displayYear, this.displayMonth, 1);\n const start = new Date(this.displayYear, this.displayMonth, 1 - monthStart.getDay());\n const todayKey = formatDateKey(new Date());\n return Array.from({\n length: 42\n }, (_, index) => {\n const date = new Date(start.getTime() + index * DAY_MS);\n const key = formatDateKey(date);\n return {\n key,\n dayOfMonth: date.getDate(),\n isCurrentMonth: date.getMonth() === this.displayMonth,\n isToday: key === todayKey\n };\n });\n }\n },\n watch: {\n modelValue: {\n immediate: true,\n handler(value) {\n this.syncFromModel(value);\n }\n }\n },\n methods: {\n syncFromModel(value) {\n const startDate = parseDateKey(value?.[0]);\n const endDate = parseDateKey(value?.[1]);\n this.draftStart = startDate ? formatDateKey(startDate) : '';\n this.draftEnd = endDate ? formatDateKey(endDate) : '';\n this.inputStart = this.draftStart;\n this.inputEnd = this.draftEnd;\n this.awaitingEnd = false;\n const displayDate = startDate || endDate;\n if (displayDate) {\n this.displayYear = displayDate.getFullYear();\n this.displayMonth = displayDate.getMonth();\n }\n },\n goToPreviousMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), -1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n goToNextMonth() {\n const date = shiftMonth(new Date(this.displayYear, this.displayMonth, 1), 1);\n this.displayYear = date.getFullYear();\n this.displayMonth = date.getMonth();\n },\n selectDay(key) {\n if (!this.draftStart || this.draftEnd || !this.awaitingEnd) {\n this.draftStart = key;\n this.draftEnd = '';\n this.inputStart = key;\n this.inputEnd = '';\n this.awaitingEnd = true;\n return;\n }\n const range = key < this.draftStart ? [key, this.draftStart] : [this.draftStart, key];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.commitRange(range);\n },\n handleManualInput() {\n const startDate = parseDateKey(this.inputStart);\n const endDate = parseDateKey(this.inputEnd);\n if (!startDate || !endDate) return;\n const startKey = formatDateKey(startDate);\n const endKey = formatDateKey(endDate);\n const range = startKey <= endKey ? [startKey, endKey] : [endKey, startKey];\n this.draftStart = range[0];\n this.draftEnd = range[1];\n this.inputStart = range[0];\n this.inputEnd = range[1];\n this.awaitingEnd = false;\n this.displayYear = startDate.getFullYear();\n this.displayMonth = startDate.getMonth();\n this.commitRange(range);\n },\n commitRange(range) {\n this.$emit('update:modelValue', range);\n this.$emit('change', range);\n },\n isInRange(key) {\n return Boolean(this.draftStart && this.draftEnd && key > this.draftStart && key < this.draftEnd);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DateRangeCalendar.vue?vue&type=template&id=3bcfcbdb&scoped=true\"\nimport script from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\nexport * from \"./DateRangeCalendar.vue?vue&type=script&lang=js\"\n\nimport \"./DateRangeCalendar.vue?vue&type=style&index=0&id=3bcfcbdb&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-3bcfcbdb\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, withCtx as _withCtx, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, normalizeStyle as _normalizeStyle, 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-title\"\n};\nconst _hoisted_6 = {\n class: \"card-value\"\n};\nconst _hoisted_7 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_8 = {\n class: \"overview-card index-status\"\n};\nconst _hoisted_9 = {\n class: \"card-icon\"\n};\nconst _hoisted_10 = {\n class: \"card-content\"\n};\nconst _hoisted_11 = {\n class: \"card-title\"\n};\nconst _hoisted_12 = {\n class: \"card-value\"\n};\nconst _hoisted_13 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_14 = {\n class: \"card-icon\"\n};\nconst _hoisted_15 = {\n class: \"card-content\"\n};\nconst _hoisted_16 = {\n class: \"card-title\"\n};\nconst _hoisted_17 = {\n class: \"card-value\"\n};\nconst _hoisted_18 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_19 = {\n class: \"charts-section\"\n};\nconst _hoisted_20 = {\n class: \"chart-card trend-chart-card\"\n};\nconst _hoisted_21 = {\n class: \"chart-header trend-chart-header\"\n};\nconst _hoisted_22 = {\n class: \"chart-title\"\n};\nconst _hoisted_23 = {\n class: \"trend-controls\"\n};\nconst _hoisted_24 = {\n class: \"trend-date-panel\"\n};\nconst _hoisted_25 = {\n class: \"chart-content trend-chart-content\"\n};\nconst _hoisted_26 = {\n key: 0,\n class: \"empty-state trend-empty-state\"\n};\nconst _hoisted_27 = {\n key: 1,\n class: \"line-chart-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"chart-card\"\n};\nconst _hoisted_29 = {\n class: \"chart-header\"\n};\nconst _hoisted_30 = {\n class: \"chart-content\"\n};\nconst _hoisted_31 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_33 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_34 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_35 = {\n class: \"center-value\"\n};\nconst _hoisted_36 = {\n class: \"center-label\"\n};\nconst _hoisted_37 = {\n class: \"chart-legend\"\n};\nconst _hoisted_38 = {\n class: \"legend-label\"\n};\nconst _hoisted_39 = {\n class: \"legend-value\"\n};\nconst _hoisted_40 = {\n class: \"legend-percent\"\n};\nconst _hoisted_41 = {\n class: \"chart-card\"\n};\nconst _hoisted_42 = {\n class: \"chart-header\"\n};\nconst _hoisted_43 = {\n class: \"chart-content\"\n};\nconst _hoisted_44 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_45 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_46 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_47 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_48 = {\n class: \"center-value\"\n};\nconst _hoisted_49 = {\n class: \"center-label\"\n};\nconst _hoisted_50 = {\n class: \"chart-legend\"\n};\nconst _hoisted_51 = {\n class: \"legend-label\"\n};\nconst _hoisted_52 = {\n class: \"legend-value\"\n};\nconst _hoisted_53 = {\n class: \"legend-percent\"\n};\nconst _hoisted_54 = {\n class: \"actions-section\"\n};\nconst _hoisted_55 = {\n class: \"action-card\"\n};\nconst _hoisted_56 = {\n class: \"action-header\"\n};\nconst _hoisted_57 = {\n class: \"action-content\"\n};\nconst _hoisted_58 = {\n key: 0,\n class: \"progress-container\"\n};\nconst _hoisted_59 = {\n class: \"progress-header\"\n};\nconst _hoisted_60 = {\n class: \"progress-phase\"\n};\nconst _hoisted_61 = {\n class: \"progress-percentage\"\n};\nconst _hoisted_62 = {\n class: \"progress-details\"\n};\nconst _hoisted_63 = {\n key: 0,\n class: \"progress-count\"\n};\nconst _hoisted_64 = {\n key: 1,\n class: \"progress-time\"\n};\nconst _hoisted_65 = {\n key: 0,\n class: \"progress-message\"\n};\nconst _hoisted_66 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_67 = {\n class: \"error-icon\"\n};\nconst _hoisted_68 = {\n class: \"error-content\"\n};\nconst _hoisted_69 = {\n class: \"error-message\"\n};\nconst _hoisted_70 = {\n key: 0,\n class: \"error-suggestion\"\n};\nconst _hoisted_71 = {\n class: \"error-actions\"\n};\nconst _hoisted_72 = {\n key: 2,\n class: \"action-buttons\"\n};\nconst _hoisted_73 = {\n class: \"restore-section\"\n};\nconst _hoisted_74 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_75 = [\"src\"];\nconst _hoisted_76 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_77 = {\n class: \"file-card-header\"\n};\nconst _hoisted_78 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_79 = {\n class: \"file-name\"\n};\nconst _hoisted_80 = {\n class: \"file-meta\"\n};\nconst _hoisted_81 = [\"src\"];\nconst _hoisted_82 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_83 = {\n class: \"file-card-header warning\"\n};\nconst _hoisted_84 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_85 = {\n class: \"file-name\"\n};\nconst _hoisted_86 = {\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_el_button = _resolveComponent(\"el-button\");\n const _component_el_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_DateRangeCalendar = _resolveComponent(\"DateRangeCalendar\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_Line = _resolveComponent(\"Line\");\n const _component_Doughnut = _resolveComponent(\"Doughnut\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\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, [_createElementVNode(\"div\", _hoisted_5, _toDisplayString(_ctx.$t('sysStatus.totalFiles')), 1), _createElementVNode(\"div\", _hoisted_6, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_7, _toDisplayString(_ctx.$t('sysStatus.clickToRefresh')), 1)])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n })]), _createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(_ctx.$t('sysStatus.indexUpdateTime')), 1), _createElementVNode(\"div\", _hoisted_12, _toDisplayString($options.formatTime($data.indexInfo.lastUpdated)), 1), _createElementVNode(\"div\", _hoisted_13, _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_14, [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\"\n })]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, _toDisplayString(_ctx.$t('sysStatus.systemVersion')), 1), _createElementVNode(\"div\", _hoisted_17, \"v\" + _toDisplayString($data.version), 1), _createElementVNode(\"div\", _hoisted_18, _toDisplayString(_ctx.$t('sysStatus.clickToViewChangelog')), 1)])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"chart-line\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.uploadTrend')), 1), _createVNode(_component_el_button, {\n class: \"trend-calendar-btn\",\n circle: \"\",\n \"aria-label\": _ctx.$t('sysStatus.selectDateRange'),\n onClick: $options.openTrendDateDialog\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"calendar\"\n })]),\n _: 1\n }, 8, [\"aria-label\", \"onClick\"])]), _createElementVNode(\"div\", _hoisted_23, [_createVNode(_component_el_radio_group, {\n modelValue: $data.trendGroupBy,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.trendGroupBy = $event),\n size: \"small\",\n class: \"trend-group-switch\",\n \"aria-label\": _ctx.$t('sysStatus.uploadTrendGroupBy')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"channel\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelType')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"channelName\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.byChannelName')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"aria-label\"])])]), _createVNode(_component_el_dialog, {\n modelValue: $data.trendDatePickerVisible,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.trendDatePickerVisible = $event),\n title: _ctx.$t('sysStatus.selectDateRange'),\n width: \"420px\",\n class: \"trend-date-dialog\",\n \"align-center\": \"\",\n \"append-to-body\": \"\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_24, [_createVNode(_component_DateRangeCalendar, {\n modelValue: $data.trendDateRange,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.trendDateRange = $event),\n onChange: $options.handleTrendDateRangeChange\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n }, 8, [\"modelValue\", \"title\"]), _createElementVNode(\"div\", _hoisted_25, [!$options.hasTrendData ? (_openBlock(), _createElementBlock(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_27, [_createVNode(_component_Line, {\n data: $options.uploadTrendChartData,\n options: $options.lineChartOptions\n }, null, 8, [\"data\", \"options\"])]))])]), _createElementVNode(\"div\", _hoisted_28, [_createElementVNode(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"share-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.channelDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_30, [Object.keys($data.indexInfo.channelStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createElementVNode(\"div\", _hoisted_33, [_createVNode(_component_Doughnut, {\n data: $options.channelChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"div\", _hoisted_35, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_36, _toDisplayString(_ctx.$t('sysStatus.totalFilesLabel')), 1)])]), _createElementVNode(\"div\", _hoisted_37, [(_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_38, _toDisplayString(channel), 1), _createElementVNode(\"span\", _hoisted_39, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_40, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])]), _createElementVNode(\"div\", _hoisted_41, [_createElementVNode(\"div\", _hoisted_42, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.fileStatusDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_43, [Object.keys($data.indexInfo.typeStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_44, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_45, [_createElementVNode(\"div\", _hoisted_46, [_createVNode(_component_Doughnut, {\n data: $options.typeChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_47, [_createElementVNode(\"div\", _hoisted_48, _toDisplayString(Object.keys($data.indexInfo.typeStats).length), 1), _createElementVNode(\"div\", _hoisted_49, _toDisplayString(_ctx.$t('sysStatus.statusTypes')), 1)])]), _createElementVNode(\"div\", _hoisted_50, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.aggregatedTypeStats, (count, status, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: status,\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_51, _toDisplayString(status), 1), _createElementVNode(\"span\", _hoisted_52, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_53, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])])]), _createElementVNode(\"div\", _hoisted_54, [_createElementVNode(\"div\", _hoisted_55, [_createElementVNode(\"div\", _hoisted_56, [_createVNode(_component_font_awesome_icon, {\n icon: \"tools\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.systemMaintenance')), 1)]), _createElementVNode(\"div\", _hoisted_57, [$data.isProcessing ? (_openBlock(), _createElementBlock(\"div\", _hoisted_58, [_createElementVNode(\"div\", _hoisted_59, [_createElementVNode(\"span\", _hoisted_60, _toDisplayString($options.phaseDescription), 1), _createElementVNode(\"span\", _hoisted_61, _toDisplayString(Math.round($data.processingProgress.percentage)) + \"%\", 1)]), _createVNode(_component_el_progress, {\n percentage: $data.processingProgress.percentage,\n \"stroke-width\": 12,\n \"show-text\": false,\n class: \"progress-bar\"\n }, null, 8, [\"percentage\"]), _createElementVNode(\"div\", _hoisted_62, [$data.processingProgress.current > 0 ? (_openBlock(), _createElementBlock(\"span\", _hoisted_63, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.processingProgress.current.toLocaleString()) + \" \", 1), $data.processingProgress.total > 0 ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createTextVNode(\" / \" + _toDisplayString($data.processingProgress.total.toLocaleString()), 1)], 64)) : _createCommentVNode(\"\", true), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.records')), 1)])) : _createCommentVNode(\"\", true), $options.estimatedTimeRemaining ? (_openBlock(), _createElementBlock(\"span\", _hoisted_64, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n }), _createTextVNode(\" \" + _toDisplayString($options.estimatedTimeRemaining), 1)])) : _createCommentVNode(\"\", true)]), $data.processingProgress.message ? (_openBlock(), _createElementBlock(\"div\", _hoisted_65, _toDisplayString($data.processingProgress.message), 1)) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n size: \"small\",\n onClick: $options.cancelOperation,\n class: \"cancel-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.cancelOperation')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : $data.processingError ? (_openBlock(), _createElementBlock(\"div\", _hoisted_66, [_createElementVNode(\"div\", _hoisted_67, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\"\n })]), _createElementVNode(\"div\", _hoisted_68, [_createElementVNode(\"div\", _hoisted_69, _toDisplayString($data.processingError.message), 1), $data.processingError.suggestion ? (_openBlock(), _createElementBlock(\"div\", _hoisted_70, _toDisplayString($data.processingError.suggestion), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_71, [$data.processingError.recoverable ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n size: \"small\",\n onClick: $options.retryOperation\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"default\",\n size: \"small\",\n onClick: $options.dismissError\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.close')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_72, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.rebuildTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.rebuilding,\n disabled: $data.isProcessing,\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 ? _ctx.$t('sysStatus.rebuilding') : _ctx.$t('sysStatus.rebuildIndex')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.backupTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"success\",\n loading: $data.backing,\n disabled: $data.isProcessing,\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 ? _ctx.$t('sysStatus.backingUp') : _ctx.$t('sysStatus.backupData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.restoreTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_73, [_createElementVNode(\"input\", {\n type: \"file\",\n ref: \"fileInput\",\n accept: \".json\",\n onChange: _cache[5] || (_cache[5] = (...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 disabled: $data.isProcessing,\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 ? _ctx.$t('sysStatus.restoring') : _ctx.$t('sysStatus.restoreData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])])]),\n _: 1\n }, 8, [\"content\"])]))])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_74, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"file-info-card info-card-newest\",\n onClick: _cache[8] || (_cache[8] = $event => $options.openFileInNewTab($data.indexInfo.newestFile))\n }, [$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[6] || (_cache[6] = $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[7] || (_cache[7] = $event => $options.handleImageError('newest'))\n }, null, 40, _hoisted_75)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_76, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_77, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.latestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_78, [_createElementVNode(\"div\", _hoisted_79, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_80, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"file-info-card info-card-oldest\",\n onClick: _cache[11] || (_cache[11] = $event => $options.openFileInNewTab($data.indexInfo.oldestFile))\n }, [$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[9] || (_cache[9] = $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[10] || (_cache[10] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_81)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_82, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_83, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.earliestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_84, [_createElementVNode(\"div\", _hoisted_85, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_86, _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 {_boundSegment, _boundSegments, _normalizeAngle} from '../../helpers/index.js';\n\nexport function _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n\n for (const segment of segments) {\n let {start, end} = segment;\n end = _findSegmentEnd(start, end, points);\n\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n\n if (!target.segments) {\n // Special case for boundary not supporting `segments` (simpleArc)\n // Bounds are provided as `target` for partial circle, or undefined for full circle\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n\n // Get all segments from `target` that intersect the bounds of current segment of `line`\n const targetSegments = _boundSegments(target, bounds);\n\n for (const tgt of targetSegments) {\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\n\nexport function _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\n\nexport function _pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({start, end}) => {\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\n\nexport function _findSegmentEnd(start, end, points) {\n for (;end > start; end--) {\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\n\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {isArray} from '../../helpers/index.js';\nimport {_pointsFromSegments} from './filler.segment.js';\n\n/**\n * @param {PointElement[] | { x: number; y: number; }} boundary\n * @param {LineElement} line\n * @return {LineElement?}\n */\nexport function _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n\n if (isArray(boundary)) {\n _loop = true;\n // @ts-ignore\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\n\nexport function _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n","import {isObject, isFinite, valueOrDefault} from '../../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.line.js').default } LineElement\n * @typedef { import('../../types/index.js').FillTarget } FillTarget\n * @typedef { import('../../types/index.js').ComplexFillTarget } ComplexFillTarget\n */\n\nexport function _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n\n if (!propagate) {\n return fill;\n }\n\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n\n target = sources[fill];\n if (!target) {\n return false;\n }\n\n if (target.visible) {\n return fill;\n }\n\n visited.push(fill);\n fill = target.fill;\n }\n\n return false;\n}\n\n/**\n * @param {LineElement} line\n * @param {number} index\n * @param {number} count\n */\nexport function _decodeFill(line, index, count) {\n /** @type {string | {value: number}} */\n const fill = parseFillOption(line);\n\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n\n let target = parseFloat(fill);\n\n if (isFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\n\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n\n return target;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @returns {number | null}\n */\nexport function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n // @ts-ignore\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @param {number} startValue\n * @returns {number | undefined}\n */\nexport function _getTargetValue(fill, scale, startValue) {\n let value;\n\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n // @ts-ignore\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n\n/**\n * @param {LineElement} line\n */\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n\n if (fill === false || fill === null) {\n return false;\n }\n\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n","/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {_isBetween} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\n\n/**\n * @param {{ chart: Chart; scale: Scale; index: number; line: LineElement; }} source\n * @return {LineElement}\n */\nexport function _buildStackLine(source) {\n const {scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({x: null, y: scale.bottom}, line));\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @return {LineElement[]}\n */\nfunction getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n\n/**\n * @param {PointElement[]} points\n * @param {PointElement} sourcePoint\n * @param {LineElement[]} linesBelow\n */\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n // First point of a segment -> need to add another point before this,\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n // In the middle of a segment, no need to add more points.\n break;\n }\n }\n }\n points.push(...postponed);\n}\n\n/**\n * @param {LineElement} line\n * @param {PointElement} sourcePoint\n * @param {string} property\n * @returns {{point?: PointElement, first?: boolean, last?: boolean}}\n */\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\n","import {TAU} from '../../helpers/index.js';\n\n// TODO: use elements.ArcElement instead\nexport class simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n","import {isFinite} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\nimport {_getTargetPixel, _getTargetValue} from './filler.options.js';\nimport {_buildStackLine} from './filler.target.stack.js';\nimport {simpleArc} from './simpleArc.js';\n\n/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nexport function _getTarget(source) {\n const {chart, fill, line} = source;\n\n if (isFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n\n if (fill === 'shape') {\n return true;\n }\n\n const boundary = computeBoundary(source);\n\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n\n return _createBoundaryLine(boundary, line);\n}\n\n/**\n * @param {Chart} chart\n * @param {number} index\n */\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\n\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\n\n\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n const pixel = _getTargetPixel(fill, scale);\n\n if (isFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n\n return null;\n}\n\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n\n for (let i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\n","import {clipArea, unclipArea, getDatasetClipArea} from '../../helpers/index.js';\nimport {_findSegmentEnd, _getBounds, _segments} from './filler.segment.js';\nimport {_getTarget} from './filler.target.js';\n\nexport function _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const {chart, index, line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n const meta = chart.getDatasetMeta(index);\n const clip = getDatasetClipArea(chart, meta);\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis, clip});\n unclipArea(ctx);\n }\n}\n\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale, clip} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n\n ctx.save();\n\n let fillColor = below;\n if (below !== above) {\n if (property === 'x') {\n clipVertical(ctx, target, area.top);\n fill(ctx, {line, target, color: above, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n } else if (property === 'y') {\n clipHorizontal(ctx, target, area.left);\n fill(ctx, {line, target, color: below, scale, property, clip});\n ctx.restore();\n ctx.save();\n clipHorizontal(ctx, target, area.right);\n fillColor = above;\n }\n }\n fill(ctx, {line, target, color: fillColor, scale, property, clip});\n\n ctx.restore();\n}\n\nfunction clipVertical(ctx, target, clipY) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction clipHorizontal(ctx, target, clipX) {\n const {segments, points} = target;\n let first = true;\n let lineLoop = false;\n\n ctx.beginPath();\n for (const segment of segments) {\n const {start, end} = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(clipX, firstPoint.y);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(clipX, lastPoint.y);\n }\n }\n\n ctx.lineTo(clipX, target.first().y);\n ctx.closePath();\n ctx.clip();\n}\n\nfunction fill(ctx, cfg) {\n const {line, target, property, color, scale, clip} = cfg;\n const segments = _segments(line, target, property);\n\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n const notShape = target !== true;\n\n ctx.save();\n ctx.fillStyle = backgroundColor;\n\n clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end));\n\n ctx.beginPath();\n\n const lineLoop = !!line.pathSegment(ctx, src);\n\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n\n ctx.restore();\n }\n}\n\nfunction clipBounds(ctx, scale, clip, bounds) {\n const chartArea = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n\n if (property === 'x' || property === 'y') {\n let left, top, right, bottom;\n\n if (property === 'x') {\n left = start;\n top = chartArea.top;\n right = end;\n bottom = chartArea.bottom;\n } else {\n left = chartArea.left;\n top = start;\n right = chartArea.right;\n bottom = end;\n }\n\n ctx.beginPath();\n\n if (clip) {\n left = Math.max(left, clip.left);\n right = Math.min(right, clip.right);\n top = Math.max(top, clip.top);\n bottom = Math.min(bottom, clip.bottom);\n }\n\n ctx.rect(left, top, right - left, bottom - top);\n ctx.clip();\n }\n}\n\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\n","/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\nimport LineElement from '../../elements/element.line.js';\nimport {_drawfill} from './filler.drawing.js';\nimport {_shouldApplyFill} from './filler.helper.js';\nimport {_decodeFill, _resolveTarget} from './filler.options.js';\n\nexport default {\n id: 'filler',\n\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\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","/**\r\n * BatchProcessor - 批量数据处理类\r\n * \r\n * 处理批量数据获取和处理的核心类,使用 cursor 分页机制获取所有数据。\r\n * 支持进度回调和取消功能。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\n\r\n/**\r\n * 批量操作错误类\r\n * 提供错误代码、是否可恢复、建议操作等信息\r\n */\r\nexport class BatchOperationError extends Error {\r\n constructor(message, code, recoverable = false, suggestion = '') {\r\n super(message);\r\n this.name = 'BatchOperationError';\r\n this.code = code;\r\n this.recoverable = recoverable;\r\n this.suggestion = suggestion;\r\n }\r\n}\r\n\r\n/**\r\n * 错误处理器映射\r\n * 根据 HTTP 状态码返回对应的错误对象\r\n */\r\nconst ERROR_HANDLERS = {\r\n 401: () => new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n ),\r\n 403: () => new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n ),\r\n 400: (details) => new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n ),\r\n 500: () => new BatchOperationError(\r\n '服务器内部错误',\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试,如果问题持续请联系管理员'\r\n ),\r\n NETWORK: () => new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n ),\r\n ABORT: () => new BatchOperationError(\r\n '操作已取消',\r\n 'ABORTED',\r\n false,\r\n ''\r\n )\r\n};\r\n\r\n/**\r\n * 根据错误创建 BatchOperationError\r\n * @param {Error|Response} error - 原始错误或响应对象\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\nfunction createError(error, details = '') {\r\n // 处理取消操作\r\n if (error.name === 'AbortError') {\r\n return ERROR_HANDLERS.ABORT();\r\n }\r\n \r\n // 处理 HTTP 响应错误\r\n if (error instanceof Response || (error && typeof error.status === 'number')) {\r\n const handler = ERROR_HANDLERS[error.status];\r\n if (handler) {\r\n return handler(details);\r\n }\r\n return new BatchOperationError(\r\n `请求失败: ${error.status}`,\r\n 'HTTP_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n \r\n // 处理网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n return ERROR_HANDLERS.NETWORK();\r\n }\r\n \r\n // 其他错误\r\n return new BatchOperationError(\r\n error.message || '未知错误',\r\n 'UNKNOWN_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n}\r\n\r\n/**\r\n * BatchProcessor 类\r\n * \r\n * 用于批量获取和处理数据的核心类\r\n */\r\nclass BatchProcessor {\r\n /**\r\n * 创建 BatchProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.batchSize - 每批数据量,默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.batchSize = options.batchSize || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.abortController = null;\r\n }\r\n\r\n /**\r\n * 获取所有数据记录\r\n * 使用 cursor 分页机制循环获取所有数据,直到没有更多数据或操作被取消\r\n * \r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 所有记录的数组\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async fetchAllRecords(includeValue = false) {\r\n // 创建新的 AbortController 用于取消操作\r\n this.abortController = new AbortController();\r\n const allRecords = [];\r\n let cursor = null;\r\n let totalFetched = 0;\r\n let batchCount = 0;\r\n\r\n try {\r\n do {\r\n // 检查是否已取消\r\n if (this.abortController.signal.aborted) {\r\n break;\r\n }\r\n\r\n // 获取一批数据\r\n const response = await this.fetchBatch(cursor, includeValue);\r\n \r\n // 合并数据到总数组\r\n allRecords.push(...response.records);\r\n cursor = response.nextCursor;\r\n totalFetched += response.records.length;\r\n batchCount++;\r\n\r\n // 调用进度回调\r\n this.onProgress({\r\n phase: 'fetching',\r\n current: totalFetched,\r\n batchCount: batchCount,\r\n message: `已获取 ${totalFetched} 条记录...`\r\n });\r\n\r\n } while (cursor && !this.abortController.signal.aborted);\r\n\r\n // 如果是因为取消而退出循环,抛出取消错误\r\n if (this.abortController.signal.aborted) {\r\n throw ERROR_HANDLERS.ABORT();\r\n }\r\n\r\n return allRecords;\r\n } catch (error) {\r\n // 调用错误回调\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : createError(error);\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 获取单批数据\r\n * \r\n * @param {string|null} cursor - 分页游标,首次请求为 null\r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 包含 records 和 nextCursor 的响应对象\r\n * @throws {BatchOperationError} 当请求失败时抛出\r\n */\r\n async fetchBatch(cursor, includeValue) {\r\n // 构建查询参数\r\n const params = new URLSearchParams();\r\n if (cursor) {\r\n params.set('cursor', cursor);\r\n }\r\n if (includeValue) {\r\n params.set('includeValue', 'true');\r\n }\r\n params.set('limit', String(this.batchSize));\r\n\r\n try {\r\n // 发送请求,传入 abort signal 支持取消\r\n const response = await fetchWithAuth(\r\n `/api/manage/batch/list?${params}`,\r\n { signal: this.abortController.signal }\r\n );\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw createError(response, errorDetails);\r\n }\r\n\r\n // 解析响应数据\r\n const data = await response.json();\r\n \r\n // 验证响应格式\r\n if (!data.success) {\r\n throw new BatchOperationError(\r\n data.error || '请求失败',\r\n 'API_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return {\r\n records: data.records || [],\r\n nextCursor: data.nextCursor || null,\r\n totalProcessed: data.totalProcessed || 0\r\n };\r\n } catch (error) {\r\n // 如果已经是 BatchOperationError,直接抛出\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 否则转换为 BatchOperationError\r\n throw createError(error);\r\n }\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n * 调用此方法将中止正在进行的 fetch 请求\r\n */\r\n abort() {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.abortController ? this.abortController.signal.aborted : false;\r\n }\r\n\r\n /**\r\n * 重置处理器状态\r\n * 在开始新的批量操作前调用\r\n */\r\n reset() {\r\n this.abortController = null;\r\n }\r\n}\r\n\r\nexport default BatchProcessor;\r\n","/**\r\n * IndexRebuilder - 索引重建类\r\n * \r\n * 处理索引重建的完整流程,包括数据获取、排序、分块上传和完成。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport BatchProcessor, { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * IndexRebuilder 类\r\n * \r\n * 用于重建索引的核心类,协调数据获取、排序和分块上传\r\n */\r\nclass IndexRebuilder {\r\n /**\r\n * 创建 IndexRebuilder 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每个分块的记录数,默认从后端获取\r\n * @param {number} options.maxRetries - 分块上传最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || null; // 从后端获取\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.sessionId = this.generateSessionId();\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 从后端获取索引配置(分块大小等)\r\n * @returns {Promise} 配置对象 { chunkSize, databaseType }\r\n */\r\n async fetchConfig() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/config');\r\n if (!response.ok) {\r\n throw new Error('获取配置失败');\r\n }\r\n const result = await response.json();\r\n if (result.success) {\r\n return {\r\n chunkSize: result.chunkSize || 500,\r\n databaseType: result.databaseType || 'unknown'\r\n };\r\n }\r\n throw new Error(result.error || '获取配置失败');\r\n } catch (error) {\r\n // 获取失败时使用保守的默认值(兼容 D1)\r\n console.warn('Failed to fetch index config, using default:', error);\r\n return { chunkSize: 500, databaseType: 'unknown' };\r\n }\r\n }\r\n\r\n /**\r\n * 执行索引重建\r\n * \r\n * 完整流程:\r\n * 1. 获取配置(分块大小)\r\n * 2. 获取所有记录\r\n * 3. 按时间戳降序排序\r\n * 4. 分块上传\r\n * 5. 完成重建\r\n * \r\n * @returns {Promise} 重建结果 { success: boolean, totalFiles: number }\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async rebuild() {\r\n this.aborted = false;\r\n \r\n try {\r\n // 获取配置(分块大小)\r\n if (!this.chunkSize) {\r\n const config = await this.fetchConfig();\r\n this.chunkSize = config.chunkSize;\r\n }\r\n\r\n // 获取所有记录\r\n this.onProgress({ \r\n phase: 'fetching', \r\n message: '正在获取数据...',\r\n current: 0\r\n });\r\n \r\n const processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' }),\r\n onError: (e) => this.onError(e)\r\n });\r\n \r\n const records = await processor.fetchAllRecords(false);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 排序(按时间戳降序)\r\n this.onProgress({ \r\n phase: 'sorting', \r\n message: '正在排序...',\r\n current: 0,\r\n total: records.length\r\n });\r\n \r\n this.sortByTimestampDescending(records);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 分块上传\r\n const chunks = this.splitIntoChunks(records);\r\n \r\n for (let i = 0; i < chunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n \r\n // 使用重试机制上传分块\r\n await this.uploadChunkWithRetry(chunks[i], i);\r\n \r\n this.onProgress({\r\n phase: 'uploading',\r\n current: i + 1,\r\n total: chunks.length,\r\n message: `正在上传分块 ${i + 1}/${chunks.length}...`\r\n });\r\n }\r\n\r\n // 完成重建\r\n this.onProgress({ \r\n phase: 'finalizing', \r\n message: '正在完成重建...',\r\n current: chunks.length,\r\n total: chunks.length\r\n });\r\n \r\n await this.finalize(chunks.length, records.length);\r\n\r\n this.onProgress({\r\n phase: 'completed',\r\n message: `索引重建完成,共 ${records.length} 个文件`,\r\n current: records.length,\r\n total: records.length\r\n });\r\n\r\n return { success: true, totalFiles: records.length };\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : new BatchOperationError(\r\n error.message || '索引重建失败',\r\n 'REBUILD_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 按时间戳降序排序记录\r\n * \r\n * @param {Array} records - 要排序的记录数组(原地排序)\r\n */\r\n sortByTimestampDescending(records) {\r\n records.sort((a, b) => {\r\n const timestampA = (a.metadata && a.metadata.TimeStamp) || 0;\r\n const timestampB = (b.metadata && b.metadata.TimeStamp) || 0;\r\n return timestampB - timestampA;\r\n });\r\n }\r\n\r\n /**\r\n * 将记录分割为多个块\r\n * \r\n * @param {Array} records - 要分割的记录数组\r\n * @returns {Array} 分块后的二维数组\r\n */\r\n splitIntoChunks(records) {\r\n const chunks = [];\r\n for (let i = 0; i < records.length; i += this.chunkSize) {\r\n chunks.push(records.slice(i, i + this.chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当所有重试都失败时抛出\r\n */\r\n async uploadChunkWithRetry(chunk, chunkId) {\r\n let lastError;\r\n \r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(chunk, chunkId);\r\n } catch (error) {\r\n lastError = error;\r\n \r\n // 不重试的错误类型\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' || \r\n error.code === 'FORBIDDEN' || \r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n \r\n // 如果还有重试机会,等待后重试\r\n if (attempt < this.maxRetries) {\r\n // 指数退避\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n \r\n this.onProgress({\r\n phase: 'retrying',\r\n message: `分块 ${chunkId + 1} 上传失败,正在重试 (${attempt}/${this.maxRetries})...`,\r\n current: chunkId,\r\n attempt: attempt\r\n });\r\n }\r\n }\r\n }\r\n \r\n // 所有重试都失败\r\n throw lastError instanceof BatchOperationError \r\n ? lastError \r\n : new BatchOperationError(\r\n `分块 ${chunkId + 1} 上传失败,已重试 ${this.maxRetries} 次`,\r\n 'CHUNK_UPLOAD_FAILED',\r\n false,\r\n '请检查网络连接后重新开始重建'\r\n );\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当上传失败时抛出\r\n */\r\n async uploadChunk(chunk, chunkId) {\r\n const checksum = await this.calculateChecksum(chunk);\r\n \r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n chunkId: String(chunkId),\r\n sessionId: this.sessionId,\r\n data: chunk,\r\n checksum\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 完成索引重建\r\n * \r\n * @param {number} totalChunks - 总分块数\r\n * @param {number} totalFiles - 总文件数\r\n * @returns {Promise} 完成响应\r\n * @throws {BatchOperationError} 当完成请求失败时抛出\r\n */\r\n async finalize(totalChunks, totalFiles) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/finalize', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n sessionId: this.sessionId,\r\n totalChunks,\r\n totalFiles\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n throw new BatchOperationError(\r\n error.message || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 生成唯一的会话 ID\r\n * \r\n * @returns {string} 会话 ID\r\n */\r\n generateSessionId() {\r\n return `rebuild_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n }\r\n\r\n /**\r\n * 计算数据的 SHA-256 校验和\r\n * \r\n * @param {Array} data - 要计算校验和的数据\r\n * @returns {Promise} 十六进制格式的校验和\r\n */\r\n async calculateChecksum(data) {\r\n const text = JSON.stringify(data);\r\n const encoder = new TextEncoder();\r\n const dataBuffer = encoder.encode(text);\r\n\r\n // crypto.subtle 仅在安全上下文(HTTPS / localhost)下可用\r\n // 通过 0.0.0.0 等非安全上下文访问时需要 fallback\r\n if (typeof crypto !== 'undefined' && crypto.subtle) {\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n // Fallback: 简单但足够用于校验的哈希实现 (FNV-1a 变体, 产生 64 位十六进制)\r\n let h1 = 0x811c9dc5 >>> 0;\r\n let h2 = 0x811c9dc5 >>> 0;\r\n for (let i = 0; i < dataBuffer.length; i++) {\r\n h1 = Math.imul(h1 ^ dataBuffer[i], 0x01000193) >>> 0;\r\n h2 = Math.imul(h2 ^ dataBuffer[i], 0x01000193 + 0x10) >>> 0;\r\n }\r\n return h1.toString(16).padStart(8, '0') + h2.toString(16).padStart(8, '0');\r\n }\r\n\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n * \r\n * @param {number} status - HTTP 状态码\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n );\r\n case 404:\r\n return new BatchOperationError(\r\n '会话不存在',\r\n 'SESSION_NOT_FOUND',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 410:\r\n return new BatchOperationError(\r\n '会话已过期',\r\n 'SESSION_EXPIRED',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n * \r\n * @param {number} ms - 延迟毫秒数\r\n * @returns {Promise}\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n\r\n /**\r\n * 重置重建器状态\r\n * 在开始新的重建操作前调用\r\n */\r\n reset() {\r\n this.aborted = false;\r\n this.sessionId = this.generateSessionId();\r\n }\r\n}\r\n\r\nexport default IndexRebuilder;\r\n","/**\r\n * BackupGenerator - 备份数据生成类\r\n * \r\n * 处理前端辅助备份功能,获取所有文件记录(包含分块文件的 value),\r\n * 构建完整的备份 JSON 文件,并触发浏览器下载。\r\n */\r\n\r\nimport BatchProcessor from '@/utils/batchProcessor';\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport packageInfo from '../../package.json'\r\n\r\n/**\r\n * BackupGenerator 类\r\n * \r\n * 用于生成和下载备份数据的类\r\n */\r\nclass BackupGenerator {\r\n /**\r\n * 创建 BackupGenerator 实例\r\n * @param {Object} options - 配置选项\r\n * @param {Function} options.onProgress - 进度回调函数\r\n */\r\n constructor(options = {}) {\r\n this.onProgress = options.onProgress || (() => {});\r\n this.processor = null;\r\n }\r\n\r\n /**\r\n * 生成并下载备份\r\n * \r\n * 完整流程:\r\n * 1. 获取所有文件记录(包含分块文件的 value)\r\n * 2. 构建备份数据结构\r\n * 3. 获取系统设置\r\n * 4. 生成并触发下载\r\n * \r\n * @returns {Promise} 包含 success 和 fileCount 的结果对象\r\n * @throws {Error} 当备份过程中发生错误时抛出\r\n */\r\n async generateBackup() {\r\n // 获取所有文件记录(包含分块文件的 value)\r\n this.processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' })\r\n });\r\n\r\n const records = await this.processor.fetchAllRecords(true);\r\n\r\n // 构建备份数据\r\n this.onProgress({ phase: 'building', message: '正在构建备份数据...' });\r\n\r\n const backupData = {\r\n timestamp: Date.now(),\r\n version: packageInfo.version,\r\n data: {\r\n fileCount: records.length,\r\n files: {},\r\n settings: {}\r\n }\r\n };\r\n\r\n // 将记录转换为以 id 为键的对象格式\r\n for (const record of records) {\r\n backupData.data.files[record.id] = {\r\n metadata: record.metadata,\r\n value: record.value || null\r\n };\r\n }\r\n\r\n // 3. 获取系统设置\r\n const settings = await this.fetchSettings();\r\n backupData.data.settings = settings;\r\n\r\n // 生成下载\r\n this.onProgress({ phase: 'downloading', message: '正在生成下载...' });\r\n this.downloadBackup(backupData);\r\n\r\n const settingsCount = Object.keys(settings).length;\r\n return { success: true, fileCount: records.length, settingsCount };\r\n }\r\n\r\n /**\r\n * 获取系统设置\r\n * \r\n * @returns {Promise} 系统设置对象,失败时返回空对象\r\n */\r\n async fetchSettings() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/settings');\r\n if (!response.ok) {\r\n console.warn('Failed to fetch settings:', response.status);\r\n return {};\r\n }\r\n const data = await response.json();\r\n // 返回 settings 字段,而不是整个响应\r\n return data.settings || {};\r\n } catch (error) {\r\n console.warn('Failed to fetch settings:', error);\r\n return {};\r\n }\r\n }\r\n\r\n /**\r\n * 触发浏览器下载备份文件\r\n * \r\n * @param {Object} data - 备份数据对象\r\n */\r\n downloadBackup(data) {\r\n // 将数据转换为格式化的 JSON 字符串\r\n const json = JSON.stringify(data, null, 2);\r\n \r\n // 创建 Blob 对象\r\n const blob = new Blob([json], { type: 'application/json' });\r\n \r\n // 创建下载 URL\r\n const url = URL.createObjectURL(blob);\r\n\r\n // 创建临时下载链接\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // 使用日期作为文件名的一部分\r\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\r\n \r\n // 触发下载\r\n document.body.appendChild(a);\r\n a.click();\r\n \r\n // 清理\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * 取消当前备份操作\r\n */\r\n abort() {\r\n if (this.processor) {\r\n this.processor.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.processor ? this.processor.isAborted() : false;\r\n }\r\n}\r\n\r\nexport default BackupGenerator;\r\n","/**\r\n * RestoreProcessor - 分批恢复数据类\r\n * \r\n * 将备份数据分批上传到后端进行恢复,避免 CPU 超时\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * RestoreProcessor 类\r\n */\r\nclass RestoreProcessor {\r\n /**\r\n * 创建 RestoreProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每批数据量,默认 50\r\n * @param {number} options.maxRetries - 最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || 50;\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 执行恢复操作\r\n * \r\n * @param {Object} backupData - 备份数据对象\r\n * @returns {Promise} 恢复结果\r\n */\r\n async restore(backupData) {\r\n this.aborted = false;\r\n\r\n // 验证备份数据格式\r\n if (!backupData || !backupData.data) {\r\n throw new BatchOperationError(\r\n '备份文件格式无效',\r\n 'INVALID_BACKUP',\r\n false,\r\n '请选择有效的备份文件'\r\n );\r\n }\r\n\r\n const { files = {}, settings = {} } = backupData.data;\r\n const fileEntries = Object.entries(files);\r\n const settingEntries = Object.entries(settings);\r\n \r\n const totalFiles = fileEntries.length;\r\n const totalSettings = settingEntries.length;\r\n const totalItems = totalFiles + totalSettings;\r\n\r\n let restoredFiles = 0;\r\n let restoredSettings = 0;\r\n let failedFiles = 0;\r\n let failedSettings = 0;\r\n\r\n try {\r\n // 1. 分批恢复文件数据\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: '正在恢复文件数据...',\r\n current: 0,\r\n total: totalItems\r\n });\r\n\r\n const fileChunks = this.splitIntoChunks(fileEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < fileChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = fileChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('files', chunkData);\r\n restoredFiles += result.restoredCount;\r\n failedFiles += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: `正在恢复文件数据 ${restoredFiles}/${totalFiles}...`,\r\n current: restoredFiles,\r\n total: totalItems,\r\n percentage: (restoredFiles / totalItems) * 80\r\n });\r\n }\r\n\r\n // 2. 分批恢复系统设置\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: '正在恢复系统设置...',\r\n current: restoredFiles,\r\n total: totalItems\r\n });\r\n\r\n const settingChunks = this.splitIntoChunks(settingEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < settingChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = settingChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('settings', chunkData);\r\n restoredSettings += result.restoredCount;\r\n failedSettings += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: `正在恢复系统设置 ${restoredSettings}/${totalSettings}...`,\r\n current: restoredFiles + restoredSettings,\r\n total: totalItems,\r\n percentage: 80 + (restoredSettings / totalSettings) * 20\r\n });\r\n }\r\n\r\n // 3. 完成\r\n this.onProgress({\r\n phase: 'completed',\r\n message: '恢复完成',\r\n current: totalItems,\r\n total: totalItems,\r\n percentage: 100\r\n });\r\n\r\n return {\r\n success: true,\r\n restoredFiles,\r\n restoredSettings,\r\n failedFiles,\r\n failedSettings,\r\n backupTimestamp: backupData.timestamp\r\n };\r\n\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError\r\n ? error\r\n : new BatchOperationError(\r\n error.message || '恢复失败',\r\n 'RESTORE_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 将数组分割为多个块\r\n */\r\n splitIntoChunks(entries, chunkSize) {\r\n const chunks = [];\r\n for (let i = 0; i < entries.length; i += chunkSize) {\r\n chunks.push(entries.slice(i, i + chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n */\r\n async uploadChunkWithRetry(type, data) {\r\n let lastError;\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(type, data);\r\n } catch (error) {\r\n lastError = error;\r\n\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' ||\r\n error.code === 'FORBIDDEN' ||\r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n\r\n if (attempt < this.maxRetries) {\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n }\r\n }\r\n }\r\n\r\n throw lastError;\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n */\r\n async uploadChunk(type, data) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/restore/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ type, data })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n\r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查备份文件格式'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n}\r\n\r\nexport default RestoreProcessor;\r\n","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/es.set.difference.v2.js\";\nimport \"core-js/modules/es.set.intersection.v2.js\";\nimport \"core-js/modules/es.set.is-disjoint-from.v2.js\";\nimport \"core-js/modules/es.set.is-subset-of.v2.js\";\nimport \"core-js/modules/es.set.is-superset-of.v2.js\";\nimport \"core-js/modules/es.set.symmetric-difference.v2.js\";\nimport \"core-js/modules/es.set.union.v2.js\";\nimport \"core-js/modules/esnext.json.parse.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, Line } from 'vue-chartjs';\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler } from 'chart.js';\nimport IndexRebuilder from '@/utils/indexRebuilder';\nimport BackupGenerator from '@/utils/backupGenerator';\nimport RestoreProcessor from '@/utils/restoreProcessor';\nimport DateRangeCalendar from '@/components/DateRangeCalendar.vue';\nChartJS.register(ArcElement, Tooltip, Legend, CategoryScale, LinearScale, PointElement, LineElement, Filler);\nconst DAY_MS = 24 * 60 * 60 * 1000;\nfunction padDatePart(value) {\n return String(value).padStart(2, '0');\n}\nfunction formatDateInput(date) {\n return `${date.getFullYear()}-${padDatePart(date.getMonth() + 1)}-${padDatePart(date.getDate())}`;\n}\nfunction getDefaultTrendDateRange() {\n const endDate = new Date();\n endDate.setHours(0, 0, 0, 0);\n const startDate = new Date(endDate.getTime() - 6 * DAY_MS);\n return [formatDateInput(startDate), formatDateInput(endDate)];\n}\nexport default {\n name: 'SysCogStatus',\n components: {\n Doughnut,\n Line,\n DateRangeCalendar\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 trendGroupBy: 'channel',\n trendDatePickerVisible: false,\n trendDateRange: getDefaultTrendDateRange(),\n // 渠道图表颜色\n channelColors: ['#8B5CF6', '#EC4899', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#6366F1', '#84CC16'],\n // 状态图表颜色\n typeColors: ['#10B981', '#3B82F6', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#06B6D4', '#84CC16'],\n // 上传趋势折线图颜色\n trendColors: ['#2563EB', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#06B6D4', '#EC4899', '#84CC16', '#64748B'],\n // 批量操作进度状态\n isProcessing: false,\n processingPhase: '',\n // fetching, sorting, uploading, finalizing, building, downloading, completed\n processingProgress: {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n },\n processingError: null,\n processingStartTime: null,\n // 当前处理器实例(用于取消操作)\n currentRebuilder: null,\n currentBackupGenerator: null,\n currentRestoreProcessor: null\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 // 文件状态图表数据 - 将Block映射为\"已屏蔽\",其余为\"正常\"\n typeChartData() {\n const aggregatedStats = this.aggregatedTypeStats;\n return {\n labels: Object.keys(aggregatedStats),\n datasets: [{\n data: Object.values(aggregatedStats),\n backgroundColor: this.typeColors.slice(0, Object.keys(aggregatedStats).length),\n borderWidth: 0\n }]\n };\n },\n // 聚合后的状态统计:Block -> 已屏蔽,其余 -> 正常\n aggregatedTypeStats() {\n const stats = this.indexInfo.typeStats || {};\n const aggregatedStats = {};\n for (const [status, count] of Object.entries(stats)) {\n const mappedStatus = status === 'Block' ? this.$t('sysStatus.blocked') : this.$t('sysStatus.normalStatus');\n aggregatedStats[mappedStatus] = (aggregatedStats[mappedStatus] || 0) + count;\n }\n return aggregatedStats;\n },\n // 当前趋势维度数据\n currentTrendGroup() {\n const trend = this.indexInfo.uploadTrend || {};\n const groupBy = trend.groupBy || {};\n return groupBy[this.trendGroupBy] || {\n series: []\n };\n },\n // 趋势图原始日期标签\n trendRawLabels() {\n const trend = this.indexInfo.uploadTrend || {};\n return trend.labels || [];\n },\n // 当前范围是否跨年\n trendRangeCrossesYear() {\n const years = new Set();\n this.trendRawLabels.forEach(label => {\n this.extractTrendLabelDates(label).forEach(date => years.add(date.year));\n });\n return years.size > 1;\n },\n // 用于横轴展示的短日期标签\n trendDisplayLabels() {\n return this.trendRawLabels.map(label => this.formatTrendAxisLabel(label));\n },\n // 是否存在趋势图数据\n hasTrendData() {\n const trend = this.indexInfo.uploadTrend || {};\n return (trend.labels || []).length > 0;\n },\n // 上传趋势折线图数据\n uploadTrendChartData() {\n const trend = this.indexInfo.uploadTrend || {};\n const series = this.currentTrendGroup.series || [];\n const totalColor = '#F97316';\n return {\n labels: this.trendDisplayLabels,\n datasets: [{\n label: this.$t('sysStatus.totalUploads'),\n data: trend.total || [],\n borderColor: totalColor,\n backgroundColor: this.hexToRgba(totalColor, 0.1),\n pointBackgroundColor: totalColor,\n pointBorderColor: totalColor,\n borderWidth: 3,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.28,\n fill: false\n }, ...series.map((item, index) => {\n const color = this.getTrendColor(index);\n return {\n label: this.formatTrendSeriesName(item),\n data: item.data || [],\n borderColor: color,\n backgroundColor: this.hexToRgba(color, 0.12),\n pointBackgroundColor: color,\n pointBorderColor: color,\n borderWidth: 2,\n pointRadius: 2,\n pointHoverRadius: 5,\n tension: 0.32,\n fill: false\n };\n })]\n };\n },\n // 折线图配置\n lineChartOptions() {\n const textColor = '#64748B';\n return {\n responsive: true,\n maintainAspectRatio: false,\n interaction: {\n mode: 'index',\n intersect: false\n },\n plugins: {\n legend: {\n display: true,\n position: 'bottom',\n labels: {\n usePointStyle: true,\n boxWidth: 8,\n boxHeight: 8,\n padding: 16,\n color: textColor\n }\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 title: items => {\n const index = items?.[0]?.dataIndex;\n return this.trendRawLabels[index] || '';\n },\n label: context => {\n const parsed = context.parsed || {};\n const value = parsed.y !== undefined ? parsed.y : context.raw;\n return ` ${context.dataset.label}: ${Number(value || 0).toLocaleString()} ${this.$t('sysStatus.uploadsUnit')}`;\n }\n }\n }\n },\n scales: {\n x: {\n grid: {\n display: false\n },\n ticks: {\n color: textColor,\n maxTicksLimit: 8,\n autoSkip: true\n }\n },\n y: {\n beginAtZero: true,\n grid: {\n color: 'rgba(148, 163, 184, 0.18)'\n },\n ticks: {\n color: textColor,\n precision: 0,\n callback: value => Number(value).toLocaleString()\n }\n }\n }\n };\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n hoverOffset: 8,\n layout: {\n padding: 10\n },\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 z: 100,\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 estimatedTimeRemaining() {\n if (!this.isProcessing || !this.processingStartTime) return '';\n if (this.processingProgress.current === 0 || this.processingProgress.percentage === 0) return '';\n const elapsed = Date.now() - this.processingStartTime;\n const progress = this.processingProgress.percentage / 100;\n if (progress <= 0) return '';\n const totalEstimated = elapsed / progress;\n const remaining = totalEstimated - elapsed;\n if (remaining <= 0) return this.$t('sysStatus.aboutToComplete');\n const seconds = Math.ceil(remaining / 1000);\n if (seconds < 60) return this.$t('sysStatus.seconds', {\n count: seconds\n });\n const minutes = Math.ceil(seconds / 60);\n if (minutes < 60) return this.$t('sysStatus.minutes', {\n count: minutes\n });\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return this.$t('sysStatus.hoursMinutes', {\n hours,\n minutes: remainingMinutes\n });\n },\n // 处理阶段描述\n phaseDescription() {\n const phaseMap = {\n 'fetching': this.$t('sysStatus.phaseFetching'),\n 'sorting': this.$t('sysStatus.phaseSorting'),\n 'uploading': this.$t('sysStatus.phaseUploading'),\n 'finalizing': this.$t('sysStatus.phaseFinalizing'),\n 'building': this.$t('sysStatus.phaseBuilding'),\n 'downloading': this.$t('sysStatus.phaseDownloading'),\n 'restoring_files': this.$t('sysStatus.phaseRestoringFiles'),\n 'restoring_settings': this.$t('sysStatus.phaseRestoringSettings'),\n 'completed': this.$t('sysStatus.phaseCompleted'),\n 'retrying': this.$t('sysStatus.phaseRetrying')\n };\n return phaseMap[this.processingPhase] || this.processingPhase;\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 getTrendColor(index) {\n return this.trendColors[index % this.trendColors.length];\n },\n // 格式化趋势序列名称\n formatTrendSeriesName(series) {\n if (series?.isOther || series?.name === '__other__') {\n return this.$t('sysStatus.otherChannels');\n }\n return series?.name || this.$t('sysStatus.unknown');\n },\n // 十六进制颜色转换为 rgba\n hexToRgba(hex, alpha) {\n const normalized = (hex || '').replace('#', '');\n if (normalized.length !== 6) {\n return `rgba(37, 99, 235, ${alpha})`;\n }\n const r = parseInt(normalized.slice(0, 2), 16);\n const g = parseInt(normalized.slice(2, 4), 16);\n const b = parseInt(normalized.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n },\n // 提取趋势标签中的日期\n extractTrendLabelDates(label) {\n const matches = String(label || '').match(/\\d{4}-\\d{2}-\\d{2}/g) || [];\n return matches.map(item => {\n const [year, month, day] = item.split('-').map(Number);\n return {\n year,\n month,\n day\n };\n });\n },\n // 横轴日期标签按范围简化,仅跨年时显示年份\n formatTrendAxisLabel(label) {\n const dates = this.extractTrendLabelDates(label);\n if (dates.length === 0) return label;\n const formatSingleDate = (date, includeYear) => {\n const monthDay = `${date.month}/${date.day}`;\n return includeYear ? `${date.year}/${monthDay}` : monthDay;\n };\n if (dates.length === 1) {\n return formatSingleDate(dates[0], this.trendRangeCrossesYear);\n }\n const [startDate, endDate] = dates;\n if (!this.trendRangeCrossesYear) {\n return `${formatSingleDate(startDate, false)}-${formatSingleDate(endDate, false)}`;\n }\n const endLabel = startDate.year === endDate.year ? formatSingleDate(endDate, false) : formatSingleDate(endDate, true);\n return `${formatSingleDate(startDate, true)}-${endLabel}`;\n },\n // 打开居中的日期范围选择弹窗\n openTrendDateDialog() {\n this.trendDatePickerVisible = true;\n },\n // 日期范围变更后重新拉取趋势数据\n handleTrendDateRangeChange(value) {\n if (!Array.isArray(value) || value.length !== 2 || !value[0] || !value[1]) {\n return;\n }\n this.trendDatePickerVisible = false;\n this.fetchIndexInfo();\n },\n // 获取趋势查询参数\n getTrendDateRangeParams() {\n if (!Array.isArray(this.trendDateRange) || this.trendDateRange.length !== 2) {\n this.trendDateRange = getDefaultTrendDateRange();\n }\n return {\n startDate: this.trendDateRange[0],\n endDate: this.trendDateRange[1]\n };\n },\n // 获取索引信息\n async fetchIndexInfo() {\n this.loading = true;\n try {\n const {\n startDate,\n endDate\n } = this.getTrendDateRangeParams();\n const params = new URLSearchParams({\n action: 'info',\n timezoneOffset: String(new Date().getTimezoneOffset()),\n trendMaxPoints: '90',\n trendSeriesLimit: '8',\n trendStartDate: startDate,\n trendEndDate: endDate\n });\n const response = await fetchWithAuth(`/api/manage/list?${params.toString()}`, {\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(this.$t('sysStatus.fetchIndexFailed'));\n } finally {\n this.loading = false;\n }\n },\n // 重建索引 - 使用前端辅助重建流程\n async rebuildIndex() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.rebuilding = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 IndexRebuilder 实例\n this.currentRebuilder = new IndexRebuilder({\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n try {\n const result = await this.currentRebuilder.rebuild();\n\n // 成功完成\n this.$message.success(this.$t('sysStatus.rebuildSuccess', {\n count: result.totalFiles.toLocaleString()\n }));\n\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.rebuilding = false;\n this.isProcessing = false;\n this.currentRebuilder = null;\n this.processingStartTime = null;\n }\n },\n // 备份数据 - 使用前端辅助备份流程\n async backupData() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.backing = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 BackupGenerator 实例\n this.currentBackupGenerator = new BackupGenerator({\n onProgress: progress => this.handleProgress(progress)\n });\n try {\n const result = await this.currentBackupGenerator.generateBackup();\n\n // 成功完成\n const settingsMsg = result.settingsCount > 0 ? this.$t('sysStatus.backupSuccessWithSettings', {\n fileCount: result.fileCount.toLocaleString(),\n settingsCount: result.settingsCount\n }) : this.$t('sysStatus.backupSuccess', {\n count: result.fileCount.toLocaleString()\n });\n this.$message.success(settingsMsg);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.backing = false;\n this.isProcessing = false;\n this.currentBackupGenerator = null;\n this.processingStartTime = null;\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(this.$t('sysStatus.selectJsonFile'));\n return;\n }\n\n // 确认恢复操作\n try {\n await this.$confirm(this.$t('sysStatus.restoreConfirmMessage'), this.$t('sysStatus.restoreConfirmTitle'), {\n confirmButtonText: this.$t('sysStatus.restoreConfirmOk'),\n cancelButtonText: this.$t('sysStatus.restoreConfirmCancel'),\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 if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.restoring = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n try {\n // 解析备份文件\n const fileContent = await file.text();\n let backupData;\n try {\n backupData = JSON.parse(fileContent);\n } catch (parseError) {\n throw new Error(this.$t('sysStatus.invalidBackupFile'));\n }\n\n // 创建 RestoreProcessor 实例\n this.currentRestoreProcessor = new RestoreProcessor({\n chunkSize: 100,\n // 每批恢复 100 条\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n const result = await this.currentRestoreProcessor.restore(backupData);\n\n // 恢复完成,重置恢复状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n\n // 显示恢复成功消息\n this.$message.success(this.$t('sysStatus.restoreSuccess', {\n files: result.restoredFiles,\n settings: result.restoredSettings\n }));\n\n // 短暂延迟后自动开始重建索引\n await new Promise(resolve => setTimeout(resolve, 500));\n await this.rebuildIndex();\n } catch (error) {\n console.error('恢复数据失败:', error);\n\n // 出错时重置状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(this.$t('sysStatus.restoreFailed') + ': ' + errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n }\n },\n // 格式化时间\n formatTime(timestamp) {\n if (!timestamp) return this.$t('sysStatus.unknown');\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 this.$t('sysStatus.daysAgo', {\n count: days\n });\n if (hours > 0) return this.$t('sysStatus.hoursAgo', {\n count: hours\n });\n if (minutes > 0) return this.$t('sysStatus.minutesAgo', {\n count: minutes\n });\n return this.$t('sysStatus.justNow');\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 openFileInNewTab(file) {\n if (!file?.id) return;\n window.open('/file/' + file.id + '?from=admin', '_blank');\n },\n // 处理进度更新\n handleProgress(progress) {\n this.processingPhase = progress.phase;\n this.processingProgress.message = progress.message || '';\n this.processingProgress.current = progress.current || 0;\n\n // 根据不同阶段计算进度百分比\n if (progress.phase === 'fetching') {\n // 获取阶段:基于已获取的记录数估算(假设总数未知时显示已获取数量)\n this.processingProgress.total = progress.total || 0;\n // 获取阶段占总进度的 60%\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = Math.min(60, progress.current / progress.total * 60);\n } else {\n // 未知总数时,使用对数增长模拟进度\n this.processingProgress.percentage = Math.min(50, Math.log10(progress.current + 1) * 15);\n }\n } else if (progress.phase === 'sorting') {\n // 排序阶段:占 60-70%\n this.processingProgress.percentage = 65;\n this.processingProgress.total = progress.total || this.processingProgress.total;\n } else if (progress.phase === 'uploading') {\n // 上传阶段:占 70-95%\n this.processingProgress.total = progress.total || 0;\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = 70 + progress.current / progress.total * 25;\n }\n } else if (progress.phase === 'finalizing') {\n // 完成阶段:95-100%\n this.processingProgress.percentage = 97;\n } else if (progress.phase === 'building') {\n // 构建备份阶段:70-90%\n this.processingProgress.percentage = 80;\n } else if (progress.phase === 'downloading') {\n // 下载阶段:90-100%\n this.processingProgress.percentage = 95;\n } else if (progress.phase === 'restoring_files') {\n // 恢复文件阶段:0-80%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 0;\n } else if (progress.phase === 'restoring_settings') {\n // 恢复设置阶段:80-100%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 80;\n } else if (progress.phase === 'completed') {\n // 完成\n this.processingProgress.percentage = 100;\n } else if (progress.phase === 'retrying') {\n // 重试阶段:保持当前进度\n this.processingProgress.message = progress.message;\n }\n },\n // 处理错误\n handleError(error) {\n console.error('批量操作错误:', error);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n },\n // 取消当前操作\n cancelOperation() {\n if (this.currentRebuilder) {\n this.currentRebuilder.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentBackupGenerator) {\n this.currentBackupGenerator.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentRestoreProcessor) {\n this.currentRestoreProcessor.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n },\n // 重试操作\n retryOperation() {\n this.processingError = null;\n if (this.rebuilding) {\n this.rebuilding = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.rebuildIndex();\n });\n } else if (this.backing) {\n this.backing = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.backupData();\n });\n }\n },\n // 关闭错误提示\n dismissError() {\n this.processingError = null;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=f8e4c870&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=f8e4c870&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-f8e4c870\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, renderSlot as _renderSlot, createBlock as _createBlock, createCommentVNode as _createCommentVNode, vShow as _vShow, withModifiers as _withModifiers, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = [\"onClick\"];\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([\"custom-select\", {\n 'is-open': $data.isOpen\n }]),\n style: _normalizeStyle({\n width: $props.width\n })\n }, [_createElementVNode(\"div\", {\n class: \"custom-select-trigger\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleDropdown && $options.toggleDropdown(...args))\n }, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-select-value\", {\n 'is-placeholder': !$props.modelValue\n }])\n }, _toDisplayString($options.displayLabel), 3), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"custom-select-arrow\"\n })]), _createVNode(_Transition, {\n name: \"dropdown-fade\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: \"custom-select-dropdown\",\n onClick: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.options, option => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: option.value,\n class: _normalizeClass([\"custom-select-option\", {\n 'is-selected': $props.modelValue === option.value\n }]),\n onClick: $event => $options.selectOption(option.value)\n }, [_renderSlot(_ctx.$slots, \"option\", {\n option: option\n }, () => [option.icon ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: option.icon,\n class: \"option-icon\"\n }, null, 8, [\"icon\"])) : _createCommentVNode(\"\", true), _createElementVNode(\"span\", null, _toDisplayString(option.label), 1)], true)], 10, _hoisted_1);\n }), 128))], 512), [[_vShow, $data.isOpen]])]),\n _: 3\n })], 6);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nexport default {\n name: 'CustomSelect',\n props: {\n modelValue: {\n type: [String, Number],\n default: ''\n },\n options: {\n type: Array,\n required: true\n // 格式: [{ value: '', label: '', icon?: '' }]\n },\n placeholder: {\n type: String,\n default: ''\n },\n width: {\n type: String,\n default: '160px'\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n isOpen: false\n };\n },\n computed: {\n resolvedPlaceholder() {\n return this.placeholder || this.$t('common.select');\n },\n displayLabel() {\n const selected = this.options.find(opt => opt.value === this.modelValue);\n return selected ? selected.label : this.resolvedPlaceholder;\n }\n },\n mounted() {\n document.addEventListener('click', this.handleClickOutside);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleClickOutside);\n },\n methods: {\n toggleDropdown() {\n this.isOpen = !this.isOpen;\n },\n selectOption(value) {\n this.$emit('update:modelValue', value);\n this.$emit('change', value);\n this.isOpen = false;\n },\n handleClickOutside(e) {\n if (!this.$el.contains(e.target)) {\n this.isOpen = false;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./CustomSelect.vue?vue&type=template&id=55080c16&scoped=true\"\nimport script from \"./CustomSelect.vue?vue&type=script&lang=js\"\nexport * from \"./CustomSelect.vue?vue&type=script&lang=js\"\n\nimport \"./CustomSelect.vue?vue&type=style&index=0&id=55080c16&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-55080c16\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, 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, createCommentVNode as _createCommentVNode, createBlock as _createBlock, withModifiers as _withModifiers, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"page-header\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"header-actions\"\n};\nconst _hoisted_5 = {\n class: \"group-header\"\n};\nconst _hoisted_6 = {\n class: \"group-title\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"load-balance-switch\"\n};\nconst _hoisted_8 = {\n class: \"switch-label\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"channel-cards\"\n};\nconst _hoisted_10 = [\"onMousemove\", \"onMouseleave\"];\nconst _hoisted_11 = {\n class: \"card-header\"\n};\nconst _hoisted_12 = {\n class: \"card-title\"\n};\nconst _hoisted_13 = {\n class: \"channel-name\"\n};\nconst _hoisted_14 = {\n class: \"card-body\"\n};\nconst _hoisted_15 = {\n class: \"card-info\"\n};\nconst _hoisted_16 = {\n class: \"info-item\"\n};\nconst _hoisted_17 = {\n class: \"info-text\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_19 = {\n class: \"info-text\"\n};\nconst _hoisted_20 = {\n key: 1,\n class: \"info-item\"\n};\nconst _hoisted_21 = [\"title\"];\nconst _hoisted_22 = {\n class: \"info-item\"\n};\nconst _hoisted_23 = {\n class: \"info-text\"\n};\nconst _hoisted_24 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_25 = [\"title\"];\nconst _hoisted_26 = {\n class: \"info-item\"\n};\nconst _hoisted_27 = {\n class: \"info-text\"\n};\nconst _hoisted_28 = {\n class: \"info-item\"\n};\nconst _hoisted_29 = {\n class: \"info-text\"\n};\nconst _hoisted_30 = {\n class: \"info-item\"\n};\nconst _hoisted_31 = {\n class: \"info-text\"\n};\nconst _hoisted_32 = {\n class: \"info-item\"\n};\nconst _hoisted_33 = [\"title\"];\nconst _hoisted_34 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_35 = [\"title\"];\nconst _hoisted_36 = {\n key: 0,\n class: \"quota-mini\"\n};\nconst _hoisted_37 = {\n class: \"quota-text\"\n};\nconst _hoisted_38 = {\n class: \"card-actions\"\n};\nconst _hoisted_39 = {\n key: 1,\n class: \"empty-tip\"\n};\nconst _hoisted_40 = {\n key: 0,\n class: \"form-warning\",\n style: {\n \"margin-top\": \"0\"\n }\n};\nconst _hoisted_41 = [\"innerHTML\"];\nconst _hoisted_42 = {\n class: \"form-tip\"\n};\nconst _hoisted_43 = {\n class: \"form-tip\"\n};\nconst _hoisted_44 = {\n class: \"form-tip\"\n};\nconst _hoisted_45 = {\n class: \"form-warning\"\n};\nconst _hoisted_46 = {\n class: \"form-tip\"\n};\nconst _hoisted_47 = {\n class: \"form-tip\"\n};\nconst _hoisted_48 = {\n class: \"form-tip\"\n};\nconst _hoisted_49 = {\n class: \"quota-label\"\n};\nconst _hoisted_50 = {\n class: \"quota-status\"\n};\nconst _hoisted_51 = {\n class: \"form-tip\"\n};\nconst _hoisted_52 = {\n class: \"form-tip\"\n};\nconst _hoisted_53 = {\n class: \"form-tip\"\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_CustomSelect = _resolveComponent(\"CustomSelect\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_el_descriptions_item = _resolveComponent(\"el-descriptions-item\");\n const _component_el_descriptions = _resolveComponent(\"el-descriptions\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.title')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.titleTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_CustomSelect, {\n modelValue: $data.channelFilter,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.channelFilter = $event),\n options: $options.filterOptions,\n placeholder: _ctx.$t('sysUpload.filterPlaceholder'),\n width: \"160px\"\n }, null, 8, [\"modelValue\", \"options\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[1] || (_cache[1] = $event => $data.showAddDialog = true),\n class: \"add-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.addChannel')), 1)]),\n _: 1\n })])]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.filteredChannels, channelType => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channelType.value,\n class: \"channel-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: $options.getChannelIcon(channelType.value),\n class: \"group-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", null, _toDisplayString(channelType.label), 1), _createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n class: \"channel-count\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelList(channelType.value).length), 1)]),\n _: 2\n }, 1024)]), $options.hasLoadBalance(channelType.value) ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, _toDisplayString(_ctx.$t('sysUpload.loadBalance')), 1), _createVNode(_component_el_switch, {\n modelValue: $options.getSettings(channelType.value).loadBalance.enabled,\n \"onUpdate:modelValue\": $event => $options.getSettings(channelType.value).loadBalance.enabled = $event,\n size: \"small\",\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])])) : _createCommentVNode(\"\", true)]), $options.getChannelList(channelType.value).length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.getChannelList(channelType.value), (channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel.name || index,\n class: _normalizeClass([\"channel-card\", [channelType.value, {\n 'disabled': !channel.enabled,\n 'fixed': channel.fixed\n }]]),\n onMousemove: $event => $options.handleCardMouseMove($event, channelType.value, index),\n onMouseleave: $event => $options.handleCardMouseLeave(channelType.value, index)\n }, [_createElementVNode(\"div\", {\n class: \"card-glow\",\n ref_for: true,\n ref: `glow-${channelType.value}-${index}`\n }, null, 512), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(channel.name || _ctx.$t('sysUpload.unnamedChannel')), 1), channel.fixed ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), _createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event,\n size: \"small\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, [channelType.value === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_17, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), channel.chatId ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_19, \"Channel: \" + _toDisplayString($options.maskText(channel.chatId)), 1)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_20, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_21)])) : channelType.value === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"server\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_23, _toDisplayString(channel.bucketName || _ctx.$t('sysUpload.notSet')), 1)]), channel.endpoint ? (_openBlock(), _createElementBlock(\"div\", _hoisted_24, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.endpoint\n }, _toDisplayString(channel.endpoint), 9, _hoisted_25)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createElementVNode(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_27, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_29, \"Channel: \" + _toDisplayString($options.maskText(channel.channelId)), 1)]), channel.isNitro ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"success\"\n }, {\n default: _withCtx(() => [...(_cache[78] || (_cache[78] = [_createTextVNode(\"Nitro\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createElementVNode(\"div\", _hoisted_30, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(channel.repo || _ctx.$t('sysUpload.notSet')), 1)]), channel.isPrivate ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.baseUrl\n }, _toDisplayString(channel.baseUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_33)]), channel.publicUrl ? (_openBlock(), _createElementBlock(\"div\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl), 9, _hoisted_35)])) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]), channel.quota?.enabled ? (_openBlock(), _createElementBlock(\"div\", _hoisted_36, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 6\n }, null, 8, [\"percentage\", \"status\"]), _createElementVNode(\"span\", _hoisted_37, _toDisplayString($options.getQuotaText(channel)), 1)])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_38, [_createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openDetailDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"eye\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.detail')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openEditDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"edit\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"danger\",\n size: \"small\",\n onClick: $event => $options.deleteChannel(channelType.value, index),\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])])], 42, _hoisted_10);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_39, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\",\n class: \"empty-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysUpload.noChannels', {\n type: channelType.label\n })), 1)]))]);\n }), 128)), _createVNode(_component_el_dialog, {\n modelValue: $data.showAddDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showAddDialog = $event),\n title: _ctx.$t('sysUpload.addDialogTitle'),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetAddForm\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showAddDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), $data.newChannel.type !== 'cfr2' ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: $options.confirmAddChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.confirmAdd')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newChannel,\n \"label-position\": \"top\",\n ref: \"addForm\",\n rules: $options.addRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelTypeLabel'),\n prop: \"type\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.newChannel.type,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.newChannel.type = $event),\n placeholder: _ctx.$t('sysUpload.channelTypePlaceholder'),\n style: {\n \"width\": \"100%\"\n },\n onChange: $options.onChannelTypeChange\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.addableChannels, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.value,\n label: ch.label,\n value: ch.value\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $options.getChannelIcon(ch.value),\n class: \"select-option-icon\"\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString(ch.label), 1)]),\n _: 2\n }, 1032, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.type === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_40, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createElementVNode(\"span\", {\n innerHTML: _ctx.$t('sysUpload.r2ConfigNote')\n }, null, 8, _hoisted_41)])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelNameLabel'),\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.name,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.newChannel.name = $event),\n placeholder: _ctx.$t('sysUpload.channelNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.type === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.chatId,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.newChannel.chatId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.chatIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.newChannel.type === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.endpoint,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.newChannel.endpoint = $event),\n placeholder: _ctx.$t('sysUpload.endpointPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.cdnDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.newChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"]), _createElementVNode(\"span\", _hoisted_42, _toDisplayString(_ctx.$t('sysUpload.cdnDomainTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.bucketName,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.newChannel.bucketName = $event),\n placeholder: _ctx.$t('sysUpload.bucketNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.region,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.newChannel.region = $event),\n placeholder: _ctx.$t('sysUpload.bucketRegionPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newChannel.accessKeyId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessKeyIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newChannel.secretAccessKey = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.secretAccessKeyPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.pathStyle')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.newChannel.pathStyle = $event)\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_43, _toDisplayString(_ctx.$t('sysUpload.pathStyleTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.newChannel.type === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.channelId,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.newChannel.channelId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.channelIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.nitroMember')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isNitro,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_44, _toDisplayString(_ctx.$t('sysUpload.nitroTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createElementVNode(\"div\", _hoisted_45, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.discordWarning')), 1)])], 64)) : $data.newChannel.type === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.repo,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newChannel.repo = $event),\n placeholder: _ctx.$t('sysUpload.repoNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.token,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newChannel.token = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.privateRepo')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_46, _toDisplayString(_ctx.$t('sysUpload.privateRepoTip')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.newChannel.type === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newChannel.baseUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavBaseUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.username,\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $data.newChannel.username = $event),\n placeholder: _ctx.$t('sysUpload.webdavUsernamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.password,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.newChannel.password = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.webdavPasswordPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.newChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"]), _createElementVNode(\"span\", _hoisted_47, _toDisplayString(_ctx.$t('sysUpload.webdavPublicUrlTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.headersText,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.newChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavCreateDirectory')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.newChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_48, _toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectoryTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)], 64))]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showDetailDialog,\n \"onUpdate:modelValue\": _cache[37] || (_cache[37] = $event => $data.showDetailDialog = $event),\n title: _ctx.$t('sysUpload.detailDialogTitle', {\n name: $data.currentChannel?.name || ''\n }),\n class: \"channel-dialog\",\n onClosed: $options.resetDetailData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[36] || (_cache[36] = $event => $data.showDetailDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.closeBtn')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.openEditFromDetail\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_descriptions, {\n column: 1,\n border: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelNameDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelTypeDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelTypeLabel($data.currentChannelType)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.statusLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: $data.currentChannel?.enabled ? 'success' : 'info'\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.enabled ? _ctx.$t('sysUpload.enabled') : _ctx.$t('sysUpload.disabled')), 1)]),\n _: 1\n }, 8, [\"type\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannel?.fixed ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 0,\n label: _ctx.$t('sysUpload.configSource')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.chatIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.chatId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 2,\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"])) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.endpointLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.endpoint,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.cdnDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.cdnDomain || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.bucketName), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketRegion')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.region), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.pathStyle')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.pathStyle ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.channelId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.nitroMember')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isNitro ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.repoName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.repo), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.privateRepo')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isPrivate ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 6\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.baseUrl,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.username || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $options.formatHeaders($data.currentChannel?.headers),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavCreateDirectory')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.createDirectory !== false ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true), $data.currentChannel?.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 7\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.limitGB) + \" GB\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.threshold) + \"%\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, null, {\n label: _withCtx(() => [_createElementVNode(\"span\", _hoisted_49, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.currentUsage')) + \" \", 1), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n class: \"refresh-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\",\n class: _normalizeClass({\n 'fa-spin': $data.quotaLoading\n })\n }, null, 8, [\"class\"])]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_50, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage($data.currentChannel),\n status: $options.getQuotaStatus($data.currentChannel),\n \"stroke-width\": 16,\n \"text-inside\": true,\n format: () => $options.getQuotaText($data.currentChannel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded($data.currentChannel)\n }])\n }, _toDisplayString($options.getQuotaStatusText($data.currentChannel)), 3)])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditDialog,\n \"onUpdate:modelValue\": _cache[77] || (_cache[77] = $event => $data.showEditDialog = $event),\n title: _ctx.$t('sysUpload.editDialogTitle', {\n name: $data.editChannel?.name || ''\n }),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetEditData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[76] || (_cache[76] = $event => $data.showEditDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.confirmEditChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.saveChanges')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editChannel,\n \"label-position\": \"top\",\n ref: \"editForm\",\n rules: $options.editRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelNameLabel'),\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.name,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.editChannel.name = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.enableChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.enabled,\n \"onUpdate:modelValue\": _cache[39] || (_cache[39] = $event => $data.editChannel.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[40] || (_cache[40] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.chatId,\n \"onUpdate:modelValue\": _cache[41] || (_cache[41] = $event => $data.editChannel.chatId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[42] || (_cache[42] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[43] || (_cache[43] = $event => $data.editChannel.publicUrl = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[44] || (_cache[44] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[45] || (_cache[45] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[46] || (_cache[46] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[47] || (_cache[47] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.endpoint,\n \"onUpdate:modelValue\": _cache[48] || (_cache[48] = $event => $data.editChannel.endpoint = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.cdnDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[49] || (_cache[49] = $event => $data.editChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"]), _createElementVNode(\"span\", _hoisted_51, _toDisplayString(_ctx.$t('sysUpload.cdnDomainTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.bucketName,\n \"onUpdate:modelValue\": _cache[50] || (_cache[50] = $event => $data.editChannel.bucketName = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.region,\n \"onUpdate:modelValue\": _cache[51] || (_cache[51] = $event => $data.editChannel.region = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[52] || (_cache[52] = $event => $data.editChannel.accessKeyId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[53] || (_cache[53] = $event => $data.editChannel.secretAccessKey = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.pathStyle')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[54] || (_cache[54] = $event => $data.editChannel.pathStyle = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[55] || (_cache[55] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[56] || (_cache[56] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[57] || (_cache[57] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[58] || (_cache[58] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[59] || (_cache[59] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.channelId,\n \"onUpdate:modelValue\": _cache[60] || (_cache[60] = $event => $data.editChannel.channelId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[61] || (_cache[61] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.nitroMember')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isNitro,\n \"onUpdate:modelValue\": _cache[62] || (_cache[62] = $event => $data.editChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.repo,\n \"onUpdate:modelValue\": _cache[63] || (_cache[63] = $event => $data.editChannel.repo = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.token,\n \"onUpdate:modelValue\": _cache[64] || (_cache[64] = $event => $data.editChannel.token = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.privateRepo')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[65] || (_cache[65] = $event => $data.editChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[66] || (_cache[66] = $event => $data.editChannel.baseUrl = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.username,\n \"onUpdate:modelValue\": _cache[67] || (_cache[67] = $event => $data.editChannel.username = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.password,\n \"onUpdate:modelValue\": _cache[68] || (_cache[68] = $event => $data.editChannel.password = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[69] || (_cache[69] = $event => $data.editChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"]), _createElementVNode(\"span\", _hoisted_52, _toDisplayString(_ctx.$t('sysUpload.webdavPublicUrlTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.headersText,\n \"onUpdate:modelValue\": _cache[70] || (_cache[70] = $event => $data.editChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavCreateDirectory')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[71] || (_cache[71] = $event => $data.editChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_53, _toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectoryTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[72] || (_cache[72] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[73] || (_cache[73] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[74] || (_cache[74] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[75] || (_cache[75] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"])])), [[_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.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.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport CustomSelect from './CustomSelect.vue';\nexport default {\n components: {\n CustomSelect\n },\n data() {\n return {\n // 渠道类型筛选\n channelFilter: '',\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 value: 'webdav',\n label: 'WebDAV'\n }],\n // 可添加的渠道类型\n addableChannels: [{\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 value: 'webdav',\n label: 'WebDAV'\n }],\n // 各渠道配置\n telegramSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n cfr2Settings: {\n channels: []\n },\n s3Settings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n discordSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n huggingfaceSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n webdavSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n // 弹窗控制\n showAddDialog: false,\n showDetailDialog: false,\n showEditDialog: false,\n // 当前操作的渠道\n currentChannelType: '',\n currentChannelIndex: -1,\n currentChannel: null,\n editChannel: {},\n // 新增渠道表单\n newChannel: {\n type: '',\n name: '',\n enabled: true,\n // Telegram\n botToken: '',\n chatId: '',\n proxyUrl: '',\n // S3\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n // Discord\n channelId: '',\n isNitro: false,\n // HuggingFace\n repo: '',\n token: '',\n isPrivate: false,\n // WebDAV\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 筛选下拉框选项\n filterOptions() {\n const iconMap = {\n telegram: 'paper-plane',\n cfr2: 'cloud',\n s3: 'database',\n discord: 'comments',\n huggingface: 'robot',\n webdav: 'folder'\n };\n return [{\n value: '',\n label: this.$t('common.all')\n }, ...this.channels.map(ch => ({\n value: ch.value,\n label: ch.label,\n icon: iconMap[ch.value] || 'server'\n }))];\n },\n // 根据筛选条件过滤渠道类型\n filteredChannels() {\n if (!this.channelFilter) {\n return this.channels;\n }\n return this.channels.filter(ch => ch.value === this.channelFilter);\n },\n addRules() {\n return {\n type: [{\n required: true,\n message: this.$t('sysUpload.channelTypePlaceholder'),\n trigger: 'change'\n }],\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n },\n editRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n // 卡片光斑跟随鼠标\n handleCardMouseMove(event, channelType, index) {\n const card = event.currentTarget;\n const rect = card.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '1';\n glowEl[0].style.left = `${x}px`;\n glowEl[0].style.top = `${y}px`;\n }\n },\n handleCardMouseLeave(channelType, index) {\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '0';\n }\n },\n // 获取渠道图标\n getChannelIcon(type) {\n const icons = {\n telegram: 'paper-plane',\n cfr2: 'cloud',\n s3: 'database',\n discord: 'comments',\n huggingface: 'robot',\n webdav: 'folder'\n };\n return icons[type] || 'server';\n },\n // 获取渠道类型标签\n getChannelTypeLabel(type) {\n const channel = this.channels.find(c => c.value === type);\n return channel ? channel.label : type;\n },\n // 获取渠道列表\n getChannelList(type) {\n return this.getSettings(type)?.channels || [];\n },\n // 获取渠道设置对象\n getSettings(type) {\n const map = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n return map[type];\n },\n // 是否有负载均衡选项\n hasLoadBalance(type) {\n return ['telegram', 's3', 'discord', 'huggingface', 'webdav'].includes(type);\n },\n // 文本脱敏\n maskText(text, showLength = 4) {\n if (!text) return this.$t('sysUpload.notSet');\n if (text.length <= showLength * 2) return '****';\n return text.slice(0, showLength) + '****' + text.slice(-showLength);\n },\n formatHeaders(headers) {\n if (!headers || typeof headers === 'object' && Object.keys(headers).length === 0) {\n return this.$t('sysUpload.notSet');\n }\n if (typeof headers === 'string') {\n return headers;\n }\n return JSON.stringify(headers, null, 2);\n },\n headersToText(headers) {\n if (!headers) return '';\n if (typeof headers === 'string') return headers;\n return JSON.stringify(headers, null, 2);\n },\n parseHeadersText(text) {\n if (!text || !text.trim()) return {};\n try {\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return null;\n }\n return parsed;\n } catch (error) {\n return null;\n }\n },\n // 打开详情弹窗\n openDetailDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n this.currentChannel = this.getChannelList(type)[index];\n this.showDetailDialog = true;\n },\n // 打开编辑弹窗\n openEditDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n const channel = this.getChannelList(type)[index];\n this.editChannel = JSON.parse(JSON.stringify(channel));\n if (type === 'webdav') {\n this.editChannel.headersText = this.headersToText(this.editChannel.headers);\n this.editChannel.createDirectory = this.editChannel.createDirectory !== false;\n }\n // 确保 quota 对象存在\n if (!this.editChannel.quota) {\n this.editChannel.quota = {\n enabled: false,\n limitGB: 10,\n threshold: 95\n };\n }\n this.showEditDialog = true;\n },\n // 从详情页打开编辑\n openEditFromDetail() {\n this.showDetailDialog = false;\n this.openEditDialog(this.currentChannelType, this.currentChannelIndex);\n },\n // 重置添加表单\n resetAddForm() {\n this.newChannel = {\n type: '',\n name: '',\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 重置详情弹窗数据\n resetDetailData() {\n this.currentChannel = null;\n },\n // 重置编辑弹窗数据\n resetEditData() {\n this.editChannel = {};\n },\n // 渠道类型变更时重置表单\n onChannelTypeChange() {\n // 保留 type 和 name,重置其他字段\n const {\n type,\n name\n } = this.newChannel;\n this.newChannel = {\n type,\n name,\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 确认添加渠道\n confirmAddChannel() {\n this.$refs.addForm.validate(valid => {\n if (!valid) return;\n const {\n type,\n name\n } = this.newChannel;\n const settings = this.getSettings(type);\n\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env', 'WebDAV_env'];\n if (reservedNames.includes(name)) {\n this.$message.warning(this.$t('sysUpload.reservedName'));\n return;\n }\n\n // 检查名称是否重复\n const isDuplicate = settings.channels.some(ch => ch.name === name);\n if (isDuplicate) {\n this.$message.warning(this.$t('sysUpload.duplicateName'));\n return;\n }\n let newChannelData = {\n id: settings.channels.length + 1,\n name: this.newChannel.name,\n type: type,\n savePath: 'database',\n enabled: true,\n fixed: false\n };\n\n // 根据类型添加特定字段\n if (type === 'telegram') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n chatId: this.newChannel.chatId,\n proxyUrl: this.newChannel.proxyUrl\n });\n } else if (type === 's3') {\n Object.assign(newChannelData, {\n endpoint: this.newChannel.endpoint,\n cdnDomain: this.newChannel.cdnDomain,\n bucketName: this.newChannel.bucketName,\n region: this.newChannel.region,\n accessKeyId: this.newChannel.accessKeyId,\n secretAccessKey: this.newChannel.secretAccessKey,\n pathStyle: this.newChannel.pathStyle,\n quota: {\n ...this.newChannel.quota\n }\n });\n } else if (type === 'discord') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n channelId: this.newChannel.channelId,\n proxyUrl: this.newChannel.proxyUrl,\n isNitro: this.newChannel.isNitro\n });\n } else if (type === 'huggingface') {\n Object.assign(newChannelData, {\n repo: this.newChannel.repo,\n token: this.newChannel.token,\n isPrivate: this.newChannel.isPrivate\n });\n } else if (type === 'webdav') {\n const headers = this.parseHeadersText(this.newChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n Object.assign(newChannelData, {\n baseUrl: this.newChannel.baseUrl,\n username: this.newChannel.username,\n password: this.newChannel.password,\n publicUrl: this.newChannel.publicUrl,\n headers,\n createDirectory: this.newChannel.createDirectory !== false,\n quota: {\n ...this.newChannel.quota\n }\n });\n }\n settings.channels.push(newChannelData);\n this.showAddDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 确认编辑渠道\n confirmEditChannel() {\n this.$refs.editForm.validate(valid => {\n if (!valid) return;\n const settings = this.getSettings(this.currentChannelType);\n const newName = this.editChannel.name;\n const currentIndex = this.currentChannelIndex;\n const isFixedChannel = this.editChannel.fixed;\n\n // 非环境变量渠道才检查名称\n if (!isFixedChannel) {\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env', 'WebDAV_env'];\n if (reservedNames.includes(newName)) {\n this.$message.warning(this.$t('sysUpload.reservedName'));\n return;\n }\n\n // 检查名称是否与其他渠道重复(排除当前编辑的渠道)\n const isDuplicate = settings.channels.some((ch, idx) => idx !== currentIndex && ch.name === newName);\n if (isDuplicate) {\n this.$message.warning(this.$t('sysUpload.duplicateName'));\n return;\n }\n }\n const editedChannel = {\n ...this.editChannel\n };\n if (this.currentChannelType === 'webdav') {\n const headers = this.parseHeadersText(editedChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n editedChannel.headers = headers;\n editedChannel.createDirectory = editedChannel.createDirectory !== false;\n delete editedChannel.headersText;\n }\n settings.channels[this.currentChannelIndex] = editedChannel;\n this.showEditDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 删除渠道\n deleteChannel(type, index) {\n const channel = this.getChannelList(type)[index];\n if (channel.fixed) {\n this.$message.warning(this.$t('sysUpload.fixedChannelCannotDelete'));\n return;\n }\n this.$confirm(this.$t('sysUpload.deleteChannelConfirm'), this.$t('common.info'), {\n confirmButtonText: this.$t('common.confirm'),\n cancelButtonText: this.$t('common.cancel'),\n type: 'warning'\n }).then(() => {\n const settings = this.getSettings(type);\n settings.channels.splice(index, 1);\n // 重新调整 id\n settings.channels.forEach((item, i) => {\n item.id = i + 1;\n });\n // 自动保存\n this.saveSettings();\n }).catch(() => {});\n },\n saveSettings() {\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 webdav: this.webdavSettings\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(this.$t('sysOthers.settingsSaved'));\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(this.$t('sysUpload.quotaInitConfirm'), this.$t('sysUpload.quotaInitTitle'), {\n confirmButtonText: this.$t('sysUpload.quotaInitConfirmBtn'),\n cancelButtonText: this.$t('sysUpload.quotaInitCancelBtn'),\n type: 'info'\n }).then(async () => {\n await this.recalculateQuota();\n }).catch(() => {\n this.$message.info(this.$t('sysUpload.quotaInitLater'));\n });\n }\n }\n },\n // 重新统计容量\n async recalculateQuota() {\n this.quotaLoading = true;\n try {\n this.$message.info(this.$t('sysUpload.quotaCalculating'));\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(this.$t('sysUpload.quotaCalculateSuccess'));\n } else {\n this.$message.error(this.$t('sysUpload.quotaCalculateError') + (data.error || ''));\n }\n } catch (error) {\n console.error('Failed to recalculate quota:', error);\n this.$message.error(this.$t('sysUpload.quotaCalculateFailed'));\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 // 确保 WebDAV 渠道有默认值\n if (data.webdav && data.webdav.channels) {\n data.webdav.channels = data.webdav.channels.map(channel => ({\n ...channel,\n username: channel.username || '',\n password: channel.password || '',\n publicUrl: channel.publicUrl || '',\n headers: channel.headers || {},\n createDirectory: channel.createDirectory !== false,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.webdavSettings = data.webdav || {\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=d225d330&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=d225d330&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-d225d330\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, vShow as _vShow, normalizeClass as _normalizeClass, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"save-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createBlock(_Transition, {\n name: \"fade-up\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: _normalizeClass([\"floating-save-btn\", {\n 'is-loading': $props.loading\n }]),\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleClick && $options.handleClick(...args))\n }, [$props.loading ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"spinner\",\n spin: \"\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"save\"\n })), _createElementVNode(\"span\", _hoisted_1, _toDisplayString($props.loading ? _ctx.$t('floatingSave.saving') : _ctx.$t('floatingSave.save')), 1)], 2), [[_vShow, $data.visible]])]),\n _: 1\n });\n}","export default {\n name: 'FloatingSaveButton',\n emits: ['click'],\n props: {\n loading: {\n type: Boolean,\n default: false\n },\n show: {\n type: Boolean,\n default: true\n }\n },\n data() {\n return {\n visible: false\n };\n },\n watch: {\n show: {\n immediate: true,\n handler(val) {\n if (val) {\n // 延迟显示,等待 Element Plus 加载遮罩淡出动画完成\n setTimeout(() => {\n this.visible = true;\n }, 600);\n } else {\n this.visible = false;\n }\n }\n }\n },\n methods: {\n handleClick() {\n if (!this.loading) {\n this.$emit('click');\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FloatingSaveButton.vue?vue&type=template&id=53091626&scoped=true\"\nimport script from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\nexport * from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\n\nimport \"./FloatingSaveButton.vue?vue&type=style&index=0&id=53091626&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-53091626\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, 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: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"second-title\"\n};\nconst _hoisted_5 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_6 = {\n class: \"second-title\"\n};\nconst _hoisted_7 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_8 = {\n class: \"second-title token-title\"\n};\nconst _hoisted_9 = {\n class: \"token-actions\"\n};\nconst _hoisted_10 = {\n class: \"token-table-container\"\n};\nconst _hoisted_11 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_12 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_13 = {\n class: \"token-display\"\n};\nconst _hoisted_14 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_15 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_16 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_17 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_18 = {\n class: \"table-cell-content action-buttons\"\n};\nconst _hoisted_19 = {\n class: \"first-settings\"\n};\nconst _hoisted_20 = {\n class: \"first-title\"\n};\nconst _hoisted_21 = {\n class: \"second-title\"\n};\nconst _hoisted_22 = {\n class: \"first-settings\"\n};\nconst _hoisted_23 = {\n class: \"first-title\"\n};\nconst _hoisted_24 = {\n class: \"second-title\"\n};\nconst _hoisted_25 = {\n class: \"second-title\"\n};\nconst _hoisted_26 = {\n class: \"second-title\"\n};\nconst _hoisted_27 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_28 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_29 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_30 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_31 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_32 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_33 = {\n class: \"token-result\"\n};\nconst _hoisted_34 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_35 = {\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_checkbox = _resolveComponent(\"el-checkbox\");\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_input_number = _resolveComponent(\"el-input-number\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\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, [_createElementVNode(\"h3\", _hoisted_3, _toDisplayString(_ctx.$t('sysSecurity.authManagement')), 1), _createElementVNode(\"h4\", _hoisted_4, _toDisplayString(_ctx.$t('sysSecurity.userAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.user,\n rules: $options.userPassRules,\n ref: \"userPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.uploadPassword'),\n prop: \"authCode\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_5, [_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 placeholder: $data.authSettings.user._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearUserPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.user._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearUserPassword,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.clearUserPassword = $event),\n onChange: $options.handleClearUserPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showUserPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\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[2] || (_cache[2] = $event => $data.authSettings.user.confirmNewUserPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_6, _toDisplayString(_ctx.$t('sysSecurity.adminAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.admin,\n rules: $options.adminPassRules,\n ref: \"adminPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminUsername'),\n prop: \"adminUsername\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminUsername,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.authSettings.admin.adminUsername = $event),\n autocomplete: \"new-password\",\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminPassword'),\n prop: \"adminPassword\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminPassword,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.authSettings.admin.adminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleAdminPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.admin._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.admin._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearAdminPassword,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.clearAdminPassword = $event),\n onChange: $options.handleClearAdminPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showAdminPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\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[6] || (_cache[6] = $event => $data.authSettings.admin.confirmNewAdminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.apiTokenManagement')) + \" \", 1), _createElementVNode(\"a\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: _cache[7] || (_cache[7] = $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_10, [_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: _ctx.$t('sysSecurity.tokenName'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(scope.row.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"token\",\n label: _ctx.$t('sysSecurity.tokenValue'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(scope.row.token), 1)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"permissions\",\n label: _ctx.$t('sysSecurity.permissions'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_14, [(_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 }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"createdAt\",\n label: _ctx.$t('sysSecurity.createdAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_15, _toDisplayString($options.formatDate(scope.row.createdAt)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.status'),\n \"header-align\": \"center\",\n width: \"90\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_tag, {\n type: $options.getTokenStatus(scope.row.expiresAt).status === 'active' ? 'success' : 'danger',\n size: \"small\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getTokenStatus(scope.row.expiresAt).label), 1)]),\n _: 2\n }, 1032, [\"type\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.expiresAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_17, _toDisplayString($options.getTokenStatus(scope.row.expiresAt).expiresText), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.operation'),\n fixed: \"right\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_18, [_createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n onClick: $event => $options.editToken(scope.row)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.editBtn')), 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(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, $data.tokenLoading]])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"h3\", _hoisted_20, _toDisplayString(_ctx.$t('sysSecurity.uploadManagement')), 1), _createElementVNode(\"h4\", _hoisted_21, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.imageReview')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.imageReviewTooltip'),\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 }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.moderate,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableReview')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.moderate.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.uploadSettings.moderate.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.reviewChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.moderate.channel,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.uploadSettings.moderate.channel = $event),\n placeholder: _ctx.$t('sysSecurity.reviewChannelPlaceholder')\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\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.moderate.channel === 'moderatecontent.com' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.apiKey')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.moderateContentApiKey,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.uploadSettings.moderate.moderateContentApiKey = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.uploadSettings.moderate.channel === 'nsfwjs' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.nsfwApiPath,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.uploadSettings.moderate.nsfwApiPath = $event),\n placeholder: \"https://nsfwjs.your.domain\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"h3\", _hoisted_23, _toDisplayString(_ctx.$t('sysSecurity.accessManagement')), 1), _createElementVNode(\"h4\", _hoisted_24, _toDisplayString(_ctx.$t('sysSecurity.domainFilter')), 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(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.allowedDomains')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.allowedDomainsTooltip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.accessSettings.allowedDomains,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.accessSettings.allowedDomains = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_25, _toDisplayString(_ctx.$t('sysSecurity.whiteListMode')), 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(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.enableWhiteList')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.enableWhiteListTooltip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.whiteListMode,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.accessSettings.whiteListMode = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_26, _toDisplayString(_ctx.$t('sysSecurity.sessionSecurityPolicy')), 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(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.secureMode')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.secureModeTooltip'),\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 }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.sessionSecure,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.accessSettings.sessionSecure = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.userSessionMaxAge')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.userSessionMaxAge,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.accessSettings.userSessionMaxAge = $event),\n min: 1,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_27, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminSessionMaxAge')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.adminSessionMaxAge,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.accessSettings.adminSessionMaxAge = $event),\n min: 1,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_28, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showCreateTokenDialog,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.showCreateTokenDialog = $event),\n title: _ctx.$t('sysSecurity.createTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_30, [_createVNode(_component_el_button, {\n onClick: _cache[23] || (_cache[23] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.createBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newToken,\n rules: $options.tokenRules,\n ref: \"tokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel'),\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newToken.name,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.newToken.name = $event),\n placeholder: _ctx.$t('sysSecurity.tokenNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.newToken.permissions,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.newToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.neverExpire,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.newToken.neverExpire = $event),\n onChange: $options.onCreateNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_29, [_createVNode(_component_el_input_number, {\n modelValue: $data.newToken.expirationValue,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.newToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.autoDelete,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditTokenDialog,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.showEditTokenDialog = $event),\n title: _ctx.$t('sysSecurity.editTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_32, [_createVNode(_component_el_button, {\n onClick: _cache[31] || (_cache[31] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.updateBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editingToken,\n rules: $options.editTokenRules,\n ref: \"editTokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editingToken.name,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.editingToken.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.editingToken.permissions,\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $data.editingToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.neverExpire,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.editingToken.neverExpire = $event),\n onChange: $options.onEditNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_31, [_createVNode(_component_el_input_number, {\n modelValue: $data.editingToken.expirationValue,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.editingToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.editingToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.editingToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.autoDelete,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.editingToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showTokenResultDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showTokenResultDialog = $event),\n title: _ctx.$t('sysSecurity.tokenCreatedTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_35, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[34] || (_cache[34] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.savedBtn')), 1)]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_33, [_createElementVNode(\"p\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysSecurity.tokenCreatedWarning')), 1)]), _createVNode(_component_el_form, {\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($data.createdToken.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.fullToken')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.createdToken.token,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.createdToken.token = $event),\n readonly: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.copyToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.copyBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"])])), [[_directive_loading, $data.loading]]);\n}","/**\r\n * Token 过期时间工具模块\r\n * 提供 Token 有效期计算、状态判定和向后兼容默认值填充功能\r\n */\r\n\r\n/**\r\n * 时间单位到毫秒的映射(月和年需要特殊处理)\r\n */\r\nconst SIMPLE_UNIT_MS = {\r\n s: 1000,\r\n m: 60 * 1000,\r\n h: 60 * 60 * 1000,\r\n d: 24 * 60 * 60 * 1000,\r\n};\r\n\r\n/**\r\n * 根据基准时间、数值和时间单位计算过期时间\r\n * @param {Date|string} baseTime - 基准时间(Date 对象或 ISO 8601 字符串)\r\n * @param {number} value - 正整数有效期数值\r\n * @param {string} unit - 时间单位:'s','m','h','d','M','Y'\r\n * @returns {string} 过期时间 ISO 8601 字符串\r\n * @throws {Error} 当 value <= 0 或 unit 无效时抛出错误\r\n */\r\nexport function computeExpiresAt(baseTime, value, unit) {\r\n if (!Number.isFinite(value) || value <= 0) {\r\n throw new Error('有效期数值必须大于 0');\r\n }\r\n\r\n const base = typeof baseTime === 'string' ? new Date(baseTime) : new Date(baseTime.getTime());\r\n\r\n if (SIMPLE_UNIT_MS[unit]) {\r\n return new Date(base.getTime() + value * SIMPLE_UNIT_MS[unit]).toISOString();\r\n }\r\n\r\n if (unit === 'M') {\r\n base.setUTCMonth(base.getUTCMonth() + value);\r\n return base.toISOString();\r\n }\r\n\r\n if (unit === 'Y') {\r\n base.setUTCFullYear(base.getUTCFullYear() + value);\r\n return base.toISOString();\r\n }\r\n\r\n throw new Error(`无效的时间单位: ${unit}`);\r\n}\r\n\r\n\r\n/**\r\n * 格式化过期时间为可读字符串\r\n * @param {string} isoString - ISO 8601 时间字符串\r\n * @returns {string} 格式化后的时间字符串\r\n */\r\nfunction formatExpiresTime(isoString) {\r\n const date = new Date(isoString);\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hours = String(date.getHours()).padStart(2, '0');\r\n const minutes = String(date.getMinutes()).padStart(2, '0');\r\n const seconds = String(date.getSeconds()).padStart(2, '0');\r\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\r\n}\r\n\r\n/**\r\n * 获取 Token 的状态信息\r\n * @param {string|null} expiresAt - 过期时间 ISO 8601 字符串,null 表示永不过期\r\n * @param {Date} [now=new Date()] - 当前时间\r\n * @returns {{ status: 'active'|'expired', label: '有效'|'已过期', expiresText: string }}\r\n */\r\nexport function getTokenStatus(expiresAt, now = new Date()) {\r\n if (expiresAt === null || expiresAt === undefined) {\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: '永不过期',\r\n };\r\n }\r\n\r\n const expiresDate = new Date(expiresAt);\r\n const currentTime = now instanceof Date ? now : new Date(now);\r\n const formattedTime = formatExpiresTime(expiresAt);\r\n\r\n if (currentTime.getTime() > expiresDate.getTime()) {\r\n return {\r\n status: 'expired',\r\n label: '已过期',\r\n expiresText: formattedTime,\r\n };\r\n }\r\n\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: formattedTime,\r\n };\r\n}\r\n\r\n\r\n/**\r\n * 为缺少过期相关字段的旧 Token 数据填充默认值\r\n * @param {Object} tokenData - Token 数据对象\r\n * @returns {Object} 填充默认值后的新 Token 数据对象\r\n */\r\nexport function applyTokenDefaults(tokenData) {\r\n return {\r\n ...tokenData,\r\n expiresAt: tokenData.expiresAt ?? null,\r\n autoDelete: tokenData.autoDelete ?? false,\r\n };\r\n}\r\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';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nimport { computeExpiresAt, getTokenStatus } from '@/utils/tokenExpiration';\nexport default {\n components: {\n FloatingSaveButton\n },\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: true,\n tokenLoading: false,\n // 修改密码相关\n oriUserPassword: '',\n // 原上传密码\n oriAdminPassword: '',\n // 原管理端密码\n\n showUserPassConfirm: false,\n // 显示用户密码确认框\n showAdminPassConfirm: false,\n // 显示管理密码确认框\n clearUserPassword: false,\n // 清除用户密码开关\n clearAdminPassword: false,\n // 清除管理密码开关\n\n // Token对话框相关\n showCreateTokenDialog: false,\n showEditTokenDialog: false,\n showTokenResultDialog: false,\n timeUnitOptions: [{\n labelKey: 'sysSecurity.timeUnitSeconds',\n value: 's'\n }, {\n labelKey: 'sysSecurity.timeUnitMinutes',\n value: 'm'\n }, {\n labelKey: 'sysSecurity.timeUnitHours',\n value: 'h'\n }, {\n labelKey: 'sysSecurity.timeUnitDays',\n value: 'd'\n }, {\n labelKey: 'sysSecurity.timeUnitMonths',\n value: 'M'\n }, {\n labelKey: 'sysSecurity.timeUnitYears',\n value: 'Y'\n }],\n newToken: {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n editingToken: {\n id: '',\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n createdToken: {\n name: '',\n token: ''\n }\n };\n },\n computed: {\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n userPassRules() {\n return {\n authCode: [{\n validator: (rule, value, callback) => {\n const urlReservedChars = ['%', '&', '?', '#', '/'];\n const hasReservedChar = urlReservedChars.some(char => value && value.includes(char));\n if (hasReservedChar) {\n callback(new Error(this.$t('sysSecurity.passwordUrlReserved')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n confirmNewUserPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmUploadPassword')));\n } else if (value !== this.authSettings.user.authCode) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n adminPassRules() {\n return {\n confirmNewAdminPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmAdminPassword')));\n } else if (value !== this.authSettings.admin.adminPassword) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n tokenRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysSecurity.tokenNameRequired'),\n trigger: 'blur'\n }],\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.newToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n editTokenRules() {\n return {\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.editingToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\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 handleClearUserPassword(checked) {\n if (checked) {\n this.authSettings.user.authCode = '';\n this.showUserPassConfirm = false;\n }\n },\n handleClearAdminPassword(checked) {\n if (checked) {\n this.authSettings.admin.adminPassword = '';\n this.authSettings.admin.adminUsername = '';\n this.showAdminPassConfirm = false;\n }\n },\n // Token相关方法\n getPermissionText(permission) {\n const permissionMap = {\n 'upload': this.$t('sysSecurity.permUpload'),\n 'delete': this.$t('sysSecurity.permDelete'),\n 'list': this.$t('sysSecurity.permList'),\n 'manage': this.$t('sysSecurity.permManage')\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(this.$t('sysSecurity.tokenListFailed'));\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\n let expiresAt = null;\n let autoDelete = false;\n if (!this.newToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.newToken.expirationValue, this.newToken.expirationUnit);\n autoDelete = this.newToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n name: this.newToken.name,\n owner: this.newToken.owner,\n permissions: this.newToken.permissions,\n expiresAt,\n autoDelete\n })\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 neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n };\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenCreateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenCreateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenCreateFailed'));\n }\n });\n },\n editToken(token) {\n const hasExpiration = token.expiresAt !== null && token.expiresAt !== undefined;\n this.editingToken = {\n id: token.id,\n name: token.name,\n owner: token.owner,\n permissions: [...token.permissions],\n neverExpire: !hasExpiration,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: token.autoDelete || false\n };\n this.showEditTokenDialog = true;\n },\n updateToken() {\n this.$refs.editTokenForm.validate(async valid => {\n if (!valid) return;\n try {\n let expiresAt = null;\n let autoDelete = false;\n if (!this.editingToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.editingToken.expirationValue, this.editingToken.expirationUnit);\n autoDelete = this.editingToken.autoDelete;\n }\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 expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.showEditTokenDialog = false;\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenUpdateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenUpdateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenUpdateFailed'));\n }\n });\n },\n async deleteToken(tokenId) {\n try {\n await this.$confirm(this.$t('sysSecurity.tokenDeleteConfirm'), this.$t('sysSecurity.tokenDeleteConfirmTitle'), {\n confirmButtonText: this.$t('sysSecurity.tokenDeleteConfirmOk'),\n cancelButtonText: this.$t('sysSecurity.tokenDeleteConfirmCancel'),\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(this.$t('sysSecurity.tokenDeleteSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenDeleteFailed'));\n }\n } catch (error) {\n if (error !== 'cancel') {\n this.$message.error(this.$t('sysSecurity.tokenDeleteFailed'));\n }\n }\n },\n async copyToken() {\n try {\n await navigator.clipboard.writeText(this.createdToken.token);\n this.$message.success(this.$t('sysSecurity.tokenCopied'));\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.copyFailed'));\n }\n },\n onCreateNeverExpireChange(val) {\n if (val) {\n this.newToken.autoDelete = false;\n }\n },\n onEditNeverExpireChange(val) {\n if (val) {\n this.editingToken.autoDelete = false;\n }\n },\n getTokenStatus(expiresAt) {\n return getTokenStatus(expiresAt);\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\n // 验证会话有效期为大于 0 的正整数\n if (this.accessSettings.userSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.userSessionMaxAge) || this.accessSettings.adminSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.adminSessionMaxAge)) {\n this.$message.error(this.$t('sysSecurity.sessionMaxAgeInvalid'));\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\n // 标记清除密码\n if (this.clearUserPassword) {\n settings.auth.user._clear = true;\n settings.auth.user.authCode = '';\n }\n if (this.clearAdminPassword) {\n settings.auth.admin._clear = true;\n settings.auth.admin.adminPassword = '';\n }\n fetchWithAuth('/api/manage/sysConfig/security', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(res => res.json()).then(data => {\n // 管理端密码变更后,当前会话已被清除,需要重新登录\n if (data.adminPasswordChanged) {\n const msg = this.$t('sysSecurity.adminPasswordChangedRelogin');\n this.$message.warning(msg);\n setTimeout(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n }, 1500);\n return;\n }\n this.$message.success(this.$t('sysSecurity.settingsSaved'));\n // 保存成功后重置密码字段为空(后端已处理)\n this.authSettings.user.authCode = '';\n this.authSettings.admin.adminPassword = '';\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n // 标记已有密码(如果用户刚设置了密码,且不是清除操作)\n if (settings.auth.user.authCode && !settings.auth.user._clear) {\n this.authSettings.user._hasPassword = true;\n } else if (settings.auth.user._clear) {\n this.authSettings.user._hasPassword = false;\n }\n if (settings.auth.admin.adminPassword && !settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = true;\n } else if (settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = false;\n }\n this.showUserPassConfirm = false;\n this.showAdminPassConfirm = false;\n this.clearUserPassword = false;\n this.clearAdminPassword = false;\n }).catch(() => {\n // 如果请求过程中 session 已失效导致 fetchWithAuth 跳转,忽略后续错误\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 = '';\n this.oriAdminPassword = '';\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=2962b112&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=2962b112&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-2962b112\"]])\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};\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_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\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($options.localized(setting, 'label')) + \" \", 1), setting.tooltip ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: $options.localized(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: $options.localized(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: $options.localizedOption(option),\n value: option.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 2\n }, 1032, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'channelName' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: !$options.currentUploadChannel || $options.currentChannelList.length === 0,\n placeholder: _ctx.$t('sysPage.channelSelectPlaceholder'),\n clearable: \"\",\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 2,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : setting.type === 'textarea' ? (_openBlock(), _createBlock(_component_el_input, {\n key: 3,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n resize: \"vertical\",\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 4,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"]))]),\n _: 2\n }, 1024);\n }), 128))]),\n _: 2\n }, 1032, [\"model\"])]);\n }), 128)), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"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.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport axios from '@/utils/axios';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: true,\n // 可用渠道列表\n availableChannels: {}\n };\n },\n computed: {\n isEn() {\n return this.$i18n.locale === 'en';\n },\n // 根据category将配置项分组\n groupedSettings() {\n const grouped = {};\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n const category = this.isEn ? setting.category_en || setting.category || this.$t('sysPage.otherSettings') : setting.category || this.$t('sysPage.otherSettings');\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(setting);\n });\n }\n return grouped;\n },\n // 当前选择的上传渠道\n currentUploadChannel() {\n const channelSetting = this.settings.config?.find(s => s.id === 'defaultUploadChannel');\n return channelSetting?.value || '';\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.currentUploadChannel] || [];\n }\n },\n watch: {\n // 监听上传渠道变化,清空渠道名称(如果不在新列表中)\n currentUploadChannel(newVal, oldVal) {\n if (newVal !== oldVal) {\n const channelNameSetting = this.settings.config?.find(s => s.id === 'defaultChannelName');\n if (channelNameSetting) {\n const newChannelList = this.availableChannels[newVal] || [];\n if (!newChannelList.some(ch => ch.name === channelNameSetting.value)) {\n channelNameSetting.value = '';\n }\n }\n }\n }\n },\n methods: {\n localized(item, field) {\n if (this.isEn && item[field + '_en']) return item[field + '_en'];\n return item[field] || '';\n },\n localizedOption(option) {\n if (this.isEn && option.label_en) return option.label_en;\n return option.label;\n },\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(this.$t('sysPage.settingsSaved')));\n },\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels');\n if (response.data) {\n this.availableChannels = response.data;\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\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=e4c3a742&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=e4c3a742&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-e4c3a742\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, 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, createBlock as _createBlock, createCommentVNode as _createCommentVNode, resolveDirective as _resolveDirective, 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 = [\"innerHTML\"];\nconst _hoisted_8 = {\n class: \"first-title\"\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_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.remoteTelemetry')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.remoteTelemetryTooltip'),\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 }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.telemetry,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\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 }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_4, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.cloudflareApiToken')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.cloudflareApiTokenTooltip'),\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 }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.cloudflareApiToken,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.zoneId')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_ZONE_ID,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.settings.cloudflareApiToken.CF_ZONE_ID = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.accountEmail')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_EMAIL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.settings.cloudflareApiToken.CF_EMAIL = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _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[3] || (_cache[3] = $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_5, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.randomImageApi')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.randomImageApiTooltip'),\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 }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.randomImageAPI,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.randomImageAPI.enabled,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.randomImageAPI.enabled = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"randomImageAPI.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.directory')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.directoryTooltip'),\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 }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.randomImageAPI.allowedDir,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $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_6, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.publicBrowse')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.publicBrowseTooltip'),\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 }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.publicBrowse,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.publicBrowse.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.settings.publicBrowse.enabled = $event),\n disabled: $data.settings.publicBrowse.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"publicBrowse.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.openDirectory')), 1), _createVNode(_component_el_tooltip, {\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n content: _withCtx(() => [_createElementVNode(\"div\", {\n style: {\n \"max-width\": \"320px\",\n \"line-height\": \"1.6\"\n },\n innerHTML: _ctx.$t('sysOthers.openDirectoryTooltip')\n }, null, 8, _hoisted_7)]),\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[7] || (_cache[7] = $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_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.webdav')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.webdavTooltip'),\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 }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.webDAV,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\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 }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUsername')\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 }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavPassword')\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 }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUploadChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.uploadChannel,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.settings.webDAV.uploadChannel = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('sysOthers.webdavDefaultChannel'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"Telegram\",\n value: \"telegram\"\n }), _createVNode(_component_el_option, {\n label: \"Cloudflare R2\",\n value: \"cfr2\"\n }), _createVNode(_component_el_option, {\n label: \"S3\",\n value: \"s3\"\n }), _createVNode(_component_el_option, {\n label: \"Discord\",\n value: \"discord\"\n }), _createVNode(_component_el_option, {\n label: \"HuggingFace\",\n value: \"huggingface\"\n }), _createVNode(_component_el_option, {\n label: \"WebDAV\",\n value: \"webdav\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.settings.webDAV.uploadChannel && $options.webdavChannelList.length > 1 ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysOthers.webdavChannelName')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.channelName,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.settings.webDAV.channelName = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.webdavChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {},\n publicBrowse: {}\n },\n availableChannels: {},\n // 可用渠道列表\n // 加载状态\n loading: true\n };\n },\n computed: {\n // WebDAV 当前渠道类型对应的渠道列表\n webdavChannelList() {\n const channelType = this.settings.webDAV?.uploadChannel;\n return channelType ? this.availableChannels[channelType] || [] : [];\n }\n },\n watch: {\n 'settings.webDAV.uploadChannel'() {\n // 切换渠道类型时清空指定的渠道名称\n if (this.settings.webDAV) {\n this.settings.webDAV.channelName = '';\n }\n }\n },\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(this.$t('sysOthers.settingsSaved')));\n },\n async fetchAvailableChannels() {\n try {\n const response = await fetchWithAuth('/api/channels');\n if (response.ok) {\n this.availableChannels = await response.json();\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\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 this.fetchAvailableChannels();\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=67b1b002&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=67b1b002&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-67b1b002\"]])\n\nexport default __exports__","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport SysConfigTabs from '@/components/config/SysConfigTabs.vue';\nimport SysCogStatus from '@/components/config/SysCogStatus.vue';\nimport SysCogUpload from '@/components/config/SysCogUpload.vue';\nimport SysCogSecurity from '@/components/config/SysCogSecurity.vue';\nimport SysCogPage from '@/components/config/SysCogPage.vue';\nimport SysCogOthers from '@/components/config/SysCogOthers.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'SystemConfig',\n mixins: [backgroundManager],\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 const url = process.env.NODE_ENV === 'production' ? '/api/auth/logout' : '/api/api/auth/logout';\n fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n authType: 'admin'\n })\n }).finally(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n });\n },\n // 设置默认锚点\n setDefaultHash() {\n const defaultHash = '#status'; // 默认锚点\n window.location.hash = defaultHash;\n this.activeIndex = defaultHash.replace('#', '');\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('adminBkImg', '.container', false, true);\n\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=7607b77d&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=7607b77d&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-7607b77d\"]])\n\nexport default __exports__","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 };"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","isCollapse","ref","style","sidebarStyle","menuItems","item","key","index","activeIndex","onClick","$event","handleSelect","icon","$t","titleKey","args","toggleCollapse","name","props","type","String","default","Boolean","data","expandedWidth","computed","collapsedWidth","window","innerWidth","this","width","watch","$nextTick","measureWidth","methods","$emit","checkMobile","isMobile","el","$refs","sidebar","prevWidth","prevTransition","transition","wasCollapsed","classList","contains","remove","offsetWidth","natural","scrollWidth","add","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","inputStart","inputmode","startDateLabel","onChange","handleManualInput","trim","rangeSeparator","inputEnd","endDateLabel","previousMonthLabel","goToPreviousMonth","monthTitle","nextMonthLabel","goToNextMonth","weekdayLabels","weekday","calendarDays","day","isCurrentMonth","isToday","draftStart","draftEnd","isInRange","selectDay","dayOfMonth","DAY_MS","padDatePart","value","padStart","formatDateKey","date","getFullYear","getMonth","getDate","parseDateKey","match","year","Number","month","Date","setHours","shiftMonth","amount","modelValue","Array","emits","today","displayYear","displayMonth","awaitingEnd","monthStart","start","getDay","todayKey","from","length","getTime","immediate","handler","syncFromModel","startDate","endDate","displayDate","range","commitRange","startKey","endKey","_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","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_85","_hoisted_86","_component_el_button","_component_el_radio_button","_component_el_radio_group","_component_DateRangeCalendar","_component_el_dialog","_component_Line","_component_Doughnut","_component_el_progress","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","circle","openTrendDateDialog","trendGroupBy","size","label","trendDatePickerVisible","title","trendDateRange","handleTrendDateRangeChange","hasTrendData","uploadTrendChartData","options","lineChartOptions","Object","keys","channelStats","channelChartData","chartOptions","count","channel","background","getChartColor","getPercentage","typeStats","typeChartData","aggregatedTypeStats","status","getTypeChartColor","isProcessing","phaseDescription","Math","round","processingProgress","percentage","current","total","estimatedTimeRemaining","message","plain","cancelOperation","processingError","suggestion","recoverable","retryOperation","dismissError","loading","rebuilding","rebuildIndex","backing","backupData","accept","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","openFileInNewTab","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","v","lim","l","h","max","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","d","e","f","hex","h1","h2","eq","isShort","r","g","hexParse","str","ret","len","alpha","hexString","undefined","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","i","hueValue","rgb2hsl","calln","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","interpolate","rgb1","rgb2","t","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","constructor","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","p","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","isNullOrUndef","prototype","toString","call","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","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","o","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","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","Symbol","toPrimitive","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","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","defineProperty","configurable","enumerable","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","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","writable","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","numberOrZero","_readValueToProps","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","resolve","inputs","info","cacheable","_addGrace","minmax","change","keepZero","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","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","callbacks","numSteps","initial","currentStep","_refresh","_update","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","progress","listen","cb","reduce","acc","_duration","cancel","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","getLabelForValue","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","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","_defineProperty","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","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","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","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","refRect","BarElement","addRectPath","tpoints","_findSegmentEnd","_getBounds","targetSegments","tgt","subBounds","fillSources","fillSource","_getEdge","_pointsFromSegments","boundary","linePoints","_createBoundaryLine","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","parseFillOption","decodeTargetIndex","firstCh","_getTargetPixel","_getTargetValue","fillOption","_buildStackLine","sourcePoints","linesBelow","getLinesBelow","addPointsBelow","below","unshift","sourcePoint","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","getLineByIndex","computeBoundary","computeCircularBoundary","computeLinearBoundary","_drawfill","lineOpts","above","doFill","fillColor","clipVertical","clipHorizontal","clipY","lineLoop","clipX","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","_args","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","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","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","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","week","quarter","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","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","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","shouldUpdate","prevOptions","prevLabels","prevDatasets","nextTick","deep","role","createTypedChart","registerables","reforwardRef","Doughnut","Line","BatchOperationError","code","ERROR_HANDLERS","details","NETWORK","ABORT","createError","Response","TypeError","BatchProcessor","batchSize","abortController","fetchAllRecords","includeValue","AbortController","allRecords","totalFetched","batchCount","signal","aborted","response","fetchBatch","records","nextCursor","phase","batchError","URLSearchParams","fetchWithAuth","errorDetails","errorData","json","success","totalProcessed","abort","isAborted","IndexRebuilder","chunkSize","maxRetries","retryDelay","sessionId","generateSessionId","fetchConfig","databaseType","rebuild","processor","sortByTimestampDescending","chunks","splitIntoChunks","uploadChunkWithRetry","finalize","timestampA","timestampB","chunkId","lastError","attempt","uploadChunk","sleep","checksum","calculateChecksum","headers","createHttpError","totalChunks","random","encoder","TextEncoder","dataBuffer","encode","crypto","subtle","hashBuffer","digest","hashArray","Uint8Array","imul","ms","BackupGenerator","generateBackup","packageInfo","fileCount","files","settings","record","fetchSettings","downloadBackup","settingsCount","blob","Blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","RestoreProcessor","fileEntries","settingEntries","totalSettings","totalItems","restoredFiles","restoredSettings","failedFiles","failedSettings","fileChunks","chunkData","fromEntries","restoredCount","failedCount","settingChunks","backupTimestamp","formatDateInput","getDefaultTrendDateRange","components","DateRangeCalendar","newest","oldest","channelColors","typeColors","trendColors","processingPhase","processingStartTime","currentRebuilder","currentBackupGenerator","currentRestoreProcessor","stats","aggregatedStats","mappedStatus","currentTrendGroup","trend","uploadTrend","groupBy","series","trendRawLabels","trendRangeCrossesYear","years","extractTrendLabelDates","trendDisplayLabels","formatTrendAxisLabel","totalColor","hexToRgba","pointBackgroundColor","pointBorderColor","pointRadius","pointHoverRadius","getTrendColor","formatTrendSeriesName","toFixed","totalEstimated","seconds","minutes","hours","remainingMinutes","phaseMap","isOther","dates","formatSingleDate","includeYear","monthDay","endLabel","getTrendDateRangeParams","action","timezoneOffset","getTimezoneOffset","trendMaxPoints","trendSeriesLimit","trendStartDate","trendEndDate","$message","warning","handleProgress","handleError","errorMessage","settingsMsg","fileInput","file","$confirm","confirmButtonText","cancelButtonText","restoreData","fileContent","parseError","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","isOpen","toggleDropdown","displayLabel","selectOption","$slots","placeholder","resolvedPlaceholder","selected","opt","handleClickOutside","beforeUnmount","$el","_component_CustomSelect","_component_el_tag","_component_el_switch","_component_el_option","_component_el_select","_component_el_form_item","_component_el_input","_component_el_input_number","_component_el_form","_component_el_descriptions_item","_component_el_descriptions","channelFilter","filterOptions","showAddDialog","filteredChannels","channelType","getChannelIcon","getChannelList","hasLoadBalance","getSettings","loadBalance","saveSettings","fixed","onMousemove","handleCardMouseMove","onMouseleave","handleCardMouseLeave","ref_for","maskText","botToken","chatId","publicUrl","bucketName","endpoint","channelId","isNitro","repo","isPrivate","baseUrl","quota","getQuotaPercentage","getQuotaStatus","getQuotaText","openDetailDialog","openEditDialog","deleteChannel","onClosed","resetAddForm","newChannel","confirmAddChannel","model","rules","addRules","onChannelTypeChange","addableChannels","ch","innerHTML","proxyUrl","cdnDomain","region","accessKeyId","secretAccessKey","pathStyle","limitGB","threshold","token","username","password","headersText","autosize","minRows","createDirectory","showDetailDialog","currentChannel","resetDetailData","openEditFromDetail","column","getChannelTypeLabel","currentChannelType","readonly","formatHeaders","link","refreshQuota","quotaLoading","isQuotaExceeded","getQuotaStatusText","showEditDialog","editChannel","resetEditData","confirmEditChannel","editRules","onQuotaEnabledChange","CustomSelect","channels","telegramSettings","cfr2Settings","s3Settings","discordSettings","huggingfaceSettings","webdavSettings","currentChannelIndex","quotaStats","iconMap","telegram","cfr2","s3","discord","huggingface","webdav","pattern","card","currentTarget","refKey","glowEl","icons","showLength","headersToText","parseHeadersText","addForm","validate","reservedNames","isDuplicate","newChannelData","savePath","editForm","newName","currentIndex","isFixedChannel","editedChannel","catch","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","finally","handleClick","spin","_component_el_checkbox","_component_el_table_column","_component_el_table","_component_FloatingSaveButton","_component_el_checkbox_group","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","autocomplete","_hasPassword","clearUserPassword","handleClearUserPassword","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","clearAdminPassword","adminPassword","handleAdminPassInput","handleClearAdminPassword","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","apiTokens","permissions","perm","getPermissionText","formatDate","createdAt","getTokenStatus","expiresAt","expiresText","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","accessSettings","allowedDomains","whiteListMode","sessionSecure","userSessionMaxAge","adminSessionMaxAge","dialogWidth","createToken","newToken","tokenRules","neverExpire","onCreateNeverExpireChange","expirationValue","expirationUnit","timeUnitOptions","labelKey","autoDelete","showEditTokenDialog","updateToken","editingToken","editTokenRules","onEditNeverExpireChange","showTokenResultDialog","createdToken","append","copyToken","SIMPLE_UNIT_MS","computeExpiresAt","baseTime","setUTCMonth","getUTCMonth","setUTCFullYear","getUTCFullYear","formatExpiresTime","isoString","getHours","getMinutes","getSeconds","expiresDate","currentTime","formattedTime","FloatingSaveButton","oriUserPassword","oriAdminPassword","owner","validator","rule","urlReservedChars","hasReservedChar","char","checked","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","hasExpiration","editTokenForm","tokenId","navigator","clipboard","writeText","validationPromises","userPassForm","adminPassForm","results","isValid","every","isInteger","auth","upload","access","_clear","adminPasswordChanged","msg","$store","commit","$router","groupedSettings","categoryGroup","categoryName","setting","localized","localizedOption","currentUploadChannel","currentChannelList","clearable","availableChannels","isEn","$i18n","category","category_en","channelSetting","newVal","oldVal","channelNameSetting","newChannelList","label_en","fetchAvailableChannels","axios","telemetry","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","randomImageAPI","allowedDir","publicBrowse","webDAV","uploadChannel","webdavChannelList","channelName","mixins","backgroundManager","newHash","scrollTo","newIndex","hash","DashboardTabs","SysConfigTabs","SysCogStatus","SysCogUpload","SysCogSecurity","SysCogPage","SysCogOthers","$route","fetch","credentials","authType","setDefaultHash","defaultHash","location","initializeBackground","_typeof","iterator","toPropertyKey"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/369.df3ca2df.js.map.gz b/frontend-dist/js/369.df3ca2df.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..7247911f73a10fc9e724e2434ee2b35a320a3d0c GIT binary patch literal 356448 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�Z>NaL{3)&&J%G}LBkF(oPH}nM0RdWdm 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%0DZ#o z20dbt-I^cLxdrFtoC~@r^wsP14OGG}AWoc*LF8_opsRjrJoP9%?!w2jqHJKp920Ya z@q;*6X#>7|t9cgQAf&Sy$bL{$Ogo%0AV7Tr$^9so#p3$7$>uKcWI^sG)^^0w8&1pW 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ξ+JZoc? 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%0D4&ICqQIVhG!crLl}bfbGYEr-{2n*! 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

agu!gkdi41MjlVH9?dtByFY;U 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 MKShFbr5ffH02nu3x&QzG literal 0 HcmV?d00001 diff --git a/frontend-dist/js/731.90070be6.js b/frontend-dist/js/731.90070be6.js new file mode 100644 index 00000000..c2833ab2 --- /dev/null +++ b/frontend-dist/js/731.90070be6.js @@ -0,0 +1,2 @@ +(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[731],{213:function(e,t,o){"use strict";o(85331),o(19104)},2893:function(e,t,o){"use strict";o(85331)},3261:function(e,t,o){"use strict";o(85331)},4885:function(e,t,o){"use strict";o(85331)},10456:function(e,t,o){"use strict";o(85331)},11393:function(e,t,o){o(16573),o(78100),o(77936),o(79577),o(41549),o(49797),o(49631),o(35623),o(64979),o(14603),o(47566),o(98721),function(t,o){e.exports=o()}(0,function(){return function(e){var t={};function o(s){if(t[s])return t[s].exports;var l=t[s]={i:s,l:!1,exports:{}};return e[s].call(l.exports,l,l.exports,o),l.l=!0,l.exports}return o.m=e,o.c=t,o.d=function(e,t,s){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(o.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var l in e)o.d(s,l,function(t){return e[t]}.bind(null,l));return s},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";var s;function l(e){return["image/png","image/jpeg","image/gif"].some(t=>t===e)}o.r(t),o.d(t,"canvastoDataURL",function(){return a}),o.d(t,"canvastoFile",function(){return n}),o.d(t,"dataURLtoFile",function(){return d}),o.d(t,"dataURLtoImage",function(){return c}),o.d(t,"downloadFile",function(){return u}),o.d(t,"filetoDataURL",function(){return p}),o.d(t,"imagetoCanvas",function(){return m}),o.d(t,"urltoBlob",function(){return g}),o.d(t,"urltoImage",function(){return f}),o.d(t,"compress",function(){return b}),o.d(t,"compressAccurately",function(){return v}),o.d(t,"EImageType",function(){return s}),function(e){e.PNG="image/png",e.JPEG="image/jpeg",e.GIF="image/gif"}(s||(s={}));var i=function(e,t,o,s){return new(o||(o=Promise))(function(l,i){function a(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(a,n)}r((s=s.apply(e,t||[])).next())})};function a(e,t=.92,o=s.JPEG){return i(this,void 0,void 0,function*(){return l(o)||(o=s.JPEG),e.toDataURL(o,t)})}function n(e,t=.92,o=s.JPEG){return new Promise(s=>e.toBlob(e=>s(e),o,t))}var r=function(e,t,o,s){return new(o||(o=Promise))(function(l,i){function a(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(a,n)}r((s=s.apply(e,t||[])).next())})};function d(e,t){return r(this,void 0,void 0,function*(){const o=e.split(",");let s=o[0].match(/:(.*?);/)[1];const i=atob(o[1]);let a=i.length;const n=new Uint8Array(a);for(;a--;)n[a]=i.charCodeAt(a);return l(t)&&(s=t),new Blob([n],{type:s})})}function c(e){return new Promise((t,o)=>{const s=new Image;s.onload=()=>t(s),s.onerror=()=>o(new Error("dataURLtoImage(): dataURL is illegal")),s.src=e})}function u(e,t){const o=document.createElement("a");o.href=window.URL.createObjectURL(e),o.download=t||Date.now().toString(36),document.body.appendChild(o);const s=document.createEvent("MouseEvents");s.initEvent("click",!1,!1),o.dispatchEvent(s),document.body.removeChild(o)}function p(e){return new Promise(t=>{const o=new FileReader;o.onloadend=e=>t(e.target.result),o.readAsDataURL(e)})}var h=function(e,t,o,s){return new(o||(o=Promise))(function(l,i){function a(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(a,n)}r((s=s.apply(e,t||[])).next())})};function m(e,t={}){return h(this,void 0,void 0,function*(){const o=Object.assign({},t),s=document.createElement("canvas"),l=s.getContext("2d");let i,a;for(const e in o)Object.prototype.hasOwnProperty.call(o,e)&&(o[e]=Number(o[e]));if(o.scale){const t=o.scale>0&&o.scale<10?o.scale:1;a=e.width*t,i=e.height*t}else a=o.width||o.height*e.width/e.height||e.width,i=o.height||o.width*e.height/e.width||e.height;switch([5,6,7,8].some(e=>e===o.orientation)?(s.height=a,s.width=i):(s.height=i,s.width=a),o.orientation){case 3:l.rotate(180*Math.PI/180),l.drawImage(e,-s.width,-s.height,s.width,s.height);break;case 6:l.rotate(90*Math.PI/180),l.drawImage(e,0,-s.width,s.height,s.width);break;case 8:l.rotate(270*Math.PI/180),l.drawImage(e,-s.height,0,s.height,s.width);break;case 2:l.translate(s.width,0),l.scale(-1,1),l.drawImage(e,0,0,s.width,s.height);break;case 4:l.translate(s.width,0),l.scale(-1,1),l.rotate(180*Math.PI/180),l.drawImage(e,-s.width,-s.height,s.width,s.height);break;case 5:l.translate(s.width,0),l.scale(-1,1),l.rotate(90*Math.PI/180),l.drawImage(e,0,-s.width,s.height,s.width);break;case 7:l.translate(s.width,0),l.scale(-1,1),l.rotate(270*Math.PI/180),l.drawImage(e,-s.height,0,s.height,s.width);break;default:l.drawImage(e,0,0,s.width,s.height)}return s})}function g(e){return fetch(e).then(e=>e.blob())}function f(e){return new Promise((t,o)=>{const s=new Image;s.onload=()=>t(s),s.onerror=()=>o(new Error("urltoImage(): Image failed to load, please check the image URL")),s.src=e})}var y=function(e,t,o,s){return new(o||(o=Promise))(function(l,i){function a(e){try{r(s.next(e))}catch(e){i(e)}}function n(e){try{r(s.throw(e))}catch(e){i(e)}}function r(e){var t;e.done?l(e.value):(t=e.value,t instanceof o?t:new o(function(e){e(t)})).then(a,n)}r((s=s.apply(e,t||[])).next())})};function b(e,t={}){return y(this,void 0,void 0,function*(){if(!(e instanceof Blob))throw new Error("compress(): First arg must be a Blob object or a File object.");if("object"!=typeof t&&(t=Object.assign({quality:t})),t.quality=Number(t.quality),Number.isNaN(t.quality))return e;const o=yield p(e);let i=o.split(",")[0].match(/:(.*?);/)[1],n=s.JPEG;l(t.type)&&(n=t.type,i=t.type);const r=yield c(o),u=yield m(r,Object.assign({},t)),h=yield a(u,t.quality,n),g=yield d(h,i);return g.size>e.size?e:g})}function v(e,t={}){return y(this,void 0,void 0,function*(){if(!(e instanceof Blob))throw new Error("compressAccurately(): First arg must be a Blob object or a File object.");if("object"!=typeof t&&(t=Object.assign({size:t})),t.size=Number(t.size),Number.isNaN(t.size))return e;if(1024*t.size>e.size)return e;t.accuracy=Number(t.accuracy),(!t.accuracy||t.accuracy<.8||t.accuracy>.99)&&(t.accuracy=.95);const o=t.size*(2-t.accuracy)*1024,i=1024*t.size,n=t.size*t.accuracy*1024,r=yield p(e);let u=r.split(",")[0].match(/:(.*?);/)[1],h=s.JPEG;l(t.type)&&(h=t.type,u=t.type);const g=yield c(r),f=yield m(g,Object.assign({},t));let y,b=.5;const v=[null,null];for(let e=1;e<=7;e++){y=yield a(f,b,h);const t=.75*y.length;if(7===e){(ot)&&(y=[y,...v].filter(e=>e).sort((e,t)=>Math.abs(.75*e.length-i)-Math.abs(.75*t.length-i))[0]);break}if(ot))break;v[0]=y,b+=Math.pow(.5,e+1)}}const C=yield d(y,u);return C.size>e.size?e:C})}}])})},13378:function(e,t,o){"use strict";o(85331),o(38736),o(79899)},15616:function(e,t,o){"use strict";o(85331),o(97197)},18785:function(e,t,o){"use strict";o(85331)},19104:function(e,t,o){"use strict";o(85331)},23597:function(e,t,o){"use strict";o(85331)},29319:function(e,t,o){"use strict";o.r(t),o.d(t,{default:function(){return $o}});var s=o(78507),l=(o(85331),o(213),o(80047)),i=(o(99648),o(56768)),a=o(24232);const n={class:"history-header"},r={class:"header-left"},d={class:"record-count"},c={class:"header-right"},u={class:"timeline-header"},p={class:"date-label"},h={key:0,class:"grid-view"},m={class:"grid-preview"},g=["src"],f=["src"],y={key:2,class:"file-icon-wrapper"},b={class:"grid-overlay"},v={class:"grid-actions"},C={class:"grid-info"},k=["title"],w={class:"upload-time"},F={key:1,class:"list-view"},L={class:"list-preview"},U=["src"],$=["src"],S={key:2,class:"file-icon-wrapper-small"},T={class:"list-info"},_=["title"],x=["title"],M={class:"list-meta"},R={class:"upload-time"},A={class:"list-actions"},E={key:0,class:"load-more-container"},D={key:0,class:"loading-indicator"},I={key:1,class:"load-more-hint"},N={key:1,class:"no-more-hint"},P={key:1,class:"empty-state"};function V(e,t,o,V,W,z){const B=(0,i.g2)("font-awesome-icon"),H=l.S2,X=s.R7;return(0,i.uX)(),(0,i.CE)("div",{class:(0,a.C4)(["history-container",{active:o.show}])},[(0,i.Lk)("div",n,[(0,i.Lk)("div",r,[(0,i.Lk)("h2",null,(0,a.v_)(e.$t("uploadHistory.title")),1),(0,i.Lk)("span",d,(0,a.v_)(e.$t("uploadHistory.totalRecords",{count:W.totalCount})),1)]),(0,i.Lk)("div",c,[(0,i.bF)(X,{content:e.$t("uploadHistory.switchView"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(H,{circle:"",onClick:z.toggleViewMode},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"grid"===W.viewMode?"list":"th-large"},null,8,["icon"])]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,i.bF)(X,{content:e.$t("uploadHistory.clearRecords"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(H,{circle:"",type:"danger",onClick:z.clearHistory},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])]),_:1},8,["content"]),(0,i.bF)(H,{circle:"",onClick:t[0]||(t[0]=t=>e.$emit("close"))},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"times"})]),_:1})])]),W.historyList.length>0?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"history-content",ref:"historyContent",onScroll:t[3]||(t[3]=(...e)=>z.handleScroll&&z.handleScroll(...e))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(z.groupedHistory,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.date,class:"history-group"},[(0,i.Lk)("div",u,[t[4]||(t[4]=(0,i.Lk)("div",{class:"timeline-dot"},null,-1)),(0,i.Lk)("span",p,(0,a.v_)(e.date),1)]),"grid"===W.viewMode?((0,i.uX)(),(0,i.CE)("div",h,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.items,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.time,class:"grid-item"},[(0,i.Lk)("div",m,[z.isImage(e.name)?((0,i.uX)(),(0,i.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[1]||(t[1]=(...e)=>z.handleImageError&&z.handleImageError(...e))},null,40,g)):z.isVideo(e.name)?((0,i.uX)(),(0,i.CE)("video",{key:1,src:e.url,muted:""},null,8,f)):((0,i.uX)(),(0,i.CE)("div",y,[(0,i.bF)(B,{icon:"file",class:"file-icon"})])),(0,i.Lk)("div",b,[(0,i.Lk)("div",v,[(0,i.bF)(H,{circle:"",size:"default",type:"primary",onClick:t=>z.copyLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"copy"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"default",class:"action-btn-view",onClick:t=>z.openLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"default",type:"danger",onClick:t=>z.deleteItem(e)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])])])]),(0,i.Lk)("div",C,[(0,i.Lk)("div",{class:"file-name",title:e.name},(0,a.v_)(e.name),9,k),(0,i.Lk)("div",w,(0,a.v_)(z.formatTime(e.time)),1)])]))),128))])):((0,i.uX)(),(0,i.CE)("div",F,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.items,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.time,class:"list-item"},[(0,i.Lk)("div",L,[z.isImage(e.name)?((0,i.uX)(),(0,i.CE)("img",{key:0,src:e.url,loading:"lazy",onError:t[2]||(t[2]=(...e)=>z.handleImageError&&z.handleImageError(...e))},null,40,U)):z.isVideo(e.name)?((0,i.uX)(),(0,i.CE)("video",{key:1,src:e.url,muted:""},null,8,$)):((0,i.uX)(),(0,i.CE)("div",S,[(0,i.bF)(B,{icon:"file"})]))]),(0,i.Lk)("div",T,[(0,i.Lk)("div",{class:"file-name",title:e.name},(0,a.v_)(e.name),9,_),(0,i.Lk)("div",{class:"file-url",title:e.url},(0,a.v_)(e.url),9,x)]),(0,i.Lk)("div",M,[(0,i.Lk)("div",R,(0,a.v_)(z.formatTime(e.time)),1)]),(0,i.Lk)("div",A,[(0,i.bF)(H,{circle:"",size:"small",type:"primary",onClick:t=>z.copyLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"copy"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"small",class:"action-btn-view",onClick:t=>z.openLink(e.url)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"external-link-alt"})]),_:1},8,["onClick"]),(0,i.bF)(H,{circle:"",size:"small",type:"danger",onClick:t=>z.deleteItem(e)},{default:(0,i.k6)(()=>[(0,i.bF)(B,{icon:"trash-alt"})]),_:1},8,["onClick"])])]))),128))]))]))),128)),z.hasMore?((0,i.uX)(),(0,i.CE)("div",E,[W.loadingMore?((0,i.uX)(),(0,i.CE)("div",D,[(0,i.bF)(B,{icon:"spinner",spin:""}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadHistory.loading")),1)])):((0,i.uX)(),(0,i.CE)("div",I,(0,a.v_)(e.$t("uploadHistory.pullToLoadMore")),1))])):W.historyList.length>0?((0,i.uX)(),(0,i.CE)("div",N,(0,a.v_)(e.$t("uploadHistory.noMoreRecords")),1)):(0,i.Q3)("",!0)],544)):((0,i.uX)(),(0,i.CE)("div",P,[(0,i.bF)(B,{icon:"history",class:"empty-icon"}),(0,i.Lk)("p",null,(0,a.v_)(e.$t("uploadHistory.emptyHistory")),1)]))],2)}o(44114),o(18111),o(22489),o(7588),o(61701),o(33110),o(58335);var W={name:"UploadHistory",props:{show:{type:Boolean,default:!1}},data(){return{historyList:[],allHistory:[],viewMode:"grid",pageSize:30,currentPage:0,loadingMore:!1,totalCount:0}},watch:{show(e){e&&this.resetAndLoad()}},computed:{hasMore(){return this.historyList.length{const o=new Date(t.time),s=`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")}`;e[s]||(e[s]=[]),e[s].push(t)}),Object.keys(e).sort((e,t)=>new Date(t)-new Date(e)).map(t=>({date:t,items:e[t]}))}},mounted(){const e=localStorage.getItem("historyViewMode");e&&(this.viewMode=e)},methods:{resetAndLoad(){this.historyList=[],this.currentPage=0,this.loadAllHistory(),this.loadMore()},loadAllHistory(){try{const e=JSON.parse(localStorage.getItem("uploadHistory")||"[]");this.allHistory=e.sort((e,t)=>t.time-e.time),this.totalCount=this.allHistory.length}catch(e){console.error("Failed to load history",e),this.allHistory=[],this.totalCount=0}},loadMore(){!this.loadingMore&&this.hasMore&&(this.loadingMore=!0,setTimeout(()=>{const e=this.currentPage*this.pageSize,t=e+this.pageSize,o=this.allHistory.slice(e,t);this.historyList=[...this.historyList,...o],this.currentPage++,this.loadingMore=!1},50))},handleScroll(e){const t=e.target,o=t.scrollTop,s=t.scrollHeight,l=t.clientHeight;s-o-l<100&&this.loadMore()},toggleViewMode(){this.viewMode="grid"===this.viewMode?"list":"grid",localStorage.setItem("historyViewMode",this.viewMode)},clearHistory(){this.$confirm(this.$t("uploadHistory.clearConfirmMessage"),this.$t("uploadHistory.clearConfirmTitle"),{confirmButtonText:this.$t("uploadHistory.clearConfirmOk"),cancelButtonText:this.$t("uploadHistory.clearConfirmCancel"),type:"warning"}).then(()=>{this.historyList=[],this.allHistory=[],this.totalCount=0,this.currentPage=0,localStorage.removeItem("uploadHistory"),this.$message.success(this.$t("uploadHistory.recordsCleared"))}).catch(()=>{})},deleteItem(e){this.$confirm(this.$t("uploadHistory.deleteConfirmMessage"),this.$t("uploadHistory.clearConfirmTitle"),{confirmButtonText:this.$t("uploadHistory.clearConfirmOk"),cancelButtonText:this.$t("uploadHistory.clearConfirmCancel"),type:"warning"}).then(()=>{this.historyList=this.historyList.filter(t=>t.time!==e.time),this.allHistory=this.allHistory.filter(t=>t.time!==e.time),this.totalCount=this.allHistory.length;try{localStorage.setItem("uploadHistory",JSON.stringify(this.allHistory)),this.$message.success(this.$t("uploadHistory.recordDeleted"))}catch(t){console.error("Failed to update history",t)}}).catch(()=>{})},isImage(e){const t=["jpg","jpeg","png","gif","bmp","webp","svg","tiff","ico","avif","heic","jfif","pjpeg","pjp"],o=e?e.split(".").pop().toLowerCase():"";return t.includes(o)},isVideo(e){const t=["mp4","webm","ogg","mkv"],o=e?e.split(".").pop().toLowerCase():"";return t.includes(o)},formatTime(e){const t=new Date(e),o=t.getFullYear(),s=String(t.getMonth()+1).padStart(2,"0"),l=String(t.getDate()).padStart(2,"0"),i=String(t.getHours()).padStart(2,"0"),a=String(t.getMinutes()).padStart(2,"0"),n=String(t.getSeconds()).padStart(2,"0");return`${o}-${s}-${l} ${i}:${a}:${n}`},copyLink(e){navigator.clipboard.writeText(e).then(()=>{this.$message.success(this.$t("uploadHistory.linkCopied"))}).catch(()=>{this.$message.error(this.$t("uploadHistory.copyFailed"))})},openLink(e){window.open(e,"_blank")},handleImageError(e){e.target.src=o(96682)}}},z=o(71241);const B=(0,z.A)(W,[["render",V],["__scopeId","data-v-550797ce"]]);var H=B,X=o(86975),O=o(9267),Q=(o(15616),o(81418)),j=(o(50333),o(74757)),q=o(55558),G=(o(10456),o(39623)),K=(o(29092),o(76018)),J=(o(96808),o(67819),o(66810));o(34396),o(4885);const Y={class:"dialog-section"},Z={class:"section-header"},ee={class:"section-title"},te={class:"section-content"},oe={class:"setting-item"},se={class:"setting-label"},le={key:0,class:"setting-item"},ie={class:"setting-label"},ae={class:"setting-item"},ne={class:"setting-label"},re={class:"setting-item"},de={class:"setting-label"},ce={class:"dialog-section"},ue={class:"section-header"},pe={class:"section-title"},he={class:"section-content"},me={class:"dialog-section"},ge={class:"section-header"},fe={class:"section-title"},ye={class:"section-content"},be={class:"setting-item"},ve={class:"setting-label"},Ce={class:"setting-item"},ke={class:"setting-label"},we={key:0,class:"setting-item slider-item"},Fe={class:"setting-label"},Le={class:"slider-wrapper"},Ue={class:"slider-input-wrapper"},$e={key:1,class:"setting-item slider-item"},Se={class:"setting-label"},Te={class:"slider-wrapper"},_e={class:"slider-input-wrapper"},xe={key:0,class:"dialog-section"},Me={class:"section-header"},Re={class:"section-title"},Ae={class:"section-content"},Ee={class:"setting-item"},De={class:"setting-label"},Ie={class:"dialog-action"};function Ne(e,t,o,n,r,d){const c=(0,i.g2)("font-awesome-icon"),u=J.ll,p=J.MQ,h=s.R7,m=K.P9,g=K.AV,f=G.WK,y=q.qi,b=j.B8,v=Q.lq,C=l.S2,k=O.kZ;return(0,i.uX)(),(0,i.Wv)(k,{title:e.$t("uploadSettings.title"),modelValue:d.visible,"onUpdate:modelValue":t[12]||(t[12]=e=>d.visible=e),width:d.dialogWidth,"show-close":!1,class:"settings-dialog"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Y,[(0,i.Lk)("div",Z,[(0,i.Lk)("span",ee,(0,a.v_)(e.$t("uploadSettings.uploadChannel")),1)]),(0,i.Lk)("div",te,[(0,i.Lk)("div",oe,[(0,i.Lk)("span",se,(0,a.v_)(e.$t("uploadSettings.channelType")),1),(0,i.bF)(p,{"model-value":o.uploadChannel,"onUpdate:modelValue":t[0]||(t[0]=t=>e.$emit("update:uploadChannel",t)),class:"radio-card-group compact"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{label:"telegram",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"paper-plane",class:"channel-icon"}),t[13]||(t[13]=(0,i.Lk)("span",null,"TG",-1))]),_:1}),(0,i.bF)(u,{label:"cfr2",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"cloud",class:"channel-icon"}),t[14]||(t[14]=(0,i.Lk)("span",null,"R2",-1))]),_:1}),(0,i.bF)(u,{label:"s3",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"database",class:"channel-icon"}),t[15]||(t[15]=(0,i.Lk)("span",null,"S3",-1))]),_:1}),(0,i.bF)(u,{label:"discord",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"comments",class:"channel-icon"}),t[16]||(t[16]=(0,i.Lk)("span",null,"DC",-1))]),_:1}),(0,i.bF)(u,{label:"huggingface",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"robot",class:"channel-icon"}),t[17]||(t[17]=(0,i.Lk)("span",null,"HF",-1))]),_:1}),(0,i.bF)(u,{label:"webdav",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"folder",class:"channel-icon"}),t[18]||(t[18]=(0,i.Lk)("span",null,"WD",-1))]),_:1})]),_:1},8,["model-value"])]),o.currentChannelList.length>1?((0,i.uX)(),(0,i.CE)("div",le,[(0,i.Lk)("span",ie,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.channelName"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.channelNameTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(g,{"model-value":o.channelName,"onUpdate:modelValue":t[1]||(t[1]=t=>e.$emit("update:channelName",t)),placeholder:e.$t("uploadSettings.autoSelect"),clearable:"",class:"setting-input"},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.currentChannelList,e=>((0,i.uX)(),(0,i.Wv)(m,{key:e.name,label:e.name,value:e.name},null,8,["label","value"]))),128))]),_:1},8,["model-value","placeholder"])])):(0,i.Q3)("",!0),(0,i.Lk)("div",ae,[(0,i.Lk)("span",ne,(0,a.v_)(e.$t("uploadSettings.uploadDirectory")),1),(0,i.bF)(f,{"model-value":o.uploadFolder,"onUpdate:modelValue":d.handleUploadFolderInput,placeholder:e.$t("uploadSettings.uploadDirectoryPlaceholder"),class:"setting-input"},null,8,["model-value","onUpdate:modelValue","placeholder"])]),(0,i.Lk)("div",re,[(0,i.Lk)("span",de,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.autoSwitch"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.autoSwitchTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(y,{"model-value":o.autoRetry,"onUpdate:modelValue":t[2]||(t[2]=t=>e.$emit("update:autoRetry",t))},null,8,["model-value"])])])]),(0,i.Lk)("div",ce,[(0,i.Lk)("div",ue,[(0,i.Lk)("span",pe,(0,a.v_)(e.$t("uploadSettings.fileNaming")),1)]),(0,i.Lk)("div",he,[(0,i.bF)(p,{"model-value":o.uploadNameType,"onUpdate:modelValue":t[3]||(t[3]=t=>e.$emit("update:uploadNameType",t)),class:"radio-card-group grid-2x2"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{label:"default",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"cog",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadSettings.namingDefault")),1)]),_:1}),(0,i.bF)(u,{label:"index",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"hashtag",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadSettings.namingIndex")),1)]),_:1}),(0,i.bF)(u,{label:"origin",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"file-signature",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadSettings.namingOrigin")),1)]),_:1}),(0,i.bF)(u,{label:"short",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"compress-alt",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadSettings.namingShort")),1)]),_:1})]),_:1},8,["model-value"])])]),(0,i.Lk)("div",me,[(0,i.Lk)("div",ge,[(0,i.Lk)("span",fe,(0,a.v_)(e.$t("uploadSettings.filePreprocess")),1),(0,i.bF)(h,{content:e.$t("uploadSettings.filePreprocessTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",ye,[(0,i.Lk)("div",be,[(0,i.Lk)("span",ve,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.convertToWebp"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.convertToWebpTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.bF)(y,{"model-value":o.convertToWebp,"onUpdate:modelValue":t[4]||(t[4]=t=>e.$emit("update:convertToWebp",t))},null,8,["model-value"])]),(0,i.Lk)("div",Ce,[(0,i.Lk)("span",ke,(0,a.v_)(e.$t("uploadSettings.fileCompress")),1),(0,i.bF)(y,{"model-value":o.customerCompress,"onUpdate:modelValue":t[5]||(t[5]=t=>e.$emit("update:customerCompress",t))},null,8,["model-value"])]),o.customerCompress?((0,i.uX)(),(0,i.CE)("div",we,[(0,i.Lk)("span",Fe,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.compressThreshold"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.compressThresholdTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Le,[(0,i.bF)(b,{"model-value":o.compressBar,"onUpdate:modelValue":t[6]||(t[6]=t=>e.$emit("update:compressBar",t)),min:1,max:20,"format-tooltip":e=>`${e} MB`},null,8,["model-value","format-tooltip"]),(0,i.Lk)("div",Ue,[(0,i.bF)(v,{"model-value":o.compressBar,"onUpdate:modelValue":t[7]||(t[7]=t=>e.$emit("update:compressBar",t)),min:1,max:20,step:1,"value-on-clear":1,class:"slider-input","controls-position":"right"},null,8,["model-value"]),t[19]||(t[19]=(0,i.Lk)("span",{class:"slider-unit"},"MB",-1))])])])):(0,i.Q3)("",!0),o.customerCompress?((0,i.uX)(),(0,i.CE)("div",$e,[(0,i.Lk)("span",Se,[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.expectedSize"))+" ",1),(0,i.bF)(h,{content:e.$t("uploadSettings.expectedSizeTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"inline-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Te,[(0,i.bF)(b,{"model-value":o.compressQuality,"onUpdate:modelValue":t[8]||(t[8]=t=>e.$emit("update:compressQuality",t)),min:.5,max:o.compressBar,step:.1,"format-tooltip":e=>`${e} MB`},null,8,["model-value","max","format-tooltip"]),(0,i.Lk)("div",_e,[(0,i.bF)(v,{"model-value":o.compressQuality,"onUpdate:modelValue":t[9]||(t[9]=t=>e.$emit("update:compressQuality",t)),min:.5,max:o.compressBar,step:.1,precision:1,"value-on-clear":.5,class:"slider-input","controls-position":"right"},null,8,["model-value","max"]),t[20]||(t[20]=(0,i.Lk)("span",{class:"slider-unit"},"MB",-1))])])])):(0,i.Q3)("",!0)])]),"telegram"===o.uploadChannel?((0,i.uX)(),(0,i.CE)("div",xe,[(0,i.Lk)("div",Me,[(0,i.Lk)("span",Re,(0,a.v_)(e.$t("uploadSettings.serverCompress")),1),(0,i.bF)(h,{content:e.$t("uploadSettings.serverCompressTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(c,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",Ae,[(0,i.Lk)("div",Ee,[(0,i.Lk)("span",De,(0,a.v_)(e.$t("uploadSettings.enableCompress")),1),(0,i.bF)(y,{"model-value":o.serverCompress,"onUpdate:modelValue":t[10]||(t[10]=t=>e.$emit("update:serverCompress",t))},null,8,["model-value"])])])])):(0,i.Q3)("",!0),(0,i.Lk)("div",Ie,[(0,i.bF)(C,{type:"primary",onClick:t[11]||(t[11]=e=>d.visible=!1),class:"confirm-btn"},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("uploadSettings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"])}var Pe={name:"UploadSettingsDialog",methods:{handleUploadFolderInput(e){e&&!e.startsWith("/")&&(e="/"+e),this.$emit("update:uploadFolder",e)}},props:{modelValue:{type:Boolean,default:!1},uploadChannel:{type:String,default:"telegram"},channelName:{type:String,default:""},currentChannelList:{type:Array,default:()=>[]},uploadFolder:{type:String,default:""},autoRetry:{type:Boolean,default:!0},uploadNameType:{type:String,default:"default"},convertToWebp:{type:Boolean,default:!1},customerCompress:{type:Boolean,default:!0},compressBar:{type:Number,default:5},compressQuality:{type:Number,default:4},serverCompress:{type:Boolean,default:!0}},emits:["update:modelValue","update:uploadChannel","update:channelName","update:uploadFolder","update:autoRetry","update:uploadNameType","update:convertToWebp","update:customerCompress","update:compressBar","update:compressQuality","update:serverCompress"],computed:{visible:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}},dialogWidth(){return window.innerWidth>768?"50%":"90%"}}};const Ve=(0,z.A)(Pe,[["render",Ne]]);var We=Ve,ze=o(88559),Be=(o(85970),o(813)),He=(o(34896),o(69655)),Xe=(o(2893),o(74253));o(79899);const Oe={class:"upload-list-item"},Qe=["href"],je={key:0,style:{width:"10vw","border-radius":"12px"},autoplay:"",muted:"",playsinline:"",loop:""},qe=["src"],Ge=["src"],Ke={key:2,style:{width:"10vw","border-radius":"12px"}},Je={class:"upload-list-item-content"},Ye={class:"upload-list-item-name-wrapper"},Ze={key:0,class:"upload-list-item-url"},et={class:"upload-list-item-url-row"},tt={class:"upload-list-item-url-row"},ot={key:1,class:"upload-list-item-progress"},st={class:"upload-list-item-action"};function lt(e,t,o,s,l,n){const r=(0,i.g2)("font-awesome-icon"),d=Xe.$g,c=G.WK,u=He.ve,p=(0,i.g2)("Link"),h=Be.tk,m=(0,i.g2)("Delete");return(0,i.uX)(),(0,i.CE)("div",Oe,[(0,i.Lk)("a",{href:o.file.url,target:"_blank",class:"upload-list-item-preview"},[n.isVideo(o.file.name)?((0,i.uX)(),(0,i.CE)("video",je,[(0,i.Lk)("source",{src:o.file.url,type:"video/mp4"},null,8,qe),t[7]||(t[7]=(0,i.eW)(" Your browser does not support the video tag. ",-1))])):n.isImage(o.file.name)?((0,i.uX)(),(0,i.CE)("img",{key:1,style:{width:"10vw","border-radius":"12px"},src:o.file.url,onError:t[0]||(t[0]=t=>e.$emit("preview-error",o.file))},null,40,Ge)):((0,i.uX)(),(0,i.CE)("div",Ke,[(0,i.bF)(r,{icon:"file",class:"file-icon"})]))],8,Qe),(0,i.Lk)("div",Je,[(0,i.Lk)("div",Ye,[(0,i.bF)(d,{class:"upload-list-item-name",truncated:""},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(n.truncateFilename(o.file.name)),1)]),_:1})]),"done"===o.file.status?((0,i.uX)(),(0,i.CE)("div",Ze,[(0,i.Lk)("div",et,[(0,i.bF)(c,{modelValue:o.file.finalURL,"onUpdate:modelValue":t[1]||(t[1]=e=>o.file.finalURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[8]||(t[8]=[(0,i.eW)("URL",-1)])]),_:1},8,["modelValue","onClick","size"]),(0,i.bF)(c,{modelValue:o.file.mdURL,"onUpdate:modelValue":t[2]||(t[2]=e=>o.file.mdURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[9]||(t[9]=[(0,i.eW)("MarkDown",-1)])]),_:1},8,["modelValue","onClick","size"])]),(0,i.Lk)("div",tt,[(0,i.bF)(c,{modelValue:o.file.htmlURL,"onUpdate:modelValue":t[3]||(t[3]=e=>o.file.htmlURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[10]||(t[10]=[(0,i.eW)("HTML",-1)])]),_:1},8,["modelValue","onClick","size"]),(0,i.bF)(c,{modelValue:o.file.ubbURL,"onUpdate:modelValue":t[4]||(t[4]=e=>o.file.ubbURL=e),readonly:"",onClick:n.selectAllText,size:n.urlSize},{prepend:(0,i.k6)(()=>[...t[11]||(t[11]=[(0,i.eW)("BBCode",-1)])]),_:1},8,["modelValue","onClick","size"])])])):((0,i.uX)(),(0,i.CE)("div",ot,[(0,i.bF)(u,{percentage:o.file.progreess,status:o.file.status,"show-text":!1},null,8,["percentage","status"])]))]),(0,i.Lk)("div",st,[(0,i.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-primary",onClick:t[5]||(t[5]=t=>e.$emit("copy",o.file))},[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.bF)(p)]),_:1})]),(0,i.Lk)("button",{class:"modern-file-action-btn modern-file-action-btn-danger",onClick:t[6]||(t[6]=t=>e.$emit("remove",o.file))},[(0,i.bF)(h,null,{default:(0,i.k6)(()=>[(0,i.bF)(m)]),_:1})])])])}var it=o(57477);const at=["jpg","jpeg","png","gif","bmp","webp","svg","tiff","ico","avif","heic","jfif","pjpeg","pjp","raw","cr2","nef","dng","eps","ai","emf","wmf"],nt=["mp4","webm","ogg","mkv"];var rt={name:"UploadFileItem",components:{Link:it.Link,Delete:it.Delete},props:{file:{type:Object,required:!0}},emits:["copy","remove","preview-error"],computed:{urlSize(){return window.innerWidth<768?"small":"default"}},methods:{isImage(e){const t=e.split(".").pop().toLowerCase();return at.includes(t)},isVideo(e){const t=e.split(".").pop().toLowerCase();return nt.includes(t)},truncateFilename(e,t=20){if(!e||e.length<=t)return e;const o=e.lastIndexOf(".");let s,l;o>0?(s=e.substring(0,o),l=e.substring(o)):(s=e,l="");const i=l.length+4,a=t-i-3;return a<=0?e.substring(0,t-3)+"...":s.substring(0,a)+"..."+s.slice(-4)+l},selectAllText(e){navigator.clipboard.writeText(e.target.value).then(()=>{this.$message({type:"success",message:this.$t("uploadForm.copySuccess")})}).catch(()=>{this.$message({type:"error",message:this.$t("uploadForm.copyFailed")})})}}};const dt=(0,z.A)(rt,[["render",lt],["__scopeId","data-v-4848c2b0"]]);var ct=dt,ut=o(62086),pt=(o(40670),o(88830),o(23597),o(70683)),ht=(o(95385),o(3261),o(47358));const mt={class:"upload-form"},gt={class:"upload-card-glow",ref:"uploadCardGlow"},ft=["innerHTML"],yt={key:0,class:"upload-card"},bt={class:"paste-card-actions"},vt={class:"upload-list-dashboard-action"},Ct={class:"modern-action-group"},kt={class:"modern-dropdown-item-content"},wt={class:"modern-action-btn modern-action-btn-danger"};function Ft(e,t,n,r,d,c){const u=(0,i.g2)("CameraFilled"),p=Be.tk,h=ht.j5,m=G.WK,g=l.S2,f=J.Zh,y=J.MQ,b=pt.Ik,v=(0,i.g2)("List"),C=(0,i.g2)("Checked"),k=(0,i.g2)("Failed"),w=Xe.$g,F=(0,i.g2)("font-awesome-icon"),L=s.R7,U=q.qi,$=ut.c6,S=ut.Iy,T=ut.dW,_=ct,x=ze.kA;return(0,i.uX)(),(0,i.CE)("div",mt,[(0,i.Lk)("div",{class:"upload-card-wrapper",onMousemove:t[0]||(t[0]=(...e)=>c.handleUploadCardMouseMove&&c.handleUploadCardMouseMove(...e)),onMouseleave:t[1]||(t[1]=(...e)=>c.handleUploadCardMouseLeave&&c.handleUploadCardMouseLeave(...e))},[(0,i.Lk)("div",gt,null,512),"default"===n.uploadMethod?((0,i.uX)(),(0,i.Wv)(h,{key:0,class:(0,a.C4)(["upload-card",{"is-uploading":d.uploading,"upload-card-busy":d.fileList.length}]),drag:"",multiple:"","http-request":c.uploadFile,onSuccess:c.handleSuccess,"on-error":c.handleError,"before-upload":c.beforeUpload,"on-progress":c.handleProgress,"file-list":d.fileList,"show-file-list":!1},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["el-icon--upload",{"upload-list-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[(0,i.bF)(u)]),_:1},8,["class"]),(0,i.Lk)("div",{class:(0,a.C4)(["el-upload__text",{"upload-list-busy":d.fileList.length}]),innerHTML:e.$t("upload.dragUploadText")},null,10,ft)]),_:1},8,["class","http-request","onSuccess","on-error","before-upload","on-progress","file-list"])):(0,i.Q3)("",!0)],32),"paste"===n.uploadMethod?((0,i.uX)(),(0,i.CE)("div",yt,[(0,i.bF)(b,{class:(0,a.C4)(["paste-card",{"is-uploading":d.uploading,"upload-card-busy":d.fileList.length}])},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:d.pastedUrls,"onUpdate:modelValue":t[2]||(t[2]=e=>d.pastedUrls=e),class:"upload-card-textarea",placeholder:e.$t("upload.pasteUrlPlaceholder"),type:"textarea",rows:d.fileList.length?4:14},null,8,["modelValue","placeholder","rows"]),(0,i.Lk)("div",bt,[(0,i.bF)(g,{class:"paste-card-upload-button",type:"primary",size:c.pasteCardMethodButtonSize,onClick:c.handleUploadPasteUrls},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.pasteUploadBtn")),1)]),_:1},8,["size","onClick"]),(0,i.bF)(y,{modelValue:d.pasteUploadMethod,"onUpdate:modelValue":t[3]||(t[3]=e=>d.pasteUploadMethod=e),class:"paste-card-method-group",size:c.pasteCardMethodButtonSize},{default:(0,i.k6)(()=>[(0,i.bF)(f,{label:"save"},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.pasteSave")),1)]),_:1}),(0,i.bF)(f,{label:"external"},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.pasteExternal")),1)]),_:1})]),_:1},8,["modelValue","size"])])]),_:1},8,["class"])])):(0,i.Q3)("",!0),(0,i.bF)(b,{class:(0,a.C4)(["upload-list-card",{"upload-list-busy":d.fileList.length,"is-uploading":d.uploading}])},{default:(0,i.k6)(()=>[(0,i.Lk)("div",{class:(0,a.C4)(["upload-list-container",{"upload-list-busy":d.fileList.length}])},[(0,i.bF)(x,{onScroll:c.handleScroll,ref:"scrollContainer"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",{class:(0,a.C4)(["upload-list-dashboard",{"list-scrolled":d.listScrolled}])},[(0,i.bF)(w,{class:"upload-list-dashboard-title"},{default:(0,i.k6)(()=>[(0,i.bF)(p,null,{default:(0,i.k6)(()=>[(0,i.bF)(v)]),_:1}),(0,i.eW)((0,a.v_)(c.uploadingCount+c.waitingCount)+" ",1),(0,i.bF)(p,null,{default:(0,i.k6)(()=>[(0,i.bF)(C)]),_:1}),(0,i.eW)((0,a.v_)(c.uploadSuccessCount)+" ",1),(0,i.bF)(p,null,{default:(0,i.k6)(()=>[(0,i.bF)(k)]),_:1}),(0,i.eW)((0,a.v_)(c.uploadErrorCount),1)]),_:1}),(0,i.Lk)("div",vt,[(0,i.Lk)("div",Ct,[(0,i.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.copyAll"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.Lk)("button",{class:"modern-action-btn",onClick:t[4]||(t[4]=(...e)=>c.copyAll&&c.copyAll(...e))},[(0,i.bF)(F,{icon:"copy"})])]),_:1},8,["disabled","content"]),(0,i.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.retryFailed"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(T,null,{dropdown:(0,i.k6)(()=>[(0,i.bF)(S,{class:"modern-dropdown-menu"},{default:(0,i.k6)(()=>[(0,i.bF)($,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",kt,[(0,i.Lk)("span",null,(0,a.v_)(e.$t("uploadForm.autoRetry")),1),(0,i.bF)(U,{modelValue:d.autoReUpload,"onUpdate:modelValue":t[6]||(t[6]=e=>d.autoReUpload=e),onChange:c.handleAutoRetryChange,size:"small"},null,8,["modelValue","onChange"])])]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.Lk)("button",{class:"modern-action-btn",onClick:t[5]||(t[5]=(...e)=>c.retryError&&c.retryError(...e))},[(0,i.bF)(F,{icon:"redo"})])]),_:1})]),_:1},8,["disabled","content"]),(0,i.bF)(L,{disabled:c.disableTooltip,content:e.$t("upload.clearList"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(T,null,{dropdown:(0,i.k6)(()=>[(0,i.bF)(S,{class:"modern-dropdown-menu"},{default:(0,i.k6)(()=>[(0,i.bF)($,{onClick:c.clearFileList},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.clearAll")),1)]),_:1},8,["onClick"]),(0,i.bF)($,{onClick:c.clearSuccessList},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.clearUploaded")),1)]),_:1},8,["onClick"])]),_:1})]),default:(0,i.k6)(()=>[(0,i.Lk)("button",wt,[(0,i.bF)(F,{icon:"trash-alt"})])]),_:1})]),_:1},8,["disabled","content"])])])],2),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(d.fileList.slice().reverse(),e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.name,file:e,onCopy:c.handleCopy,onRemove:c.handleRemove,onPreviewError:t[7]||(t[7]=e=>e.url=o(96682))},null,8,["file","onCopy","onRemove"]))),128))]),_:1},8,["onScroll"])],2)]),_:1},8,["class"])])}o(16573),o(78100),o(77936),o(20116),o(18237),o(79577),o(41549),o(49797),o(49631),o(35623),o(64979),o(14603),o(47566),o(98721);var Lt=o(457),Ut=o(76334),$t=o(60782);function St(e,t,o){const s=o+e;return{finalURL:s,mdURL:`![${t}](${s})`,htmlURL:`${t}`,ubbURL:`[img]${s}[/img]`}}function Tt(e,t){const o={url:e.finalURL,md:e.mdURL,html:e.htmlURL,ubb:e.ubbURL};return o[t]||e.finalURL}function _t(e,t){e.forEach(e=>{if("external"===e.uploadChannel)return;const o=St(e.srcID,e.name,t);Object.assign(e,o)})}const xt=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Mt=(e,t)=>e>>>t|e<<32-t;function Rt(e,t){const o=new Uint32Array(64);for(let u=0;u<16;u++)o[u]=e[4*u]<<24|e[4*u+1]<<16|e[4*u+2]<<8|e[4*u+3];for(let u=16;u<64;u++){const e=Mt(o[u-15],7)^Mt(o[u-15],18)^o[u-15]>>>3,t=Mt(o[u-2],17)^Mt(o[u-2],19)^o[u-2]>>>10;o[u]=o[u-16]+e+o[u-7]+t>>>0}let[s,l,i,a,n,r,d,c]=t;for(let u=0;u<64;u++){const e=Mt(n,6)^Mt(n,11)^Mt(n,25),t=n&r^~n&d,p=c+e+t+xt[u]+o[u]>>>0,h=Mt(s,2)^Mt(s,13)^Mt(s,22),m=s&l^s&i^l&i,g=h+m>>>0;c=d,d=r,r=n,n=a+p>>>0,a=i,i=l,l=s,s=p+g>>>0}t[0]=t[0]+s>>>0,t[1]=t[1]+l>>>0,t[2]=t[2]+i>>>0,t[3]=t[3]+a>>>0,t[4]=t[4]+n>>>0,t[5]=t[5]+r>>>0,t[6]=t[6]+d>>>0,t[7]=t[7]+c>>>0}function At(){let e=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),t=new Uint8Array(64),o=0,s=0;return{update(l){s+=l.length;let i=0;if(o>0){const s=64-o,a=Math.min(s,l.length);t.set(l.subarray(0,a),o),o+=a,i=a,64===o&&(Rt(t,e),o=0)}while(i+64<=l.length)Rt(l.subarray(i,i+64),e),i+=64;i56&&(t.fill(0,o,64),Rt(t,e),o=0),t.fill(0,o,56);const i=new DataView(t.buffer);i.setUint32(56,Math.floor(l/4294967296),!1),i.setUint32(60,l>>>0,!1),Rt(t,e);let a="";for(let t=0;t<8;t++)a+=e[t].toString(16).padStart(8,"0");return a}}}async function Et(e){const t=At(),o=4194304;let s=0;while(sthis.fileListLength&&this.$nextTick(()=>{setTimeout(()=>{this.$refs.scrollContainer&&this.$refs.scrollContainer.setScrollTop(0)},100)}),this.fileListLength=this.fileList.length},deep:!0},useCustomUrl:{handler(){_t(this.fileList,this.rootUrl)},immediate:!0},customUrlPrefix:{handler(){"true"===this.useCustomUrl&&_t(this.fileList,this.rootUrl)},immediate:!0},autoReUpload(e){this.$store.commit("setStoreAutoReUpload",e)}},computed:{...(0,$t.L8)(["storeAutoReUpload"]),uploadSuccessCount(){return this.fileList.filter(e=>"done"===e.status||"success"===e.status).length},uploadErrorCount(){return this.fileList.filter(e=>"exception"===e.status).length},uploadingCount(){return this.fileList.filter(e=>"uploading"===e.status).length},waitingCount(){return this.uploadQueue.length},urlSize(){return window.innerWidth<768?"small":"default"},disableTooltip(){return window.innerWidth<768},rootUrl(){return"true"===this.useCustomUrl?this.customUrlPrefix:this.urlPrefix||`${window.location.protocol}//${window.location.host}/file/`},pasteCardMethodButtonSize(){return this.fileList.length||window.innerWidth<768?"small":"medium"}},mounted(){document.addEventListener("paste",this.handlePaste),this.autoReUpload=this.storeAutoReUpload},beforeUnmount(){document.removeEventListener("paste",this.handlePaste),this.uploadQueue=[],this.fileList=[],this.activeUploads=0},methods:{truncateFilename(e,t=20){if(!e||e.length<=t)return e;const o=e.lastIndexOf(".");let s,l;o>0?(s=e.substring(0,o),l=e.substring(o)):(s=e,l="");const i=l.length+4,a=t-i-3;return a<=0?e.substring(0,t-3)+"...":s.substring(0,a)+"..."+s.slice(-4)+l},uploadFile(e){if(!this.fileList.find(t=>t.uid===e.file.uid))return;if(this.activeUploads>=this.maxConcurrentUploads){this.uploadQueue.push(e);const t=this.fileList.find(t=>t.uid===e.file.uid);return void(t&&(t.status="waiting"))}this.activeUploads++;const t=this.fileList.find(t=>t.uid===e.file.uid);t&&(t.status="uploading");const o=this.fileList.find(t=>t.uid===e.file.uid),s=o?.uploadChannel||this.uploadChannel;if("external"===s)return void this.uploadSingleFile(e);if("huggingface"===s){const t=20971520;return void(e.file.size>=t?this.uploadToHuggingFaceDirect(e):this.uploadSingleFile(e))}if("discord"===s){const t=9437184;return void(e.file.size>t?this.uploadFileInChunks(e):this.uploadSingleFile(e))}const l=20971520;e.file.size>l?this.uploadFileInChunks(e):this.uploadSingleFile(e)},processUploadQueue(){if(0===this.uploadQueue.length||this.activeUploads>=this.maxConcurrentUploads)return;const e=this.uploadQueue.shift();e&&this.fileList.find(t=>t.uid===e.file.uid)?this.uploadFile(e):this.processUploadQueue()},onUploadComplete(){this.activeUploads=Math.max(0,this.activeUploads-1),this.processUploadQueue(),0===this.activeUploads&&0===this.uploadQueue.length&&(this.uploading=!1)},async uploadSingleFile(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=t.serverCompress,s=t.uploadChannel||this.uploadChannel,l=this.autoRetry&&"external"!==s,i="external"===s?"default":this.uploadNameType,a=new AbortController;this.abortControllers.set(e.file.uid,a);const n=new FormData;if(n.append("file",e.file),"external"===s&&n.append("url",e.file.url),"huggingface"===s)try{console.log("Computing SHA256 for HuggingFace upload...");const t=await Et(e.file);n.append("sha256",t),console.log("SHA256 computed:",t)}catch(r){console.error("Failed to compute SHA256:",r)}(0,Lt.A)({url:"/upload?serverCompress="+o+"&uploadChannel="+s+(this.channelName?"&channelName="+encodeURIComponent(this.channelName):"")+"&uploadNameType="+i+"&autoRetry="+l+"&uploadFolder="+encodeURIComponent(this.uploadFolder),method:"post",data:n,withAuthCode:!0,signal:a.signal,onUploadProgress:t=>{const o=Math.round(t.loaded/t.total*100);e.onProgress({percent:o,file:e.file})}}).then(t=>{e.onSuccess(t,e.file)}).catch(t=>{"CanceledError"!==t.name&&"ERR_CANCELED"!==t.code?t.response&&401!==t.response.status?(this.exceptionList.push(e),e.onError(t,e.file)):t.response||(this.exceptionList.push(e),e.onError(t,e.file)):console.log("上传已取消:",e.file.name)}).finally(()=>{this.abortControllers.delete(e.file.uid),this.onUploadComplete()})},async uploadFileInChunks(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=t.uploadChannel||this.uploadChannel,s=new AbortController;this.abortControllers.set(e.file.uid,s);const l="discord"===o?9437184:16777216,i=e.file.size,a=Math.ceil(i/l),n=t.serverCompress,r=this.autoRetry&&"external"!==o,d="external"===o?"default":this.uploadNameType;let c=null;if("huggingface"===o)try{console.log("Computing SHA256 for HuggingFace chunked upload..."),c=await Et(e.file),console.log("SHA256 computed:",c)}catch(u){console.error("Failed to compute SHA256:",u)}try{const t=new FormData;t.append("originalFileName",e.file.name),t.append("originalFileType",e.file.type),t.append("totalChunks",a.toString());const p=await(0,Lt.A)({url:"/upload?serverCompress="+n+"&uploadChannel="+o+(this.channelName?"&channelName="+encodeURIComponent(this.channelName):"")+"&uploadNameType="+d+"&autoRetry="+r+"&uploadFolder="+encodeURIComponent(this.uploadFolder)+"&initChunked=true",method:"post",data:t,withAuthCode:!0});if(!p.data.success)throw new Error(this.$t("uploadForm.chunkInitFailed")+": "+p.data.message);const h=p.data.uploadId;console.log("分块上传初始化成功,uploadId:",h);const m=this.fileList.find(t=>t.uid===e.file.uid);m&&(m.totalChunks=a,m.uploadId=h);const g=3,f=new Array(a).fill(0);let y=0,b=!1,v="",C=!1;const k=async t=>{if(b||C)return;const c=t*l,p=Math.min(c+l,i),m=e.file.slice(c,p),g=new FormData;g.append("file",m,`${e.file.name}.part${t.toString().padStart(3,"0")}`),g.append("chunkIndex",t.toString()),g.append("totalChunks",a.toString()),g.append("uploadId",h),g.append("originalFileName",e.file.name),g.append("originalFileType",e.file.type);let y=0;const k=3;while(y{if(b||C)return;const s=Math.round(o.loaded/o.total*100);f[t]=s;const l=Math.round(f.reduce((e,t)=>e+t,0)/a);e.onProgress({percent:l,file:e.file})}})}catch(u){if("CanceledError"===u.name||"ERR_CANCELED"===u.code)return C=!0,void console.log("分块上传已取消:",e.file.name);if(y++,console.warn(`分块 ${t+1}/${a} 上传失败 (重试 ${y}/${k}):`,u),y>=k)throw b=!0,v=`分块 ${t+1}/${a} 上传失败: ${u.message}`,new Error(v);await new Promise(e=>setTimeout(e,2e3*y))}}},w=[];for(let e=0;e{while(yt.uid===e.file.uid);t&&t.uploadId&&this.cleanupUploadResources(t.uploadId,t.totalChunks).then(()=>{console.log(`已清理分块上传失败的资源: ${t.uploadId}`)}).catch(e=>{console.warn("清理分块上传失败资源时出错:",e)}),u.response&&401!==u.response.status?(this.exceptionList.push(e),e.onError(u,e.file)):u.response||(this.exceptionList.push(e),e.onError(u,e.file))}finally{this.abortControllers.delete(e.file.uid),this.onUploadComplete()}},handleRemove(e){this.abortControllers.has(e.uid)&&(this.abortControllers.get(e.uid).abort(),this.abortControllers.delete(e.uid)),this.uploadQueue=this.uploadQueue.filter(t=>t.file.uid!==e.uid),this.fileList=this.fileList.filter(t=>t.uid!==e.uid),this.$message({type:"info",message:this.$t("uploadForm.deleted",{name:this.truncateFilename(e.name)})})},async cleanupUploadResources(e,t=0){try{await(0,Lt.A)({url:`/upload?cleanup=true&uploadId=${e}&totalChunks=${t}`,method:"get",withAuthCode:!0,timeout:5e3}),console.log(`清理上传资源成功: ${e}`)}catch(o){console.warn("清理上传资源失败:",o)}},handleSuccess(e,t){const o=this.fileList.find(e=>e.uid===t.uid);if(o)try{const s=o.uploadChannel||this.uploadChannel;if("external"!==s){const s=e.data[0].src.replace("/file/","");o.url=`${window.location.protocol}//${window.location.host}/file/`+s;const l=St(s,t.name,this.rootUrl);Object.assign(o,l),o.srcID=s}o.progreess=100,o.status="success",this.saveToHistory(o),this.$message({type:"success",message:this.$t("uploadForm.uploadSuccess",{name:this.truncateFilename(t.name)})}),setTimeout(()=>{const e=this.fileList.find(e=>e.uid===t.uid);e&&(e.status="done")},1e3)}catch(s){this.$message.error(this.$t("uploadForm.uploadFailed",{name:this.truncateFilename(t.name)})),o.status="exception"}},saveToHistory(e){try{const t=JSON.parse(localStorage.getItem("uploadHistory")||"[]"),o={name:e.name,url:e.finalURL,time:Date.now(),type:e.name.split(".").pop().toLowerCase()};t.push(o),localStorage.setItem("uploadHistory",JSON.stringify(t))}catch(t){console.error("Failed to save history",t)}},handleError(e,t){const o=this.fileList.find(e=>e.uid===t.uid);o&&(this.$message.error(this.$t("uploadForm.uploadFailed",{name:this.truncateFilename(t.name)})),o.status="exception",this.autoReUpload&&this.scheduleAutoRetry())},handleCopy(e){const t=this.fileList.find(t=>t.uid===e.uid).status;"done"===t||"success"===t?(navigator.clipboard.writeText(Tt(e,this.selectedUrlForm)),this.$message({type:"success",message:this.$t("uploadForm.copySuccess")})):this.$message({type:"warning",message:this.$t("uploadForm.fileNotUploaded")})},beforeUpload(e){return new Promise(async(t,o)=>{let s=e;const l=this.convertToWebp&&e.type.includes("image")&&!e.type.includes("webp")&&!e.type.includes("gif")&&!e.type.includes("svg");if(l)try{const t=await this.convertImageToWebp(e);t&&(s=t,console.log(`WebP转换成功: ${e.name} -> ${t.name}, 大小: ${(e.size/1024).toFixed(1)}KB -> ${(t.size/1024).toFixed(1)}KB`))}catch(r){console.warn("WebP转换失败,使用原文件:",r)}const i=s.type.includes("image")&&this.customerCompress&&s.size/1024/1024>this.compressBar,a=s.size/1024/1024<=1024||"telegram"!==this.uploadChannel,n=(e,o)=>{const s=URL.createObjectURL(e);this.fileList.push({uid:e.uid,name:e.name,url:s,finalURL:"",mdURL:"",htmlURL:"",ubbURL:"",srcID:"",status:"uploading",progreess:0,serverCompress:o,retryCount:0}),t(e)};if(i)Ut.compressAccurately(s,1024*this.compressQuality).then(t=>{t.size/1024/1024>1024&&"telegram"===this.uploadChannel&&(this.$message.error(this.$t("uploadForm.compressedFileTooLarge",{name:s.name})),o(this.$t("uploadForm.fileSizeTooLarge"))),this.uploading=!0;const l=new File([t],s.name,{type:t.type});l.uid=e.uid;const i=this.uploadCount++,a=this.serverCompress&&l.size/1024/1024<10&&"telegram"===this.uploadChannel;0===i?n(l,a):setTimeout(()=>{n(l,a),this.uploadCount--},300*i)}).catch(e=>{this.$message.error(this.$t("uploadForm.compressFailedCannotUpload",{name:s.name})),o(e)});else if(a){this.uploading=!0;const e=this.uploadCount++,t="telegram"===this.uploadChannel&&this.serverCompress&&(!s.type.includes("image")||s.size/1024/1024<10);0===e?n(s,t):setTimeout(()=>{n(s,t),this.uploadCount--},300*e)}else this.$message.error(this.$t("uploadForm.fileTooLarge",{name:s.name})),o(this.$t("uploadForm.fileSizeTooLarge"))})},handleProgress(e){const t=this.fileList.find(t=>t.uid===e.file.uid);t&&(t.progreess=e.percent)},copyAll(){const e=this.fileList.filter(e=>"done"===e.status||"success"===e.status).map(e=>Tt(e,this.selectedUrlForm)).join("\n");navigator.clipboard.writeText(e),this.$message({type:"success",message:this.$t("uploadForm.copyAllSuccess")})},clearFileList(){this.fileList.length>0?(this.abortControllers.forEach((e,t)=>{e.abort()}),this.abortControllers.clear(),this.uploadQueue=[],this.fileList=[],this.$message({type:"success",message:this.$t("uploadForm.fileListCleared")})):this.$message({type:"info",message:this.$t("uploadForm.fileListEmpty")})},clearSuccessList(){this.uploadSuccessCount>0?(this.fileList=this.fileList.filter(e=>"done"!==e.status&&"success"!==e.status),this.$message({type:"success",message:this.$t("uploadForm.successFilesCleared")})):this.$message({type:"info",message:this.$t("uploadForm.successFilesEmpty")})},handlePaste(e){if("INPUT"===e.target.tagName||"TEXTAREA"===e.target.tagName)return;const t=e.clipboardData.items;t.length>0&&this.uploadFromUrl(t)},handleUploadPasteUrls(){const e=this.pastedUrls.split("\n"),t=e.map(e=>e.trim()).filter(e=>""!==e).filter(e=>/^(https?:\/\/[^\s$.?#].[^\s]*)$/.test(e));if("save"===this.pasteUploadMethod)this.uploadFromUrl(t.map(e=>({kind:"string",getAsString:t=>{t(e)}})));else if("external"===this.pasteUploadMethod)for(let o=0;o`,a=`[img]${e}[/img]`,n=new File([],e.split("/").pop(),{type:"text/plain"});n.uid=Date.now()+o,n.url=e,this.fileList.push({uid:n.uid,name:n.name,url:e,finalURL:e,mdURL:l,htmlURL:i,ubbURL:a,srcID:e,status:"uploading",progreess:0,serverCompress:!1,uploadChannel:"external",retryCount:0}),this.uploadFile({file:n,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}},uploadFromUrl(e){for(let t=0;t{e instanceof File&&this.uploadFile({file:e,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}).catch(e=>{console.log(e)})}else"string"===e[t].kind&&e[t].getAsString(e=>{const o=/^(https?:\/\/[^\s$.?#].[^\s]*)$/;let s="";o.test(e)&&Lt.A.post("/api/fetchRes",{url:e},{responseType:"blob",withAuthCode:!0}).then(o=>{o.headers["content-type"];if(200!=o.status)throw new Error("URL地址请求失败");{const i=o.headers["content-disposition"];if(i){const e=/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/,t=/filename\*\s*=\s*UTF-8''([^;\n]*)/;let o=e.exec(i);if(null!=o&&o[1]){s=o[1].replace(/['"]/g,"");try{s=decodeURIComponent(s)}catch(l){s=""}}""===s&&(o=t.exec(i),null!=o&&o[1]&&(s=decodeURIComponent(o[1])))}if(""===s){const t=new URL(e);s=t.pathname.split("/").pop()}if(""===s){const o=new URL(e);let l=o.pathname.split(".").pop();(!l||""===l||l.length>10)&&(l="bin"),s="PastedFile"+Date.now()+t+"."+l}const a=o.data,n=new File([a],s,{type:a.type});n.uid=Date.now()+t;const r=this.beforeUpload(n);r instanceof Promise&&r.then(e=>{e instanceof File&&this.uploadFile({file:e,onProgress:e=>this.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})}).catch(e=>{console.log(e)})}}).catch(e=>{this.$message({type:"warning",message:this.$t("uploadForm.urlRequestFailed")})})})},handleScroll(e){this.listScrolled=e.scrollTop>0&&this.fileList.length>0},retryError(){this.exceptionList.length>0?(this.retryFailedFiles(this.exceptionList),this.exceptionList=[]):this.$message({type:"info",message:this.$t("uploadForm.noFailedFiles")})},handleAutoRetryChange(e){this.$message({type:e?"success":"info",message:e?this.$t("uploadForm.autoRetryOn"):this.$t("uploadForm.autoRetryOff")}),e&&this.exceptionList.length>0&&this.scheduleAutoRetry()},retryFailedFiles(e){e.forEach(e=>{const t=e.retryCount||0;tthis.handleProgress(e),onSuccess:(e,t)=>this.handleSuccess(e,t),onError:(e,t)=>this.handleError(e,t)})):this.$message({type:"warning",message:this.$t("uploadForm.maxRetryReached",{name:e.name,max:this.maxRetryCount})})})},scheduleAutoRetry(){this.retryTimer&&clearTimeout(this.retryTimer),this.retryTimer=setTimeout(()=>{if(this.autoReUpload&&this.exceptionList.length>0){const e=[...this.exceptionList];this.exceptionList=[],this.retryFailedFiles(e)}},this.retryDelay)},async uploadToHuggingFaceDirect(e){const t=this.fileList.find(t=>t.uid===e.file.uid);if(!t)return;const o=new AbortController;this.abortControllers.set(e.file.uid,o);try{console.log("=== HuggingFace Direct Upload ==="),console.log("File:",e.file.name,"Size:",e.file.size),e.onProgress({percent:5,file:e.file}),console.log("Computing SHA256...");const t=await Et(e.file);if(console.log("SHA256:",t),o.signal.aborted)return void console.log("HuggingFace 上传已取消:",e.file.name);const s=new Uint8Array(await e.file.slice(0,512).arrayBuffer()),l=btoa(String.fromCharCode(...s));e.onProgress({percent:10,file:e.file}),console.log("Getting LFS upload URL...");const i=await(0,Lt.A)({url:"/upload/huggingface/getUploadUrl",method:"post",data:{fileSize:e.file.size,fileName:e.file.name,fileType:e.file.type,sha256:t,fileSample:l,channelName:this.channelName,uploadNameType:this.uploadNameType,uploadFolder:this.uploadFolder},withAuthCode:!0,signal:o.signal});if(!i.data.success)throw new Error(i.data.error||"Failed to get upload URL");const a=i.data;if(console.log("Upload info:",a),a.alreadyExists)console.log("File already exists in LFS, skipping upload"),e.onProgress({percent:90,file:e.file});else if(a.needsLfs&&a.uploadAction){const{href:t,header:s}=a.uploadAction;if(s?.chunk_size)await this.uploadToHuggingFaceMultipart(e,a,o);else{console.log("Uploading to S3 (basic)...");const l=await fetch(t,{method:"PUT",headers:s||{},body:e.file,signal:o.signal});if(!l.ok){const e=await l.text();throw new Error(`S3 upload failed: ${l.status} - ${e}`)}console.log("S3 upload complete")}}if(o.signal.aborted)return void console.log("HuggingFace 上传已取消:",e.file.name);e.onProgress({percent:95,file:e.file}),console.log("Committing file...");const n=await(0,Lt.A)({url:"/upload/huggingface/commitUpload",method:"post",data:{fullId:a.fullId,filePath:a.filePath,sha256:t,fileSize:e.file.size,fileName:e.file.name,fileType:e.file.type,channelName:a.channelName},withAuthCode:!0,signal:o.signal});if(!n.data.success)throw new Error(n.data.error||"Failed to commit file");console.log("Upload complete:",n.data);const r={data:[{src:n.data.src}]};e.onSuccess(r,e.file)}catch(s){if("CanceledError"===s.name||"ERR_CANCELED"===s.code||"AbortError"===s.name)return void console.log("HuggingFace 上传已取消:",e.file.name);console.error("HuggingFace direct upload error:",s),this.exceptionList.push(e),e.onError(s,e.file)}finally{this.abortControllers.delete(e.file.uid),this.onUploadComplete()}},async uploadToHuggingFaceMultipart(e,t,o){const{uploadAction:s}=t,{href:l,header:i}=s,a=parseInt(i.chunk_size),n=Object.keys(i).filter(e=>/^[0-9]+$/.test(e));console.log(`Multipart upload: ${n.length} parts, chunk size: ${a}`);const r=[],d=n.length;for(const u of n){if(o&&o.signal.aborted)throw console.log("HuggingFace 分片上传已取消"),new DOMException("Upload cancelled","AbortError");const t=parseInt(u)-1,s=t*a,l=Math.min(s+a,e.file.size),n=e.file.slice(s,l);console.log(`Uploading part ${u}/${d}`);const c=await fetch(i[u],{method:"PUT",body:n,signal:o?o.signal:void 0});if(!c.ok)throw new Error(`Failed to upload part ${u}: ${c.status}`);const p=c.headers.get("ETag");if(!p)throw new Error(`No ETag for part ${u}`);r.push({partNumber:parseInt(u),etag:p});const h=10+Math.round(parseInt(u)/d*80);e.onProgress({percent:h,file:e.file})}if(o&&o.signal.aborted)throw console.log("HuggingFace 分片上传已取消"),new DOMException("Upload cancelled","AbortError");console.log("Completing multipart upload...");const c=await fetch(l,{method:"POST",headers:{Accept:"application/vnd.git-lfs+json","Content-Type":"application/vnd.git-lfs+json"},body:JSON.stringify({oid:t.oid,parts:r}),signal:o?o.signal:void 0});if(!c.ok){const e=await c.text();throw new Error(`Multipart complete failed: ${c.status} - ${e}`)}console.log("Multipart upload complete")},async convertImageToWebp(e){return new Promise((t,o)=>{if(e.type.includes("gif")||e.type.includes("svg")||e.type.includes("webp"))return void t(null);const s=new Image,l=document.createElement("canvas"),i=l.getContext("2d");s.onload=()=>{l.width=s.width,l.height=s.height,i.drawImage(s,0,0),l.toBlob(l=>{if(l){const o=e.name,s=o.lastIndexOf("."),i=s>0?o.substring(0,s)+".webp":o+".webp",a=new File([l],i,{type:"image/webp"});a.uid=e.uid,t(a)}else o(new Error("WebP 转换失败"));URL.revokeObjectURL(s.src)},"image/webp",.92)},s.onerror=()=>{URL.revokeObjectURL(s.src),o(new Error(this.$t("uploadForm.imageLoadFailed")))},s.src=URL.createObjectURL(e)})},handleUploadCardMouseMove(e){const t=this.$refs.uploadCardGlow;if(!t)return;const o=e.currentTarget.getBoundingClientRect(),s=e.clientX-o.left,l=e.clientY-o.top;t.style.opacity="1",t.style.left=s+"px",t.style.top=l+"px"},handleUploadCardMouseLeave(){const e=this.$refs.uploadCardGlow;e&&(e.style.opacity="0")}},beforeDestroy(){this.retryTimer&&clearTimeout(this.retryTimer)}};const It=(0,z.A)(Dt,[["render",Ft],["__scopeId","data-v-37f80c81"]]);var Nt=It,Pt=o(732),Vt=o(33892),Wt=o(45130);const zt={class:"directory-suggestion-input",ref:"wrapperRef"},Bt={class:"suggestion-dropdown"},Ht={class:"suggestion-list"},Xt=["title","onMousedown"];function Ot(e,t,o,s,l,n){const r=G.WK;return(0,i.uX)(),(0,i.CE)("div",zt,[(0,i.bF)(r,{ref:"inputRef",modelValue:n.inputValue,"onUpdate:modelValue":t[0]||(t[0]=e=>n.inputValue=e),placeholder:o.placeholder,onFocus:n.handleFocus,onBlur:n.handleBlur,onInput:n.handleInput},null,8,["modelValue","placeholder","onFocus","onBlur","onInput"]),(0,i.bo)((0,i.Lk)("div",Bt,[(0,i.Lk)("ul",Ht,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.suggestions,(e,t)=>((0,i.uX)(),(0,i.CE)("li",{key:t,class:"suggestion-item",title:e.value,onMousedown:(0,Wt.D$)(t=>n.selectItem(e),["prevent"])},(0,a.v_)(e.value),41,Xt))),128))])],512),[[Wt.aG,l.dropdownVisible&&l.suggestions.length>0]])],512)}var Qt={name:"DirectorySuggestionInput",props:{modelValue:{type:String,default:""},placeholder:{type:String,default:""}},emits:["update:modelValue","focus","blur","select"],data(){return{directoryTreeRoot:null,directoryTreeLoaded:!1,directoryTreeLoading:!1,directoryChildrenMap:{},focusTime:null,dropdownVisible:!1,isFocused:!1,suggestions:[]}},computed:{inputValue:{get(){return this.modelValue},set(e){this.$emit("update:modelValue",e)}}},watch:{modelValue(){this.isFocused&&this.refreshSuggestions()}},methods:{handleFocus(){this.isFocused=!0,this.focusTime=Date.now(),this.ensureDirectoryTreeLoaded(),this.$emit("focus"),setTimeout(()=>{this.isFocused&&(this.refreshSuggestions(),this.dropdownVisible=!0)},500)},handleBlur(){this.isFocused=!1,this.dropdownVisible=!1,this.$emit("blur")},handleInput(e){this.$nextTick(()=>{this.refreshSuggestions(),this.isFocused&&(this.dropdownVisible=!0)})},selectItem(e){const t=e.value;this.inputValue=t,this.$emit("select",t);const o=this.normalizeDirectoryPath(t),s=this.directoryChildrenMap[o];s&&s.length>0?this.$nextTick(()=>{this.refreshSuggestions(),this.dropdownVisible=!0,this.$refs.inputRef?.focus()}):this.dropdownVisible=!1},refreshSuggestions(){this.suggestions=this.getDirectorySuggestions(this.modelValue||"")},normalizeDirectoryPath(e){if(!e)return"/";let t=e;return t.startsWith("/")||(t="/"+t),"/"===t||t.endsWith("/")||(t+="/"),t},buildDirectoryChildrenMap(e){const t={},o=e=>{const s=this.normalizeDirectoryPath(e.path),l=Array.isArray(e.children)?e.children:[];t[s]=l.map(e=>({name:e.name,path:this.normalizeDirectoryPath(e.path)})),l.forEach(o)};o(e),this.directoryChildrenMap=t},async ensureDirectoryTreeLoaded(){if(!this.directoryTreeLoaded&&!this.directoryTreeLoading){this.directoryTreeLoading=!0;try{const e=await Lt.A.get("/api/directoryTree",{withAuthCode:!0}),t=e?.data?.tree;t&&(this.directoryTreeRoot=t,this.buildDirectoryChildrenMap(t),this.directoryTreeLoaded=!0)}catch(e){console.error("Failed to load directory tree for autocomplete:",e)}finally{this.directoryTreeLoading=!1}}},parseDirectoryQuery(e){const t=e&&e.startsWith("/")?e:`/${e||""}`,o=t.slice(1),s=o.split("/"),l=s[s.length-1]||"",i=s.slice(0,-1).filter(Boolean),a=i.length>0?`/${i.join("/")}/`:"/";return{segmentInput:l,parentPath:a}},getDirectorySuggestions(e){const{segmentInput:t,parentPath:o}=this.parseDirectoryQuery(e),s=this.directoryChildrenMap[o]||[];if(!t)return s.slice(0,10).map(e=>({value:e.path}));const l=t.toLowerCase();return s.filter(e=>e.name.toLowerCase().startsWith(l)).slice(0,10).map(e=>({value:e.path}))}}};const jt=(0,z.A)(Qt,[["render",Ot],["__scopeId","data-v-0ff63416"]]);var qt=jt,Gt=o(6834);const Kt={class:"container"},Jt={class:"upload-home"},Yt={class:"toolbar-manage"},Zt={class:"toolbar"},eo={class:"header"},to={class:"title"},oo={class:"main-title",href:"https://github.com/MarSeventh/CloudFlare-ImgBed",target:"_blank"},so={class:"dialog-section"},lo={class:"section-header"},io={class:"section-title"},ao={class:"section-content"},no={class:"dialog-section"},ro={class:"section-header"},co={class:"section-title"},uo={class:"section-content"},po={class:"setting-item"},ho={class:"setting-label"},mo={key:0,class:"setting-item"},go={class:"setting-label"},fo={class:"dialog-action"},yo=["innerHTML"],bo={class:"dialog-footer"};function vo(e,t,o,n,r,d){const c=Gt.A,u=(0,i.g2)("font-awesome-icon"),p=l.S2,h=ut.c6,m=ut.Iy,g=ut.dW,f=qt,y=G.WK,b=Vt.A,v=s.R7,C=Pt.A,k=Nt,w=J.ll,F=J.MQ,L=q.qi,U=O.kZ,$=We,S=X.A,T=H;return(0,i.uX)(),(0,i.CE)("div",Kt,[(0,i.Lk)("div",Jt,[(0,i.bF)(c,{class:"toggle-dark-button desktop-only"}),(0,i.bF)(g,{class:"more-dropdown desktop-only",trigger:"click",onCommand:d.handleDesktopMenuCommand},{dropdown:(0,i.k6)(()=>[(0,i.bF)(m,null,{default:(0,i.k6)(()=>[(0,i.bF)(h,{command:"showHistory"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"history",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.history")),1)]),_:1}),(0,i.bF)(h,{command:"showAnnouncement",disabled:!d.announcementAvailable},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"bullhorn",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.announcement")),1)]),_:1},8,["disabled"]),(0,i.bF)(h,{command:"toggleLanguage"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"globe",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)("zh-CN"===e.$i18n.locale?"English":"简体中文"),1)]),_:1}),(0,i.bF)(h,{command:"viewDocs"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"book",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.viewDocs")),1)]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"more-button"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"ellipsis-v",size:"lg"})]),_:1})]),_:1},8,["onCommand"]),(0,i.Lk)("div",{class:(0,a.C4)(["upload-folder-container",{"no-announcement":!d.announcementAvailable}])},[(0,i.Lk)("div",{class:(0,a.C4)(["upload-folder",{active:r.isFolderInputActive}])},[d.showDirectorySuggestions?((0,i.uX)(),(0,i.Wv)(f,{key:0,modelValue:r.uploadFolder,"onUpdate:modelValue":t[0]||(t[0]=e=>r.uploadFolder=e),class:"inner-folder-input",placeholder:e.$t("upload.folderPlaceholder"),onFocus:d.handleFolderInputFocus,onBlur:d.handleFolderInputBlur,onSelect:d.handleDirectorySelect},null,8,["modelValue","placeholder","onFocus","onBlur","onSelect"])):((0,i.uX)(),(0,i.Wv)(y,{key:1,class:"inner-folder-input",modelValue:r.uploadFolder,"onUpdate:modelValue":t[1]||(t[1]=e=>r.uploadFolder=e),placeholder:e.$t("upload.folderPlaceholder"),onFocus:d.handleFolderInputFocus,onBlur:d.handleFolderInputBlur},null,8,["modelValue","placeholder","onFocus","onBlur"]))],2),d.showDirectorySuggestions?((0,i.uX)(),(0,i.Wv)(b,{key:0,"current-directory":r.uploadFolder,source:"upload",onSelect:d.handleDirectorySelect},{trigger:(0,i.k6)(()=>[(0,i.bF)(p,{class:"directory-tree-trigger"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"folder-tree"})]),_:1})]),_:1},8,["current-directory","onSelect"])):(0,i.Q3)("",!0)],2),(0,i.bF)(v,{content:e.$t("upload.switchUploadMethod"),placement:"bottom",disabled:d.disableTooltip},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"upload-method-button desktop-only",onClick:d.handleChangeUploadMethod},{default:(0,i.k6)(()=>["default"===r.uploadMethod?((0,i.uX)(),(0,i.Wv)(u,{key:0,icon:"folder-open",class:"upload-method-icon",size:"lg"})):"paste"===r.uploadMethod?((0,i.uX)(),(0,i.Wv)(u,{key:1,icon:"paste",class:"upload-method-icon",size:"lg"})):(0,i.Q3)("",!0)]),_:1},8,["onClick"])]),_:1},8,["content","disabled"]),(0,i.bF)(g,{class:"mobile-more-dropdown mobile-only",trigger:"click",onCommand:d.handleMobileMenuCommand},{dropdown:(0,i.k6)(()=>[(0,i.bF)(m,null,{default:(0,i.k6)(()=>[(0,i.bF)(h,{command:"toggleTheme"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:d.getThemeIcon(),style:{width:"16px","margin-right":"8px","text-align":"center"}},null,8,["icon"]),(0,i.eW)(" "+(0,a.v_)(d.getThemeText()),1)]),_:1}),(0,i.bF)(h,{command:"toggleUploadMethod"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"default"===r.uploadMethod?"paste":"folder-open",style:{width:"16px","margin-right":"8px","text-align":"center"}},null,8,["icon"]),(0,i.eW)(" "+(0,a.v_)("default"===r.uploadMethod?e.$t("upload.pasteUpload"):e.$t("upload.fileUpload")),1)]),_:1}),(0,i.bF)(h,{command:"showHistory"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"history",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.history")),1)]),_:1}),(0,i.bF)(h,{command:"showAnnouncement",disabled:!d.announcementAvailable},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"bullhorn",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.announcement")),1)]),_:1},8,["disabled"]),(0,i.bF)(h,{command:"toggleLanguage"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"globe",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)("zh-CN"===e.$i18n.locale?"English":"简体中文"),1)]),_:1}),(0,i.bF)(h,{command:"viewDocs"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"book",style:{width:"16px","margin-right":"8px","text-align":"center"}}),(0,i.eW)(" "+(0,a.v_)(e.$t("upload.viewDocs")),1)]),_:1})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{class:"mobile-more-button"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"ellipsis-v",size:"lg"})]),_:1})]),_:1},8,["onCommand"]),(0,i.Lk)("div",Yt,[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-manage-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.handleOpenToolbar,circle:""},{default:(0,i.k6)(()=>[r.isToolBarOpen?((0,i.uX)(),(0,i.Wv)(u,{key:1,icon:"times",class:"manage-icon",size:"lg"})):((0,i.uX)(),(0,i.Wv)(u,{key:0,icon:"bars",class:"manage-icon",size:"lg"}))]),_:1},8,["class","onClick"])]),(0,i.Lk)("div",Zt,[(0,i.bF)(v,{disabled:d.disableTooltip,content:e.$t("upload.settings"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-button compress-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.openCompressDialog,circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"cloud-upload",class:"compress-icon",size:"lg"})]),_:1},8,["class","onClick"])]),_:1},8,["disabled","content"]),(0,i.bF)(v,{disabled:d.disableTooltip,content:e.$t("upload.linkFormat"),placement:"left"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-button link-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.openUrlDialog,circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"link",class:"link-icon",size:"lg"})]),_:1},8,["class","onClick"])]),_:1},8,["disabled","content"]),(0,i.bF)(v,{disabled:d.disableTooltip,content:e.$t("upload.manage"),placement:"left"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-button config-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.handleManage,circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"cog",class:"config-icon",size:"lg"})]),_:1},8,["class","onClick"])]),_:1},8,["disabled","content"]),(0,i.bF)(v,{disabled:d.disableTooltip,content:e.$t("upload.logout"),placement:"left"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{class:(0,a.C4)(["toolbar-button sign-out-button",{active:r.isToolBarOpen}]),size:"large",onClick:d.handleLogout,circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"sign-out-alt",class:"sign-out-icon",size:"lg"})]),_:1},8,["class","onClick"])]),_:1},8,["disabled","content"])]),(0,i.bF)(C,{useConfigLink:!0}),(0,i.Lk)("div",eo,[(0,i.Lk)("h1",to,[(0,i.Lk)("a",oo,(0,a.v_)(d.ownerName),1),t[21]||(t[21]=(0,i.eW)(" ImgHub",-1))])]),(0,i.bF)(k,{selectedUrlForm:r.selectedUrlForm,customerCompress:r.customerCompress,compressQuality:r.compressQuality,compressBar:r.compressBar,serverCompress:r.serverCompress,uploadChannel:r.uploadChannel,channelName:r.channelName,uploadNameType:r.uploadNameType,useCustomUrl:r.useCustomUrl,customUrlPrefix:r.customUrlPrefix,autoRetry:r.autoRetry,urlPrefix:d.urlPrefix,uploadMethod:r.uploadMethod,uploadFolder:r.uploadFolder,convertToWebp:r.convertToWebp,class:"upload"},null,8,["selectedUrlForm","customerCompress","compressQuality","compressBar","serverCompress","uploadChannel","channelName","uploadNameType","useCustomUrl","customUrlPrefix","autoRetry","urlPrefix","uploadMethod","uploadFolder","convertToWebp"]),(0,i.bF)(U,{title:e.$t("settings.linkFormatTitle"),modelValue:r.showUrlDialog,"onUpdate:modelValue":t[6]||(t[6]=e=>r.showUrlDialog=e),width:d.dialogWidth,"show-close":!1,class:"settings-dialog"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",so,[(0,i.Lk)("div",lo,[(0,i.Lk)("span",io,(0,a.v_)(e.$t("settings.defaultCopyLink")),1)]),(0,i.Lk)("div",ao,[(0,i.bF)(F,{modelValue:r.selectedUrlForm,"onUpdate:modelValue":t[2]||(t[2]=e=>r.selectedUrlForm=e),onChange:d.changeUrlForm,class:"radio-card-group grid-2x2"},{default:(0,i.k6)(()=>[(0,i.bF)(w,{value:"url",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"link",class:"radio-icon"}),(0,i.Lk)("span",null,(0,a.v_)(e.$t("settings.rawLink")),1)]),_:1}),(0,i.bF)(w,{value:"md",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"code",class:"radio-icon"}),t[22]||(t[22]=(0,i.Lk)("span",null,"MarkDown",-1))]),_:1}),(0,i.bF)(w,{value:"html",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"code-branch",class:"radio-icon"}),t[23]||(t[23]=(0,i.Lk)("span",null,"HTML",-1))]),_:1}),(0,i.bF)(w,{value:"ubb",class:"radio-card"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"quote-right",class:"radio-icon"}),t[24]||(t[24]=(0,i.Lk)("span",null,"BBCode",-1))]),_:1})]),_:1},8,["modelValue","onChange"])])]),(0,i.Lk)("div",no,[(0,i.Lk)("div",ro,[(0,i.Lk)("span",co,(0,a.v_)(e.$t("settings.customLink")),1),(0,i.bF)(v,{content:e.$t("settings.customLinkTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",class:"section-help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",uo,[(0,i.Lk)("div",po,[(0,i.Lk)("span",ho,(0,a.v_)(e.$t("settings.enableCustom")),1),(0,i.bF)(L,{modelValue:r.useCustomUrl,"onUpdate:modelValue":t[3]||(t[3]=e=>r.useCustomUrl=e),"active-value":"true","inactive-value":"false"},null,8,["modelValue"])]),"true"===r.useCustomUrl?((0,i.uX)(),(0,i.CE)("div",mo,[(0,i.Lk)("span",go,(0,a.v_)(e.$t("settings.customPrefix")),1),(0,i.bF)(y,{modelValue:r.customUrlPrefix,"onUpdate:modelValue":t[4]||(t[4]=e=>r.customUrlPrefix=e),placeholder:e.$t("settings.customPrefixPlaceholder"),class:"setting-input"},null,8,["modelValue","placeholder"])])):(0,i.Q3)("",!0)])]),(0,i.Lk)("div",fo,[(0,i.bF)(p,{type:"primary",onClick:t[5]||(t[5]=e=>r.showUrlDialog=!1),class:"confirm-btn"},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("settings.confirm")),1)]),_:1})])]),_:1},8,["title","modelValue","width"]),(0,i.bF)($,{modelValue:r.showCompressDialog,"onUpdate:modelValue":t[7]||(t[7]=e=>r.showCompressDialog=e),uploadChannel:r.uploadChannel,"onUpdate:uploadChannel":t[8]||(t[8]=e=>r.uploadChannel=e),channelName:r.channelName,"onUpdate:channelName":t[9]||(t[9]=e=>r.channelName=e),currentChannelList:d.currentChannelList,uploadFolder:r.uploadFolder,"onUpdate:uploadFolder":t[10]||(t[10]=e=>r.uploadFolder=e),autoRetry:r.autoRetry,"onUpdate:autoRetry":t[11]||(t[11]=e=>r.autoRetry=e),uploadNameType:r.uploadNameType,"onUpdate:uploadNameType":t[12]||(t[12]=e=>r.uploadNameType=e),convertToWebp:r.convertToWebp,"onUpdate:convertToWebp":t[13]||(t[13]=e=>r.convertToWebp=e),customerCompress:r.customerCompress,"onUpdate:customerCompress":t[14]||(t[14]=e=>r.customerCompress=e),compressBar:r.compressBar,"onUpdate:compressBar":t[15]||(t[15]=e=>r.compressBar=e),compressQuality:r.compressQuality,"onUpdate:compressQuality":t[16]||(t[16]=e=>r.compressQuality=e),serverCompress:r.serverCompress,"onUpdate:serverCompress":t[17]||(t[17]=e=>r.serverCompress=e)},null,8,["modelValue","uploadChannel","channelName","currentChannelList","uploadFolder","autoRetry","uploadNameType","convertToWebp","customerCompress","compressBar","compressQuality","serverCompress"])]),(0,i.bF)(S,{class:"footer"}),(0,i.bF)(U,{title:e.$t("upload.announcementTitle"),modelValue:r.showAnnouncementDialog,"onUpdate:modelValue":t[19]||(t[19]=e=>r.showAnnouncementDialog=e),width:d.dialogWidth,"show-close":!1,"close-on-click-modal":!1,"close-on-press-escape":!1,center:""},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",bo,[(0,i.bF)(p,{type:"primary",onClick:t[18]||(t[18]=e=>r.showAnnouncementDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,a.v_)(e.$t("upload.announcementAck")),1)]),_:1})])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",{innerHTML:r.announcementContent},null,8,yo)]),_:1},8,["title","modelValue","width"]),(0,i.bF)(T,{show:r.showHistory,onClose:t[20]||(t[20]=e=>r.showHistory=!1)},null,8,["show"])])}o(13579);var Co=o(46638),ko=o(48903),wo=o(90144),Fo=o(62388),Lo={name:"UploadHome",mixins:[ko.A],data(){return{selectedUrlForm:(0,wo.KR)(""),showUrlDialog:!1,showCompressDialog:!1,customerCompress:!0,compressQuality:4,compressBar:5,convertToWebp:!1,serverCompress:!0,uploadChannel:"",channelName:"",availableChannels:{},uploadNameType:"",customUrlPrefix:"",useCustomUrl:"false",autoRetry:!0,useDefaultWallPaper:!1,isToolBarOpen:!1,uploadMethod:"default",uploadFolder:"",isFolderInputActive:!1,showAnnouncementDialog:!1,announcementContent:"",showHistory:!1,themeMode:"auto"}},watch:{customerCompress(e){this.updateCompressConfig("customerCompress",e)},compressQuality(e){this.updateCompressConfig("compressQuality",e)},compressBar(e){null===e||void 0===e||e<1?this.compressBar=1:(this.compressQuality>e&&(this.compressQuality=e),this.updateCompressConfig("compressBar",e))},serverCompress(e){this.updateCompressConfig("serverCompress",e)},convertToWebp(e){this.updateCompressConfig("convertToWebp",e)},uploadChannel(e){this.updateStoreUploadChannel(e);const t=this.availableChannels[e]||[],o=this.storeChannelName;o&&t.some(e=>e.name===o)?this.channelName=o:this.channelName=""},channelName(e){this.$store.commit("setStoreChannelName",e||"")},uploadNameType(e){this.updateStoreUploadNameType(e)},customUrlPrefix(e){this.$store.commit("setCustomUrlSettings",{key:"customUrlPrefix",value:e})},useCustomUrl(e){this.$store.commit("setCustomUrlSettings",{key:"useCustomUrl",value:e})},autoRetry(e){this.$store.commit("setStoreAutoRetry",e)},uploadFolder(e){if(this.validateUploadFolder(e,!1)){const t=(0,Fo.G)(e,{strict:!0});t.valid&&this.$store.commit("setStoreUploadFolder",e)}else this.$nextTick(()=>{this.uploadFolder=this.storeUploadFolder})}},computed:{...(0,$t.L8)(["userConfig","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeUploadNameType","customUrlSettings","storeAutoRetry","storeUploadMethod","storeUploadFolder"]),ownerName(){return this.userConfig?.ownerName||"Sanyue"},dialogWidth(){return window.innerWidth>768?"50%":"90%"},disableTooltip(){return window.innerWidth<768},urlPrefix(){return this.userConfig?.urlPrefix||`${window.location.protocol}//${window.location.host}/file/`},announcementAvailable(){return!!this.userConfig?.announcement},showDirectorySuggestions(){return this.userConfig?.showDirectorySuggestions??!1},currentChannelList(){return this.availableChannels[this.uploadChannel]||[]}},mounted(){this.initializeBackground("uploadBkImg",".container",!1,!0),this.selectedUrlForm=this.uploadCopyUrlForm||"url",this.customerCompress=this.compressConfig.customerCompress??this.parseBoolean(this.userConfig?.defaultCustomerCompress,!0),this.compressQuality=this.compressConfig.compressQuality??this.parseNumber(this.userConfig?.defaultCompressQuality,4),this.compressBar=this.compressConfig.compressBar??this.parseNumber(this.userConfig?.defaultCompressBar,5),this.serverCompress=this.compressConfig.serverCompress??!0,this.convertToWebp=this.compressConfig.convertToWebp??this.parseBoolean(this.userConfig?.defaultConvertToWebp,!1),this.uploadChannel=this.storeUploadChannel||this.userConfig?.defaultUploadChannel||"telegram",this.autoRetry=this.storeAutoRetry,this.uploadNameType=this.storeUploadNameType||this.userConfig?.defaultUploadNameType||"default",this.customUrlPrefix=this.customUrlSettings.customUrlPrefix,this.useCustomUrl=this.customUrlSettings.useCustomUrl,this.uploadMethod=this.storeUploadMethod,this.fetchAvailableChannels(),this.uploadFolder=this.storeUploadFolder||this.userConfig?.defaultUploadFolder||"";const e=this.$store.getters.cusDarkMode,t=this.$store.getters.useDarkMode;this.themeMode=e?t?"dark":"light":"auto";const o=localStorage.getItem("visitedUploadHome"),s=this.userConfig?.announcement;!o&&s&&(this.announcementContent=s,this.showAnnouncementDialog=!0,localStorage.setItem("visitedUploadHome","true"))},components:{UploadForm:Nt,Footer:X.A,ToggleDark:Gt.A,Logo:Pt.A,UploadHistory:H,UploadSettingsDialog:We,DirectoryTreePicker:Vt.A,DirectorySuggestionInput:qt},methods:{async fetchAvailableChannels(){try{const e=await Lt.A.get("/api/channels",{withAuthCode:!0});if(e.data){this.availableChannels=e.data;const t=this.storeChannelName,o=this.userConfig?.defaultChannelName,s=this.availableChannels[this.uploadChannel]||[];t&&s.some(e=>e.name===t)?this.channelName=t:""!==t&&null!==t&&void 0!==t||""!==t&&o&&s.some(e=>e.name===o)&&(this.channelName=o)}}catch(e){console.error("Failed to fetch available channels:",e)}},validateUploadFolder(e,t=!0){e&&!e.startsWith("/")&&(e="/"+e,this.uploadFolder=e);const o=(0,Fo.G)(e,{strict:t});return!!o.valid||(this.$message.error(o.error),!1)},handleFolderInputFocus(){this.isFolderInputActive=!0},handleFolderInputBlur(){this.isFolderInputActive=!1,this.uploadFolder&&!this.uploadFolder.startsWith("/")&&(this.uploadFolder="/"+this.uploadFolder),this.validateUploadFolder(this.uploadFolder,!0)||this.$nextTick(()=>{this.uploadFolder=this.storeUploadFolder})},handleManage(){this.$router.push("/dashboard")},parseBoolean(e,t){return void 0===e||null===e?t:"boolean"===typeof e?e:"string"===typeof e?"true"===e:t},parseNumber(e,t){if(void 0===e||null===e)return t;const o=parseFloat(e);return isNaN(o)?t:o},openUrlDialog(){this.showUrlDialog=!0},handleLogout(){Lt.A.post("/api/auth/logout",{authType:"user"},{withCredentials:!0}).finally(()=>{this.$store.commit("setUserLoggedIn",!1),this.$router.push("/login"),this.$message.success(this.$t("upload.logoutSuccess"))})},changeUrlForm(){this.$store.commit("setUploadCopyUrlForm",this.selectedUrlForm)},openCompressDialog(){this.showCompressDialog=!0},updateCompressConfig(e,t){this.$store.commit("setCompressConfig",{key:e,value:t})},updateStoreUploadChannel(e){this.$store.commit("setStoreUploadChannel",e)},updateStoreUploadNameType(e){this.$store.commit("setStoreUploadNameType",e)},handleOpenToolbar(){this.isToolBarOpen=!this.isToolBarOpen,setTimeout(()=>{const e=document.querySelectorAll(".toolbar-button");e.forEach(e=>{e.style.pointerEvents=this.isToolBarOpen?"auto":"none"})},300)},handleChangeUploadMethod(){this.uploadMethod="default"===this.uploadMethod?"paste":"default",this.$store.commit("setUploadMethod",this.uploadMethod)},handleMobileMenuCommand(e){if("toggleTheme"===e)"auto"===this.themeMode?(this.themeMode="light",this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!1)):"light"===this.themeMode?(this.themeMode="dark",this.$store.commit("setCusDarkMode",!0),this.$store.commit("setUseDarkMode",!0)):(this.themeMode="auto",this.$store.commit("setCusDarkMode",!1));else if("toggleUploadMethod"===e)this.handleChangeUploadMethod();else if("viewDocs"===e)window.open("https://cfbed.sanyue.de/qa/","_blank");else if("showHistory"===e)this.showHistory=!0;else if("showAnnouncement"===e)this.handleShowAnnouncement();else if("toggleLanguage"===e){const e="zh-CN"===this.$i18n.locale?"en":"zh-CN";(0,Co.xS)(e)}},handleDesktopMenuCommand(e){if("viewDocs"===e)window.open("https://cfbed.sanyue.de/qa/","_blank");else if("showHistory"===e)this.showHistory=!0;else if("showAnnouncement"===e)this.handleShowAnnouncement();else if("toggleLanguage"===e){const e="zh-CN"===this.$i18n.locale?"en":"zh-CN";(0,Co.xS)(e)}},getThemeIcon(){return"auto"===this.themeMode?"sun":"light"===this.themeMode?"moon":"adjust"},getThemeText(){return"auto"===this.themeMode?this.$t("theme.lightMode"):"light"===this.themeMode?this.$t("theme.darkMode"):this.$t("theme.autoMode")},handleShowAnnouncement(){const e=this.userConfig?.announcement;e?(this.announcementContent=e,this.showAnnouncementDialog=!0):this.$message.info(this.$t("upload.noAnnouncement"))},handleDirectorySelect(e){this.uploadFolder=e,this.validateUploadFolder(e,!0)&&this.$store.commit("setStoreUploadFolder",e)}}};const Uo=(0,z.A)(Lo,[["render",vo],["__scopeId","data-v-f50dcc42"]]);var $o=Uo},30694:function(e,t,o){"use strict";o(85331)},33892:function(e,t,o){"use strict";o.d(t,{A:function(){return $}});var s=o(99114),l=(o(85331),o(30694),o(49385)),i=(o(37952),o(30650)),a=(o(19104),o(31802)),n=(o(13378),o(80047)),r=(o(99648),o(56768)),d=o(45130),c=o(24232);const u={class:"directory-tree-picker"},p={class:"tree-container"},h={key:0,class:"error-state"},m={class:"error-text"},g={class:"node-label"},f={class:"tree-container"},y={key:0,class:"error-state"},b={class:"error-text"},v={class:"node-label"};function C(e,t,o,C,k,w){const F=(0,r.g2)("font-awesome-icon"),L=n.S2,U=a.qk,$=i.Vc,S=l.pw,T=s.A;return(0,r.uX)(),(0,r.CE)("div",u,[w.isDesktop?((0,r.uX)(),(0,r.Wv)($,{key:0,visible:k.popoverVisible,"onUpdate:visible":t[1]||(t[1]=e=>k.popoverVisible=e),placement:"bottom-start",width:320,trigger:"click","popper-class":"directory-tree-popover","show-arrow":!0,"hide-after":0,"show-after":50,transition:"el-zoom-in-top"},{reference:(0,r.k6)(()=>[(0,r.Lk)("span",{class:"popover-trigger-wrapper",onClick:t[0]||(t[0]=(0,d.D$)(()=>{},["stop"]))},[(0,r.RG)(e.$slots,"trigger",{},void 0,!0)])]),default:(0,r.k6)(()=>[(0,r.bo)(((0,r.uX)(),(0,r.CE)("div",p,[k.error?((0,r.uX)(),(0,r.CE)("div",h,[(0,r.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,r.Lk)("span",m,(0,c.v_)(k.error),1),(0,r.bF)(L,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,r.k6)(()=>[(0,r.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,r.uX)(),(0,r.Wv)(U,{key:1,ref:"treeRef",data:k.treeData,props:k.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":o.currentDirectory,class:"directory-tree",onNodeClick:w.handleNodeClick},{default:(0,r.k6)(({node:e,data:t})=>[(0,r.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===o.currentDirectory}])},[(0,r.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,r.Lk)("span",g,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[T,k.loading]])]),_:3},8,["visible"])):((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[(0,r.Lk)("span",{class:"drawer-trigger-wrapper",onClick:t[2]||(t[2]=(...e)=>w.openDrawer&&w.openDrawer(...e))},[(0,r.RG)(e.$slots,"trigger",{},void 0,!0)]),(0,r.bF)(S,{modelValue:k.drawerVisible,"onUpdate:modelValue":t[3]||(t[3]=e=>k.drawerVisible=e),direction:"btt",size:"60%","show-close":!0,"with-header":!0,"z-index":3e3,title:e.$t("directoryTree.selectDirectory"),class:"directory-tree-drawer"},{default:(0,r.k6)(()=>[(0,r.bo)(((0,r.uX)(),(0,r.CE)("div",f,[k.error?((0,r.uX)(),(0,r.CE)("div",y,[(0,r.bF)(F,{icon:"exclamation-circle",class:"error-icon"}),(0,r.Lk)("span",b,(0,c.v_)(k.error),1),(0,r.bF)(L,{type:"primary",size:"small",onClick:w.fetchDirectoryTree},{default:(0,r.k6)(()=>[(0,r.eW)((0,c.v_)(e.$t("directoryTree.retry")),1)]),_:1},8,["onClick"])])):((0,r.uX)(),(0,r.Wv)(U,{key:1,ref:"treeRefMobile",data:k.treeData,props:k.treeProps,"node-key":"path","default-expand-all":!1,"expand-on-click-node":!1,"highlight-current":!0,"current-node-key":o.currentDirectory,class:"directory-tree mobile-tree",onNodeClick:w.handleNodeClick},{default:(0,r.k6)(({node:e,data:t})=>[(0,r.Lk)("span",{class:(0,c.C4)(["tree-node",{"is-current":t.path===o.currentDirectory}])},[(0,r.bF)(F,{icon:e.expanded?"folder-open":"folder",class:"folder-icon"},null,8,["icon"]),(0,r.Lk)("span",v,(0,c.v_)(t.name),1)],2)]),_:1},8,["data","props","current-node-key","onNodeClick"]))])),[[T,k.loading]])]),_:1},8,["modelValue","title"])],64))])}var k=o(457),w=o(70797),F={name:"DirectoryTreePicker",props:{currentDirectory:{type:String,default:""},source:{type:String,default:"upload",validator:e=>["upload","admin"].includes(e)}},data(){return{popoverVisible:!1,drawerVisible:!1,treeData:[],loading:!1,error:"",treeProps:{children:"children",label:"name"},windowWidth:window.innerWidth}},computed:{isDesktop(){return this.windowWidth>=769}},watch:{popoverVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.popoverVisible&&this.$refs.treeRef){const e=this.$refs.treeRef.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},200)},drawerVisible(e){e?this.fetchDirectoryTree():setTimeout(()=>{if(!this.drawerVisible&&this.$refs.treeRefMobile){const e=this.$refs.treeRefMobile.store;for(const t in e.nodesMap)e.nodesMap[t].expanded=!1}},300)},currentDirectory(e){this.$nextTick(()=>{this.$refs.treeRef&&e&&this.$refs.treeRef.setCurrentKey(e),this.$refs.treeRefMobile&&e&&this.$refs.treeRefMobile.setCurrentKey(e)})}},mounted(){window.addEventListener("resize",this.handleResize)},beforeUnmount(){window.removeEventListener("resize",this.handleResize)},methods:{handleResize(){this.windowWidth=window.innerWidth},openDrawer(){this.drawerVisible=!0},async fetchDirectoryTree(){this.loading=!0,this.error="";try{let e;if("admin"===this.source){const t=await(0,w.A)("/api/directoryTree",{method:"GET"});if(!t.ok)return void(401===t.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.serverError"));e=await t.json()}else{const t=await k.A.get("/api/directoryTree",{withAuthCode:!0});e=t.data}e.tree?this.treeData=[e.tree]:this.treeData=[]}catch(e){console.error("Failed to fetch directory tree:",e),401===e.response?.status?this.error=this.$t("directoryTree.authFailed"):this.error=this.$t("directoryTree.loadFailed")}finally{this.loading=!1}},handleNodeClick(e){let t=e.path;t&&!t.startsWith("/")?t="/"+t:t||(t="/"),this.$emit("select",t),this.popoverVisible=!1,this.drawerVisible=!1}}},L=o(71241);const U=(0,L.A)(F,[["render",C],["__scopeId","data-v-62eab69a"]]);var $=U},34396:function(e,t,o){"use strict";o(85331),o(4885)},37952:function(e,t,o){"use strict";o(85331),o(97197)},38736:function(e,t,o){"use strict";o(85331)},40670:function(e,t,o){"use strict";o(85331),o(99648),o(19104),o(85970)},50333:function(e,t,o){"use strict";o(85331),o(29092)},62388:function(e,t,o){"use strict";o.d(t,{G:function(){return l}});var s=o(46638);function l(e,{strict:t=!0}={}){if(!e||""===e.trim())return{valid:!0};if("/"===e)return{valid:!0};if(!e.startsWith("/"))return{valid:!1,error:s.Ay.global.t("validation.pathMustStartWithSlash")};if(/(?:^|\/)\.\.(\/|$)/.test(e)||e.includes(".."))return{valid:!1,error:s.Ay.global.t("validation.pathTraversalNotAllowed")};const o=t?/\/\.(\/|$)/:/\/\.\//;if(o.test(e))return{valid:!1,error:s.Ay.global.t("validation.singleDotNotAllowed")};if(e.includes("//"))return{valid:!1,error:s.Ay.global.t("validation.consecutiveSlashNotAllowed")};const l=/[\\:\*\?"'<>\| \(\)\[\]\{\}#%\^`~;@&=\+\$,]/;return l.test(e)?{valid:!1,error:s.Ay.global.t("validation.invalidCharacters")}:{valid:!0}}},67819:function(e,t,o){"use strict";o(85331)},70797:function(e,t,o){"use strict";o.d(t,{A:function(){return a}});o(44114);var s=o(25507),l=o(16915);let i=!1;async function a(e,t={}){t.credentials="include",t.headers={...t.headers};const o=await fetch(e,t);return 401!==o.status||i||(i=!0,s.A.commit("setAdminLoggedIn",!1),l.A.push("/adminLogin").finally(()=>{i=!1})),o}},76334:function(e,t,o){e.exports=o(11393)},79899:function(e,t,o){"use strict";o(85331)},85970:function(e,t,o){"use strict";o(85331)},88830:function(e,t,o){"use strict";o(85331)},95385:function(e,t,o){"use strict";o(85331)},96682:function(e,t,o){"use strict";e.exports=o.p+"img/404.8ed11fb3.png"},96808:function(e,t,o){"use strict";o(85331),o(18785),o(67819),o(85970),o(19104)}}]); +//# sourceMappingURL=731.90070be6.js.map \ No newline at end of file diff --git a/frontend-dist/js/731.90070be6.js.gz b/frontend-dist/js/731.90070be6.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..6240bf56fb79f97a4b008790410f1d842e324808 GIT binary patch literal 24756 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 literal 0 HcmV?d00001 diff --git a/frontend-dist/js/731.90070be6.js.map b/frontend-dist/js/731.90070be6.js.map new file mode 100644 index 00000000..84c10886 --- /dev/null +++ b/frontend-dist/js/731.90070be6.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/731.90070be6.js","mappings":"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","sources":["webpack://sanyue_imghub/./node_modules/image-conversion/build/conversion.js","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue?61df","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue","webpack://sanyue_imghub/./src/components/upload/UploadHistory.vue?d5f5","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue?f394","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue","webpack://sanyue_imghub/./src/components/upload/UploadSettingsDialog.vue?adb2","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue?d2e4","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue","webpack://sanyue_imghub/./src/components/upload/UploadFileItem.vue?420c","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue?f120","webpack://sanyue_imghub/./src/utils/upload/urlBuilder.js","webpack://sanyue_imghub/./src/utils/upload/sha256.js","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue","webpack://sanyue_imghub/./src/components/upload/UploadForm.vue?bdbd","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue?be1c","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue","webpack://sanyue_imghub/./src/components/DirectorySuggestionInput.vue?69c3","webpack://sanyue_imghub/./src/views/UploadHome.vue?728c","webpack://sanyue_imghub/./src/views/UploadHome.vue","webpack://sanyue_imghub/./src/views/UploadHome.vue?af00","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?9e0f","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue","webpack://sanyue_imghub/./src/components/DirectoryTreePicker.vue?6984","webpack://sanyue_imghub/./src/utils/pathValidator.js","webpack://sanyue_imghub/./src/utils/fetchWithAuth.js","webpack://sanyue_imghub/./node_modules/image-conversion/index.js"],"sourcesContent":["!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.imageConversion=e():t.imageConversion=e()}(this,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,\"a\",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p=\"\",n(n.s=0)}([function(t,e,n){\"use strict\";var r;function o(t){return[\"image/png\",\"image/jpeg\",\"image/gif\"].some(e=>e===t)}n.r(e),n.d(e,\"canvastoDataURL\",(function(){return a})),n.d(e,\"canvastoFile\",(function(){return c})),n.d(e,\"dataURLtoFile\",(function(){return s})),n.d(e,\"dataURLtoImage\",(function(){return l})),n.d(e,\"downloadFile\",(function(){return d})),n.d(e,\"filetoDataURL\",(function(){return f})),n.d(e,\"imagetoCanvas\",(function(){return g})),n.d(e,\"urltoBlob\",(function(){return w})),n.d(e,\"urltoImage\",(function(){return m})),n.d(e,\"compress\",(function(){return p})),n.d(e,\"compressAccurately\",(function(){return b})),n.d(e,\"EImageType\",(function(){return r})),function(t){t.PNG=\"image/png\",t.JPEG=\"image/jpeg\",t.GIF=\"image/gif\"}(r||(r={}));var i=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function a(t,e=.92,n=r.JPEG){return i(this,void 0,void 0,(function*(){return o(n)||(n=r.JPEG),t.toDataURL(n,e)}))}function c(t,e=.92,n=r.JPEG){return new Promise(r=>t.toBlob(t=>r(t),n,e))}var u=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function s(t,e){return u(this,void 0,void 0,(function*(){const n=t.split(\",\");let r=n[0].match(/:(.*?);/)[1];const i=atob(n[1]);let a=i.length;const c=new Uint8Array(a);for(;a--;)c[a]=i.charCodeAt(a);return o(e)&&(r=e),new Blob([c],{type:r})}))}function l(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(\"dataURLtoImage(): dataURL is illegal\")),r.src=t})}function d(t,e){const n=document.createElement(\"a\");n.href=window.URL.createObjectURL(t),n.download=e||Date.now().toString(36),document.body.appendChild(n);const r=document.createEvent(\"MouseEvents\");r.initEvent(\"click\",!1,!1),n.dispatchEvent(r),document.body.removeChild(n)}function f(t){return new Promise(e=>{const n=new FileReader;n.onloadend=t=>e(t.target.result),n.readAsDataURL(t)})}var h=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function g(t,e={}){return h(this,void 0,void 0,(function*(){const n=Object.assign({},e),r=document.createElement(\"canvas\"),o=r.getContext(\"2d\");let i,a;for(const t in n)Object.prototype.hasOwnProperty.call(n,t)&&(n[t]=Number(n[t]));if(n.scale){const e=n.scale>0&&n.scale<10?n.scale:1;a=t.width*e,i=t.height*e}else a=n.width||n.height*t.width/t.height||t.width,i=n.height||n.width*t.height/t.width||t.height;switch([5,6,7,8].some(t=>t===n.orientation)?(r.height=a,r.width=i):(r.height=i,r.width=a),n.orientation){case 3:o.rotate(180*Math.PI/180),o.drawImage(t,-r.width,-r.height,r.width,r.height);break;case 6:o.rotate(90*Math.PI/180),o.drawImage(t,0,-r.width,r.height,r.width);break;case 8:o.rotate(270*Math.PI/180),o.drawImage(t,-r.height,0,r.height,r.width);break;case 2:o.translate(r.width,0),o.scale(-1,1),o.drawImage(t,0,0,r.width,r.height);break;case 4:o.translate(r.width,0),o.scale(-1,1),o.rotate(180*Math.PI/180),o.drawImage(t,-r.width,-r.height,r.width,r.height);break;case 5:o.translate(r.width,0),o.scale(-1,1),o.rotate(90*Math.PI/180),o.drawImage(t,0,-r.width,r.height,r.width);break;case 7:o.translate(r.width,0),o.scale(-1,1),o.rotate(270*Math.PI/180),o.drawImage(t,-r.height,0,r.height,r.width);break;default:o.drawImage(t,0,0,r.width,r.height)}return r}))}function w(t){return fetch(t).then(t=>t.blob())}function m(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(\"urltoImage(): Image failed to load, please check the image URL\")),r.src=t})}var y=function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(t){i(t)}}function c(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))};function p(t,e={}){return y(this,void 0,void 0,(function*(){if(!(t instanceof Blob))throw new Error(\"compress(): First arg must be a Blob object or a File object.\");if(\"object\"!=typeof e&&(e=Object.assign({quality:e})),e.quality=Number(e.quality),Number.isNaN(e.quality))return t;const n=yield f(t);let i=n.split(\",\")[0].match(/:(.*?);/)[1],c=r.JPEG;o(e.type)&&(c=e.type,i=e.type);const u=yield l(n),d=yield g(u,Object.assign({},e)),h=yield a(d,e.quality,c),w=yield s(h,i);return w.size>t.size?t:w}))}function b(t,e={}){return y(this,void 0,void 0,(function*(){if(!(t instanceof Blob))throw new Error(\"compressAccurately(): First arg must be a Blob object or a File object.\");if(\"object\"!=typeof e&&(e=Object.assign({size:e})),e.size=Number(e.size),Number.isNaN(e.size))return t;if(1024*e.size>t.size)return t;e.accuracy=Number(e.accuracy),(!e.accuracy||e.accuracy<.8||e.accuracy>.99)&&(e.accuracy=.95);const n=e.size*(2-e.accuracy)*1024,i=1024*e.size,c=e.size*e.accuracy*1024,u=yield f(t);let d=u.split(\",\")[0].match(/:(.*?);/)[1],h=r.JPEG;o(e.type)&&(h=e.type,d=e.type);const w=yield l(u),m=yield g(w,Object.assign({},e));let y,p=.5;const b=[null,null];for(let t=1;t<=7;t++){y=yield a(m,p,h);const e=.75*y.length;if(7===t){(ne)&&(y=[y,...b].filter(t=>t).sort((t,e)=>Math.abs(.75*t.length-i)-Math.abs(.75*e.length-i))[0]);break}if(ne))break;b[0]=y,p+=Math.pow(.5,t+1)}}const v=yield s(y,d);return v.size>t.size?t:v}))}}])}));","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass } from \"vue\";\nconst _hoisted_1 = {\n class: \"history-header\"\n};\nconst _hoisted_2 = {\n class: \"header-left\"\n};\nconst _hoisted_3 = {\n class: \"record-count\"\n};\nconst _hoisted_4 = {\n class: \"header-right\"\n};\nconst _hoisted_5 = {\n class: \"timeline-header\"\n};\nconst _hoisted_6 = {\n class: \"date-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"grid-view\"\n};\nconst _hoisted_8 = {\n class: \"grid-preview\"\n};\nconst _hoisted_9 = [\"src\"];\nconst _hoisted_10 = [\"src\"];\nconst _hoisted_11 = {\n key: 2,\n class: \"file-icon-wrapper\"\n};\nconst _hoisted_12 = {\n class: \"grid-overlay\"\n};\nconst _hoisted_13 = {\n class: \"grid-actions\"\n};\nconst _hoisted_14 = {\n class: \"grid-info\"\n};\nconst _hoisted_15 = [\"title\"];\nconst _hoisted_16 = {\n class: \"upload-time\"\n};\nconst _hoisted_17 = {\n key: 1,\n class: \"list-view\"\n};\nconst _hoisted_18 = {\n class: \"list-preview\"\n};\nconst _hoisted_19 = [\"src\"];\nconst _hoisted_20 = [\"src\"];\nconst _hoisted_21 = {\n key: 2,\n class: \"file-icon-wrapper-small\"\n};\nconst _hoisted_22 = {\n class: \"list-info\"\n};\nconst _hoisted_23 = [\"title\"];\nconst _hoisted_24 = [\"title\"];\nconst _hoisted_25 = {\n class: \"list-meta\"\n};\nconst _hoisted_26 = {\n class: \"upload-time\"\n};\nconst _hoisted_27 = {\n class: \"list-actions\"\n};\nconst _hoisted_28 = {\n key: 0,\n class: \"load-more-container\"\n};\nconst _hoisted_29 = {\n key: 0,\n class: \"loading-indicator\"\n};\nconst _hoisted_30 = {\n key: 1,\n class: \"load-more-hint\"\n};\nconst _hoisted_31 = {\n key: 1,\n class: \"no-more-hint\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"empty-state\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n return _openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass([\"history-container\", {\n 'active': $props.show\n }])\n }, [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h2\", null, _toDisplayString(_ctx.$t('uploadHistory.title')), 1), _createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadHistory.totalRecords', {\n count: $data.totalCount\n })), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.switchView'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n onClick: $options.toggleViewMode\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.viewMode === 'grid' ? 'list' : 'th-large'\n }, null, 8, [\"icon\"])]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadHistory.clearRecords'),\n placement: \"bottom\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n circle: \"\",\n type: \"danger\",\n onClick: $options.clearHistory\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_button, {\n circle: \"\",\n onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('close'))\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n })]),\n _: 1\n })])]), $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"history-content\",\n ref: \"historyContent\",\n onScroll: _cache[3] || (_cache[3] = (...args) => $options.handleScroll && $options.handleScroll(...args))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.groupedHistory, group => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: group.date,\n class: \"history-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_cache[4] || (_cache[4] = _createElementVNode(\"div\", {\n class: \"timeline-dot\"\n }, null, -1)), _createElementVNode(\"span\", _hoisted_6, _toDisplayString(group.date), 1)]), $data.viewMode === 'grid' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"grid-item\"\n }, [_createElementVNode(\"div\", _hoisted_8, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[1] || (_cache[1] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_9)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_10)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_11, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })])), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"default\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_15), _createElementVNode(\"div\", _hoisted_16, _toDisplayString($options.formatTime(item.time)), 1)])]);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_17, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(group.items, item => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: item.time,\n class: \"list-item\"\n }, [_createElementVNode(\"div\", _hoisted_18, [$options.isImage(item.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: item.url,\n loading: \"lazy\",\n onError: _cache[2] || (_cache[2] = (...args) => $options.handleImageError && $options.handleImageError(...args))\n }, null, 40, _hoisted_19)) : $options.isVideo(item.name) ? (_openBlock(), _createElementBlock(\"video\", {\n key: 1,\n src: item.url,\n muted: \"\"\n }, null, 8, _hoisted_20)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_21, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\"\n })]))]), _createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"div\", {\n class: \"file-name\",\n title: item.name\n }, _toDisplayString(item.name), 9, _hoisted_23), _createElementVNode(\"div\", {\n class: \"file-url\",\n title: item.url\n }, _toDisplayString(item.url), 9, _hoisted_24)]), _createElementVNode(\"div\", _hoisted_25, [_createElementVNode(\"div\", _hoisted_26, _toDisplayString($options.formatTime(item.time)), 1)]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"primary\",\n onClick: $event => $options.copyLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n class: \"action-btn-view\",\n onClick: $event => $options.openLink(item.url)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"external-link-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n circle: \"\",\n size: \"small\",\n type: \"danger\",\n onClick: $event => $options.deleteItem(item)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })]),\n _: 1\n }, 8, [\"onClick\"])])]);\n }), 128))]))]);\n }), 128)), $options.hasMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_28, [$data.loadingMore ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createVNode(_component_font_awesome_icon, {\n icon: \"spinner\",\n spin: \"\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadHistory.loading')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_30, _toDisplayString(_ctx.$t('uploadHistory.pullToLoadMore')), 1))])) : $data.historyList.length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_31, _toDisplayString(_ctx.$t('uploadHistory.noMoreRecords')), 1)) : _createCommentVNode(\"\", true)], 544)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n class: \"empty-icon\"\n }), _createElementVNode(\"p\", null, _toDisplayString(_ctx.$t('uploadHistory.emptyHistory')), 1)]))], 2);\n}","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.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 \"core-js/modules/esnext.json.parse.js\";\nexport default {\n name: 'UploadHistory',\n props: {\n show: {\n type: Boolean,\n default: false\n }\n },\n data() {\n return {\n historyList: [],\n allHistory: [],\n // 完整历史记录\n viewMode: 'grid',\n // 'grid' or 'list'\n pageSize: 30,\n // 每次加载数量\n currentPage: 0,\n loadingMore: false,\n totalCount: 0\n };\n },\n watch: {\n show(val) {\n if (val) {\n this.resetAndLoad();\n }\n }\n },\n computed: {\n hasMore() {\n return this.historyList.length < this.totalCount;\n },\n groupedHistory() {\n const groups = {};\n this.historyList.forEach(item => {\n const date = new Date(item.time);\n const dateStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;\n if (!groups[dateStr]) {\n groups[dateStr] = [];\n }\n groups[dateStr].push(item);\n });\n\n // Sort dates descending\n return Object.keys(groups).sort((a, b) => new Date(b) - new Date(a)).map(date => ({\n date,\n items: groups[date]\n }));\n }\n },\n mounted() {\n // Load view mode preference\n const savedMode = localStorage.getItem('historyViewMode');\n if (savedMode) {\n this.viewMode = savedMode;\n }\n },\n methods: {\n resetAndLoad() {\n this.historyList = [];\n this.currentPage = 0;\n this.loadAllHistory();\n this.loadMore();\n },\n loadAllHistory() {\n try {\n const history = JSON.parse(localStorage.getItem('uploadHistory') || '[]');\n // Sort by time desc\n this.allHistory = history.sort((a, b) => b.time - a.time);\n this.totalCount = this.allHistory.length;\n } catch (e) {\n console.error('Failed to load history', e);\n this.allHistory = [];\n this.totalCount = 0;\n }\n },\n loadMore() {\n if (this.loadingMore || !this.hasMore) return;\n this.loadingMore = true;\n\n // 模拟异步加载,避免阻塞UI\n setTimeout(() => {\n const start = this.currentPage * this.pageSize;\n const end = start + this.pageSize;\n const newItems = this.allHistory.slice(start, end);\n this.historyList = [...this.historyList, ...newItems];\n this.currentPage++;\n this.loadingMore = false;\n }, 50);\n },\n handleScroll(e) {\n const container = e.target;\n const scrollTop = container.scrollTop;\n const scrollHeight = container.scrollHeight;\n const clientHeight = container.clientHeight;\n\n // 距离底部 100px 时加载更多\n if (scrollHeight - scrollTop - clientHeight < 100) {\n this.loadMore();\n }\n },\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n localStorage.setItem('historyViewMode', this.viewMode);\n },\n clearHistory() {\n this.$confirm(this.$t('uploadHistory.clearConfirmMessage'), this.$t('uploadHistory.clearConfirmTitle'), {\n confirmButtonText: this.$t('uploadHistory.clearConfirmOk'),\n cancelButtonText: this.$t('uploadHistory.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n this.historyList = [];\n this.allHistory = [];\n this.totalCount = 0;\n this.currentPage = 0;\n localStorage.removeItem('uploadHistory');\n this.$message.success(this.$t('uploadHistory.recordsCleared'));\n }).catch(() => {});\n },\n deleteItem(item) {\n this.$confirm(this.$t('uploadHistory.deleteConfirmMessage'), this.$t('uploadHistory.clearConfirmTitle'), {\n confirmButtonText: this.$t('uploadHistory.clearConfirmOk'),\n cancelButtonText: this.$t('uploadHistory.clearConfirmCancel'),\n type: 'warning'\n }).then(() => {\n // Remove from lists\n this.historyList = this.historyList.filter(i => i.time !== item.time);\n this.allHistory = this.allHistory.filter(i => i.time !== item.time);\n this.totalCount = this.allHistory.length;\n\n // Update localStorage\n try {\n localStorage.setItem('uploadHistory', JSON.stringify(this.allHistory));\n this.$message.success(this.$t('uploadHistory.recordDeleted'));\n } catch (e) {\n console.error('Failed to update history', e);\n }\n }).catch(() => {});\n },\n isImage(fileName) {\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff', 'ico', 'avif', 'heic', 'jfif', 'pjpeg', 'pjp'];\n const extension = fileName ? fileName.split('.').pop().toLowerCase() : '';\n return imageExtensions.includes(extension);\n },\n isVideo(fileName) {\n const videoExtensions = ['mp4', 'webm', 'ogg', 'mkv'];\n const extension = fileName ? fileName.split('.').pop().toLowerCase() : '';\n return videoExtensions.includes(extension);\n },\n formatTime(timestamp) {\n const date = new Date(timestamp);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n },\n copyLink(url) {\n navigator.clipboard.writeText(url).then(() => {\n this.$message.success(this.$t('uploadHistory.linkCopied'));\n }).catch(() => {\n this.$message.error(this.$t('uploadHistory.copyFailed'));\n });\n },\n openLink(url) {\n window.open(url, '_blank');\n },\n handleImageError(e) {\n e.target.src = require('@/assets/404.png');\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadHistory.vue?vue&type=template&id=550797ce&scoped=true\"\nimport script from \"./UploadHistory.vue?vue&type=script&lang=js\"\nexport * from \"./UploadHistory.vue?vue&type=script&lang=js\"\n\nimport \"./UploadHistory.vue?vue&type=style&index=0&id=550797ce&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-550797ce\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode } from \"vue\";\nconst _hoisted_1 = {\n class: \"dialog-section\"\n};\nconst _hoisted_2 = {\n class: \"section-header\"\n};\nconst _hoisted_3 = {\n class: \"section-title\"\n};\nconst _hoisted_4 = {\n class: \"section-content\"\n};\nconst _hoisted_5 = {\n class: \"setting-item\"\n};\nconst _hoisted_6 = {\n class: \"setting-label\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_8 = {\n class: \"setting-label\"\n};\nconst _hoisted_9 = {\n class: \"setting-item\"\n};\nconst _hoisted_10 = {\n class: \"setting-label\"\n};\nconst _hoisted_11 = {\n class: \"setting-item\"\n};\nconst _hoisted_12 = {\n class: \"setting-label\"\n};\nconst _hoisted_13 = {\n class: \"dialog-section\"\n};\nconst _hoisted_14 = {\n class: \"section-header\"\n};\nconst _hoisted_15 = {\n class: \"section-title\"\n};\nconst _hoisted_16 = {\n class: \"section-content\"\n};\nconst _hoisted_17 = {\n class: \"dialog-section\"\n};\nconst _hoisted_18 = {\n class: \"section-header\"\n};\nconst _hoisted_19 = {\n class: \"section-title\"\n};\nconst _hoisted_20 = {\n class: \"section-content\"\n};\nconst _hoisted_21 = {\n class: \"setting-item\"\n};\nconst _hoisted_22 = {\n class: \"setting-label\"\n};\nconst _hoisted_23 = {\n class: \"setting-item\"\n};\nconst _hoisted_24 = {\n class: \"setting-label\"\n};\nconst _hoisted_25 = {\n key: 0,\n class: \"setting-item slider-item\"\n};\nconst _hoisted_26 = {\n class: \"setting-label\"\n};\nconst _hoisted_27 = {\n class: \"slider-wrapper\"\n};\nconst _hoisted_28 = {\n class: \"slider-input-wrapper\"\n};\nconst _hoisted_29 = {\n key: 1,\n class: \"setting-item slider-item\"\n};\nconst _hoisted_30 = {\n class: \"setting-label\"\n};\nconst _hoisted_31 = {\n class: \"slider-wrapper\"\n};\nconst _hoisted_32 = {\n class: \"slider-input-wrapper\"\n};\nconst _hoisted_33 = {\n key: 0,\n class: \"dialog-section\"\n};\nconst _hoisted_34 = {\n class: \"section-header\"\n};\nconst _hoisted_35 = {\n class: \"section-title\"\n};\nconst _hoisted_36 = {\n class: \"section-content\"\n};\nconst _hoisted_37 = {\n class: \"setting-item\"\n};\nconst _hoisted_38 = {\n class: \"setting-label\"\n};\nconst _hoisted_39 = {\n class: \"dialog-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_radio = _resolveComponent(\"el-radio\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\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_input = _resolveComponent(\"el-input\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_slider = _resolveComponent(\"el-slider\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n return _openBlock(), _createBlock(_component_el_dialog, {\n title: _ctx.$t('uploadSettings.title'),\n modelValue: $options.visible,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $options.visible = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"span\", _hoisted_3, _toDisplayString(_ctx.$t('uploadSettings.uploadChannel')), 1)]), _createElementVNode(\"div\", _hoisted_4, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"span\", _hoisted_6, _toDisplayString(_ctx.$t('uploadSettings.channelType')), 1), _createVNode(_component_el_radio_group, {\n \"model-value\": $props.uploadChannel,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => _ctx.$emit('update:uploadChannel', $event)),\n class: \"radio-card-group compact\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"telegram\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"paper-plane\",\n class: \"channel-icon\"\n }), _cache[13] || (_cache[13] = _createElementVNode(\"span\", null, \"TG\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"cfr2\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud\",\n class: \"channel-icon\"\n }), _cache[14] || (_cache[14] = _createElementVNode(\"span\", null, \"R2\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"s3\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"channel-icon\"\n }), _cache[15] || (_cache[15] = _createElementVNode(\"span\", null, \"S3\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"discord\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"channel-icon\"\n }), _cache[16] || (_cache[16] = _createElementVNode(\"span\", null, \"DC\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"huggingface\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"channel-icon\"\n }), _cache[17] || (_cache[17] = _createElementVNode(\"span\", null, \"HF\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"webdav\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"folder\",\n class: \"channel-icon\"\n }), _cache[18] || (_cache[18] = _createElementVNode(\"span\", null, \"WD\", -1))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model-value\"])]), $props.currentChannelList.length > 1 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.channelName')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.channelNameTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_select, {\n \"model-value\": $props.channelName,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => _ctx.$emit('update:channelName', $event)),\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\",\n class: \"setting-input\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"model-value\", \"placeholder\"])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.$t('uploadSettings.uploadDirectory')), 1), _createVNode(_component_el_input, {\n \"model-value\": $props.uploadFolder,\n \"onUpdate:modelValue\": $options.handleUploadFolderInput,\n placeholder: _ctx.$t('uploadSettings.uploadDirectoryPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"model-value\", \"onUpdate:modelValue\", \"placeholder\"])]), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"span\", _hoisted_12, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.autoSwitch')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.autoSwitchTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_switch, {\n \"model-value\": $props.autoRetry,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => _ctx.$emit('update:autoRetry', $event))\n }, null, 8, [\"model-value\"])])])]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"span\", _hoisted_15, _toDisplayString(_ctx.$t('uploadSettings.fileNaming')), 1)]), _createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_radio_group, {\n \"model-value\": $props.uploadNameType,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => _ctx.$emit('update:uploadNameType', $event)),\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n label: \"default\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cog\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingDefault')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"index\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingIndex')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"origin\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"file-signature\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingOrigin')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n label: \"short\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"compress-alt\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadSettings.namingShort')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model-value\"])])]), _createElementVNode(\"div\", _hoisted_17, [_createElementVNode(\"div\", _hoisted_18, [_createElementVNode(\"span\", _hoisted_19, _toDisplayString(_ctx.$t('uploadSettings.filePreprocess')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.filePreprocessTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createElementVNode(\"span\", _hoisted_22, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.convertToWebp')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.convertToWebpTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createVNode(_component_el_switch, {\n \"model-value\": $props.convertToWebp,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => _ctx.$emit('update:convertToWebp', $event))\n }, null, 8, [\"model-value\"])]), _createElementVNode(\"div\", _hoisted_23, [_createElementVNode(\"span\", _hoisted_24, _toDisplayString(_ctx.$t('uploadSettings.fileCompress')), 1), _createVNode(_component_el_switch, {\n \"model-value\": $props.customerCompress,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => _ctx.$emit('update:customerCompress', $event))\n }, null, 8, [\"model-value\"])]), $props.customerCompress ? (_openBlock(), _createElementBlock(\"div\", _hoisted_25, [_createElementVNode(\"span\", _hoisted_26, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.compressThreshold')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.compressThresholdTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_27, [_createVNode(_component_el_slider, {\n \"model-value\": $props.compressBar,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => _ctx.$emit('update:compressBar', $event)),\n min: 1,\n max: 20,\n \"format-tooltip\": value => `${value} MB`\n }, null, 8, [\"model-value\", \"format-tooltip\"]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_el_input_number, {\n \"model-value\": $props.compressBar,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => _ctx.$emit('update:compressBar', $event)),\n min: 1,\n max: 20,\n step: 1,\n \"value-on-clear\": 1,\n class: \"slider-input\",\n \"controls-position\": \"right\"\n }, null, 8, [\"model-value\"]), _cache[19] || (_cache[19] = _createElementVNode(\"span\", {\n class: \"slider-unit\"\n }, \"MB\", -1))])])])) : _createCommentVNode(\"\", true), $props.customerCompress ? (_openBlock(), _createElementBlock(\"div\", _hoisted_29, [_createElementVNode(\"span\", _hoisted_30, [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.expectedSize')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.expectedSizeTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"inline-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_31, [_createVNode(_component_el_slider, {\n \"model-value\": $props.compressQuality,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => _ctx.$emit('update:compressQuality', $event)),\n min: 0.5,\n max: $props.compressBar,\n step: 0.1,\n \"format-tooltip\": value => `${value} MB`\n }, null, 8, [\"model-value\", \"max\", \"format-tooltip\"]), _createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_el_input_number, {\n \"model-value\": $props.compressQuality,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => _ctx.$emit('update:compressQuality', $event)),\n min: 0.5,\n max: $props.compressBar,\n step: 0.1,\n precision: 1,\n \"value-on-clear\": 0.5,\n class: \"slider-input\",\n \"controls-position\": \"right\"\n }, null, 8, [\"model-value\", \"max\"]), _cache[20] || (_cache[20] = _createElementVNode(\"span\", {\n class: \"slider-unit\"\n }, \"MB\", -1))])])])) : _createCommentVNode(\"\", true)])]), $props.uploadChannel === 'telegram' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_33, [_createElementVNode(\"div\", _hoisted_34, [_createElementVNode(\"span\", _hoisted_35, _toDisplayString(_ctx.$t('uploadSettings.serverCompress')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('uploadSettings.serverCompressTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_36, [_createElementVNode(\"div\", _hoisted_37, [_createElementVNode(\"span\", _hoisted_38, _toDisplayString(_ctx.$t('uploadSettings.enableCompress')), 1), _createVNode(_component_el_switch, {\n \"model-value\": $props.serverCompress,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => _ctx.$emit('update:serverCompress', $event))\n }, null, 8, [\"model-value\"])])])])) : _createCommentVNode(\"\", true), _createElementVNode(\"div\", _hoisted_39, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[11] || (_cache[11] = $event => $options.visible = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('uploadSettings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]);\n}","export default {\n name: 'UploadSettingsDialog',\n methods: {\n handleUploadFolderInput(val) {\n // 自动补全前导 /\n if (val && !val.startsWith('/')) {\n val = '/' + val;\n }\n this.$emit('update:uploadFolder', val);\n }\n },\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n uploadChannel: {\n type: String,\n default: 'telegram'\n },\n channelName: {\n type: String,\n default: ''\n },\n currentChannelList: {\n type: Array,\n default: () => []\n },\n uploadFolder: {\n type: String,\n default: ''\n },\n autoRetry: {\n type: Boolean,\n default: true\n },\n uploadNameType: {\n type: String,\n default: 'default'\n },\n convertToWebp: {\n type: Boolean,\n default: false\n },\n customerCompress: {\n type: Boolean,\n default: true\n },\n compressBar: {\n type: Number,\n default: 5\n },\n compressQuality: {\n type: Number,\n default: 4\n },\n serverCompress: {\n type: Boolean,\n default: true\n }\n },\n emits: ['update:modelValue', 'update:uploadChannel', 'update:channelName', 'update:uploadFolder', 'update:autoRetry', 'update:uploadNameType', 'update:convertToWebp', 'update:customerCompress', 'update:compressBar', 'update:compressQuality', 'update:serverCompress'],\n computed: {\n visible: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadSettingsDialog.vue?vue&type=template&id=23f532c8\"\nimport script from \"./UploadSettingsDialog.vue?vue&type=script&lang=js\"\nexport * from \"./UploadSettingsDialog.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-list-item\"\n};\nconst _hoisted_2 = [\"href\"];\nconst _hoisted_3 = {\n key: 0,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n },\n autoplay: \"\",\n muted: \"\",\n playsinline: \"\",\n loop: \"\"\n};\nconst _hoisted_4 = [\"src\"];\nconst _hoisted_5 = [\"src\"];\nconst _hoisted_6 = {\n key: 2,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n }\n};\nconst _hoisted_7 = {\n class: \"upload-list-item-content\"\n};\nconst _hoisted_8 = {\n class: \"upload-list-item-name-wrapper\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"upload-list-item-url\"\n};\nconst _hoisted_10 = {\n class: \"upload-list-item-url-row\"\n};\nconst _hoisted_11 = {\n class: \"upload-list-item-url-row\"\n};\nconst _hoisted_12 = {\n key: 1,\n class: \"upload-list-item-progress\"\n};\nconst _hoisted_13 = {\n class: \"upload-list-item-action\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_text = _resolveComponent(\"el-text\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_Link = _resolveComponent(\"Link\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_Delete = _resolveComponent(\"Delete\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"a\", {\n href: $props.file.url,\n target: \"_blank\",\n class: \"upload-list-item-preview\"\n }, [$options.isVideo($props.file.name) ? (_openBlock(), _createElementBlock(\"video\", _hoisted_3, [_createElementVNode(\"source\", {\n src: $props.file.url,\n type: \"video/mp4\"\n }, null, 8, _hoisted_4), _cache[7] || (_cache[7] = _createTextVNode(\" Your browser does not support the video tag. \", -1))])) : $options.isImage($props.file.name) ? (_openBlock(), _createElementBlock(\"img\", {\n key: 1,\n style: {\n \"width\": \"10vw\",\n \"border-radius\": \"12px\"\n },\n src: $props.file.url,\n onError: _cache[0] || (_cache[0] = $event => _ctx.$emit('preview-error', $props.file))\n }, null, 40, _hoisted_5)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: \"file\",\n class: \"file-icon\"\n })]))], 8, _hoisted_2), _createElementVNode(\"div\", _hoisted_7, [_createElementVNode(\"div\", _hoisted_8, [_createVNode(_component_el_text, {\n class: \"upload-list-item-name\",\n truncated: \"\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.truncateFilename($props.file.name)), 1)]),\n _: 1\n })]), $props.file.status === 'done' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [_createElementVNode(\"div\", _hoisted_10, [_createVNode(_component_el_input, {\n modelValue: $props.file.finalURL,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $props.file.finalURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[8] || (_cache[8] = [_createTextVNode(\"URL\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"]), _createVNode(_component_el_input, {\n modelValue: $props.file.mdURL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $props.file.mdURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[9] || (_cache[9] = [_createTextVNode(\"MarkDown\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"])]), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_input, {\n modelValue: $props.file.htmlURL,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $props.file.htmlURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[10] || (_cache[10] = [_createTextVNode(\"HTML\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"]), _createVNode(_component_el_input, {\n modelValue: $props.file.ubbURL,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $props.file.ubbURL = $event),\n readonly: \"\",\n onClick: $options.selectAllText,\n size: $options.urlSize\n }, {\n prepend: _withCtx(() => [...(_cache[11] || (_cache[11] = [_createTextVNode(\"BBCode\", -1)]))]),\n _: 1\n }, 8, [\"modelValue\", \"onClick\", \"size\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_12, [_createVNode(_component_el_progress, {\n percentage: $props.file.progreess,\n status: $props.file.status,\n \"show-text\": false\n }, null, 8, [\"percentage\", \"status\"])]))]), _createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"button\", {\n class: \"modern-file-action-btn modern-file-action-btn-primary\",\n onClick: _cache[5] || (_cache[5] = $event => _ctx.$emit('copy', $props.file))\n }, [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Link)]),\n _: 1\n })]), _createElementVNode(\"button\", {\n class: \"modern-file-action-btn modern-file-action-btn-danger\",\n onClick: _cache[6] || (_cache[6] = $event => _ctx.$emit('remove', $props.file))\n }, [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Delete)]),\n _: 1\n })])])]);\n}","import { Link, Delete } from '@element-plus/icons-vue';\nconst IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff', 'ico', 'avif', 'heic', 'jfif', 'pjpeg', 'pjp', 'raw', 'cr2', 'nef', 'dng', 'eps', 'ai', 'emf', 'wmf'];\nconst VIDEO_EXTENSIONS = ['mp4', 'webm', 'ogg', 'mkv'];\nexport default {\n name: 'UploadFileItem',\n components: {\n Link,\n Delete\n },\n props: {\n file: {\n type: Object,\n required: true\n }\n },\n emits: ['copy', 'remove', 'preview-error'],\n computed: {\n urlSize() {\n return window.innerWidth < 768 ? 'small' : 'default';\n }\n },\n methods: {\n isImage(fileName) {\n const ext = fileName.split('.').pop().toLowerCase();\n return IMAGE_EXTENSIONS.includes(ext);\n },\n isVideo(fileName) {\n const ext = fileName.split('.').pop().toLowerCase();\n return VIDEO_EXTENSIONS.includes(ext);\n },\n truncateFilename(filename, maxLength = 20) {\n if (!filename || filename.length <= maxLength) return filename;\n const lastDotIndex = filename.lastIndexOf('.');\n let name, ext;\n if (lastDotIndex > 0) {\n name = filename.substring(0, lastDotIndex);\n ext = filename.substring(lastDotIndex);\n } else {\n name = filename;\n ext = '';\n }\n const keepEnd = ext.length + 4;\n const keepStart = maxLength - keepEnd - 3;\n if (keepStart <= 0) return filename.substring(0, maxLength - 3) + '...';\n return name.substring(0, keepStart) + '...' + name.slice(-4) + ext;\n },\n selectAllText(event) {\n navigator.clipboard.writeText(event.target.value).then(() => {\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copySuccess')\n });\n }).catch(() => {\n this.$message({\n type: 'error',\n message: this.$t('uploadForm.copyFailed')\n });\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadFileItem.vue?vue&type=template&id=4848c2b0&scoped=true\"\nimport script from \"./UploadFileItem.vue?vue&type=script&lang=js\"\nexport * from \"./UploadFileItem.vue?vue&type=script&lang=js\"\n\nimport \"./UploadFileItem.vue?vue&type=style&index=0&id=4848c2b0&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-4848c2b0\"]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createElementBlock as _createElementBlock, renderList as _renderList, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-form\"\n};\nconst _hoisted_2 = {\n class: \"upload-card-glow\",\n ref: \"uploadCardGlow\"\n};\nconst _hoisted_3 = [\"innerHTML\"];\nconst _hoisted_4 = {\n key: 0,\n class: \"upload-card\"\n};\nconst _hoisted_5 = {\n class: \"paste-card-actions\"\n};\nconst _hoisted_6 = {\n class: \"upload-list-dashboard-action\"\n};\nconst _hoisted_7 = {\n class: \"modern-action-group\"\n};\nconst _hoisted_8 = {\n class: \"modern-dropdown-item-content\"\n};\nconst _hoisted_9 = {\n class: \"modern-action-btn modern-action-btn-danger\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_CameraFilled = _resolveComponent(\"CameraFilled\");\n const _component_el_icon = _resolveComponent(\"el-icon\");\n const _component_el_upload = _resolveComponent(\"el-upload\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_radio_button = _resolveComponent(\"el-radio-button\");\n const _component_el_radio_group = _resolveComponent(\"el-radio-group\");\n const _component_el_card = _resolveComponent(\"el-card\");\n const _component_List = _resolveComponent(\"List\");\n const _component_Checked = _resolveComponent(\"Checked\");\n const _component_Failed = _resolveComponent(\"Failed\");\n const _component_el_text = _resolveComponent(\"el-text\");\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_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_UploadFileItem = _resolveComponent(\"UploadFileItem\");\n const _component_el_scrollbar = _resolveComponent(\"el-scrollbar\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", {\n class: \"upload-card-wrapper\",\n onMousemove: _cache[0] || (_cache[0] = (...args) => $options.handleUploadCardMouseMove && $options.handleUploadCardMouseMove(...args)),\n onMouseleave: _cache[1] || (_cache[1] = (...args) => $options.handleUploadCardMouseLeave && $options.handleUploadCardMouseLeave(...args))\n }, [_createElementVNode(\"div\", _hoisted_2, null, 512), $props.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_el_upload, {\n key: 0,\n class: _normalizeClass([\"upload-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }]),\n drag: \"\",\n multiple: \"\",\n \"http-request\": $options.uploadFile,\n onSuccess: $options.handleSuccess,\n \"on-error\": $options.handleError,\n \"before-upload\": $options.beforeUpload,\n \"on-progress\": $options.handleProgress,\n \"file-list\": $data.fileList,\n \"show-file-list\": false\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, {\n class: _normalizeClass([\"el-icon--upload\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_CameraFilled)]),\n _: 1\n }, 8, [\"class\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"el-upload__text\", {\n 'upload-list-busy': $data.fileList.length\n }]),\n innerHTML: _ctx.$t('upload.dragUploadText')\n }, null, 10, _hoisted_3)]),\n _: 1\n }, 8, [\"class\", \"http-request\", \"onSuccess\", \"on-error\", \"before-upload\", \"on-progress\", \"file-list\"])) : _createCommentVNode(\"\", true)], 32), $props.uploadMethod === 'paste' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [_createVNode(_component_el_card, {\n class: _normalizeClass([\"paste-card\", {\n 'is-uploading': $data.uploading,\n 'upload-card-busy': $data.fileList.length\n }])\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.pastedUrls,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.pastedUrls = $event),\n class: \"upload-card-textarea\",\n placeholder: _ctx.$t('upload.pasteUrlPlaceholder'),\n type: \"textarea\",\n rows: $data.fileList.length ? 4 : 14\n }, null, 8, [\"modelValue\", \"placeholder\", \"rows\"]), _createElementVNode(\"div\", _hoisted_5, [_createVNode(_component_el_button, {\n class: \"paste-card-upload-button\",\n type: \"primary\",\n size: $options.pasteCardMethodButtonSize,\n onClick: $options.handleUploadPasteUrls\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteUploadBtn')), 1)]),\n _: 1\n }, 8, [\"size\", \"onClick\"]), _createVNode(_component_el_radio_group, {\n modelValue: $data.pasteUploadMethod,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.pasteUploadMethod = $event),\n class: \"paste-card-method-group\",\n size: $options.pasteCardMethodButtonSize\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio_button, {\n label: \"save\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteSave')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio_button, {\n label: \"external\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.pasteExternal')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"size\"])])]),\n _: 1\n }, 8, [\"class\"])])) : _createCommentVNode(\"\", true), _createVNode(_component_el_card, {\n class: _normalizeClass([\"upload-list-card\", {\n 'upload-list-busy': $data.fileList.length,\n 'is-uploading': $data.uploading\n }])\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-container\", {\n 'upload-list-busy': $data.fileList.length\n }])\n }, [_createVNode(_component_el_scrollbar, {\n onScroll: $options.handleScroll,\n ref: \"scrollContainer\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-list-dashboard\", {\n 'list-scrolled': $data.listScrolled\n }])\n }, [_createVNode(_component_el_text, {\n class: \"upload-list-dashboard-title\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_List)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadingCount + $options.waitingCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Checked)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadSuccessCount) + \" \", 1), _createVNode(_component_el_icon, null, {\n default: _withCtx(() => [_createVNode(_component_Failed)]),\n _: 1\n }), _createTextVNode(_toDisplayString($options.uploadErrorCount), 1)]),\n _: 1\n }), _createElementVNode(\"div\", _hoisted_6, [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.copyAll'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn\",\n onClick: _cache[4] || (_cache[4] = (...args) => $options.copyAll && $options.copyAll(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"copy\"\n })])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.retryFailed'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, null, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('uploadForm.autoRetry')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.autoReUpload,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.autoReUpload = $event),\n onChange: $options.handleAutoRetryChange,\n size: \"small\"\n }, null, 8, [\"modelValue\", \"onChange\"])])]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", {\n class: \"modern-action-btn\",\n onClick: _cache[5] || (_cache[5] = (...args) => $options.retryError && $options.retryError(...args))\n }, [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.clearList'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown, null, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, {\n class: \"modern-dropdown-menu\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n onClick: $options.clearFileList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearAll')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_dropdown_item, {\n onClick: $options.clearSuccessList\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.clearUploaded')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n })]),\n default: _withCtx(() => [_createElementVNode(\"button\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\"\n })])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"disabled\", \"content\"])])])], 2), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.fileList.slice().reverse(), file => {\n return _openBlock(), _createBlock(_component_UploadFileItem, {\n key: file.name,\n file: file,\n onCopy: $options.handleCopy,\n onRemove: $options.handleRemove,\n onPreviewError: _cache[7] || (_cache[7] = f => f.url = require('@/assets/404.png'))\n }, null, 8, [\"file\", \"onCopy\", \"onRemove\"]);\n }), 128))]),\n _: 1\n }, 8, [\"onScroll\"])], 2)]),\n _: 1\n }, 8, [\"class\"])]);\n}","/**\r\n * URL 构建工具函数\r\n * 用于生成各种格式的文件链接(原始链接、Markdown、HTML、BBCode)\r\n */\r\n\r\n/**\r\n * 根据 srcID 和文件名生成所有格式的 URL\r\n * @param {string} srcID - 文件资源 ID\r\n * @param {string} name - 文件名\r\n * @param {string} rootUrl - 链接前缀\r\n * @returns {{ finalURL: string, mdURL: string, htmlURL: string, ubbURL: string }}\r\n */\r\nexport function buildFileUrls(srcID, name, rootUrl) {\r\n const url = rootUrl + srcID\r\n return {\r\n finalURL: url,\r\n mdURL: `![${name}](${url})`,\r\n htmlURL: `\"${name}\"`,\r\n ubbURL: `[img]${url}[/img]`\r\n }\r\n}\r\n\r\n/**\r\n * 根据 selectedUrlForm 获取对应格式的 URL 值\r\n * @param {object} file - 文件对象,包含 finalURL/mdURL/htmlURL/ubbURL\r\n * @param {string} format - 格式类型:'url' | 'md' | 'html' | 'ubb'\r\n * @returns {string}\r\n */\r\nexport function getUrlByFormat(file, format) {\r\n const map = {\r\n url: file.finalURL,\r\n md: file.mdURL,\r\n html: file.htmlURL,\r\n ubb: file.ubbURL\r\n }\r\n return map[format] || file.finalURL\r\n}\r\n\r\n/**\r\n * 批量更新文件列表中的 URL(当自定义链接前缀变化时)\r\n * @param {Array} fileList - 文件列表\r\n * @param {string} rootUrl - 新的链接前缀\r\n */\r\nexport function updateFileListUrls(fileList, rootUrl) {\r\n fileList.forEach(item => {\r\n if (item.uploadChannel === 'external') {\r\n return\r\n }\r\n const urls = buildFileUrls(item.srcID, item.name, rootUrl)\r\n Object.assign(item, urls)\r\n })\r\n}\r\n","/**\r\n * SHA256 计算工具\r\n * 纯 JavaScript 实现的增量 SHA256 哈希算法,支持任意大小文件\r\n */\r\n\r\n// SHA256 常量\r\nconst K = new Uint32Array([\r\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\r\n])\r\n\r\nconst rotr = (x, n) => (x >>> n) | (x << (32 - n))\r\n\r\nfunction processBlock(block, H) {\r\n const W = new Uint32Array(64)\r\n\r\n for (let i = 0; i < 16; i++) {\r\n W[i] = (block[i * 4] << 24) | (block[i * 4 + 1] << 16) | (block[i * 4 + 2] << 8) | block[i * 4 + 3]\r\n }\r\n\r\n for (let i = 16; i < 64; i++) {\r\n const s0 = rotr(W[i - 15], 7) ^ rotr(W[i - 15], 18) ^ (W[i - 15] >>> 3)\r\n const s1 = rotr(W[i - 2], 17) ^ rotr(W[i - 2], 19) ^ (W[i - 2] >>> 10)\r\n W[i] = (W[i - 16] + s0 + W[i - 7] + s1) >>> 0\r\n }\r\n\r\n let [a, b, c, d, e, f, g, h] = H\r\n\r\n for (let i = 0; i < 64; i++) {\r\n const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)\r\n const ch = (e & f) ^ (~e & g)\r\n const temp1 = (h + S1 + ch + K[i] + W[i]) >>> 0\r\n const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)\r\n const maj = (a & b) ^ (a & c) ^ (b & c)\r\n const temp2 = (S0 + maj) >>> 0\r\n\r\n h = g; g = f; f = e\r\n e = (d + temp1) >>> 0\r\n d = c; c = b; b = a\r\n a = (temp1 + temp2) >>> 0\r\n }\r\n\r\n H[0] = (H[0] + a) >>> 0\r\n H[1] = (H[1] + b) >>> 0\r\n H[2] = (H[2] + c) >>> 0\r\n H[3] = (H[3] + d) >>> 0\r\n H[4] = (H[4] + e) >>> 0\r\n H[5] = (H[5] + f) >>> 0\r\n H[6] = (H[6] + g) >>> 0\r\n H[7] = (H[7] + h) >>> 0\r\n}\r\n\r\n/**\r\n * 创建增量 SHA256 哈希器\r\n * @returns {{ update: (data: Uint8Array) => void, digest: () => string }}\r\n */\r\nexport function createSha256() {\r\n let H = new Uint32Array([\r\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\r\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\r\n ])\r\n\r\n let buffer = new Uint8Array(64)\r\n let bufferLength = 0\r\n let totalLength = 0\r\n\r\n return {\r\n update(data) {\r\n totalLength += data.length\r\n let offset = 0\r\n\r\n if (bufferLength > 0) {\r\n const needed = 64 - bufferLength\r\n const toCopy = Math.min(needed, data.length)\r\n buffer.set(data.subarray(0, toCopy), bufferLength)\r\n bufferLength += toCopy\r\n offset = toCopy\r\n\r\n if (bufferLength === 64) {\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n }\r\n\r\n while (offset + 64 <= data.length) {\r\n processBlock(data.subarray(offset, offset + 64), H)\r\n offset += 64\r\n }\r\n\r\n if (offset < data.length) {\r\n buffer.set(data.subarray(offset), 0)\r\n bufferLength = data.length - offset\r\n }\r\n },\r\n digest() {\r\n const bitLength = totalLength * 8\r\n\r\n // Padding\r\n buffer[bufferLength++] = 0x80\r\n\r\n if (bufferLength > 56) {\r\n buffer.fill(0, bufferLength, 64)\r\n processBlock(buffer, H)\r\n bufferLength = 0\r\n }\r\n\r\n buffer.fill(0, bufferLength, 56)\r\n\r\n // Length in bits (big-endian, 64-bit)\r\n const view = new DataView(buffer.buffer)\r\n view.setUint32(56, Math.floor(bitLength / 0x100000000), false)\r\n view.setUint32(60, bitLength >>> 0, false)\r\n\r\n processBlock(buffer, H)\r\n\r\n // Convert to hex\r\n let hex = ''\r\n for (let i = 0; i < 8; i++) {\r\n hex += H[i].toString(16).padStart(8, '0')\r\n }\r\n return hex\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 计算文件的 SHA256 哈希\r\n * 使用增量哈希算法,支持任意大小文件\r\n * @param {File} file - 要计算哈希的文件\r\n * @returns {Promise} SHA256 哈希值(十六进制字符串)\r\n */\r\nexport async function computeSha256(file) {\r\n const sha256 = createSha256()\r\n\r\n const CHUNK_SIZE = 4 * 1024 * 1024 // 4MB chunks\r\n let offset = 0\r\n\r\n while (offset < file.size) {\r\n const chunk = file.slice(offset, Math.min(offset + CHUNK_SIZE, file.size))\r\n const buffer = await chunk.arrayBuffer()\r\n sha256.update(new Uint8Array(buffer))\r\n offset += CHUNK_SIZE\r\n\r\n // 每处理 20MB 打印一次进度\r\n if (offset % (20 * 1024 * 1024) < CHUNK_SIZE) {\r\n console.log(`SHA256 progress: ${Math.min(100, Math.round(offset / file.size * 100))}%`)\r\n }\r\n }\r\n\r\n return sha256.digest()\r\n}\r\n","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.array-buffer.detached.js\";\nimport \"core-js/modules/es.array-buffer.transfer.js\";\nimport \"core-js/modules/es.array-buffer.transfer-to-fixed-length.js\";\nimport \"core-js/modules/es.iterator.constructor.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.iterator.reduce.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/es.typed-array.with.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nimport \"core-js/modules/esnext.uint8-array.set-from-base64.js\";\nimport \"core-js/modules/esnext.uint8-array.set-from-hex.js\";\nimport \"core-js/modules/esnext.uint8-array.to-base64.js\";\nimport \"core-js/modules/esnext.uint8-array.to-hex.js\";\nimport \"core-js/modules/web.dom-exception.stack.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 axios from '@/utils/axios';\nimport * as imageConversion from 'image-conversion';\nimport { mapGetters } from 'vuex';\nimport { buildFileUrls, updateFileListUrls, getUrlByFormat } from '@/utils/upload/urlBuilder';\nimport { computeSha256 } from '@/utils/upload/sha256';\nimport UploadFileItem from '@/components/upload/UploadFileItem.vue';\nexport default {\n name: 'UploadForm',\n components: {\n UploadFileItem\n },\n props: {\n selectedUrlForm: {\n type: String,\n default: 'url',\n required: false\n },\n customerCompress: {\n type: Boolean,\n default: true,\n required: false\n },\n compressQuality: {\n type: Number,\n default: 4,\n required: false\n },\n compressBar: {\n type: Number,\n default: 5,\n required: false\n },\n serverCompress: {\n type: Boolean,\n default: true,\n required: false\n },\n uploadChannel: {\n type: String,\n default: 'telegram',\n required: false\n },\n channelName: {\n type: String,\n default: '',\n required: false\n },\n uploadNameType: {\n type: String,\n default: 'default',\n required: false\n },\n useCustomUrl: {\n type: String,\n default: 'false',\n required: false\n },\n customUrlPrefix: {\n type: String,\n default: '',\n required: false\n },\n autoRetry: {\n type: Boolean,\n default: true,\n required: false\n },\n urlPrefix: {\n type: String,\n default: '',\n required: false\n },\n uploadMethod: {\n type: String,\n default: 'default',\n required: false\n },\n uploadFolder: {\n type: String,\n default: '',\n required: false\n },\n convertToWebp: {\n type: Boolean,\n default: false,\n required: false\n }\n },\n data() {\n return {\n fileList: [],\n uploading: false,\n maxUploading: 6,\n exceptionList: [],\n listScrolled: false,\n fileListLength: 0,\n uploadCount: 0,\n pastedUrls: '',\n pasteUploadMethod: 'save',\n // 失败文件自动重试相关\n autoReUpload: true,\n maxRetryCount: 10,\n // 最大重试次数\n retryTimer: null,\n // 自动重试定时器\n retryDelay: 12000,\n // 重试延迟时间(毫秒)\n // 批量上传并发控制\n uploadQueue: [],\n // 等待上传的文件队列\n activeUploads: 0,\n // 当前正在上传的文件数\n maxConcurrentUploads: 6,\n // 最大并发上传数\n // 取消上传控制\n abortControllers: new Map() // 存储每个文件的 AbortController\n };\n },\n watch: {\n fileList: {\n handler() {\n if (this.fileList.length > this.fileListLength) {\n this.$nextTick(() => {\n setTimeout(() => {\n if (this.$refs.scrollContainer) {\n // this.$refs.scrollContainer.setScrollTop(this.$refs.scrollContainer.wrapRef.scrollHeight) // 滚动到底部\n this.$refs.scrollContainer.setScrollTop(0); // 滚动到顶部\n }\n }, 100);\n });\n }\n this.fileListLength = this.fileList.length;\n },\n deep: true\n },\n useCustomUrl: {\n handler() {\n updateFileListUrls(this.fileList, this.rootUrl);\n },\n immediate: true\n },\n customUrlPrefix: {\n handler() {\n if (this.useCustomUrl === 'true') {\n updateFileListUrls(this.fileList, this.rootUrl);\n }\n },\n immediate: true\n },\n autoReUpload(val) {\n this.$store.commit('setStoreAutoReUpload', val);\n }\n },\n computed: {\n ...mapGetters(['storeAutoReUpload']),\n uploadSuccessCount() {\n return this.fileList.filter(item => item.status === 'done' || item.status === 'success').length;\n },\n uploadErrorCount() {\n return this.fileList.filter(item => item.status === 'exception').length;\n },\n uploadingCount() {\n return this.fileList.filter(item => item.status === 'uploading').length;\n },\n waitingCount() {\n return this.uploadQueue.length;\n },\n urlSize() {\n // 移动端为small\n return window.innerWidth < 768 ? 'small' : 'default';\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n rootUrl() {\n // 链接前缀,优先级:用户自定义 > urlPrefix > 默认\n return this.useCustomUrl === 'true' ? this.customUrlPrefix : this.urlPrefix || `${window.location.protocol}//${window.location.host}/file/`;\n },\n pasteCardMethodButtonSize() {\n if (this.fileList.length) {\n return 'small';\n } else {\n return window.innerWidth < 768 ? 'small' : 'medium';\n }\n }\n },\n mounted() {\n document.addEventListener('paste', this.handlePaste);\n this.autoReUpload = this.storeAutoReUpload;\n },\n beforeUnmount() {\n document.removeEventListener('paste', this.handlePaste);\n // 清理状态\n this.uploadQueue = [];\n this.fileList = [];\n this.activeUploads = 0;\n },\n methods: {\n // 文件名中间截断,保留前缀和扩展名\n truncateFilename(filename, maxLength = 20) {\n if (!filename || filename.length <= maxLength) {\n return filename;\n }\n const lastDotIndex = filename.lastIndexOf('.');\n let name, ext;\n if (lastDotIndex > 0) {\n name = filename.substring(0, lastDotIndex);\n ext = filename.substring(lastDotIndex);\n } else {\n name = filename;\n ext = '';\n }\n // 保留扩展名和部分前后缀\n const keepEnd = ext.length + 4; // 扩展名 + 4个字符\n const keepStart = maxLength - keepEnd - 3; // 3个字符留给...\n if (keepStart <= 0) {\n return filename.substring(0, maxLength - 3) + '...';\n }\n return name.substring(0, keepStart) + '...' + name.slice(-4) + ext;\n },\n uploadFile(file) {\n // 如果fileList中不存在该文件,说明已被删除,直接返回\n if (!this.fileList.find(item => item.uid === file.file.uid)) {\n return;\n }\n\n // 并发控制:如果当前上传数已达上限,加入队列等待\n if (this.activeUploads >= this.maxConcurrentUploads) {\n this.uploadQueue.push(file);\n const waitingItem = this.fileList.find(item => item.uid === file.file.uid);\n if (waitingItem) waitingItem.status = 'waiting';\n return;\n }\n\n // 开始上传,增加计数\n this.activeUploads++;\n const uploadingItem = this.fileList.find(item => item.uid === file.file.uid);\n if (uploadingItem) uploadingItem.status = 'uploading';\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n const uploadChannel = fileItem?.uploadChannel || this.uploadChannel;\n\n // 如果上传渠道为外链,直接使用外链上传\n if (uploadChannel === 'external') {\n this.uploadSingleFile(file);\n return;\n }\n\n // HuggingFace 渠道:根据文件大小选择上传方式\n // 小文件(<20MB):通过 CF Workers 代理上传\n // 大文件(>=20MB):前端直传到 HuggingFace S3,绕过 CF Workers 限制\n if (uploadChannel === 'huggingface') {\n const HF_DIRECT_THRESHOLD = 20 * 1024 * 1024; // 20MB\n if (file.file.size >= HF_DIRECT_THRESHOLD) {\n this.uploadToHuggingFaceDirect(file);\n } else {\n this.uploadSingleFile(file);\n }\n return;\n }\n\n // Discord 渠道:限制 10MB,超过 9MB 就用分块上传(留安全余量)\n if (uploadChannel === 'discord') {\n const DISCORD_CHUNK_THRESHOLD = 9 * 1024 * 1024; // 9MB\n if (file.file.size > DISCORD_CHUNK_THRESHOLD) {\n this.uploadFileInChunks(file);\n } else {\n this.uploadSingleFile(file);\n }\n return;\n }\n\n // 其他渠道,检查文件大小,决定是否使用分块上传\n const CHUNK_THRESHOLD = 20 * 1024 * 1024; // 20MB\n if (file.file.size > CHUNK_THRESHOLD) {\n this.uploadFileInChunks(file);\n } else {\n this.uploadSingleFile(file);\n }\n },\n // 处理上传队列中的下一个文件\n processUploadQueue() {\n // 如果队列为空或已达并发上限,不处理\n if (this.uploadQueue.length === 0 || this.activeUploads >= this.maxConcurrentUploads) {\n return;\n }\n\n // 从队列中取出下一个文件并上传\n const nextFile = this.uploadQueue.shift();\n if (nextFile && this.fileList.find(item => item.uid === nextFile.file.uid)) {\n this.uploadFile(nextFile);\n } else {\n // 如果文件已被删除,继续处理下一个\n this.processUploadQueue();\n }\n },\n // 上传完成后的清理工作(成功或失败都调用)\n onUploadComplete() {\n this.activeUploads = Math.max(0, this.activeUploads - 1);\n\n // 处理队列中的下一个文件\n this.processUploadQueue();\n\n // 更新上传状态\n if (this.activeUploads === 0 && this.uploadQueue.length === 0) {\n this.uploading = false;\n }\n },\n // 单文件上传\n async uploadSingleFile(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return; // 文件已被删除\n\n const needServerCompress = fileItem.serverCompress;\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n const autoRetry = this.autoRetry && uploadChannel !== 'external';\n const uploadNameType = uploadChannel === 'external' ? 'default' : this.uploadNameType;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n const formData = new FormData();\n formData.append('file', file.file);\n if (uploadChannel === 'external') {\n formData.append('url', file.file.url);\n }\n\n // HuggingFace 渠道:在前端预计算 SHA256,避免后端 CPU 超时\n if (uploadChannel === 'huggingface') {\n try {\n console.log('Computing SHA256 for HuggingFace upload...');\n const sha256 = await computeSha256(file.file);\n formData.append('sha256', sha256);\n console.log('SHA256 computed:', sha256);\n } catch (err) {\n console.error('Failed to compute SHA256:', err);\n // 继续上传,让后端计算(可能会超时)\n }\n }\n axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder),\n method: 'post',\n data: formData,\n withAuthCode: true,\n signal: abortController.signal,\n // 添加取消信号\n onUploadProgress: progressEvent => {\n const percentCompleted = Math.round(progressEvent.loaded / progressEvent.total * 100);\n file.onProgress({\n percent: percentCompleted,\n file: file.file\n });\n }\n }).then(res => {\n file.onSuccess(res, file.file);\n }).catch(err => {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n console.log('上传已取消:', file.file.name);\n return;\n }\n if (err.response && err.response.status !== 401) {\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } else if (!err.response) {\n // 网络错误(如 ERR_HTTP2_PROTOCOL_ERROR),也加入异常列表\n this.exceptionList.push(file);\n file.onError(err, file.file);\n }\n }).finally(() => {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n });\n },\n // 分块上传\n async uploadFileInChunks(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return; // 文件已被删除\n\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n\n // Discord 使用 9MB 分块(留安全余量,Discord 限制 10MB)\n // Telegram 使用 16MB 分块(TG Bot getFile 下载限制 20MB,留 4MB 安全余量)\n // 其他渠道使用 16MB 分块\n const CHUNK_SIZE = uploadChannel === 'discord' ? 9 * 1024 * 1024 // 9MB for Discord\n : 16 * 1024 * 1024; // 16MB for Telegram and others (TG getFile limit: 20MB)\n\n const fileSize = file.file.size;\n const totalChunks = Math.ceil(fileSize / CHUNK_SIZE);\n const needServerCompress = fileItem.serverCompress;\n const autoRetry = this.autoRetry && uploadChannel !== 'external';\n const uploadNameType = uploadChannel === 'external' ? 'default' : this.uploadNameType;\n\n // HuggingFace 渠道:在前端预计算 SHA256\n let precomputedSha256 = null;\n if (uploadChannel === 'huggingface') {\n try {\n console.log('Computing SHA256 for HuggingFace chunked upload...');\n precomputedSha256 = await computeSha256(file.file);\n console.log('SHA256 computed:', precomputedSha256);\n } catch (err) {\n console.error('Failed to compute SHA256:', err);\n }\n }\n try {\n // 第一步:初始化分块上传,获取uploadId\n const initFormData = new FormData();\n initFormData.append('originalFileName', file.file.name);\n initFormData.append('originalFileType', file.file.type);\n initFormData.append('totalChunks', totalChunks.toString());\n const initResponse = await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&initChunked=true',\n method: 'post',\n data: initFormData,\n withAuthCode: true\n });\n if (!initResponse.data.success) {\n throw new Error(this.$t('uploadForm.chunkInitFailed') + ': ' + initResponse.data.message);\n }\n const uploadId = initResponse.data.uploadId;\n console.log('分块上传初始化成功,uploadId:', uploadId);\n\n // 记录 totalChunks 和 uploadId 到文件项,用于后续清理\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (fileItem) {\n fileItem.totalChunks = totalChunks;\n fileItem.uploadId = uploadId;\n }\n\n // 第二步:并发上传所有分块\n const maxConcurrency = 3; // 最大并发数\n const chunkProgress = new Array(totalChunks).fill(0);\n let nextChunkIndex = 0;\n let hasError = false;\n let errorMsg = '';\n let isCancelled = false; // 标记是否被取消\n\n const uploadChunk = async chunkIndex => {\n if (hasError || isCancelled) return;\n const start = chunkIndex * CHUNK_SIZE;\n const end = Math.min(start + CHUNK_SIZE, fileSize);\n const chunk = file.file.slice(start, end);\n const formData = new FormData();\n formData.append('file', chunk, `${file.file.name}.part${chunkIndex.toString().padStart(3, '0')}`);\n formData.append('chunkIndex', chunkIndex.toString());\n formData.append('totalChunks', totalChunks.toString());\n formData.append('uploadId', uploadId);\n formData.append('originalFileName', file.file.name);\n formData.append('originalFileType', file.file.type);\n let retryCount = 0;\n const maxRetries = 3;\n while (retryCount < maxRetries) {\n if (hasError || isCancelled) return;\n try {\n await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&chunked=true',\n method: 'post',\n data: formData,\n withAuthCode: true,\n signal: abortController.signal,\n // 添加取消信号\n onUploadProgress: progressEvent => {\n if (hasError || isCancelled) return;\n const percent = Math.round(progressEvent.loaded / progressEvent.total * 100);\n chunkProgress[chunkIndex] = percent;\n const totalPercent = Math.round(chunkProgress.reduce((a, b) => a + b, 0) / totalChunks);\n file.onProgress({\n percent: totalPercent,\n file: file.file\n });\n }\n });\n return; // Success\n } catch (err) {\n // 如果是取消操作,直接返回\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n isCancelled = true;\n console.log('分块上传已取消:', file.file.name);\n return;\n }\n retryCount++;\n console.warn(`分块 ${chunkIndex + 1}/${totalChunks} 上传失败 (重试 ${retryCount}/${maxRetries}):`, err);\n if (retryCount >= maxRetries) {\n hasError = true;\n errorMsg = `分块 ${chunkIndex + 1}/${totalChunks} 上传失败: ${err.message}`;\n throw new Error(errorMsg);\n }\n // 等待后重试\n await new Promise(resolve => setTimeout(resolve, 2000 * retryCount));\n }\n }\n };\n\n // 创建并发池\n const pool = [];\n for (let i = 0; i < maxConcurrency; i++) {\n pool.push((async () => {\n while (nextChunkIndex < totalChunks && !hasError && !isCancelled) {\n const currentIndex = nextChunkIndex++;\n try {\n await uploadChunk(currentIndex);\n } catch (e) {\n if (!isCancelled) {\n hasError = true;\n errorMsg = e.message;\n }\n break;\n }\n }\n })());\n }\n await Promise.all(pool);\n\n // 如果被取消,直接返回\n if (isCancelled) {\n console.log('分块上传已取消,跳过合并步骤');\n return;\n }\n if (hasError) {\n throw new Error(errorMsg || this.$t('uploadForm.uploadError'));\n }\n\n // 第三步:所有分块上传完成,发送合并请求\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.chunkMerging'),\n duration: 0 // 不自动关闭\n });\n const mergeFormData = new FormData();\n mergeFormData.append('uploadId', uploadId);\n mergeFormData.append('totalChunks', totalChunks.toString());\n mergeFormData.append('originalFileName', file.file.name);\n mergeFormData.append('originalFileType', file.file.type);\n // HuggingFace 渠道:传递预计算的 SHA256\n if (precomputedSha256) {\n mergeFormData.append('sha256', precomputedSha256);\n }\n const response = await axios({\n url: '/upload' + '?serverCompress=' + needServerCompress + '&uploadChannel=' + uploadChannel + (this.channelName ? '&channelName=' + encodeURIComponent(this.channelName) : '') + '&uploadNameType=' + uploadNameType + '&autoRetry=' + autoRetry + '&uploadFolder=' + encodeURIComponent(this.uploadFolder) + '&chunked=true&merge=true',\n method: 'post',\n data: mergeFormData,\n withAuthCode: true\n });\n\n // 关闭提示\n this.$message.closeAll();\n\n // 同步处理完成\n file.onSuccess(response, file.file);\n } catch (err) {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED') {\n console.log('分块上传已取消:', file.file.name);\n return;\n }\n console.error('分块上传失败:', err);\n\n // 如果有uploadId,清理相关资源\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (fileItem && fileItem.uploadId) {\n this.cleanupUploadResources(fileItem.uploadId, fileItem.totalChunks).then(() => {\n console.log(`已清理分块上传失败的资源: ${fileItem.uploadId}`);\n }).catch(cleanupError => {\n console.warn('清理分块上传失败资源时出错:', cleanupError);\n });\n }\n if (err.response && err.response.status !== 401) {\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } else if (!err.response) {\n // 网络错误,也加入异常列表\n this.exceptionList.push(file);\n file.onError(err, file.file);\n }\n } finally {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n }\n },\n handleRemove(file) {\n // 如果文件正在上传,取消上传\n if (this.abortControllers.has(file.uid)) {\n this.abortControllers.get(file.uid).abort();\n this.abortControllers.delete(file.uid);\n }\n // 从上传队列中移除(如果在等待中)\n this.uploadQueue = this.uploadQueue.filter(item => item.file.uid !== file.uid);\n // 从文件列表中移除\n this.fileList = this.fileList.filter(item => item.uid !== file.uid);\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.deleted', {\n name: this.truncateFilename(file.name)\n })\n });\n },\n // 清理上传资源\n async cleanupUploadResources(uploadId, totalChunks = 0) {\n try {\n await axios({\n url: `/upload?cleanup=true&uploadId=${uploadId}&totalChunks=${totalChunks}`,\n method: 'get',\n withAuthCode: true,\n timeout: 5000\n });\n console.log(`清理上传资源成功: ${uploadId}`);\n } catch (error) {\n console.warn('清理上传资源失败:', error);\n }\n },\n handleSuccess(response, file) {\n const fileItem = this.fileList.find(item => item.uid === file.uid);\n if (!fileItem) return; // 文件已被删除\n\n try {\n // 对上传渠道为外链的,不修改链接\n const uploadChannel = fileItem.uploadChannel || this.uploadChannel;\n if (uploadChannel !== 'external') {\n // 从response.data[0].src中去除/file/前缀\n const srcID = response.data[0].src.replace('/file/', '');\n fileItem.url = `${window.location.protocol}//${window.location.host}/file/` + srcID;\n const urls = buildFileUrls(srcID, file.name, this.rootUrl);\n Object.assign(fileItem, urls);\n fileItem.srcID = srcID;\n }\n fileItem.progreess = 100;\n fileItem.status = 'success';\n\n // Save to history\n this.saveToHistory(fileItem);\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.uploadSuccess', {\n name: this.truncateFilename(file.name)\n })\n });\n setTimeout(() => {\n const item = this.fileList.find(item => item.uid === file.uid);\n if (item) item.status = 'done';\n }, 1000);\n } catch (error) {\n this.$message.error(this.$t('uploadForm.uploadFailed', {\n name: this.truncateFilename(file.name)\n }));\n fileItem.status = 'exception';\n }\n // 注意:并发控制的 onUploadComplete 已在各上传方法的 finally 中调用\n },\n saveToHistory(fileItem) {\n try {\n const history = JSON.parse(localStorage.getItem('uploadHistory') || '[]');\n const newRecord = {\n name: fileItem.name,\n url: fileItem.finalURL,\n time: Date.now(),\n type: fileItem.name.split('.').pop().toLowerCase()\n };\n history.push(newRecord);\n localStorage.setItem('uploadHistory', JSON.stringify(history));\n } catch (e) {\n console.error('Failed to save history', e);\n }\n },\n handleError(err, file) {\n const fileItem = this.fileList.find(item => item.uid === file.uid);\n if (!fileItem) return; // 文件已被删除\n\n this.$message.error(this.$t('uploadForm.uploadFailed', {\n name: this.truncateFilename(file.name)\n }));\n fileItem.status = 'exception';\n\n // 如果开启了自动重试,安排自动重试\n if (this.autoReUpload) {\n this.scheduleAutoRetry();\n }\n // 注意:并发控制的 onUploadComplete 已在各上传方法的 finally 中调用\n },\n handleCopy(file) {\n const status = this.fileList.find(item => item.uid === file.uid).status;\n if (status !== 'done' && status !== 'success') {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.fileNotUploaded')\n });\n return;\n }\n navigator.clipboard.writeText(getUrlByFormat(file, this.selectedUrlForm));\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copySuccess')\n });\n },\n beforeUpload(file) {\n return new Promise(async (resolve, reject) => {\n let processedFile = file;\n\n // WebP 转换:在压缩之前进行\n // 条件:1.开启WebP转换 2.文件类型为图片 3.不是WebP/GIF/SVG格式\n const canConvertToWebp = this.convertToWebp && file.type.includes('image') && !file.type.includes('webp') && !file.type.includes('gif') && !file.type.includes('svg');\n if (canConvertToWebp) {\n try {\n const convertedFile = await this.convertImageToWebp(file);\n if (convertedFile) {\n processedFile = convertedFile;\n console.log(`WebP转换成功: ${file.name} -> ${convertedFile.name}, 大小: ${(file.size / 1024).toFixed(1)}KB -> ${(convertedFile.size / 1024).toFixed(1)}KB`);\n }\n } catch (err) {\n console.warn('WebP转换失败,使用原文件:', err);\n // 转换失败,继续使用原文件\n }\n }\n\n // 客户端压缩条件:1.文件类型为图片 2.开启客户端压缩,且文件大小大于压缩阈值\n const needCustomCompress = processedFile.type.includes('image') && this.customerCompress && processedFile.size / 1024 / 1024 > this.compressBar;\n const isLtLim = processedFile.size / 1024 / 1024 <= 1024 || this.uploadChannel !== 'telegram';\n const pushFileToQueue = (file, serverCompress) => {\n const fileUrl = URL.createObjectURL(file);\n this.fileList.push({\n uid: file.uid,\n name: file.name,\n url: fileUrl,\n finalURL: '',\n mdURL: '',\n htmlURL: '',\n ubbURL: '',\n srcID: '',\n status: 'uploading',\n progreess: 0,\n serverCompress: serverCompress,\n retryCount: 0\n });\n resolve(file);\n };\n if (needCustomCompress) {\n //尝试压缩图片\n imageConversion.compressAccurately(processedFile, 1024 * this.compressQuality).then(res => {\n //如果压缩后大于1024MB,且上传渠道为telegram,则不上传\n if (res.size / 1024 / 1024 > 1024 && this.uploadChannel === 'telegram') {\n this.$message.error(this.$t('uploadForm.compressedFileTooLarge', {\n name: processedFile.name\n }));\n reject(this.$t('uploadForm.fileSizeTooLarge'));\n }\n this.uploading = true;\n //将res包装成新的file\n const newFile = new File([res], processedFile.name, {\n type: res.type\n });\n newFile.uid = file.uid;\n const myUploadCount = this.uploadCount++;\n\n //开启服务端压缩条件:1.开启服务端压缩 2.文件大小小于10MB 3.上传渠道为Telegram\n const needServerCompress = this.serverCompress && newFile.size / 1024 / 1024 < 10 && this.uploadChannel === 'telegram';\n if (myUploadCount === 0) {\n pushFileToQueue(newFile, needServerCompress);\n } else {\n setTimeout(() => {\n pushFileToQueue(newFile, needServerCompress);\n this.uploadCount--;\n }, 300 * myUploadCount);\n }\n }).catch(err => {\n this.$message.error(this.$t('uploadForm.compressFailedCannotUpload', {\n name: processedFile.name\n }));\n reject(err);\n });\n } else if (isLtLim) {\n this.uploading = true;\n const myUploadCount = this.uploadCount++;\n\n // 开启服务端压缩条件:1.上传渠道为Telegram 2.开启服务端压缩 3.如果为图片,则文件大小小于10MB,否则不限制大小\n const needServerCompress = this.uploadChannel === 'telegram' && this.serverCompress && (processedFile.type.includes('image') ? processedFile.size / 1024 / 1024 < 10 : true);\n if (myUploadCount === 0) {\n pushFileToQueue(processedFile, needServerCompress);\n } else {\n setTimeout(() => {\n pushFileToQueue(processedFile, needServerCompress);\n this.uploadCount--;\n }, 300 * myUploadCount);\n }\n } else {\n this.$message.error(this.$t('uploadForm.fileTooLarge', {\n name: processedFile.name\n }));\n reject(this.$t('uploadForm.fileSizeTooLarge'));\n }\n });\n },\n handleProgress(event) {\n const fileItem = this.fileList.find(item => item.uid === event.file.uid);\n if (fileItem) {\n fileItem.progreess = event.percent;\n }\n },\n copyAll() {\n const urls = this.fileList.filter(item => item.status === 'done' || item.status === 'success').map(item => getUrlByFormat(item, this.selectedUrlForm)).join('\\n');\n navigator.clipboard.writeText(urls);\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.copyAllSuccess')\n });\n },\n clearFileList() {\n if (this.fileList.length > 0) {\n // 取消所有正在上传的文件\n this.abortControllers.forEach((controller, uid) => {\n controller.abort();\n });\n this.abortControllers.clear();\n // 清空上传队列\n this.uploadQueue = [];\n // 清空文件列表\n this.fileList = [];\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.fileListCleared')\n });\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.fileListEmpty')\n });\n }\n },\n clearSuccessList() {\n if (this.uploadSuccessCount > 0) {\n this.fileList = this.fileList.filter(item => item.status !== 'done' && item.status !== 'success');\n this.$message({\n type: 'success',\n message: this.$t('uploadForm.successFilesCleared')\n });\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.successFilesEmpty')\n });\n }\n },\n handlePaste(event) {\n // 当粘贴位置是文本框时,不执行该操作\n if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {\n return;\n }\n const items = event.clipboardData.items;\n if (items.length > 0) {\n this.uploadFromUrl(items);\n }\n },\n handleUploadPasteUrls() {\n // 用于上传在上传文本框中粘贴的外链\n const urls = this.pastedUrls.split('\\n');\n // 处理空行和首尾空字符,链接须符合URL规范\n const validUrls = urls.map(url => url.trim()).filter(url => url !== '').filter(url => /^(https?:\\/\\/[^\\s$.?#].[^\\s]*)$/.test(url));\n\n // 根据粘贴上传方式进行上传\n if (this.pasteUploadMethod === 'save') {\n // 正常上传\n this.uploadFromUrl(validUrls.map(url => {\n return {\n kind: 'string',\n getAsString: callback => {\n callback(url);\n }\n };\n }));\n } else if (this.pasteUploadMethod === 'external') {\n // 仅保存外链,使用 external 渠道上传\n for (let i = 0; i < validUrls.length; i++) {\n const url = validUrls[i];\n const fileName = url.split('/').pop();\n const mdUrl = `![${fileName}](${url})`;\n const htmlUrl = `\"${fileName}\"`;\n const ubbUrl = `[img]${url}[/img]`;\n // 将 url 作为文件内容,文件名为 URL 的最后一部分\n const file = new File([], url.split('/').pop(), {\n type: 'text/plain'\n });\n file.uid = Date.now() + i;\n file.url = url;\n this.fileList.push({\n uid: file.uid,\n name: file.name,\n url: url,\n finalURL: url,\n mdURL: mdUrl,\n htmlURL: htmlUrl,\n ubbURL: ubbUrl,\n srcID: url,\n status: 'uploading',\n progreess: 0,\n serverCompress: false,\n uploadChannel: 'external',\n retryCount: 0\n });\n // 上传\n this.uploadFile({\n file: file,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }\n },\n uploadFromUrl(items) {\n for (let i = 0; i < items.length; i++) {\n if (items[i].kind === 'file') {\n const file = items[i].getAsFile();\n // 允许上传任意类型的文件\n file.uid = Date.now() + i;\n //接收beforeUpload的Promise对象\n const checkResult = this.beforeUpload(file);\n if (checkResult instanceof Promise) {\n checkResult.then(newFile => {\n if (newFile instanceof File) {\n this.uploadFile({\n file: newFile,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }).catch(err => {\n console.log(err);\n });\n }\n } else if (items[i].kind === 'string') {\n items[i].getAsString(text => {\n const urlPattern = /^(https?:\\/\\/[^\\s$.?#].[^\\s]*)$/;\n let fileName = '';\n if (urlPattern.test(text)) {\n axios.post('/api/fetchRes', {\n url: text\n }, {\n responseType: 'blob',\n withAuthCode: true\n }).then(response => {\n const contentType = response.headers['content-type'];\n if (response.status == 200) {\n // 提取文件名\n const disposition = response.headers['content-disposition'];\n if (disposition) {\n const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\n const filenameStarRegex = /filename\\*\\s*=\\s*UTF-8''([^;\\n]*)/; // 处理 filename*\n\n let matches = filenameRegex.exec(disposition);\n if (matches != null && matches[1]) {\n fileName = matches[1].replace(/['\"]/g, '');\n // 尝试解码\n try {\n fileName = decodeURIComponent(fileName);\n } catch (e) {\n fileName = '';\n }\n }\n if (fileName === '') {\n matches = filenameStarRegex.exec(disposition); // 尝试匹配 filename*\n if (matches != null && matches[1]) {\n fileName = decodeURIComponent(matches[1]);\n }\n }\n }\n // 尝试从URL中提取文件名\n if (fileName === '') {\n const url = new URL(text);\n fileName = url.pathname.split('/').pop();\n }\n // 未提取到文件名,使用默认文件名\n if (fileName === '') {\n // 获取文件后缀\n const url = new URL(text);\n let extension = url.pathname.split('.').pop();\n // 未能从URL提取有效后缀,使用bin作为默认后缀\n if (!extension || extension === '' || extension.length > 10) {\n extension = 'bin';\n }\n fileName = 'PastedFile' + Date.now() + i + '.' + extension;\n }\n\n // 读取文件内容\n const blob = response.data;\n const file = new File([blob], fileName, {\n type: blob.type\n });\n file.uid = Date.now() + i;\n // 接收beforeUpload的Promise对象\n const checkResult = this.beforeUpload(file);\n if (checkResult instanceof Promise) {\n checkResult.then(newFile => {\n if (newFile instanceof File) {\n this.uploadFile({\n file: newFile,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n }\n }).catch(err => {\n console.log(err);\n });\n }\n } else {\n throw new Error('URL地址请求失败');\n }\n }).catch(error => {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.urlRequestFailed')\n });\n });\n }\n });\n }\n }\n },\n handleScroll(event) {\n this.listScrolled = event.scrollTop > 0 && this.fileList.length > 0;\n },\n retryError() {\n if (this.exceptionList.length > 0) {\n this.retryFailedFiles(this.exceptionList);\n this.exceptionList = [];\n } else {\n this.$message({\n type: 'info',\n message: this.$t('uploadForm.noFailedFiles')\n });\n }\n },\n handleAutoRetryChange(val) {\n this.$message({\n type: val ? 'success' : 'info',\n message: val ? this.$t('uploadForm.autoRetryOn') : this.$t('uploadForm.autoRetryOff')\n });\n\n // 如果开启自动重试且有失败文件,立即开始重试\n if (val && this.exceptionList.length > 0) {\n this.scheduleAutoRetry();\n }\n },\n retryFailedFiles(files) {\n files.forEach(file => {\n const retryCount = file.retryCount || 0;\n if (retryCount < this.maxRetryCount) {\n file.retryCount = retryCount + 1;\n this.uploadFile({\n file: file.file,\n onProgress: evt => this.handleProgress(evt),\n onSuccess: (response, file) => this.handleSuccess(response, file),\n onError: (error, file) => this.handleError(error, file)\n });\n } else {\n this.$message({\n type: 'warning',\n message: this.$t('uploadForm.maxRetryReached', {\n name: file.name,\n max: this.maxRetryCount\n })\n });\n }\n });\n },\n scheduleAutoRetry() {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n this.retryTimer = setTimeout(() => {\n if (this.autoReUpload && this.exceptionList.length > 0) {\n const filesToRetry = [...this.exceptionList];\n this.exceptionList = [];\n this.retryFailedFiles(filesToRetry);\n }\n }, this.retryDelay);\n },\n // HuggingFace 大文件直传(绕过 CF Workers 限制)\n // 流程:前端计算 SHA256 → 获取 S3 上传 URL → 直传到 S3 → 提交文件引用\n async uploadToHuggingFaceDirect(file) {\n const fileItem = this.fileList.find(item => item.uid === file.file.uid);\n if (!fileItem) return;\n\n // 创建 AbortController 用于取消上传\n const abortController = new AbortController();\n this.abortControllers.set(file.file.uid, abortController);\n try {\n console.log('=== HuggingFace Direct Upload ===');\n console.log('File:', file.file.name, 'Size:', file.file.size);\n\n // 1. 计算 SHA256\n file.onProgress({\n percent: 5,\n file: file.file\n });\n console.log('Computing SHA256...');\n const sha256 = await computeSha256(file.file);\n console.log('SHA256:', sha256);\n\n // 检查是否已取消\n if (abortController.signal.aborted) {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n\n // 2. 获取文件样本(前512字节的base64)\n const sampleBytes = new Uint8Array(await file.file.slice(0, 512).arrayBuffer());\n const fileSample = btoa(String.fromCharCode(...sampleBytes));\n\n // 3. 获取 LFS 上传 URL\n file.onProgress({\n percent: 10,\n file: file.file\n });\n console.log('Getting LFS upload URL...');\n const uploadInfoRes = await axios({\n url: '/upload/huggingface/getUploadUrl',\n method: 'post',\n data: {\n fileSize: file.file.size,\n fileName: file.file.name,\n fileType: file.file.type,\n sha256,\n fileSample,\n channelName: this.channelName,\n // 传递指定的渠道名称\n uploadNameType: this.uploadNameType,\n uploadFolder: this.uploadFolder\n },\n withAuthCode: true,\n signal: abortController.signal\n });\n if (!uploadInfoRes.data.success) {\n throw new Error(uploadInfoRes.data.error || 'Failed to get upload URL');\n }\n const uploadInfo = uploadInfoRes.data;\n console.log('Upload info:', uploadInfo);\n\n // 检查文件是否已存在\n if (uploadInfo.alreadyExists) {\n console.log('File already exists in LFS, skipping upload');\n file.onProgress({\n percent: 90,\n file: file.file\n });\n } else if (uploadInfo.needsLfs && uploadInfo.uploadAction) {\n // 4. 直接上传到 S3\n const {\n href,\n header\n } = uploadInfo.uploadAction;\n if (header?.chunk_size) {\n // 分片上传\n await this.uploadToHuggingFaceMultipart(file, uploadInfo, abortController);\n } else {\n // 基本上传\n console.log('Uploading to S3 (basic)...');\n const uploadRes = await fetch(href, {\n method: 'PUT',\n headers: header || {},\n body: file.file,\n signal: abortController.signal\n });\n if (!uploadRes.ok) {\n const error = await uploadRes.text();\n throw new Error(`S3 upload failed: ${uploadRes.status} - ${error}`);\n }\n console.log('S3 upload complete');\n }\n }\n\n // 检查是否已取消\n if (abortController.signal.aborted) {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n\n // 5. 提交文件引用\n file.onProgress({\n percent: 95,\n file: file.file\n });\n console.log('Committing file...');\n const commitRes = await axios({\n url: '/upload/huggingface/commitUpload',\n method: 'post',\n data: {\n fullId: uploadInfo.fullId,\n filePath: uploadInfo.filePath,\n sha256,\n fileSize: file.file.size,\n fileName: file.file.name,\n fileType: file.file.type,\n channelName: uploadInfo.channelName\n },\n withAuthCode: true,\n signal: abortController.signal\n });\n if (!commitRes.data.success) {\n throw new Error(commitRes.data.error || 'Failed to commit file');\n }\n console.log('Upload complete:', commitRes.data);\n // 转换响应格式以匹配 handleSuccess 期望的格式\n const formattedResponse = {\n data: [{\n src: commitRes.data.src\n }]\n };\n file.onSuccess(formattedResponse, file.file);\n } catch (err) {\n // 如果是取消操作,不加入异常列表\n if (err.name === 'CanceledError' || err.code === 'ERR_CANCELED' || err.name === 'AbortError') {\n console.log('HuggingFace 上传已取消:', file.file.name);\n return;\n }\n console.error('HuggingFace direct upload error:', err);\n this.exceptionList.push(file);\n file.onError(err, file.file);\n } finally {\n // 清理 AbortController\n this.abortControllers.delete(file.file.uid);\n // 调用并发控制的完成回调\n this.onUploadComplete();\n }\n },\n // HuggingFace 分片上传到 S3\n async uploadToHuggingFaceMultipart(file, uploadInfo, abortController) {\n const {\n uploadAction\n } = uploadInfo;\n const {\n href: completionUrl,\n header\n } = uploadAction;\n const chunkSize = parseInt(header.chunk_size);\n\n // 获取所有分片的上传 URL\n const parts = Object.keys(header).filter(key => /^[0-9]+$/.test(key));\n console.log(`Multipart upload: ${parts.length} parts, chunk size: ${chunkSize}`);\n const completeParts = [];\n const totalParts = parts.length;\n for (const part of parts) {\n // 检查是否已取消\n if (abortController && abortController.signal.aborted) {\n console.log('HuggingFace 分片上传已取消');\n throw new DOMException('Upload cancelled', 'AbortError');\n }\n const index = parseInt(part) - 1;\n const start = index * chunkSize;\n const end = Math.min(start + chunkSize, file.file.size);\n const chunk = file.file.slice(start, end);\n console.log(`Uploading part ${part}/${totalParts}`);\n const response = await fetch(header[part], {\n method: 'PUT',\n body: chunk,\n signal: abortController ? abortController.signal : undefined\n });\n if (!response.ok) {\n throw new Error(`Failed to upload part ${part}: ${response.status}`);\n }\n const etag = response.headers.get('ETag');\n if (!etag) {\n throw new Error(`No ETag for part ${part}`);\n }\n completeParts.push({\n partNumber: parseInt(part),\n etag\n });\n\n // 更新进度(10% - 90%)\n const progress = 10 + Math.round(parseInt(part) / totalParts * 80);\n file.onProgress({\n percent: progress,\n file: file.file\n });\n }\n\n // 检查是否已取消\n if (abortController && abortController.signal.aborted) {\n console.log('HuggingFace 分片上传已取消');\n throw new DOMException('Upload cancelled', 'AbortError');\n }\n\n // 完成分片上传\n console.log('Completing multipart upload...');\n const completeResponse = await fetch(completionUrl, {\n method: 'POST',\n headers: {\n 'Accept': 'application/vnd.git-lfs+json',\n 'Content-Type': 'application/vnd.git-lfs+json'\n },\n body: JSON.stringify({\n oid: uploadInfo.oid,\n parts: completeParts\n }),\n signal: abortController ? abortController.signal : undefined\n });\n if (!completeResponse.ok) {\n const error = await completeResponse.text();\n throw new Error(`Multipart complete failed: ${completeResponse.status} - ${error}`);\n }\n console.log('Multipart upload complete');\n },\n // 将图片转换为 WebP 格式\n async convertImageToWebp(file) {\n return new Promise((resolve, reject) => {\n // 不支持转换的格式直接返回 null\n if (file.type.includes('gif') || file.type.includes('svg') || file.type.includes('webp')) {\n resolve(null);\n return;\n }\n const img = new Image();\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n canvas.toBlob(blob => {\n if (blob) {\n // 修改文件名:将原扩展名替换为 .webp\n const originalName = file.name;\n const lastDotIndex = originalName.lastIndexOf('.');\n const newName = lastDotIndex > 0 ? originalName.substring(0, lastDotIndex) + '.webp' : originalName + '.webp';\n const webpFile = new File([blob], newName, {\n type: 'image/webp'\n });\n webpFile.uid = file.uid;\n resolve(webpFile);\n } else {\n reject(new Error('WebP 转换失败'));\n }\n\n // 清理\n URL.revokeObjectURL(img.src);\n }, 'image/webp', 0.92); // 0.92 质量参数,平衡质量和大小\n };\n img.onerror = () => {\n URL.revokeObjectURL(img.src);\n reject(new Error(this.$t('uploadForm.imageLoadFailed')));\n };\n img.src = URL.createObjectURL(file);\n });\n },\n // 拖拽上传卡片鼠标移动事件 - 悬浮光斑效果\n handleUploadCardMouseMove(e) {\n const glow = this.$refs.uploadCardGlow;\n if (!glow) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n glow.style.opacity = '1';\n glow.style.left = x + 'px';\n glow.style.top = y + 'px';\n },\n // 拖拽上传卡片鼠标离开事件\n handleUploadCardMouseLeave() {\n const glow = this.$refs.uploadCardGlow;\n if (!glow) return;\n glow.style.opacity = '0';\n }\n },\n beforeDestroy() {\n // 清理定时器\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadForm.vue?vue&type=template&id=37f80c81&scoped=true\"\nimport script from \"./UploadForm.vue?vue&type=script&lang=js\"\nexport * from \"./UploadForm.vue?vue&type=script&lang=js\"\n\nimport \"./UploadForm.vue?vue&type=style&index=0&id=37f80c81&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-37f80c81\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, withModifiers as _withModifiers, createElementVNode as _createElementVNode, vShow as _vShow, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-suggestion-input\",\n ref: \"wrapperRef\"\n};\nconst _hoisted_2 = {\n class: \"suggestion-dropdown\"\n};\nconst _hoisted_3 = {\n class: \"suggestion-list\"\n};\nconst _hoisted_4 = [\"title\", \"onMousedown\"];\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_el_input = _resolveComponent(\"el-input\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createVNode(_component_el_input, {\n ref: \"inputRef\",\n modelValue: $options.inputValue,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $options.inputValue = $event),\n placeholder: $props.placeholder,\n onFocus: $options.handleFocus,\n onBlur: $options.handleBlur,\n onInput: $options.handleInput\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\", \"onInput\"]), _withDirectives(_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"ul\", _hoisted_3, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.suggestions, (item, index) => {\n return _openBlock(), _createElementBlock(\"li\", {\n key: index,\n class: \"suggestion-item\",\n title: item.value,\n onMousedown: _withModifiers($event => $options.selectItem(item), [\"prevent\"])\n }, _toDisplayString(item.value), 41, _hoisted_4);\n }), 128))])], 512), [[_vShow, $data.dropdownVisible && $data.suggestions.length > 0]])], 512);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.filter.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.map.js\";\nimport axios from '@/utils/axios';\nexport default {\n name: 'DirectorySuggestionInput',\n props: {\n modelValue: {\n type: String,\n default: ''\n },\n placeholder: {\n type: String,\n default: ''\n }\n },\n emits: ['update:modelValue', 'focus', 'blur', 'select'],\n data() {\n return {\n directoryTreeRoot: null,\n directoryTreeLoaded: false,\n directoryTreeLoading: false,\n directoryChildrenMap: {},\n focusTime: null,\n dropdownVisible: false,\n isFocused: false,\n suggestions: []\n };\n },\n computed: {\n inputValue: {\n get() {\n return this.modelValue;\n },\n set(val) {\n this.$emit('update:modelValue', val);\n }\n }\n },\n watch: {\n modelValue() {\n // 外部修改 modelValue 时也刷新建议\n if (this.isFocused) {\n this.refreshSuggestions();\n }\n }\n },\n methods: {\n handleFocus() {\n this.isFocused = true;\n this.focusTime = Date.now();\n this.ensureDirectoryTreeLoaded();\n this.$emit('focus');\n setTimeout(() => {\n if (this.isFocused) {\n this.refreshSuggestions();\n this.dropdownVisible = true;\n }\n }, 500);\n },\n handleBlur() {\n this.isFocused = false;\n this.dropdownVisible = false;\n this.$emit('blur');\n },\n handleInput(val) {\n // val 是 el-input @input 事件传来的最新值\n this.$nextTick(() => {\n this.refreshSuggestions();\n if (this.isFocused) {\n this.dropdownVisible = true;\n }\n });\n },\n selectItem(item) {\n const path = item.value;\n this.inputValue = path;\n this.$emit('select', path);\n const normalizedPath = this.normalizeDirectoryPath(path);\n const children = this.directoryChildrenMap[normalizedPath];\n if (children && children.length > 0) {\n this.$nextTick(() => {\n this.refreshSuggestions();\n this.dropdownVisible = true;\n this.$refs.inputRef?.focus();\n });\n } else {\n this.dropdownVisible = false;\n }\n },\n refreshSuggestions() {\n this.suggestions = this.getDirectorySuggestions(this.modelValue || '');\n },\n normalizeDirectoryPath(path) {\n if (!path) return '/';\n let normalized = path;\n if (!normalized.startsWith('/')) normalized = '/' + normalized;\n if (normalized !== '/' && !normalized.endsWith('/')) normalized += '/';\n return normalized;\n },\n buildDirectoryChildrenMap(treeRoot) {\n const map = {};\n const walk = node => {\n const parentPath = this.normalizeDirectoryPath(node.path);\n const children = Array.isArray(node.children) ? node.children : [];\n map[parentPath] = children.map(child => ({\n name: child.name,\n path: this.normalizeDirectoryPath(child.path)\n }));\n children.forEach(walk);\n };\n walk(treeRoot);\n this.directoryChildrenMap = map;\n },\n async ensureDirectoryTreeLoaded() {\n if (this.directoryTreeLoaded || this.directoryTreeLoading) return;\n this.directoryTreeLoading = true;\n try {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n const tree = response?.data?.tree;\n if (tree) {\n this.directoryTreeRoot = tree;\n this.buildDirectoryChildrenMap(tree);\n this.directoryTreeLoaded = true;\n }\n } catch (error) {\n console.error('Failed to load directory tree for autocomplete:', error);\n } finally {\n this.directoryTreeLoading = false;\n }\n },\n parseDirectoryQuery(value) {\n const normalizedInput = value && value.startsWith('/') ? value : `/${value || ''}`;\n const raw = normalizedInput.slice(1);\n const parts = raw.split('/');\n const segmentInput = parts[parts.length - 1] || '';\n const parentSegments = parts.slice(0, -1).filter(Boolean);\n const parentPath = parentSegments.length > 0 ? `/${parentSegments.join('/')}/` : '/';\n return {\n segmentInput,\n parentPath\n };\n },\n getDirectorySuggestions(queryString) {\n const {\n segmentInput,\n parentPath\n } = this.parseDirectoryQuery(queryString);\n const parentChildren = this.directoryChildrenMap[parentPath] || [];\n if (!segmentInput) {\n return parentChildren.slice(0, 10).map(item => ({\n value: item.path\n }));\n }\n const keyword = segmentInput.toLowerCase();\n return parentChildren.filter(item => item.name.toLowerCase().startsWith(keyword)).slice(0, 10).map(item => ({\n value: item.path\n }));\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectorySuggestionInput.vue?vue&type=template&id=0ff63416&scoped=true\"\nimport script from \"./DirectorySuggestionInput.vue?vue&type=script&lang=js\"\nexport * from \"./DirectorySuggestionInput.vue?vue&type=script&lang=js\"\n\nimport \"./DirectorySuggestionInput.vue?vue&type=style&index=0&id=0ff63416&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-0ff63416\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock } from \"vue\";\nconst _hoisted_1 = {\n class: \"container\"\n};\nconst _hoisted_2 = {\n class: \"upload-home\"\n};\nconst _hoisted_3 = {\n class: \"toolbar-manage\"\n};\nconst _hoisted_4 = {\n class: \"toolbar\"\n};\nconst _hoisted_5 = {\n class: \"header\"\n};\nconst _hoisted_6 = {\n class: \"title\"\n};\nconst _hoisted_7 = {\n class: \"main-title\",\n href: \"https://github.com/MarSeventh/CloudFlare-ImgBed\",\n target: \"_blank\"\n};\nconst _hoisted_8 = {\n class: \"dialog-section\"\n};\nconst _hoisted_9 = {\n class: \"section-header\"\n};\nconst _hoisted_10 = {\n class: \"section-title\"\n};\nconst _hoisted_11 = {\n class: \"section-content\"\n};\nconst _hoisted_12 = {\n class: \"dialog-section\"\n};\nconst _hoisted_13 = {\n class: \"section-header\"\n};\nconst _hoisted_14 = {\n class: \"section-title\"\n};\nconst _hoisted_15 = {\n class: \"section-content\"\n};\nconst _hoisted_16 = {\n class: \"setting-item\"\n};\nconst _hoisted_17 = {\n class: \"setting-label\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"setting-item\"\n};\nconst _hoisted_19 = {\n class: \"setting-label\"\n};\nconst _hoisted_20 = {\n class: \"dialog-action\"\n};\nconst _hoisted_21 = [\"innerHTML\"];\nconst _hoisted_22 = {\n class: \"dialog-footer\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_ToggleDark = _resolveComponent(\"ToggleDark\");\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_dropdown_item = _resolveComponent(\"el-dropdown-item\");\n const _component_el_dropdown_menu = _resolveComponent(\"el-dropdown-menu\");\n const _component_el_dropdown = _resolveComponent(\"el-dropdown\");\n const _component_DirectorySuggestionInput = _resolveComponent(\"DirectorySuggestionInput\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_DirectoryTreePicker = _resolveComponent(\"DirectoryTreePicker\");\n const _component_el_tooltip = _resolveComponent(\"el-tooltip\");\n const _component_Logo = _resolveComponent(\"Logo\");\n const _component_UploadForm = _resolveComponent(\"UploadForm\");\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_dialog = _resolveComponent(\"el-dialog\");\n const _component_UploadSettingsDialog = _resolveComponent(\"UploadSettingsDialog\");\n const _component_Footer = _resolveComponent(\"Footer\");\n const _component_UploadHistory = _resolveComponent(\"UploadHistory\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createVNode(_component_ToggleDark, {\n class: \"toggle-dark-button desktop-only\"\n }), _createVNode(_component_el_dropdown, {\n class: \"more-dropdown desktop-only\",\n trigger: \"click\",\n onCommand: $options.handleDesktopMenuCommand\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"showHistory\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.history')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showAnnouncement\",\n disabled: !$options.announcementAvailable\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"bullhorn\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.announcement')), 1)]),\n _: 1\n }, 8, [\"disabled\"]), _createVNode(_component_el_dropdown_item, {\n command: \"toggleLanguage\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.locale === 'zh-CN' ? 'English' : '简体中文'), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"viewDocs\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"book\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.viewDocs')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"more-button\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ellipsis-v\",\n size: \"lg\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"onCommand\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-folder-container\", {\n 'no-announcement': !$options.announcementAvailable\n }])\n }, [_createElementVNode(\"div\", {\n class: _normalizeClass([\"upload-folder\", {\n 'active': $data.isFolderInputActive\n }])\n }, [$options.showDirectorySuggestions ? (_openBlock(), _createBlock(_component_DirectorySuggestionInput, {\n key: 0,\n modelValue: $data.uploadFolder,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.uploadFolder = $event),\n class: \"inner-folder-input\",\n placeholder: _ctx.$t('upload.folderPlaceholder'),\n onFocus: $options.handleFolderInputFocus,\n onBlur: $options.handleFolderInputBlur,\n onSelect: $options.handleDirectorySelect\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\", \"onSelect\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 1,\n class: \"inner-folder-input\",\n modelValue: $data.uploadFolder,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.uploadFolder = $event),\n placeholder: _ctx.$t('upload.folderPlaceholder'),\n onFocus: $options.handleFolderInputFocus,\n onBlur: $options.handleFolderInputBlur\n }, null, 8, [\"modelValue\", \"placeholder\", \"onFocus\", \"onBlur\"]))], 2), $options.showDirectorySuggestions ? (_openBlock(), _createBlock(_component_DirectoryTreePicker, {\n key: 0,\n \"current-directory\": $data.uploadFolder,\n source: \"upload\",\n onSelect: $options.handleDirectorySelect\n }, {\n trigger: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"directory-tree-trigger\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"folder-tree\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"current-directory\", \"onSelect\"])) : _createCommentVNode(\"\", true)], 2), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('upload.switchUploadMethod'),\n placement: \"bottom\",\n disabled: $options.disableTooltip\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"upload-method-button desktop-only\",\n onClick: $options.handleChangeUploadMethod\n }, {\n default: _withCtx(() => [$data.uploadMethod === 'default' ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"folder-open\",\n class: \"upload-method-icon\",\n size: \"lg\"\n })) : $data.uploadMethod === 'paste' ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"paste\",\n class: \"upload-method-icon\",\n size: \"lg\"\n })) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"content\", \"disabled\"]), _createVNode(_component_el_dropdown, {\n class: \"mobile-more-dropdown mobile-only\",\n trigger: \"click\",\n onCommand: $options.handleMobileMenuCommand\n }, {\n dropdown: _withCtx(() => [_createVNode(_component_el_dropdown_menu, null, {\n default: _withCtx(() => [_createVNode(_component_el_dropdown_item, {\n command: \"toggleTheme\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $options.getThemeIcon(),\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($options.getThemeText()), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"toggleUploadMethod\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $data.uploadMethod === 'default' ? 'paste' : 'folder-open',\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString($data.uploadMethod === 'default' ? _ctx.$t('upload.pasteUpload') : _ctx.$t('upload.fileUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showHistory\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"history\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.history')), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"showAnnouncement\",\n disabled: !$options.announcementAvailable\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"bullhorn\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.announcement')), 1)]),\n _: 1\n }, 8, [\"disabled\"]), _createVNode(_component_el_dropdown_item, {\n command: \"toggleLanguage\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"globe\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.locale === 'zh-CN' ? 'English' : '简体中文'), 1)]),\n _: 1\n }), _createVNode(_component_el_dropdown_item, {\n command: \"viewDocs\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"book\",\n style: {\n \"width\": \"16px\",\n \"margin-right\": \"8px\",\n \"text-align\": \"center\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('upload.viewDocs')), 1)]),\n _: 1\n })]),\n _: 1\n })]),\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: \"mobile-more-button\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"ellipsis-v\",\n size: \"lg\"\n })]),\n _: 1\n })]),\n _: 1\n }, 8, [\"onCommand\"]), _createElementVNode(\"div\", _hoisted_3, [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-manage-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.handleOpenToolbar,\n circle: \"\"\n }, {\n default: _withCtx(() => [!$data.isToolBarOpen ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"bars\",\n class: \"manage-icon\",\n size: \"lg\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"times\",\n class: \"manage-icon\",\n size: \"lg\"\n }))]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.settings'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button compress-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.openCompressDialog,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cloud-upload\",\n class: \"compress-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.linkFormat'),\n placement: \"left\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button link-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.openUrlDialog,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"link-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.manage'),\n placement: \"left\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button config-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.handleManage,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"cog\",\n class: \"config-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"]), _createVNode(_component_el_tooltip, {\n disabled: $options.disableTooltip,\n content: _ctx.$t('upload.logout'),\n placement: \"left\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n class: _normalizeClass([\"toolbar-button sign-out-button\", {\n 'active': $data.isToolBarOpen\n }]),\n size: \"large\",\n onClick: $options.handleLogout,\n circle: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sign-out-alt\",\n class: \"sign-out-icon\",\n size: \"lg\"\n })]),\n _: 1\n }, 8, [\"class\", \"onClick\"])]),\n _: 1\n }, 8, [\"disabled\", \"content\"])]), _createVNode(_component_Logo, {\n useConfigLink: true\n }), _createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"h1\", _hoisted_6, [_createElementVNode(\"a\", _hoisted_7, _toDisplayString($options.ownerName), 1), _cache[21] || (_cache[21] = _createTextVNode(\" ImgHub\", -1))])]), _createVNode(_component_UploadForm, {\n selectedUrlForm: $data.selectedUrlForm,\n customerCompress: $data.customerCompress,\n compressQuality: $data.compressQuality,\n compressBar: $data.compressBar,\n serverCompress: $data.serverCompress,\n uploadChannel: $data.uploadChannel,\n channelName: $data.channelName,\n uploadNameType: $data.uploadNameType,\n useCustomUrl: $data.useCustomUrl,\n customUrlPrefix: $data.customUrlPrefix,\n autoRetry: $data.autoRetry,\n urlPrefix: $options.urlPrefix,\n uploadMethod: $data.uploadMethod,\n uploadFolder: $data.uploadFolder,\n convertToWebp: $data.convertToWebp,\n class: \"upload\"\n }, null, 8, [\"selectedUrlForm\", \"customerCompress\", \"compressQuality\", \"compressBar\", \"serverCompress\", \"uploadChannel\", \"channelName\", \"uploadNameType\", \"useCustomUrl\", \"customUrlPrefix\", \"autoRetry\", \"urlPrefix\", \"uploadMethod\", \"uploadFolder\", \"convertToWebp\"]), _createVNode(_component_el_dialog, {\n title: _ctx.$t('settings.linkFormatTitle'),\n modelValue: $data.showUrlDialog,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.showUrlDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n class: \"settings-dialog\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, [_createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.$t('settings.defaultCopyLink')), 1)]), _createElementVNode(\"div\", _hoisted_11, [_createVNode(_component_el_radio_group, {\n modelValue: $data.selectedUrlForm,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.selectedUrlForm = $event),\n onChange: $options.changeUrlForm,\n class: \"radio-card-group grid-2x2\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_radio, {\n value: \"url\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"radio-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('settings.rawLink')), 1)]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"md\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code\",\n class: \"radio-icon\"\n }), _cache[22] || (_cache[22] = _createElementVNode(\"span\", null, \"MarkDown\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"html\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\",\n class: \"radio-icon\"\n }), _cache[23] || (_cache[23] = _createElementVNode(\"span\", null, \"HTML\", -1))]),\n _: 1\n }), _createVNode(_component_el_radio, {\n value: \"ubb\",\n class: \"radio-card\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"quote-right\",\n class: \"radio-icon\"\n }), _cache[24] || (_cache[24] = _createElementVNode(\"span\", null, \"BBCode\", -1))]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])])]), _createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"div\", _hoisted_13, [_createElementVNode(\"span\", _hoisted_14, _toDisplayString(_ctx.$t('settings.customLink')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('settings.customLinkTooltip'),\n placement: \"top\",\n \"raw-content\": \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"section-help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, [_createElementVNode(\"span\", _hoisted_17, _toDisplayString(_ctx.$t('settings.enableCustom')), 1), _createVNode(_component_el_switch, {\n modelValue: $data.useCustomUrl,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.useCustomUrl = $event),\n \"active-value\": \"true\",\n \"inactive-value\": \"false\"\n }, null, 8, [\"modelValue\"])]), $data.useCustomUrl === 'true' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createElementVNode(\"span\", _hoisted_19, _toDisplayString(_ctx.$t('settings.customPrefix')), 1), _createVNode(_component_el_input, {\n modelValue: $data.customUrlPrefix,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.customUrlPrefix = $event),\n placeholder: _ctx.$t('settings.customPrefixPlaceholder'),\n class: \"setting-input\"\n }, null, 8, [\"modelValue\", \"placeholder\"])])) : _createCommentVNode(\"\", true)])]), _createElementVNode(\"div\", _hoisted_20, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[5] || (_cache[5] = $event => $data.showUrlDialog = false),\n class: \"confirm-btn\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('settings.confirm')), 1)]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_UploadSettingsDialog, {\n modelValue: $data.showCompressDialog,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.showCompressDialog = $event),\n uploadChannel: $data.uploadChannel,\n \"onUpdate:uploadChannel\": _cache[8] || (_cache[8] = $event => $data.uploadChannel = $event),\n channelName: $data.channelName,\n \"onUpdate:channelName\": _cache[9] || (_cache[9] = $event => $data.channelName = $event),\n currentChannelList: $options.currentChannelList,\n uploadFolder: $data.uploadFolder,\n \"onUpdate:uploadFolder\": _cache[10] || (_cache[10] = $event => $data.uploadFolder = $event),\n autoRetry: $data.autoRetry,\n \"onUpdate:autoRetry\": _cache[11] || (_cache[11] = $event => $data.autoRetry = $event),\n uploadNameType: $data.uploadNameType,\n \"onUpdate:uploadNameType\": _cache[12] || (_cache[12] = $event => $data.uploadNameType = $event),\n convertToWebp: $data.convertToWebp,\n \"onUpdate:convertToWebp\": _cache[13] || (_cache[13] = $event => $data.convertToWebp = $event),\n customerCompress: $data.customerCompress,\n \"onUpdate:customerCompress\": _cache[14] || (_cache[14] = $event => $data.customerCompress = $event),\n compressBar: $data.compressBar,\n \"onUpdate:compressBar\": _cache[15] || (_cache[15] = $event => $data.compressBar = $event),\n compressQuality: $data.compressQuality,\n \"onUpdate:compressQuality\": _cache[16] || (_cache[16] = $event => $data.compressQuality = $event),\n serverCompress: $data.serverCompress,\n \"onUpdate:serverCompress\": _cache[17] || (_cache[17] = $event => $data.serverCompress = $event)\n }, null, 8, [\"modelValue\", \"uploadChannel\", \"channelName\", \"currentChannelList\", \"uploadFolder\", \"autoRetry\", \"uploadNameType\", \"convertToWebp\", \"customerCompress\", \"compressBar\", \"compressQuality\", \"serverCompress\"])]), _createVNode(_component_Footer, {\n class: \"footer\"\n }), _createVNode(_component_el_dialog, {\n title: _ctx.$t('upload.announcementTitle'),\n modelValue: $data.showAnnouncementDialog,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.showAnnouncementDialog = $event),\n width: $options.dialogWidth,\n \"show-close\": false,\n \"close-on-click-modal\": false,\n \"close-on-press-escape\": false,\n center: \"\"\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_22, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[18] || (_cache[18] = $event => $data.showAnnouncementDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('upload.announcementAck')), 1)]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", {\n innerHTML: $data.announcementContent\n }, null, 8, _hoisted_21)]),\n _: 1\n }, 8, [\"title\", \"modelValue\", \"width\"]), _createVNode(_component_UploadHistory, {\n show: $data.showHistory,\n onClose: _cache[20] || (_cache[20] = $event => $data.showHistory = false)\n }, null, 8, [\"show\"])]);\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.iterator.some.js\";\nimport UploadForm from '@/components/upload/UploadForm.vue';\nimport Footer from '@/components/Footer.vue';\nimport ToggleDark from '@/components/ToggleDark.vue';\nimport Logo from '@/components/Logo.vue';\nimport { setLocale } from '@/locales';\nimport UploadHistory from '@/components/upload/UploadHistory.vue';\nimport UploadSettingsDialog from '@/components/upload/UploadSettingsDialog.vue';\nimport DirectoryTreePicker from '@/components/DirectoryTreePicker.vue';\nimport DirectorySuggestionInput from '@/components/DirectorySuggestionInput.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nimport axios from '@/utils/axios';\nimport { ref } from 'vue';\nimport { mapGetters } from 'vuex';\nimport { validateFolderPath } from '@/utils/pathValidator';\nexport default {\n name: 'UploadHome',\n mixins: [backgroundManager],\n data() {\n return {\n selectedUrlForm: ref(''),\n showUrlDialog: false,\n showCompressDialog: false,\n customerCompress: true,\n //上传前压缩\n compressQuality: 4,\n //压缩后大小\n compressBar: 5,\n //压缩阈值\n convertToWebp: false,\n //转换为WebP格式\n serverCompress: true,\n //服务器端压缩\n uploadChannel: '',\n //上传渠道\n channelName: '',\n //指定的渠道名称\n availableChannels: {},\n //可用渠道列表\n uploadNameType: '',\n //上传文件命名方式\n customUrlPrefix: '',\n //自定义链接前缀\n useCustomUrl: 'false',\n //是否启用自定义链接格式\n autoRetry: true,\n //失败自动切换\n useDefaultWallPaper: false,\n isToolBarOpen: false,\n //是否打开工具栏\n uploadMethod: 'default',\n //上传方式\n uploadFolder: '',\n // 上传文件夹\n isFolderInputActive: false,\n showAnnouncementDialog: false,\n // 控制公告弹窗的显示\n announcementContent: '',\n // 公告内容\n showHistory: false,\n themeMode: 'auto' // 主题模式:light, dark, auto\n };\n },\n watch: {\n customerCompress(val) {\n this.updateCompressConfig('customerCompress', val);\n },\n compressQuality(val) {\n this.updateCompressConfig('compressQuality', val);\n },\n compressBar(val) {\n // 确保值在有效范围内\n if (val === null || val === undefined || val < 1) {\n this.compressBar = 1;\n return;\n }\n // 确保期望大小不超过压缩阈值\n if (this.compressQuality > val) {\n this.compressQuality = val;\n }\n this.updateCompressConfig('compressBar', val);\n },\n serverCompress(val) {\n this.updateCompressConfig('serverCompress', val);\n },\n convertToWebp(val) {\n this.updateCompressConfig('convertToWebp', val);\n },\n uploadChannel(val) {\n this.updateStoreUploadChannel(val);\n // 切换渠道类型时,检查持久化的渠道名是否在新渠道列表中\n const newChannelList = this.availableChannels[val] || [];\n const savedChannelName = this.storeChannelName;\n if (savedChannelName && newChannelList.some(ch => ch.name === savedChannelName)) {\n // 持久化的渠道名在新渠道列表中,恢复它\n this.channelName = savedChannelName;\n } else {\n // 否则清空\n this.channelName = '';\n }\n },\n channelName(val) {\n // 确保清空时保存空字符串而不是null\n this.$store.commit('setStoreChannelName', val || '');\n },\n uploadNameType(val) {\n this.updateStoreUploadNameType(val);\n },\n customUrlPrefix(val) {\n this.$store.commit('setCustomUrlSettings', {\n key: 'customUrlPrefix',\n value: val\n });\n },\n useCustomUrl(val) {\n this.$store.commit('setCustomUrlSettings', {\n key: 'useCustomUrl',\n value: val\n });\n },\n autoRetry(val) {\n this.$store.commit('setStoreAutoRetry', val);\n },\n uploadFolder(val) {\n // 实时输入时用非 strict 模式,不检查末尾的单独 . 以允许继续输入如 .123\n if (this.validateUploadFolder(val, false)) {\n // 非 strict 通过后,再用 strict 模式静默检查,只有完全合法才更新 store\n const strictResult = validateFolderPath(val, {\n strict: true\n });\n if (strictResult.valid) {\n this.$store.commit('setStoreUploadFolder', val);\n }\n // strict 不通过时不更新 store,等失焦时提示并回滚\n } else {\n this.$nextTick(() => {\n this.uploadFolder = this.storeUploadFolder;\n });\n }\n }\n },\n computed: {\n ...mapGetters(['userConfig', 'uploadCopyUrlForm', 'compressConfig', 'storeUploadChannel', 'storeChannelName', 'storeUploadNameType', 'customUrlSettings', 'storeAutoRetry', 'storeUploadMethod', 'storeUploadFolder']),\n ownerName() {\n return this.userConfig?.ownerName || 'Sanyue';\n },\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n disableTooltip() {\n return window.innerWidth < 768;\n },\n urlPrefix() {\n // 全局自定义链接前缀\n return this.userConfig?.urlPrefix || `${window.location.protocol}//${window.location.host}/file/`;\n },\n announcementAvailable() {\n return !!this.userConfig?.announcement;\n },\n // 是否显示目录候选项(从 userConfig 获取)\n showDirectorySuggestions() {\n return this.userConfig?.showDirectorySuggestions ?? false;\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.uploadChannel] || [];\n }\n },\n mounted() {\n // 初始化背景图,启用自动创建元素\n this.initializeBackground('uploadBkImg', '.container', false, true);\n\n // 读取用户选择的链接格式\n this.selectedUrlForm = this.uploadCopyUrlForm || 'url';\n // 读取用户选择的压缩设置(优先用户设置,其次系统默认配置)\n this.customerCompress = this.compressConfig.customerCompress ?? this.parseBoolean(this.userConfig?.defaultCustomerCompress, true);\n this.compressQuality = this.compressConfig.compressQuality ?? this.parseNumber(this.userConfig?.defaultCompressQuality, 4);\n this.compressBar = this.compressConfig.compressBar ?? this.parseNumber(this.userConfig?.defaultCompressBar, 5);\n this.serverCompress = this.compressConfig.serverCompress ?? true;\n this.convertToWebp = this.compressConfig.convertToWebp ?? this.parseBoolean(this.userConfig?.defaultConvertToWebp, false);\n // 读取用户选择的上传渠道\n this.uploadChannel = this.storeUploadChannel || this.userConfig?.defaultUploadChannel || 'telegram';\n // 用户定义的失败自动切换\n this.autoRetry = this.storeAutoRetry;\n // 读取用户选择的上传文件命名方式\n this.uploadNameType = this.storeUploadNameType || this.userConfig?.defaultUploadNameType || 'default';\n // 读取用户自定义链接格式\n this.customUrlPrefix = this.customUrlSettings.customUrlPrefix;\n this.useCustomUrl = this.customUrlSettings.useCustomUrl;\n // 读取用户偏好的上传方式\n this.uploadMethod = this.storeUploadMethod;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\n // 读取用户设置的上传文件夹\n this.uploadFolder = this.storeUploadFolder || this.userConfig?.defaultUploadFolder || '';\n\n // 从 Vuex store 读取主题模式状态\n const cusDarkMode = this.$store.getters.cusDarkMode;\n const useDarkMode = this.$store.getters.useDarkMode;\n if (!cusDarkMode) {\n this.themeMode = 'auto';\n } else if (useDarkMode) {\n this.themeMode = 'dark';\n } else {\n this.themeMode = 'light';\n }\n\n // 首次访问公告\n const visited = localStorage.getItem('visitedUploadHome');\n const announcement = this.userConfig?.announcement;\n if (!visited && announcement) {\n this.announcementContent = announcement;\n this.showAnnouncementDialog = true;\n localStorage.setItem('visitedUploadHome', 'true');\n }\n },\n components: {\n UploadForm,\n Footer,\n ToggleDark,\n Logo,\n UploadHistory,\n UploadSettingsDialog,\n DirectoryTreePicker,\n DirectorySuggestionInput\n },\n methods: {\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels', {\n withAuthCode: true\n });\n if (response.data) {\n this.availableChannels = response.data;\n // 恢复渠道名称:优先持久化的值,其次系统默认配置\n const savedChannelName = this.storeChannelName;\n const defaultChannelName = this.userConfig?.defaultChannelName;\n const currentChannelList = this.availableChannels[this.uploadChannel] || [];\n\n // 如果用户主动清空过(savedChannelName === ''),则保持为空\n // 如果从未选择过(savedChannelName === null/undefined),则使用默认值\n if (savedChannelName && currentChannelList.some(ch => ch.name === savedChannelName)) {\n this.channelName = savedChannelName;\n } else if (savedChannelName === '' || savedChannelName === null || savedChannelName === undefined) {\n // 用户主动清空或从未选择,检查是否使用默认值\n if (savedChannelName !== '' && defaultChannelName && currentChannelList.some(ch => ch.name === defaultChannelName)) {\n this.channelName = defaultChannelName;\n }\n // 如果 savedChannelName === '',说明用户主动清空,保持为空\n }\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n },\n // 验证上传文件夹路径的合法性\n validateUploadFolder(path, strict = true) {\n // 自动补全前导 /\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n this.uploadFolder = path;\n }\n const result = validateFolderPath(path, {\n strict\n });\n if (!result.valid) {\n this.$message.error(result.error);\n return false;\n }\n return true;\n },\n handleFolderInputFocus() {\n this.isFolderInputActive = true;\n },\n handleFolderInputBlur() {\n this.isFolderInputActive = false;\n // 失焦时自动补全前导 /\n if (this.uploadFolder && !this.uploadFolder.startsWith('/')) {\n this.uploadFolder = '/' + this.uploadFolder;\n }\n // 失焦时做完整校验(包括末尾单独的 .)\n if (!this.validateUploadFolder(this.uploadFolder, true)) {\n this.$nextTick(() => {\n this.uploadFolder = this.storeUploadFolder;\n });\n }\n },\n handleManage() {\n this.$router.push('/dashboard');\n },\n // 解析布尔值\n parseBoolean(value, defaultValue) {\n if (value === undefined || value === null) return defaultValue;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value === 'true';\n return defaultValue;\n },\n // 解析数字\n parseNumber(value, defaultValue) {\n if (value === undefined || value === null) return defaultValue;\n const num = parseFloat(value);\n return isNaN(num) ? defaultValue : num;\n },\n openUrlDialog() {\n this.showUrlDialog = true;\n },\n handleLogout() {\n axios.post('/api/auth/logout', {\n authType: 'user'\n }, {\n withCredentials: true\n }).finally(() => {\n this.$store.commit('setUserLoggedIn', false);\n this.$router.push('/login');\n this.$message.success(this.$t('upload.logoutSuccess'));\n });\n },\n changeUrlForm() {\n this.$store.commit('setUploadCopyUrlForm', this.selectedUrlForm);\n },\n openCompressDialog() {\n this.showCompressDialog = true;\n },\n updateCompressConfig(key, value) {\n this.$store.commit('setCompressConfig', {\n key,\n value\n });\n },\n updateStoreUploadChannel(value) {\n this.$store.commit('setStoreUploadChannel', value);\n },\n updateStoreUploadNameType(value) {\n this.$store.commit('setStoreUploadNameType', value);\n },\n handleOpenToolbar() {\n this.isToolBarOpen = !this.isToolBarOpen;\n // 等过渡动画结束,向active类添加pointer-events属性,使其可以点击\n setTimeout(() => {\n const buttons = document.querySelectorAll('.toolbar-button');\n buttons.forEach(button => {\n button.style.pointerEvents = this.isToolBarOpen ? 'auto' : 'none';\n });\n }, 300);\n },\n handleChangeUploadMethod() {\n this.uploadMethod = this.uploadMethod === 'default' ? 'paste' : 'default';\n this.$store.commit('setUploadMethod', this.uploadMethod);\n },\n handleMobileMenuCommand(command) {\n if (command === 'toggleTheme') {\n // 循环切换:auto -> light -> dark -> auto\n if (this.themeMode === 'auto') {\n // 切换到亮色\n this.themeMode = 'light';\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', false);\n } else if (this.themeMode === 'light') {\n // 切换到暗色\n this.themeMode = 'dark';\n this.$store.commit('setCusDarkMode', true);\n this.$store.commit('setUseDarkMode', true);\n } else {\n // 切换到自动\n this.themeMode = 'auto';\n this.$store.commit('setCusDarkMode', false);\n }\n } else if (command === 'toggleUploadMethod') {\n this.handleChangeUploadMethod();\n } else if (command === 'viewDocs') {\n window.open('https://cfbed.sanyue.de/qa/', '_blank');\n } else if (command === 'showHistory') {\n this.showHistory = true;\n } else if (command === 'showAnnouncement') {\n this.handleShowAnnouncement();\n } else if (command === 'toggleLanguage') {\n const next = this.$i18n.locale === 'zh-CN' ? 'en' : 'zh-CN';\n setLocale(next);\n }\n },\n handleDesktopMenuCommand(command) {\n if (command === 'viewDocs') {\n window.open('https://cfbed.sanyue.de/qa/', '_blank');\n } else if (command === 'showHistory') {\n this.showHistory = true;\n } else if (command === 'showAnnouncement') {\n this.handleShowAnnouncement();\n } else if (command === 'toggleLanguage') {\n const next = this.$i18n.locale === 'zh-CN' ? 'en' : 'zh-CN';\n setLocale(next);\n }\n },\n getThemeIcon() {\n // 显示下一个模式的图标\n if (this.themeMode === 'auto') return 'sun'; // auto -> light\n if (this.themeMode === 'light') return 'moon'; // light -> dark\n return 'adjust'; // dark -> auto\n },\n getThemeText() {\n // 显示下一个模式的文字\n if (this.themeMode === 'auto') return this.$t('theme.lightMode');\n if (this.themeMode === 'light') return this.$t('theme.darkMode');\n return this.$t('theme.autoMode');\n },\n handleShowAnnouncement() {\n const announcement = this.userConfig?.announcement;\n if (announcement) {\n this.announcementContent = announcement;\n this.showAnnouncementDialog = true;\n } else {\n this.$message.info(this.$t('upload.noAnnouncement'));\n }\n },\n // 处理目录选择\n handleDirectorySelect(path) {\n // 填入选择的目录路径\n this.uploadFolder = path;\n // 触发路径验证逻辑\n if (this.validateUploadFolder(path, true)) {\n this.$store.commit('setStoreUploadFolder', path);\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./UploadHome.vue?vue&type=template&id=f50dcc42&scoped=true\"\nimport script from \"./UploadHome.vue?vue&type=script&lang=js\"\nexport * from \"./UploadHome.vue?vue&type=script&lang=js\"\n\nimport \"./UploadHome.vue?vue&type=style&index=0&id=f50dcc42&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-f50dcc42\"]])\n\nexport default __exports__","import { renderSlot as _renderSlot, withModifiers as _withModifiers, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createBlock as _createBlock, resolveDirective as _resolveDirective, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\";\nconst _hoisted_1 = {\n class: \"directory-tree-picker\"\n};\nconst _hoisted_2 = {\n class: \"tree-container\"\n};\nconst _hoisted_3 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_4 = {\n class: \"error-text\"\n};\nconst _hoisted_5 = {\n class: \"node-label\"\n};\nconst _hoisted_6 = {\n class: \"tree-container\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"error-state\"\n};\nconst _hoisted_8 = {\n class: \"error-text\"\n};\nconst _hoisted_9 = {\n class: \"node-label\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tree = _resolveComponent(\"el-tree\");\n const _component_el_popover = _resolveComponent(\"el-popover\");\n const _component_el_drawer = _resolveComponent(\"el-drawer\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _openBlock(), _createElementBlock(\"div\", _hoisted_1, [$options.isDesktop ? (_openBlock(), _createBlock(_component_el_popover, {\n key: 0,\n visible: $data.popoverVisible,\n \"onUpdate:visible\": _cache[1] || (_cache[1] = $event => $data.popoverVisible = $event),\n placement: \"bottom-start\",\n width: 320,\n trigger: \"click\",\n \"popper-class\": \"directory-tree-popover\",\n \"show-arrow\": true,\n \"hide-after\": 0,\n \"show-after\": 50,\n transition: \"el-zoom-in-top\"\n }, {\n reference: _withCtx(() => [_createElementVNode(\"span\", {\n class: \"popover-trigger-wrapper\",\n onClick: _cache[0] || (_cache[0] = _withModifiers(() => {}, [\"stop\"]))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)])]),\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_2, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_4, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRef\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_5, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 3\n }, 8, [\"visible\"])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createElementVNode(\"span\", {\n class: \"drawer-trigger-wrapper\",\n onClick: _cache[2] || (_cache[2] = (...args) => $options.openDrawer && $options.openDrawer(...args))\n }, [_renderSlot(_ctx.$slots, \"trigger\", {}, undefined, true)]), _createVNode(_component_el_drawer, {\n modelValue: $data.drawerVisible,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.drawerVisible = $event),\n direction: \"btt\",\n size: \"60%\",\n \"show-close\": true,\n \"with-header\": true,\n \"z-index\": 3000,\n title: _ctx.$t('directoryTree.selectDirectory'),\n class: \"directory-tree-drawer\"\n }, {\n default: _withCtx(() => [_withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_6, [$data.error ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-circle\",\n class: \"error-icon\"\n }), _createElementVNode(\"span\", _hoisted_8, _toDisplayString($data.error), 1), _createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: $options.fetchDirectoryTree\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('directoryTree.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : (_openBlock(), _createBlock(_component_el_tree, {\n key: 1,\n ref: \"treeRefMobile\",\n data: $data.treeData,\n props: $data.treeProps,\n \"node-key\": \"path\",\n \"default-expand-all\": false,\n \"expand-on-click-node\": false,\n \"highlight-current\": true,\n \"current-node-key\": $props.currentDirectory,\n class: \"directory-tree mobile-tree\",\n onNodeClick: $options.handleNodeClick\n }, {\n default: _withCtx(({\n node,\n data\n }) => [_createElementVNode(\"span\", {\n class: _normalizeClass([\"tree-node\", {\n 'is-current': data.path === $props.currentDirectory\n }])\n }, [_createVNode(_component_font_awesome_icon, {\n icon: node.expanded ? 'folder-open' : 'folder',\n class: \"folder-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", _hoisted_9, _toDisplayString(data.name), 1)], 2)]),\n _: 1\n }, 8, [\"data\", \"props\", \"current-node-key\", \"onNodeClick\"]))])), [[_directive_loading, $data.loading]])]),\n _: 1\n }, 8, [\"modelValue\", \"title\"])], 64))]);\n}","import axios from '@/utils/axios';\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nexport default {\n name: 'DirectoryTreePicker',\n props: {\n currentDirectory: {\n type: String,\n default: ''\n },\n source: {\n type: String,\n default: 'upload',\n validator: value => ['upload', 'admin'].includes(value)\n }\n },\n data() {\n return {\n popoverVisible: false,\n drawerVisible: false,\n treeData: [],\n loading: false,\n error: '',\n treeProps: {\n children: 'children',\n label: 'name'\n },\n windowWidth: window.innerWidth\n };\n },\n computed: {\n isDesktop() {\n return this.windowWidth >= 769;\n }\n },\n watch: {\n popoverVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 弹窗关闭后延迟折叠所有节点,避免下次打开时出现折叠动画\n setTimeout(() => {\n if (!this.popoverVisible && this.$refs.treeRef) {\n const store = this.$refs.treeRef.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 200);\n }\n },\n drawerVisible(newVal) {\n if (newVal) {\n this.fetchDirectoryTree();\n } else {\n // 抽屉关闭后延迟折叠所有节点\n setTimeout(() => {\n if (!this.drawerVisible && this.$refs.treeRefMobile) {\n const store = this.$refs.treeRefMobile.store;\n for (const key in store.nodesMap) {\n store.nodesMap[key].expanded = false;\n }\n }\n }, 300);\n }\n },\n currentDirectory(newVal) {\n this.$nextTick(() => {\n if (this.$refs.treeRef && newVal) {\n this.$refs.treeRef.setCurrentKey(newVal);\n }\n if (this.$refs.treeRefMobile && newVal) {\n this.$refs.treeRefMobile.setCurrentKey(newVal);\n }\n });\n }\n },\n mounted() {\n window.addEventListener('resize', this.handleResize);\n },\n beforeUnmount() {\n window.removeEventListener('resize', this.handleResize);\n },\n methods: {\n handleResize() {\n this.windowWidth = window.innerWidth;\n },\n openDrawer() {\n this.drawerVisible = true;\n },\n async fetchDirectoryTree() {\n this.loading = true;\n this.error = '';\n try {\n let data;\n if (this.source === 'admin') {\n const response = await fetchWithAuth('/api/directoryTree', {\n method: 'GET'\n });\n if (!response.ok) {\n if (response.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.serverError');\n }\n return;\n }\n data = await response.json();\n } else {\n const response = await axios.get('/api/directoryTree', {\n withAuthCode: true\n });\n data = response.data;\n }\n if (data.tree) {\n this.treeData = [data.tree];\n } else {\n this.treeData = [];\n }\n } catch (err) {\n console.error('Failed to fetch directory tree:', err);\n if (err.response?.status === 401) {\n this.error = this.$t('directoryTree.authFailed');\n } else {\n this.error = this.$t('directoryTree.loadFailed');\n }\n } finally {\n this.loading = false;\n }\n },\n handleNodeClick(data) {\n let path = data.path;\n if (path && !path.startsWith('/')) {\n path = '/' + path;\n } else if (!path) {\n path = '/';\n }\n this.$emit('select', path);\n this.popoverVisible = false;\n this.drawerVisible = false;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./DirectoryTreePicker.vue?vue&type=template&id=62eab69a&scoped=true\"\nimport script from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\nexport * from \"./DirectoryTreePicker.vue?vue&type=script&lang=js\"\n\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=0&id=62eab69a&scoped=true&lang=css\"\nimport \"./DirectoryTreePicker.vue?vue&type=style&index=1&id=62eab69a&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-62eab69a\"]])\n\nexport default __exports__","/**\r\n * 路径验证器模块\r\n * 提供共享的文件夹路径验证功能,供 AdminDashBoard 和 UploadHome 共同使用\r\n */\r\nimport i18n from '@/locales'\r\n\r\n/**\r\n * 验证文件夹路径的合法性\r\n * @param {string} path - 要验证的路径\r\n * @param {{ strict?: boolean }} options - 选项,strict 为 true 时检查末尾单独的 \".\"(默认 true)\r\n * @returns {{ valid: boolean, error?: string }} 验证结果\r\n */\r\nexport function validateFolderPath(path, { strict = true } = {}) {\r\n // 如果路径为空或仅为空白字符,返回有效(表示根目录)\r\n if (!path || path.trim() === '') {\r\n return { valid: true };\r\n }\r\n \r\n // 如果路径仅为 \"/\",返回有效(表示根目录)\r\n if (path === '/') {\r\n return { valid: true };\r\n }\r\n \r\n // 检查路径是否以 \"/\" 开头\r\n if (!path.startsWith('/')) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.pathMustStartWithSlash') \r\n };\r\n }\r\n\r\n // 检查路径穿越:包含 .. 的路径段\r\n if (/(?:^|\\/)\\.\\.(\\/|$)/.test(path) || path.includes('..')) {\r\n return {\r\n valid: false,\r\n error: i18n.global.t('validation.pathTraversalNotAllowed')\r\n };\r\n }\r\n\r\n // 检查路径中单独的 . 段\r\n // strict 模式检查 /./ 和末尾 /.,非 strict 模式仅检查 /./ 以允许用户继续输入如 /.123\r\n const dotPattern = strict ? /\\/\\.(\\/|$)/ : /\\/\\.\\//;\r\n if (dotPattern.test(path)) {\r\n return {\r\n valid: false,\r\n error: i18n.global.t('validation.singleDotNotAllowed')\r\n };\r\n }\r\n\r\n // 检查路径是否包含连续的斜杠\r\n if (path.includes('//')) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.consecutiveSlashNotAllowed') \r\n };\r\n }\r\n \r\n // 检查路径是否包含非法字符\r\n // 非法字符包括: \\ : * ? \" ' < > | 空格 ( ) [ ] { } # % ^ ` ~ ; @ & = + $ ,\r\n const invalidChars = /[\\\\:\\*\\?\"'<>\\| \\(\\)\\[\\]\\{\\}#%\\^`~;@&=\\+\\$,]/;\r\n if (invalidChars.test(path)) {\r\n return { \r\n valid: false, \r\n error: i18n.global.t('validation.invalidCharacters') \r\n };\r\n }\r\n \r\n return { valid: true };\r\n}\r\n","import store from '@/store'\r\nimport router from '@/router'\r\n\r\nlet isRedirecting = false;\r\n\r\nexport default async function fetchWithAuth(url, options = {}) {\r\n // 开发环境下添加 /api 前缀\r\n url = process.env.NODE_ENV === 'production' ? url : `/api${url}`;\r\n\r\n // 确保包含凭据(HttpOnly Cookie 会自动携带)\r\n options.credentials = 'include';\r\n\r\n options.headers = {\r\n ...options.headers,\r\n };\r\n\r\n const response = await fetch(url, options);\r\n\r\n if (response.status === 401 && !isRedirecting) {\r\n isRedirecting = true;\r\n store.commit('setAdminLoggedIn', false);\r\n // 静默跳转登录页,不弹出错误提示(路由守卫负责认证 UX)\r\n router.push('/adminLogin').finally(() => {\r\n isRedirecting = false;\r\n });\r\n }\r\n\r\n return response;\r\n}\r\n","module.exports = require(\"./build/conversion.js\");\n"],"names":["t","e","module","exports","this","n","r","o","i","l","call","m","c","d","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","some","a","f","g","w","b","PNG","JPEG","GIF","Promise","u","next","throw","done","then","apply","toDataURL","toBlob","split","match","atob","length","Uint8Array","charCodeAt","Blob","type","Image","onload","onerror","Error","src","document","createElement","href","window","URL","createObjectURL","download","Date","now","toString","body","appendChild","createEvent","initEvent","dispatchEvent","removeChild","FileReader","onloadend","target","result","readAsDataURL","h","assign","getContext","Number","scale","width","height","orientation","rotate","Math","PI","drawImage","translate","fetch","blob","y","quality","isNaN","size","accuracy","filter","sort","abs","pow","v","_hoisted_1","class","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","key","_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","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","_component_el_button","_component_el_tooltip","show","$t","count","totalCount","content","placement","circle","onClick","toggleViewMode","icon","viewMode","_","clearHistory","$event","$emit","historyList","ref","onScroll","args","handleScroll","groupedHistory","group","date","items","item","time","isImage","name","url","loading","onError","handleImageError","isVideo","muted","copyLink","openLink","deleteItem","title","formatTime","hasMore","loadingMore","spin","props","Boolean","data","allHistory","pageSize","currentPage","watch","val","resetAndLoad","computed","groups","forEach","dateStr","getFullYear","String","getMonth","padStart","getDate","push","keys","map","mounted","savedMode","localStorage","getItem","methods","loadAllHistory","loadMore","history","JSON","parse","console","error","setTimeout","start","end","newItems","slice","container","scrollTop","scrollHeight","clientHeight","setItem","$confirm","confirmButtonText","cancelButtonText","removeItem","$message","success","catch","stringify","fileName","imageExtensions","extension","pop","toLowerCase","includes","videoExtensions","timestamp","year","month","day","hours","getHours","minutes","getMinutes","seconds","getSeconds","navigator","clipboard","writeText","open","__exports__","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_component_el_radio","_component_el_radio_group","_component_el_option","_component_el_select","_component_el_input","_component_el_switch","_component_el_slider","_component_el_input_number","_component_el_dialog","modelValue","visible","dialogWidth","uploadChannel","label","currentChannelList","channelName","placeholder","clearable","ch","uploadFolder","handleUploadFolderInput","autoRetry","uploadNameType","convertToWebp","customerCompress","compressBar","min","max","step","compressQuality","precision","serverCompress","startsWith","Array","emits","set","innerWidth","style","autoplay","playsinline","loop","_component_el_text","_component_el_progress","_component_Link","_component_el_icon","_component_Delete","file","truncated","truncateFilename","status","finalURL","readonly","selectAllText","urlSize","prepend","mdURL","htmlURL","ubbURL","percentage","progreess","IMAGE_EXTENSIONS","VIDEO_EXTENSIONS","components","Link","Delete","required","ext","filename","maxLength","lastDotIndex","lastIndexOf","substring","keepEnd","keepStart","event","message","_component_CameraFilled","_component_el_upload","_component_el_radio_button","_component_el_card","_component_List","_component_Checked","_component_Failed","_component_el_dropdown_item","_component_el_dropdown_menu","_component_el_dropdown","_component_UploadFileItem","_component_el_scrollbar","onMousemove","handleUploadCardMouseMove","onMouseleave","handleUploadCardMouseLeave","uploadMethod","uploading","fileList","drag","multiple","uploadFile","onSuccess","handleSuccess","handleError","beforeUpload","handleProgress","innerHTML","pastedUrls","rows","pasteCardMethodButtonSize","handleUploadPasteUrls","pasteUploadMethod","listScrolled","uploadingCount","waitingCount","uploadSuccessCount","uploadErrorCount","disabled","disableTooltip","copyAll","dropdown","autoReUpload","onChange","handleAutoRetryChange","retryError","clearFileList","clearSuccessList","reverse","onCopy","handleCopy","onRemove","handleRemove","onPreviewError","buildFileUrls","srcID","rootUrl","getUrlByFormat","format","md","html","ubb","updateFileListUrls","urls","K","Uint32Array","rotr","x","processBlock","block","H","W","s0","s1","S1","temp1","S0","maj","temp2","createSha256","buffer","bufferLength","totalLength","update","offset","needed","toCopy","subarray","digest","bitLength","fill","view","DataView","setUint32","floor","hex","async","computeSha256","sha256","CHUNK_SIZE","chunk","arrayBuffer","log","round","UploadFileItem","selectedUrlForm","useCustomUrl","customUrlPrefix","urlPrefix","maxUploading","exceptionList","fileListLength","uploadCount","maxRetryCount","retryTimer","retryDelay","uploadQueue","activeUploads","maxConcurrentUploads","abortControllers","Map","handler","$nextTick","$refs","scrollContainer","setScrollTop","deep","immediate","$store","commit","location","protocol","host","addEventListener","handlePaste","storeAutoReUpload","beforeUnmount","removeEventListener","find","uid","waitingItem","uploadingItem","fileItem","uploadSingleFile","HF_DIRECT_THRESHOLD","uploadToHuggingFaceDirect","DISCORD_CHUNK_THRESHOLD","uploadFileInChunks","CHUNK_THRESHOLD","processUploadQueue","nextFile","shift","onUploadComplete","needServerCompress","abortController","AbortController","formData","FormData","append","err","axios","encodeURIComponent","method","withAuthCode","signal","onUploadProgress","progressEvent","percentCompleted","loaded","total","onProgress","percent","res","code","response","finally","delete","fileSize","totalChunks","ceil","precomputedSha256","initFormData","initResponse","uploadId","maxConcurrency","chunkProgress","nextChunkIndex","hasError","errorMsg","isCancelled","uploadChunk","chunkIndex","retryCount","maxRetries","totalPercent","reduce","warn","resolve","pool","currentIndex","all","duration","mergeFormData","closeAll","cleanupUploadResources","cleanupError","has","abort","timeout","replace","saveToHistory","newRecord","scheduleAutoRetry","reject","processedFile","canConvertToWebp","convertedFile","convertImageToWebp","toFixed","needCustomCompress","isLtLim","pushFileToQueue","fileUrl","newFile","File","myUploadCount","join","controller","clear","tagName","clipboardData","uploadFromUrl","validUrls","trim","test","kind","getAsString","callback","mdUrl","htmlUrl","ubbUrl","evt","getAsFile","checkResult","text","urlPattern","post","responseType","headers","disposition","filenameRegex","filenameStarRegex","matches","exec","decodeURIComponent","pathname","retryFailedFiles","files","clearTimeout","filesToRetry","aborted","sampleBytes","fileSample","btoa","fromCharCode","uploadInfoRes","fileType","uploadInfo","alreadyExists","needsLfs","uploadAction","header","chunk_size","uploadToHuggingFaceMultipart","uploadRes","ok","commitRes","fullId","filePath","formattedResponse","completionUrl","chunkSize","parseInt","parts","completeParts","totalParts","part","DOMException","index","undefined","etag","partNumber","progress","completeResponse","oid","img","canvas","ctx","originalName","newName","webpFile","revokeObjectURL","glow","uploadCardGlow","rect","currentTarget","getBoundingClientRect","clientX","left","clientY","top","opacity","beforeDestroy","inputValue","onFocus","handleFocus","onBlur","handleBlur","onInput","handleInput","suggestions","onMousedown","selectItem","dropdownVisible","directoryTreeRoot","directoryTreeLoaded","directoryTreeLoading","directoryChildrenMap","focusTime","isFocused","refreshSuggestions","ensureDirectoryTreeLoaded","path","normalizedPath","normalizeDirectoryPath","children","inputRef","focus","getDirectorySuggestions","normalized","endsWith","buildDirectoryChildrenMap","treeRoot","walk","node","parentPath","isArray","child","tree","parseDirectoryQuery","normalizedInput","raw","segmentInput","parentSegments","queryString","parentChildren","keyword","_component_ToggleDark","_component_DirectorySuggestionInput","_component_DirectoryTreePicker","_component_Logo","_component_UploadForm","_component_UploadSettingsDialog","_component_Footer","_component_UploadHistory","trigger","onCommand","handleDesktopMenuCommand","command","announcementAvailable","$i18n","locale","isFolderInputActive","showDirectorySuggestions","handleFolderInputFocus","handleFolderInputBlur","onSelect","handleDirectorySelect","source","handleChangeUploadMethod","handleMobileMenuCommand","getThemeIcon","getThemeText","isToolBarOpen","handleOpenToolbar","openCompressDialog","openUrlDialog","handleManage","handleLogout","useConfigLink","ownerName","showUrlDialog","changeUrlForm","showCompressDialog","showAnnouncementDialog","center","footer","announcementContent","showHistory","onClose","mixins","backgroundManager","availableChannels","useDefaultWallPaper","themeMode","updateCompressConfig","updateStoreUploadChannel","newChannelList","savedChannelName","storeChannelName","updateStoreUploadNameType","validateUploadFolder","strictResult","strict","valid","storeUploadFolder","userConfig","announcement","initializeBackground","uploadCopyUrlForm","compressConfig","parseBoolean","defaultCustomerCompress","parseNumber","defaultCompressQuality","defaultCompressBar","defaultConvertToWebp","storeUploadChannel","defaultUploadChannel","storeAutoRetry","storeUploadNameType","defaultUploadNameType","customUrlSettings","storeUploadMethod","fetchAvailableChannels","defaultUploadFolder","cusDarkMode","getters","useDarkMode","visited","UploadForm","Footer","ToggleDark","Logo","UploadHistory","UploadSettingsDialog","DirectoryTreePicker","DirectorySuggestionInput","defaultChannelName","$router","defaultValue","num","parseFloat","authType","withCredentials","buttons","querySelectorAll","button","pointerEvents","handleShowAnnouncement","info","_component_el_tree","_component_el_popover","_component_el_drawer","_directive_loading","isDesktop","popoverVisible","transition","reference","$slots","fetchDirectoryTree","treeData","treeProps","currentDirectory","onNodeClick","handleNodeClick","expanded","openDrawer","drawerVisible","direction","validator","windowWidth","newVal","treeRef","store","nodesMap","treeRefMobile","setCurrentKey","handleResize","fetchWithAuth","json","validateFolderPath","i18n","global","dotPattern","invalidChars","isRedirecting","options","credentials","router"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/731.90070be6.js.map.gz b/frontend-dist/js/731.90070be6.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..13a59bb1c962bed63488b6c00100f849eff043ba GIT binary patch literal 67833 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

1jp(VlDyQAGMrax~E# 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 @> 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 sT%5l+>#G{Qak`x>x6{_0L4rqDF6Tf literal 0 HcmV?d00001 diff --git a/frontend-dist/js/75.75dccc00.js b/frontend-dist/js/75.75dccc00.js deleted file mode 100644 index a6814102..00000000 --- a/frontend-dist/js/75.75dccc00.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict";(self["webpackChunksanyue_imghub"]=self["webpackChunksanyue_imghub"]||[]).push([[75],{2893:function(t,e,s){s(85331)},5802:function(t,e,s){s(85331),s(38736),s(213),s(85970)},15616:function(t,e,s){s(85331),s(97197)},49187:function(t,e,s){s(85331),s(38736)},50333:function(t,e,s){s(85331),s(29092)},60075:function(t,e,s){s.r(e),s.d(e,{default:function(){return Wp}});var i=s(56768),n=s(24232);const a={class:"menu-list"},o=["onClick"],l={class:"menu-text"};function r(t,e,s,r,h,d){const c=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["sidebar-container",{"is-collapsed":s.isCollapse}]),ref:"sidebar",style:(0,n.Tr)(d.sidebarStyle)},[(0,i.Lk)("div",a,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(h.menuItems,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.index,class:(0,n.C4)(["menu-item",{"is-active":s.activeIndex===e.index}]),onClick:t=>d.handleSelect(e.index)},[(0,i.bF)(c,{icon:e.icon,class:"menu-icon"},null,8,["icon"]),(0,i.Lk)("span",l,(0,n.v_)(t.$t(e.titleKey)),1)],10,o))),128))]),(0,i.Lk)("div",{class:"toggle-button",onClick:e[0]||(e[0]=(...t)=>d.toggleCollapse&&d.toggleCollapse(...t))},[(0,i.bF)(c,{icon:s.isCollapse?"angle-double-right":"angle-double-left"},null,8,["icon"])])],6)}var h={name:"SysConfigTabs",props:{activeIndex:{type:String,default:"status"},isCollapse:{type:Boolean,default:!1}},data(){return{expandedWidth:null,menuItems:[{index:"status",icon:"chart-bar",titleKey:"sysConfigTabs.systemStatus"},{index:"upload",icon:"cloud-upload",titleKey:"sysConfigTabs.uploadSettings"},{index:"security",icon:"shield",titleKey:"sysConfigTabs.securitySettings"},{index:"page",icon:"pager",titleKey:"sysConfigTabs.pageSettings"},{index:"others",icon:"cog",titleKey:"sysConfigTabs.otherSettings"}]}},computed:{collapsedWidth(){return window.innerWidth<=768?50:56},sidebarStyle(){return this.isCollapse?{width:this.collapsedWidth+"px"}:this.expandedWidth?{width:this.expandedWidth+"px"}:{}}},watch:{"$i18n.locale"(){this.$nextTick(()=>this.measureWidth())}},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)},measureWidth(){const t=this.$refs.sidebar;if(!t)return;const e=t.style.width,s=t.style.transition,i=t.classList.contains("is-collapsed");t.style.transition="none",i&&t.classList.remove("is-collapsed"),t.style.width="auto",t.offsetWidth;const n=t.scrollWidth;t.style.width=e,i&&t.classList.add("is-collapsed"),t.offsetWidth,t.style.transition=s,this.expandedWidth=n}},mounted(){this.checkMobile(),this.$nextTick(()=>this.measureWidth()),window.addEventListener("resize",this.checkMobile)},beforeDestroy(){window.removeEventListener("resize",this.checkMobile)}},d=s(71241);const c=(0,d.A)(h,[["render",r],["__scopeId","data-v-2718059d"]]);var u=c,p=s(54880),g=(s(85331),s(77128),s(78507)),f=(s(213),s(97247));const m={class:"container"},b={class:"header-content"},y={class:"header-action"};function x(t,e,s,a,o,l){const r=f.A,h=(0,i.g2)("font-awesome-icon"),d=g.R7,c=p.bZ,x=u;return(0,i.uX)(),(0,i.CE)("div",m,[(0,i.bF)(c,null,{default:(0,i.k6)(()=>[(0,i.Lk)("div",b,[(0,i.bF)(r,{activeTab:"systemConfig"}),(0,i.Lk)("div",y,[(0,i.bF)(d,{disabled:l.disableTooltip,content:t.$t("sysConfig.logout"),placement:"bottom"},{default:(0,i.k6)(()=>[(0,i.bF)(h,{icon:"sign-out-alt",class:"header-icon",onClick:l.handleLogout},null,8,["onClick"])]),_:1},8,["disabled","content"])])])]),_:1}),(0,i.bF)(x,{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,i.uX)(),(0,i.Wv)((0,i.$y)(l.currentComponent),{class:(0,n.C4)(["main-container",{collapsed:o.isSidebarCollapse}])},null,8,["class"]))])}s(44114),s(33110);var v=s(99114),_=(s(30694),s(57009)),k=(s(78450),s(80047)),w=(s(99648),s(69655));s(2893);const C={class:"status-panel"},S={class:"overview-cards"},F={class:"card-icon"},T={class:"card-content"},P={class:"card-title"},M={class:"card-value"},A={class:"card-subtitle"},D={class:"overview-card index-status"},$={class:"card-icon"},V={class:"card-content"},L={class:"card-title"},E={class:"card-value"},U={class:"card-subtitle"},I={class:"card-icon"},O={class:"card-content"},R={class:"card-title"},W={class:"card-value"},B={class:"card-subtitle"},N={class:"charts-section"},z={class:"chart-card"},j={class:"chart-header"},q={class:"chart-content"},H={key:0,class:"empty-state"},X={key:1,class:"pie-chart-container"},K={class:"pie-chart-wrapper"},Y={class:"chart-center-text"},Q={class:"center-value"},G={class:"center-label"},J={class:"chart-legend"},Z={class:"legend-label"},tt={class:"legend-value"},et={class:"legend-percent"},st={class:"chart-card"},it={class:"chart-header"},nt={class:"chart-content"},at={key:0,class:"empty-state"},ot={key:1,class:"pie-chart-container"},lt={class:"pie-chart-wrapper"},rt={class:"chart-center-text"},ht={class:"center-value"},dt={class:"center-label"},ct={class:"chart-legend"},ut={class:"legend-label"},pt={class:"legend-value"},gt={class:"legend-percent"},ft={class:"actions-section"},mt={class:"action-card"},bt={class:"action-header"},yt={class:"action-content"},xt={key:0,class:"progress-container"},vt={class:"progress-header"},_t={class:"progress-phase"},kt={class:"progress-percentage"},wt={class:"progress-details"},Ct={key:0,class:"progress-count"},St={key:1,class:"progress-time"},Ft={key:0,class:"progress-message"},Tt={key:1,class:"error-container"},Pt={class:"error-icon"},Mt={class:"error-content"},At={class:"error-message"},Dt={key:0,class:"error-suggestion"},$t={class:"error-actions"},Vt={key:2,class:"action-buttons"},Lt={class:"restore-section"},Et={key:0,class:"file-info-section"},Ut=["src"],It={key:2,class:"card-bg-fallback"},Ot={class:"file-card-header"},Rt={class:"info-card-footer"},Wt={class:"file-name"},Bt={class:"file-meta"},Nt=["src"],zt={key:2,class:"card-bg-fallback"},jt={class:"file-card-header warning"},qt={class:"info-card-footer"},Ht={class:"file-name"},Xt={class:"file-meta"};function Kt(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),h=(0,i.g2)("Doughnut"),d=w.ve,c=k.S2,u=g.R7,p=_.Zq,f=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",C,[(0,i.Lk)("div",S,[(0,i.Lk)("div",{class:"overview-card total-files",onClick:e[0]||(e[0]=(...t)=>l.fetchIndexInfo&&l.fetchIndexInfo(...t))},[(0,i.Lk)("div",F,[(0,i.bF)(r,{icon:"database"})]),(0,i.Lk)("div",T,[(0,i.Lk)("div",P,(0,n.v_)(t.$t("sysStatus.totalFiles")),1),(0,i.Lk)("div",M,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",A,(0,n.v_)(t.$t("sysStatus.clickToRefresh")),1)])]),(0,i.Lk)("div",D,[(0,i.Lk)("div",$,[(0,i.bF)(r,{icon:"clock"})]),(0,i.Lk)("div",V,[(0,i.Lk)("div",L,(0,n.v_)(t.$t("sysStatus.indexUpdateTime")),1),(0,i.Lk)("div",E,(0,n.v_)(l.formatTime(o.indexInfo.lastUpdated)),1),(0,i.Lk)("div",U,(0,n.v_)(l.getTimeAgo(o.indexInfo.lastUpdated)),1)])]),(0,i.Lk)("div",{class:"overview-card system-version",onClick:e[1]||(e[1]=(...t)=>l.openReleases&&l.openReleases(...t))},[(0,i.Lk)("div",I,[(0,i.bF)(r,{icon:"code-branch"})]),(0,i.Lk)("div",O,[(0,i.Lk)("div",R,(0,n.v_)(t.$t("sysStatus.systemVersion")),1),(0,i.Lk)("div",W,"v"+(0,n.v_)(o.version),1),(0,i.Lk)("div",B,(0,n.v_)(t.$t("sysStatus.clickToViewChangelog")),1)])])]),(0,i.Lk)("div",N,[(0,i.Lk)("div",z,[(0,i.Lk)("div",j,[(0,i.bF)(r,{icon:"share-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.channelDistribution")),1)]),(0,i.Lk)("div",q,[0===Object.keys(o.indexInfo.channelStats||{}).length?((0,i.uX)(),(0,i.CE)("div",H,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",X,[(0,i.Lk)("div",K,[(0,i.bF)(h,{data:l.channelChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",Y,[(0,i.Lk)("div",Q,(0,n.v_)(o.indexInfo.totalFiles?.toLocaleString()||"0"),1),(0,i.Lk)("div",G,(0,n.v_)(t.$t("sysStatus.totalFilesLabel")),1)])]),(0,i.Lk)("div",J,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.indexInfo.channelStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getChartColor(s)})},null,4),(0,i.Lk)("span",Z,(0,n.v_)(e),1),(0,i.Lk)("span",tt,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",et,(0,n.v_)(l.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])]),(0,i.Lk)("div",st,[(0,i.Lk)("div",it,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.fileStatusDistribution")),1)]),(0,i.Lk)("div",nt,[0===Object.keys(o.indexInfo.typeStats||{}).length?((0,i.uX)(),(0,i.CE)("div",at,[(0,i.bF)(r,{icon:"inbox"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.noData")),1)])):((0,i.uX)(),(0,i.CE)("div",ot,[(0,i.Lk)("div",lt,[(0,i.bF)(h,{data:l.typeChartData,options:l.chartOptions},null,8,["data","options"]),(0,i.Lk)("div",rt,[(0,i.Lk)("div",ht,(0,n.v_)(Object.keys(o.indexInfo.typeStats).length),1),(0,i.Lk)("div",dt,(0,n.v_)(t.$t("sysStatus.statusTypes")),1)])]),(0,i.Lk)("div",ct,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.aggregatedTypeStats,(t,e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:e,class:"legend-item"},[(0,i.Lk)("span",{class:"legend-color",style:(0,n.Tr)({background:l.getTypeChartColor(s)})},null,4),(0,i.Lk)("span",ut,(0,n.v_)(e),1),(0,i.Lk)("span",pt,(0,n.v_)(t.toLocaleString()),1),(0,i.Lk)("span",gt,(0,n.v_)(l.getPercentage(t,o.indexInfo.totalFiles))+"%",1)]))),128))])]))])])]),(0,i.Lk)("div",ft,[(0,i.Lk)("div",mt,[(0,i.Lk)("div",bt,[(0,i.bF)(r,{icon:"tools"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.systemMaintenance")),1)]),(0,i.Lk)("div",yt,[o.isProcessing?((0,i.uX)(),(0,i.CE)("div",xt,[(0,i.Lk)("div",vt,[(0,i.Lk)("span",_t,(0,n.v_)(l.phaseDescription),1),(0,i.Lk)("span",kt,(0,n.v_)(Math.round(o.processingProgress.percentage))+"%",1)]),(0,i.bF)(d,{percentage:o.processingProgress.percentage,"stroke-width":12,"show-text":!1,class:"progress-bar"},null,8,["percentage"]),(0,i.Lk)("div",wt,[o.processingProgress.current>0?((0,i.uX)(),(0,i.CE)("span",Ct,[(0,i.bF)(r,{icon:"file-alt"}),(0,i.eW)(" "+(0,n.v_)(o.processingProgress.current.toLocaleString())+" ",1),o.processingProgress.total>0?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.eW)(" / "+(0,n.v_)(o.processingProgress.total.toLocaleString()),1)],64)):(0,i.Q3)("",!0),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.records")),1)])):(0,i.Q3)("",!0),l.estimatedTimeRemaining?((0,i.uX)(),(0,i.CE)("span",St,[(0,i.bF)(r,{icon:"clock"}),(0,i.eW)(" "+(0,n.v_)(l.estimatedTimeRemaining),1)])):(0,i.Q3)("",!0)]),o.processingProgress.message?((0,i.uX)(),(0,i.CE)("div",Ft,(0,n.v_)(o.processingProgress.message),1)):(0,i.Q3)("",!0),(0,i.bF)(c,{type:"danger",plain:"",size:"small",onClick:l.cancelOperation,class:"cancel-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"times"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.cancelOperation")),1)]),_:1},8,["onClick"])])):o.processingError?((0,i.uX)(),(0,i.CE)("div",Tt,[(0,i.Lk)("div",Pt,[(0,i.bF)(r,{icon:"exclamation-triangle"})]),(0,i.Lk)("div",Mt,[(0,i.Lk)("div",At,(0,n.v_)(o.processingError.message),1),o.processingError.suggestion?((0,i.uX)(),(0,i.CE)("div",Dt,(0,n.v_)(o.processingError.suggestion),1)):(0,i.Q3)("",!0)]),(0,i.Lk)("div",$t,[o.processingError.recoverable?((0,i.uX)(),(0,i.Wv)(c,{key:0,type:"primary",size:"small",onClick:l.retryOperation},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"redo"}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysStatus.retry")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0),(0,i.bF)(c,{type:"default",size:"small",onClick:l.dismissError},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysStatus.close")),1)]),_:1},8,["onClick"])])])):((0,i.uX)(),(0,i.CE)("div",Vt,[(0,i.bF)(u,{content:t.$t("sysStatus.rebuildTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"primary",loading:o.rebuilding,disabled:o.isProcessing,onClick:l.rebuildIndex,class:"action-btn rebuild-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt"}),(0,i.eW)(" "+(0,n.v_)(o.rebuilding?t.$t("sysStatus.rebuilding"):t.$t("sysStatus.rebuildIndex")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(u,{content:t.$t("sysStatus.backupTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{type:"success",loading:o.backing,disabled:o.isProcessing,onClick:l.backupData,class:"action-btn backup-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"download"}),(0,i.eW)(" "+(0,n.v_)(o.backing?t.$t("sysStatus.backingUp"):t.$t("sysStatus.backupData")),1)]),_:1},8,["loading","disabled","onClick"])]),_:1},8,["content"]),(0,i.bF)(u,{content:t.$t("sysStatus.restoreTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Lt,[(0,i.Lk)("input",{type:"file",ref:"fileInput",accept:".json",onChange:e[2]||(e[2]=(...t)=>l.handleFileSelect&&l.handleFileSelect(...t)),style:{display:"none"}},null,544),(0,i.bF)(c,{type:"warning",loading:o.restoring,disabled:o.isProcessing,onClick:l.selectRestoreFile,class:"action-btn restore-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"upload"}),(0,i.eW)(" "+(0,n.v_)(o.restoring?t.$t("sysStatus.restoring"):t.$t("sysStatus.restoreData")),1)]),_:1},8,["loading","disabled","onClick"])])]),_:1},8,["content"])]))])])]),o.indexInfo.newestFile||o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",Et,[o.indexInfo.newestFile?((0,i.uX)(),(0,i.CE)("div",{key:0,class:"file-info-card info-card-newest",onClick:e[5]||(e[5]=t=>l.openFileInNewTab(o.indexInfo.newestFile))},[l.isImageFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.Wv)(p,{key:0,src:"/file/"+o.indexInfo.newestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[3]||(e[3]=t=>l.handleImageError("newest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.newestFile)&&!o.loadErrors["newest"]?((0,i.uX)(),(0,i.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=>l.handleImageError("newest"))},null,40,Ut)):((0,i.uX)(),(0,i.CE)("div",It,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",Ot,[(0,i.bF)(r,{icon:"arrow-up"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.latestUpload")),1)]),(0,i.Lk)("div",Rt,[(0,i.Lk)("div",Wt,(0,n.v_)(o.indexInfo.newestFile.metadata?.FileName||o.indexInfo.newestFile.id),1),(0,i.Lk)("div",Bt,(0,n.v_)(l.formatTime(o.indexInfo.newestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0),o.indexInfo.oldestFile?((0,i.uX)(),(0,i.CE)("div",{key:1,class:"file-info-card info-card-oldest",onClick:e[8]||(e[8]=t=>l.openFileInNewTab(o.indexInfo.oldestFile))},[l.isImageFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.Wv)(p,{key:0,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",fit:"cover",class:"card-bg-media",onError:e[6]||(e[6]=t=>l.handleImageError("oldest"))},null,8,["src"])):l.isVideoFile(o.indexInfo.oldestFile)&&!o.loadErrors["oldest"]?((0,i.uX)(),(0,i.CE)("video",{key:1,src:"/file/"+o.indexInfo.oldestFile.id+"?from=admin",class:"card-bg-media",muted:"",loop:"",autoplay:"",onError:e[7]||(e[7]=t=>l.handleImageError("oldest"))},null,40,Nt)):((0,i.uX)(),(0,i.CE)("div",zt,[(0,i.bF)(r,{icon:"file-alt",class:"fallback-icon"})])),(0,i.Lk)("div",jt,[(0,i.bF)(r,{icon:"arrow-down"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysStatus.earliestUpload")),1)]),(0,i.Lk)("div",qt,[(0,i.Lk)("div",Ht,(0,n.v_)(o.indexInfo.oldestFile.metadata?.FileName||o.indexInfo.oldestFile.id),1),(0,i.Lk)("div",Xt,(0,n.v_)(l.formatTime(o.indexInfo.oldestFile.metadata?.TimeStamp)),1)])])):(0,i.Q3)("",!0)])):(0,i.Q3)("",!0)])),[[f,o.loading]])}s(18111),s(18237),s(58335);var Yt=s(70797),Qt={rE:"2.7.2"},Gt=(s(20116),s(61701),s(91114));s(22489),s(7588),s(13579),s(17642),s(58004),s(33853),s(45876),s(32475),s(15024),s(31698); -/*! - * @kurkle/color v0.3.4 - * https://github.com/kurkle/color#readme - * (c) 2024 Jukka Kurkela - * Released under the MIT License - */ -function Jt(t){return t+.5|0}const Zt=(t,e,s)=>Math.max(Math.min(t,s),e);function te(t){return Zt(Jt(2.55*t),0,255)}function ee(t){return Zt(Jt(255*t),0,255)}function se(t){return Zt(Jt(t/2.55)/100,0,1)}function ie(t){return Zt(Jt(100*t),0,100)}const ne={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},ae=[..."0123456789ABCDEF"],oe=t=>ae[15&t],le=t=>ae[(240&t)>>4]+ae[15&t],re=t=>(240&t)>>4===(15&t),he=t=>re(t.r)&&re(t.g)&&re(t.b)&&re(t.a);function de(t){var e,s=t.length;return"#"===t[0]&&(4===s||5===s?e={r:255&17*ne[t[1]],g:255&17*ne[t[2]],b:255&17*ne[t[3]],a:5===s?17*ne[t[4]]:255}:7!==s&&9!==s||(e={r:ne[t[1]]<<4|ne[t[2]],g:ne[t[3]]<<4|ne[t[4]],b:ne[t[5]]<<4|ne[t[6]],a:9===s?ne[t[7]]<<4|ne[t[8]]:255})),e}const ce=(t,e)=>t<255?e(t):"";function ue(t){var e=he(t)?oe:le;return t?"#"+e(t.r)+e(t.g)+e(t.b)+ce(t.a,e):void 0}const pe=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function ge(t,e,s){const i=e*Math.min(s,1-s),n=(e,n=(e+t/30)%12)=>s-i*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function fe(t,e,s){const i=(i,n=(i+t/60)%6)=>s-s*e*Math.max(Math.min(n,4-n,1),0);return[i(5),i(3),i(1)]}function me(t,e,s){const i=ge(t,1,.5);let n;for(e+s>1&&(n=1/(e+s),e*=n,s*=n),n=0;n<3;n++)i[n]*=1-e-s,i[n]+=e;return i}function be(t,e,s,i,n){return t===n?(e-s)/i+(e.5?d/(2-a-o):d/(a+o),r=be(s,i,n,d,a),r=60*r+.5),[0|r,h||0,l]}function xe(t,e,s,i){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,s,i)).map(ee)}function ve(t,e,s){return xe(ge,t,e,s)}function _e(t,e,s){return xe(me,t,e,s)}function ke(t,e,s){return xe(fe,t,e,s)}function we(t){return(t%360+360)%360}function Ce(t){const e=pe.exec(t);let s,i=255;if(!e)return;e[5]!==s&&(i=e[6]?te(+e[5]):ee(+e[5]));const n=we(+e[2]),a=+e[3]/100,o=+e[4]/100;return s="hwb"===e[1]?_e(n,a,o):"hsv"===e[1]?ke(n,a,o):ve(n,a,o),{r:s[0],g:s[1],b:s[2],a:i}}function Se(t,e){var s=ye(t);s[0]=we(s[0]+e),s=ve(s),t.r=s[0],t.g=s[1],t.b=s[2]}function Fe(t){if(!t)return;const e=ye(t),s=e[0],i=ie(e[1]),n=ie(e[2]);return t.a<255?`hsla(${s}, ${i}%, ${n}%, ${se(t.a)})`:`hsl(${s}, ${i}%, ${n}%)`}const Te={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},Pe={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function Me(){const t={},e=Object.keys(Pe),s=Object.keys(Te);let i,n,a,o,l;for(i=0;i>16&255,a>>8&255,255&a]}return t}let Ae;function De(t){Ae||(Ae=Me(),Ae.transparent=[0,0,0,0]);const e=Ae[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const $e=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function Ve(t){const e=$e.exec(t);let s,i,n,a=255;if(e){if(e[7]!==s){const t=+e[7];a=e[8]?te(t):Zt(255*t,0,255)}return s=+e[1],i=+e[3],n=+e[5],s=255&(e[2]?te(s):Zt(s,0,255)),i=255&(e[4]?te(i):Zt(i,0,255)),n=255&(e[6]?te(n):Zt(n,0,255)),{r:s,g:i,b:n,a:a}}}function Le(t){return t&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${se(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`)}const Ee=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Ue=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Ie(t,e,s){const i=Ue(se(t.r)),n=Ue(se(t.g)),a=Ue(se(t.b));return{r:ee(Ee(i+s*(Ue(se(e.r))-i))),g:ee(Ee(n+s*(Ue(se(e.g))-n))),b:ee(Ee(a+s*(Ue(se(e.b))-a))),a:t.a+s*(e.a-t.a)}}function Oe(t,e,s){if(t){let i=ye(t);i[e]=Math.max(0,Math.min(i[e]+i[e]*s,0===e?360:1)),i=ve(i),t.r=i[0],t.g=i[1],t.b=i[2]}}function Re(t,e){return t?Object.assign(e||{},t):t}function We(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=ee(t[3]))):(e=Re(t,{r:0,g:0,b:0,a:1}),e.a=ee(e.a)),e}function Be(t){return"r"===t.charAt(0)?Ve(t):Ce(t)}class Ne{constructor(t){if(t instanceof Ne)return t;const e=typeof t;let s;"object"===e?s=We(t):"string"===e&&(s=de(t)||De(t)||Be(t)),this._rgb=s,this._valid=!!s}get valid(){return this._valid}get rgb(){var t=Re(this._rgb);return t&&(t.a=se(t.a)),t}set rgb(t){this._rgb=We(t)}rgbString(){return this._valid?Le(this._rgb):void 0}hexString(){return this._valid?ue(this._rgb):void 0}hslString(){return this._valid?Fe(this._rgb):void 0}mix(t,e){if(t){const s=this.rgb,i=t.rgb;let n;const a=e===n?.5:e,o=2*a-1,l=s.a-i.a,r=((o*l===-1?o:(o+l)/(1+o*l))+1)/2;n=1-r,s.r=255&r*s.r+n*i.r+.5,s.g=255&r*s.g+n*i.g+.5,s.b=255&r*s.b+n*i.b+.5,s.a=a*s.a+(1-a)*i.a,this.rgb=s}return this}interpolate(t,e){return t&&(this._rgb=Ie(this._rgb,t._rgb,e)),this}clone(){return new Ne(this.rgb)}alpha(t){return this._rgb.a=ee(t),this}clearer(t){const e=this._rgb;return e.a*=1-t,this}greyscale(){const t=this._rgb,e=Jt(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){const e=this._rgb;return e.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Oe(this._rgb,2,t),this}darken(t){return Oe(this._rgb,2,-t),this}saturate(t){return Oe(this._rgb,1,t),this}desaturate(t){return Oe(this._rgb,1,-t),this}rotate(t){return Se(this._rgb,t),this}} -/*! - * Chart.js v4.5.1 - * https://www.chartjs.org - * (c) 2025 Chart.js Contributors - * Released under the MIT License - */ -function ze(){}const je=(()=>{let t=0;return()=>t++})();function qe(t){return null===t||void 0===t}function He(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function Xe(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function Ke(t){return("number"===typeof t||t instanceof Number)&&isFinite(+t)}function Ye(t,e){return Ke(t)?t:e}function Qe(t,e){return"undefined"===typeof t?e:t}const Ge=(t,e)=>"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,Je=(t,e)=>"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function Ze(t,e,s){if(t&&"function"===typeof t.call)return t.apply(s,e)}function ts(t,e,s,i){let n,a,o;if(He(t))if(a=t.length,i)for(n=a-1;n>=0;n--)e.call(s,t[n],n);else for(n=0;nt,x:t=>t.x,y:t=>t.y};function hs(t){const e=t.split("."),s=[];let i="";for(const n of e)i+=n,i.endsWith("\\")?i=i.slice(0,-1)+".":(s.push(i),i="");return s}function ds(t){const e=hs(t);return t=>{for(const s of e){if(""===s)break;t=t&&t[s]}return t}}function cs(t,e){const s=rs[e]||(rs[e]=ds(e));return s(t)}function us(t){return t.charAt(0).toUpperCase()+t.slice(1)}const ps=t=>"undefined"!==typeof t,gs=t=>"function"===typeof t,fs=(t,e)=>{if(t.size!==e.size)return!1;for(const s of t)if(!e.has(s))return!1;return!0};function ms(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const bs=Math.PI,ys=2*bs,xs=ys+bs,vs=Number.POSITIVE_INFINITY,_s=bs/180,ks=bs/2,ws=bs/4,Cs=2*bs/3,Ss=Math.log10,Fs=Math.sign;function Ts(t,e,s){return Math.abs(t-e)t-e).pop(),e}function As(t){return"symbol"===typeof t||"object"===typeof t&&null!==t&&!(Symbol.toPrimitive in t||"toString"in t||"valueOf"in t)}function Ds(t){return!As(t)&&!isNaN(parseFloat(t))&&isFinite(t)}function $s(t,e){const s=Math.round(t);return s-e<=t&&s+e>=t}function Vs(t,e,s){let i,n,a;for(i=0,n=t.length;ir&&h=Math.min(e,s)-i&&t<=Math.max(e,s)+i}function qs(t,e,s){s=s||(s=>t[s]1)i=a+n>>1,s(i)?a=i:n=i;return{lo:a,hi:n}}const Hs=(t,e,s,i)=>qs(t,s,i?i=>{const n=t[i][e];return nt[i][e]qs(t,s,i=>t[i][e]>=s);function Ks(t,e,s){let i=0,n=t.length;while(ii&&t[n-1]>s)n--;return i>0||n{const s="_onData"+us(e),i=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=i.apply(this,e);return t._chartjs.listeners.forEach(t=>{"function"===typeof t[s]&&t[s](...e)}),n}})}))}function Gs(t,e){const s=t._chartjs;if(!s)return;const i=s.listeners,n=i.indexOf(e);-1!==n&&i.splice(n,1),i.length>0||(Ys.forEach(e=>{delete t[e]}),delete t._chartjs)}function Js(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const Zs=function(){return"undefined"===typeof window?function(t){return t()}:window.requestAnimationFrame}();function ti(t,e){let s=[],i=!1;return function(...n){s=n,i||(i=!0,Zs.call(window,()=>{i=!1,t.apply(e,s)}))}}function ei(t,e){let s;return function(...i){return e?(clearTimeout(s),s=setTimeout(t,e,i)):t.apply(this,i),e}}const si=t=>"start"===t?"left":"end"===t?"right":"center",ii=(t,e,s)=>"start"===t?e:"end"===t?s:(e+s)/2,ni=(t,e,s,i)=>{const n=i?"left":"right";return t===n?s:"center"===t?(e+s)/2:e};function ai(t,e,s){const i=e.length;let n=0,a=i;if(t._sorted){const{iScale:o,vScale:l,_parsed:r}=t,h=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null,d=o.axis,{min:c,max:u,minDefined:p,maxDefined:g}=o.getUserBounds();if(p){if(n=Math.min(Hs(r,d,c).lo,s?i:Hs(e,d,o.getPixelForValue(c)).lo),h){const t=r.slice(0,n+1).reverse().findIndex(t=>!qe(t[l.axis]));n-=Math.max(0,t)}n=Ns(n,0,i-1)}if(g){let t=Math.max(Hs(r,o.axis,u,!0).hi+1,s?0:Hs(e,d,o.getPixelForValue(u),!0).hi+1);if(h){const e=r.slice(t-1).findIndex(t=>!qe(t[l.axis]));t+=Math.max(0,e)}a=Ns(t,n,i)-n}else a=i-n}return{start:n,count:a}}function oi(t){const{xScale:e,yScale:s,_scaleRanges:i}=t,n={xmin:e.min,xmax:e.max,ymin:s.min,ymax:s.max};if(!i)return t._scaleRanges=n,!0;const a=i.xmin!==e.min||i.xmax!==e.max||i.ymin!==s.min||i.ymax!==s.max;return Object.assign(i,n),a}const li=t=>0===t||1===t,ri=(t,e,s)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*ys/s),hi=(t,e,s)=>Math.pow(2,-10*t)*Math.sin((t-e)*ys/s)+1,di={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*ks),easeOutSine:t=>Math.sin(t*ks),easeInOutSine:t=>-.5*(Math.cos(bs*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>li(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>li(t)?t:ri(t,.075,.3),easeOutElastic:t=>li(t)?t:hi(t,.075,.3),easeInOutElastic(t){const e=.1125,s=.45;return li(t)?t:t<.5?.5*ri(2*t,e,s):.5+.5*hi(2*t-1,e,s)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-di.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,s=2.75;return t<1/s?e*t*t:t<2/s?e*(t-=1.5/s)*t+.75:t<2.5/s?e*(t-=2.25/s)*t+.9375:e*(t-=2.625/s)*t+.984375},easeInOutBounce:t=>t<.5?.5*di.easeInBounce(2*t):.5*di.easeOutBounce(2*t-1)+.5};function ci(t){if(t&&"object"===typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function ui(t){return ci(t)?t:new Ne(t)}function pi(t){return ci(t)?t:new Ne(t).saturate(.5).darken(.1).hexString()}const gi=["x","y","borderWidth","radius","tension"],fi=["color","borderColor","backgroundColor"];function mi(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:fi},numbers:{type:"number",properties:gi}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})}function bi(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}const yi=new Map;function xi(t,e){e=e||{};const s=t+JSON.stringify(e);let i=yi.get(s);return i||(i=new Intl.NumberFormat(t,e),yi.set(s,i)),i}function vi(t,e,s){return xi(e,s).format(t)}const _i={values(t){return He(t)?t:""+t},numeric(t,e,s){if(0===t)return"0";const i=this.chart.options.locale;let n,a=t;if(s.length>1){const e=Math.max(Math.abs(s[0].value),Math.abs(s[s.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),a=ki(t,s)}const o=Ss(Math.abs(a)),l=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),r={notation:n,minimumFractionDigits:l,maximumFractionDigits:l};return Object.assign(r,this.options.ticks.format),vi(t,i,r)},logarithmic(t,e,s){if(0===t)return"0";const i=s[e].significand||t/Math.pow(10,Math.floor(Ss(t)));return[1,2,3,5,10,15].includes(i)||e>.8*s.length?_i.numeric.call(this,t,e,s):""}};function ki(t,e){let s=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;return Math.abs(s)>=1&&t!==Math.floor(t)&&(s=t-Math.floor(t)),s}var wi={formatters:_i};function Ci(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:wi.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}const Si=Object.create(null),Fi=Object.create(null);function Ti(t,e){if(!e)return t;const s=e.split(".");for(let i=0,n=s.length;it.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>pi(e.backgroundColor),this.hoverBorderColor=(t,e)=>pi(e.borderColor),this.hoverColor=(t,e)=>pi(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return Pi(this,t,e)}get(t){return Ti(this,t)}describe(t,e){return Pi(Fi,t,e)}override(t,e){return Pi(Si,t,e)}route(t,e,s,i){const n=Ti(this,t),a=Ti(this,s),o="_"+e;Object.defineProperties(n,{[o]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[o],e=a[i];return Xe(t)?Object.assign({},e,t):Qe(t,e)},set(t){this[o]=t}}})}apply(t){t.forEach(t=>t(this))}}var Ai=new Mi({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[mi,bi,Ci]);function Di(t){return!t||qe(t.size)||qe(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function $i(t,e,s,i,n){let a=e[n];return a||(a=e[n]=t.measureText(n).width,s.push(n)),a>i&&(i=a),i}function Vi(t,e,s,i){i=i||{};let n=i.data=i.data||{},a=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(n=i.data={},a=i.garbageCollect=[],i.font=e),t.save(),t.font=e;let o=0;const l=s.length;let r,h,d,c,u;for(r=0;rs.length){for(r=0;r0&&t.stroke()}}function Oi(t,e,s){return s=s||.5,!e||t&&t.x>e.left-s&&t.xe.top-s&&t.y0&&""!==a.strokeColor;let r,h;for(t.save(),t.font=n.string,zi(t,a),r=0;r+t||0;function Ji(t,e){const s={},i=Xe(e),n=i?Object.keys(e):e,a=Xe(t)?i?s=>Qe(t[s],t[e[s]]):e=>t[e]:()=>t;for(const o of n)s[o]=Gi(a(o));return s}function Zi(t){return Ji(t,{top:"y",right:"x",bottom:"y",left:"x"})}function tn(t){return Ji(t,["topLeft","topRight","bottomLeft","bottomRight"])}function en(t){const e=Zi(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function sn(t,e){t=t||{},e=e||Ai.font;let s=Qe(t.size,e.size);"string"===typeof s&&(s=parseInt(s,10));let i=Qe(t.style,e.style);i&&!(""+i).match(Yi)&&(console.warn('Invalid font style specified: "'+i+'"'),i=void 0);const n={family:Qe(t.family,e.family),lineHeight:Qi(Qe(t.lineHeight,e.lineHeight),s),size:s,style:i,weight:Qe(t.weight,e.weight),string:""};return n.string=Di(n),n}function nn(t,e,s,i){let n,a,o,l=!0;for(n=0,a=t.length;ns&&0===t?0:t+e;return{min:o(i,-Math.abs(a)),max:o(n,a)}}function on(t,e){return Object.assign(Object.create(t),e)}function ln(t,e=[""],s,i,n=()=>t[0]){const a=s||t;"undefined"===typeof i&&(i=wn("_fallback",t));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:a,_fallback:i,_getTarget:n,override:s=>ln([s,...t],e,a,i)};return new Proxy(o,{deleteProperty(e,s){return delete e[s],delete e._keys,delete t[0][s],!0},get(s,i){return un(s,i,()=>kn(i,e,t,s))},getOwnPropertyDescriptor(t,e){return Reflect.getOwnPropertyDescriptor(t._scopes[0],e)},getPrototypeOf(){return Reflect.getPrototypeOf(t[0])},has(t,e){return Cn(t).includes(e)},ownKeys(t){return Cn(t)},set(t,e,s){const i=t._storage||(t._storage=n());return t[e]=i[e]=s,delete t._keys,!0}})}function rn(t,e,s,i){const n={_cacheable:!1,_proxy:t,_context:e,_subProxy:s,_stack:new Set,_descriptors:hn(t,i),setContext:e=>rn(t,e,s,i),override:n=>rn(t.override(n),e,s,i)};return new Proxy(n,{deleteProperty(e,s){return delete e[s],delete t[s],!0},get(t,e,s){return un(t,e,()=>pn(t,e,s))},getOwnPropertyDescriptor(e,s){return e._descriptors.allKeys?Reflect.has(t,s)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,s)},getPrototypeOf(){return Reflect.getPrototypeOf(t)},has(e,s){return Reflect.has(t,s)},ownKeys(){return Reflect.ownKeys(t)},set(e,s,i){return t[s]=i,delete e[s],!0}})}function hn(t,e={scriptable:!0,indexable:!0}){const{_scriptable:s=e.scriptable,_indexable:i=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:s,indexable:i,isScriptable:gs(s)?s:()=>s,isIndexable:gs(i)?i:()=>i}}const dn=(t,e)=>t?t+us(e):e,cn=(t,e)=>Xe(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function un(t,e,s){if(Object.prototype.hasOwnProperty.call(t,e)||"constructor"===e)return t[e];const i=s();return t[e]=i,i}function pn(t,e,s){const{_proxy:i,_context:n,_subProxy:a,_descriptors:o}=t;let l=i[e];return gs(l)&&o.isScriptable(e)&&(l=gn(e,l,t,s)),He(l)&&l.length&&(l=fn(e,l,t,o.isIndexable)),cn(e,l)&&(l=rn(l,n,a&&a[e],o)),l}function gn(t,e,s,i){const{_proxy:n,_context:a,_subProxy:o,_stack:l}=s;if(l.has(t))throw new Error("Recursion detected: "+Array.from(l).join("->")+"->"+t);l.add(t);let r=e(a,o||i);return l.delete(t),cn(t,r)&&(r=xn(n._scopes,n,t,r)),r}function fn(t,e,s,i){const{_proxy:n,_context:a,_subProxy:o,_descriptors:l}=s;if("undefined"!==typeof a.index&&i(t))return e[a.index%e.length];if(Xe(e[0])){const s=e,i=n._scopes.filter(t=>t!==s);e=[];for(const r of s){const s=xn(i,n,t,r);e.push(rn(s,a,o&&o[t],l))}}return e}function mn(t,e,s){return gs(t)?t(e,s):t}const bn=(t,e)=>!0===t?e:"string"===typeof t?cs(e,t):void 0;function yn(t,e,s,i,n){for(const a of e){const e=bn(s,a);if(e){t.add(e);const a=mn(e._fallback,s,n);if("undefined"!==typeof a&&a!==s&&a!==i)return a}else if(!1===e&&"undefined"!==typeof i&&s!==i)return null}return!1}function xn(t,e,s,i){const n=e._rootScopes,a=mn(e._fallback,s,i),o=[...t,...n],l=new Set;l.add(i);let r=vn(l,o,s,a||s,i);return null!==r&&(("undefined"===typeof a||a===s||(r=vn(l,o,a,r,i),null!==r))&&ln(Array.from(l),[""],n,a,()=>_n(e,s,i)))}function vn(t,e,s,i,n){while(s)s=yn(t,e,s,i,n);return s}function _n(t,e,s){const i=t._getTarget();e in i||(i[e]={});const n=i[e];return He(n)&&Xe(s)?s:n||{}}function kn(t,e,s,i){let n;for(const a of e)if(n=wn(dn(a,t),s),"undefined"!==typeof n)return cn(t,n)?xn(s,i,t,n):n}function wn(t,e){for(const s of e){if(!s)continue;const e=s[t];if("undefined"!==typeof e)return e}}function Cn(t){let e=t._keys;return e||(e=t._keys=Sn(t._scopes)),e}function Sn(t){const e=new Set;for(const s of t)for(const t of Object.keys(s).filter(t=>!t.startsWith("_")))e.add(t);return Array.from(e)}function Fn(t,e,s,i){const{iScale:n}=t,{key:a="r"}=this._parsing,o=new Array(i);let l,r,h,d;for(l=0,r=i;le"x"===t?"y":"x";function An(t,e,s,i){const n=t.skip?e:t,a=e,o=s.skip?e:s,l=Os(a,n),r=Os(o,a);let h=l/(l+r),d=r/(l+r);h=isNaN(h)?0:h,d=isNaN(d)?0:d;const c=i*h,u=i*d;return{previous:{x:a.x-c*(o.x-n.x),y:a.y-c*(o.y-n.y)},next:{x:a.x+u*(o.x-n.x),y:a.y+u*(o.y-n.y)}}}function Dn(t,e,s){const i=t.length;let n,a,o,l,r,h=Pn(t,0);for(let d=0;d!t.skip)),"monotone"===e.cubicInterpolationMode)Vn(t,n);else{let s=i?t[t.length-1]:t[0];for(a=0,o=t.length;at.ownerDocument.defaultView.getComputedStyle(t,null);function Bn(t,e){return Wn(t).getPropertyValue(e)}const Nn=["top","right","bottom","left"];function zn(t,e,s){const i={};s=s?"-"+s:"";for(let n=0;n<4;n++){const a=Nn[n];i[a]=parseFloat(t[e+"-"+a+s])||0}return i.width=i.left+i.right,i.height=i.top+i.bottom,i}const jn=(t,e,s)=>(t>0||e>0)&&(!s||!s.shadowRoot);function qn(t,e){const s=t.touches,i=s&&s.length?s[0]:t,{offsetX:n,offsetY:a}=i;let o,l,r=!1;if(jn(n,a,t.target))o=n,l=a;else{const t=e.getBoundingClientRect();o=i.clientX-t.left,l=i.clientY-t.top,r=!0}return{x:o,y:l,box:r}}function Hn(t,e){if("native"in t)return t;const{canvas:s,currentDevicePixelRatio:i}=e,n=Wn(s),a="border-box"===n.boxSizing,o=zn(n,"padding"),l=zn(n,"border","width"),{x:r,y:h,box:d}=qn(t,s),c=o.left+(d&&l.left),u=o.top+(d&&l.top);let{width:p,height:g}=e;return a&&(p-=o.width+l.width,g-=o.height+l.height),{x:Math.round((r-c)/p*s.width/i),y:Math.round((h-u)/g*s.height/i)}}function Xn(t,e,s){let i,n;if(void 0===e||void 0===s){const a=t&&On(t);if(a){const t=a.getBoundingClientRect(),o=Wn(a),l=zn(o,"border","width"),r=zn(o,"padding");e=t.width-r.width-l.width,s=t.height-r.height-l.height,i=Rn(o.maxWidth,a,"clientWidth"),n=Rn(o.maxHeight,a,"clientHeight")}else e=t.clientWidth,s=t.clientHeight}return{width:e,height:s,maxWidth:i||vs,maxHeight:n||vs}}const Kn=t=>Math.round(10*t)/10;function Yn(t,e,s,i){const n=Wn(t),a=zn(n,"margin"),o=Rn(n.maxWidth,t,"clientWidth")||vs,l=Rn(n.maxHeight,t,"clientHeight")||vs,r=Xn(t,e,s);let{width:h,height:d}=r;if("content-box"===n.boxSizing){const t=zn(n,"border","width"),e=zn(n,"padding");h-=e.width+t.width,d-=e.height+t.height}h=Math.max(0,h-a.width),d=Math.max(0,i?h/i:d-a.height),h=Kn(Math.min(h,o,r.maxWidth)),d=Kn(Math.min(d,l,r.maxHeight)),h&&!d&&(d=Kn(h/2));const c=void 0!==e||void 0!==s;return c&&i&&r.height&&d>r.height&&(d=r.height,h=Kn(Math.floor(d*i))),{width:h,height:d}}function Qn(t,e,s){const i=e||1,n=Kn(t.height*i),a=Kn(t.width*i);t.height=Kn(t.height),t.width=Kn(t.width);const o=t.canvas;return o.style&&(s||!o.style.height&&!o.style.width)&&(o.style.height=`${t.height}px`,o.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==i||o.height!==n||o.width!==a)&&(t.currentDevicePixelRatio=i,o.height=n,o.width=a,t.ctx.setTransform(i,0,0,i,0,0),!0)}const Gn=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};In()&&(window.addEventListener("test",null,e),window.removeEventListener("test",null,e))}catch(e){}return t}();function Jn(t,e){const s=Bn(t,e),i=s&&s.match(/^(\d+)(\.\d+)?px$/);return i?+i[1]:void 0}function Zn(t,e,s,i){return{x:t.x+s*(e.x-t.x),y:t.y+s*(e.y-t.y)}}function ta(t,e,s,i){return{x:t.x+s*(e.x-t.x),y:"middle"===i?s<.5?t.y:e.y:"after"===i?s<1?t.y:e.y:s>0?e.y:t.y}}function ea(t,e,s,i){const n={x:t.cp2x,y:t.cp2y},a={x:e.cp1x,y:e.cp1y},o=Zn(t,n,s),l=Zn(n,a,s),r=Zn(a,e,s),h=Zn(o,l,s),d=Zn(l,r,s);return Zn(h,d,s)}const sa=function(t,e){return{x(s){return t+t+e-s},setWidth(t){e=t},textAlign(t){return"center"===t?t:"right"===t?"left":"right"},xPlus(t,e){return t-e},leftForLtr(t,e){return t-e}}},ia=function(){return{x(t){return t},setWidth(t){},textAlign(t){return t},xPlus(t,e){return t+e},leftForLtr(t,e){return t}}};function na(t,e,s){return t?sa(e,s):ia()}function aa(t,e){let s,i;"ltr"!==e&&"rtl"!==e||(s=t.canvas.style,i=[s.getPropertyValue("direction"),s.getPropertyPriority("direction")],s.setProperty("direction",e,"important"),t.prevTextDirection=i)}function oa(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function la(t){return"angle"===t?{between:Bs,compare:Rs,normalize:Ws}:{between:js,compare:(t,e)=>t-e,normalize:t=>t}}function ra({start:t,end:e,count:s,loop:i,style:n}){return{start:t%s,end:e%s,loop:i&&(e-t+1)%s===0,style:n}}function ha(t,e,s){const{property:i,start:n,end:a}=s,{between:o,normalize:l}=la(i),r=e.length;let h,d,{start:c,end:u,loop:p}=t;if(p){for(c+=r,u+=r,h=0,d=r;hr(n,b,f)&&0!==l(n,b),_=()=>0===l(a,f)||r(a,b,f),k=()=>y||v(),w=()=>!y||_();for(let C=d,S=d;C<=c;++C)m=e[C%o],m.skip||(f=h(m[i]),f!==b&&(y=r(f,n,a),null===x&&k()&&(x=0===l(f,n)?C:S),null!==x&&w()&&(g.push(ra({start:x,end:C,loop:u,count:o,style:p})),x=null),S=C,b=f));return null!==x&&g.push(ra({start:x,end:c,loop:u,count:o,style:p})),g}function ca(t,e){const s=[],i=t.segments;for(let n=0;nn&&t[a%e].skip)a--;return a%=e,{start:n,end:a}}function pa(t,e,s,i){const n=t.length,a=[];let o,l=e,r=t[e];for(o=e+1;o<=s;++o){const s=t[o%n];s.skip||s.stop?r.skip||(i=!1,a.push({start:e%n,end:(o-1)%n,loop:i}),e=l=s.stop?o:null):(l=o,r.skip&&(e=o)),r=s}return null!==l&&a.push({start:e%n,end:l%n,loop:i}),a}function ga(t,e){const s=t.points,i=t.options.spanGaps,n=s.length;if(!n)return[];const a=!!t._loop,{start:o,end:l}=ua(s,n,a,i);if(!0===i)return fa(t,[{start:o,end:l,loop:a}],s,e);const r=li({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(s-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=Zs.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((s,i)=>{if(!s.running||!s.items.length)return;const n=s.items;let a,o=n.length-1,l=!1;for(;o>=0;--o)a=n[o],a._active?(a._total>s.duration&&(s.duration=a._total),a.tick(t),l=!0):(n[o]=n[n.length-1],n.pop());l&&(i.draw(),this._notify(i,s,t,"progress")),n.length||(s.running=!1,this._notify(i,s,t,"complete"),s.initial=!1),e+=n.length}),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let s=e.get(t);return s||(s={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,s)),s}listen(t,e,s){this._getAnims(t).listeners[e].push(s)}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 s=e.items;let i=s.length-1;for(;i>=0;--i)s[i].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var wa=new ka;const Ca="transparent",Sa={boolean(t,e,s){return s>.5?e:t},color(t,e,s){const i=ui(t||Ca),n=i.valid&&ui(e||Ca);return n&&n.valid?n.mix(i,s).hexString():e},number(t,e,s){return t+(e-t)*s}};class Fa{constructor(t,e,s,i){const n=e[s];i=nn([t.to,i,n,t.from]);const a=nn([t.from,n,i]);this._active=!0,this._fn=t.fn||Sa[t.type||typeof a],this._easing=di[t.easing]||di.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=s,this._from=a,this._to=i,this._promises=void 0}active(){return this._active}update(t,e,s){if(this._active){this._notify(!1);const i=this._target[this._prop],n=s-this._start,a=this._duration-n;this._start=s,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=nn([t.to,e,i,t.from]),this._from=nn([t.from,i,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,s=this._duration,i=this._prop,n=this._from,a=this._loop,o=this._to;let l;if(this._active=n!==o&&(a||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[i]=this._fn(n,o,l))}wait(){const t=this._promises||(this._promises=[]);return new Promise((e,s)=>{t.push({res:e,rej:s})})}_notify(t){const e=t?"res":"rej",s=this._promises||[];for(let i=0;i{const n=t[i];if(!Xe(n))return;const a={};for(const t of e)a[t]=n[t];(He(n.properties)&&n.properties||[i]).forEach(t=>{t!==i&&s.has(t)||s.set(t,a)})})}_animateOptions(t,e){const s=e.options,i=Ma(t,s);if(!i)return[];const n=this._createAnimations(i,s);return s.$shared&&Pa(t.options.$animations,s).then(()=>{t.options=s},()=>{}),n}_createAnimations(t,e){const s=this._properties,i=[],n=t.$animations||(t.$animations={}),a=Object.keys(e),o=Date.now();let l;for(l=a.length-1;l>=0;--l){const r=a[l];if("$"===r.charAt(0))continue;if("options"===r){i.push(...this._animateOptions(t,e));continue}const h=e[r];let d=n[r];const c=s.get(r);if(d){if(c&&d.active()){d.update(c,h,o);continue}d.cancel()}c&&c.duration?(n[r]=d=new Fa(c,t,r,h),i.push(d)):t[r]=h}return i}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const s=this._createAnimations(t,e);return s.length?(wa.add(this._chart,s),!0):void 0}}function Pa(t,e){const s=[],i=Object.keys(e);for(let n=0;n0||!s&&e<0)return n.index}return null}function Ba(t,e){const{chart:s,_cachedMeta:i}=t,n=s._stacks||(s._stacks={}),{iScale:a,vScale:o,index:l}=i,r=a.axis,h=o.axis,d=Ia(a,o,i),c=e.length;let u;for(let p=0;ps[t].axis===e).shift()}function za(t,e){return on(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:"default",type:"dataset"})}function ja(t,e,s){return on(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:s,index:e,mode:"default",type:"data"})}function qa(t,e){const s=t.controller.index,i=t.vScale&&t.vScale.axis;if(i){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[i]||void 0===e[i][s])return;delete e[i][s],void 0!==e[i]._visualValues&&void 0!==e[i]._visualValues[s]&&delete e[i]._visualValues[s]}}}const Ha=t=>"reset"===t||"none"===t,Xa=(t,e)=>e?t:Object.assign({},t),Ka=(t,e,s)=>t&&!e.hidden&&e._stacked&&{keys:Va(s,!0),values:null};class Ya{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=Ua(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&&qa(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,s=this.getDataset(),i=(t,e,s,i)=>"x"===t?e:"r"===t?i:s,n=e.xAxisID=Qe(s.xAxisID,Na(t,"x")),a=e.yAxisID=Qe(s.yAxisID,Na(t,"y")),o=e.rAxisID=Qe(s.rAxisID,Na(t,"r")),l=e.indexAxis,r=e.iAxisID=i(l,n,a,o),h=e.vAxisID=i(l,a,n,o);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(o),e.iScale=this.getScaleForId(r),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&&Gs(this._data,this),t._stacked&&qa(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),s=this._data;if(Xe(e)){const t=this._cachedMeta;this._data=Ea(e,t)}else if(s!==e){if(s){Gs(s,this);const t=this._cachedMeta;qa(t),t._parsed=[]}e&&Object.isExtensible(e)&&Qs(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,s=this.getDataset();let i=!1;this._dataCheck();const n=e._stacked;e._stacked=Ua(e.vScale,e),e.stack!==s.stack&&(i=!0,qa(e),e.stack=s.stack),this._resyncElements(t),(i||n!==e._stacked)&&(Ba(this,e._parsed),e._stacked=Ua(e.vScale,e))}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),s=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(s,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:s,_data:i}=this,{iScale:n,_stacked:a}=s,o=n.axis;let l,r,h,d=0===t&&e===i.length||s._sorted,c=t>0&&s._parsed[t-1];if(!1===this._parsing)s._parsed=i,s._sorted=!0,h=i;else{h=He(i[t])?this.parseArrayData(s,i,t,e):Xe(i[t])?this.parseObjectData(s,i,t,e):this.parsePrimitiveData(s,i,t,e);const n=()=>null===r[o]||c&&r[o]e||d=0;--c)if(!p()){this.updateRangeFromParsed(r,t,u,l);break}return r}getAllParsedValues(t){const e=this._cachedMeta._parsed,s=[];let i,n,a;for(i=0,n=e.length;i=0&&tthis.getContext(s,i,e),g=r.resolveNamedOptions(c,u,p,d);return g.$shared&&(g.$shared=l,n[a]=Object.freeze(Xa(g,l))),g}_resolveAnimations(t,e,s){const i=this.chart,n=this._cachedDataOpts,a=`animation-${e}`,o=n[a];if(o)return o;let l;if(!1!==i.options.animation){const i=this.chart.config,n=i.datasetAnimationScopeKeys(this._type,e),a=i.getOptionScopes(this.getDataset(),n);l=i.createResolver(a,this.getContext(t,s,e))}const r=new Ta(i,l&&l.animations);return l&&l._cacheable&&(n[a]=Object.freeze(r)),r}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Ha(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const s=this.resolveDataElementOptions(t,e),i=this._sharedOptions,n=this.getSharedOptions(s),a=this.includeOptions(e,n)||n!==i;return this.updateSharedOptions(n,e,s),{sharedOptions:n,includeOptions:a}}updateElement(t,e,s,i){Ha(i)?Object.assign(t,s):this._resolveAnimations(e,i).update(t,s)}updateSharedOptions(t,e,s){t&&!Ha(e)&&this._resolveAnimations(void 0,e).update(t,s)}_setStyle(t,e,s,i){t.active=i;const n=this.getStyle(e,i);this._resolveAnimations(e,s,i).update(t,{options:!i&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,s){this._setStyle(t,s,"active",!1)}setHoverStyle(t,e,s){this._setStyle(t,s,"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,s=this._cachedMeta.data;for(const[o,l,r]of this._syncList)this[o](l,r);this._syncList=[];const i=s.length,n=e.length,a=Math.min(n,i);a&&this.parse(0,a),n>i?this._insertElements(i,n-i,t):n{for(t.length+=e,o=t.length-1;o>=a;o--)t[o]=t[o-e]};for(l(n),o=t;ot-e))}return t._cache.$bar}function Ga(t){const e=t.iScale,s=Qa(e,t.type);let i,n,a,o,l=e._length;const r=()=>{32767!==a&&-32768!==a&&(ps(o)&&(l=Math.min(l,Math.abs(a-o)||l)),o=a)};for(i=0,n=s.length;i0?n[t-1]:null,l=tMath.abs(l)&&(r=l,h=o),e[s.axis]=h,e._custom={barStart:r,barEnd:h,start:n,end:a,min:o,max:l}}function eo(t,e,s,i){return He(t)?to(t,e,s,i):e[s.axis]=s.parse(t,i),e}function so(t,e,s,i){const n=t.iScale,a=t.vScale,o=n.getLabels(),l=n===a,r=[];let h,d,c,u;for(h=s,d=s+i;h=s?1:-1)}function ao(t){let e,s,i,n,a;return t.horizontal?(e=t.base>t.x,s="left",i="right"):(e=t.baset.controller.options.grouped),n=s.options.stacked,a=[],o=this._cachedMeta.controller.getParsed(e),l=o&&o[s.axis],r=t=>{const e=t._parsed.find(t=>t[s.axis]===l),i=e&&e[t.vScale.axis];if(qe(i)||isNaN(i))return!0};for(const h of i)if((void 0===e||!r(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(s=>t[s].axis===e).shift()}_getAxis(){const t={},e=this.getFirstScaleIdForIndexAxis();for(const s of this.chart.data.datasets)t[Qe("x"===this.chart.options.indexAxis?s.xAxisID:s.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,s){const i=this._getStacks(t,s),n=void 0!==e?i.indexOf(e):-1;return-1===n?i.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,s=e.iScale,i=[];let n,a;for(n=0,a=e.data.length;n=0;--s)e=Math.max(e,t[s].size(this.resolveDataElementOptions(s))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart.data.labels||[],{xScale:i,yScale:n}=e,a=this.getParsed(t),o=i.getLabelForValue(a.x),l=n.getLabelForValue(a.y),r=a._custom;return{label:s[t]||"",value:"("+o+", "+l+(r?", "+r:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,s,i){const n="reset"===i,{iScale:a,vScale:o}=this._cachedMeta,{sharedOptions:l,includeOptions:r}=this._getSharedOptions(e,i),h=a.axis,d=o.axis;for(let c=e;cBs(t,l,r,!0)?1:Math.max(e,e*s,i,i*s),g=(t,e,i)=>Bs(t,l,r,!0)?-1:Math.min(e,e*s,i,i*s),f=p(0,h,c),m=p(ks,d,u),b=g(bs,h,c),y=g(bs+ks,d,u);i=(f-b)/2,n=(m-y)/2,a=-(f+b)/2,o=-(m+y)/2}return{ratioX:i,ratioY:n,offsetX:a,offsetY:o}}(0,Gt.A)(po,"id","bubble"),(0,Gt.A)(po,"defaults",{datasetElementType:!1,dataElementType:"point",animations:{numbers:{type:"number",properties:["x","y","borderWidth","radius"]}}}),(0,Gt.A)(po,"overrides",{scales:{x:{type:"linear"},y:{type:"linear"}}});class fo extends Ya{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 s=this.getDataset().data,i=this._cachedMeta;if(!1===this._parsing)i._parsed=s;else{let n,a,o=t=>+s[t];if(Xe(s[t])){const{key:t="value"}=this._parsing;o=e=>+cs(s[e],t)}for(n=t,a=t+e;n0&&!isNaN(t)?ys*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=vi(e._parsed[t],s.options.locale);return{label:i[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const s=this.chart;let i,n,a,o,l;if(!t)for(i=0,n=s.data.datasets.length;i"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),(0,Gt.A)(fo,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data,{labels:{pointStyle:s,textAlign:i,color:n,useBorderRadius:a,borderRadius:o}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((e,l)=>{const r=t.getDatasetMeta(0),h=r.controller.getStyle(l);return{text:e,fillStyle:h.backgroundColor,fontColor:n,hidden:!t.getDataVisibility(l),lineDash:h.borderDash,lineDashOffset:h.borderDashOffset,lineJoin:h.borderJoinStyle,lineWidth:h.borderWidth,strokeStyle:h.borderColor,textAlign:i,pointStyle:s,borderRadius:a&&(o||h.borderRadius),index:l}}):[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}}});class mo extends Ya{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:s,data:i=[],_dataset:n}=e,a=this.chart._animationsDisabled;let{start:o,count:l}=ai(e,i,a);this._drawStart=o,this._drawCount=l,oi(e)&&(o=0,l=i.length),s._chart=this.chart,s._datasetIndex=this.index,s._decimated=!!n._decimated,s.points=i;const r=this.resolveDatasetElementOptions(t);this.options.showLine||(r.borderWidth=0),r.segment=this.options.segment,this.updateElement(s,void 0,{animated:!a,options:r},t),this.updateElements(i,o,l,t)}updateElements(t,e,s,i){const n="reset"===i,{iScale:a,vScale:o,_stacked:l,_dataset:r}=this._cachedMeta,{sharedOptions:h,includeOptions:d}=this._getSharedOptions(e,i),c=a.axis,u=o.axis,{spanGaps:p,segment:g}=this.options,f=Ds(p)?p:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||"none"===i,b=e+s,y=t.length;let x=e>0&&this.getParsed(e-1);for(let v=0;v=b){p.skip=!0;continue}const y=this.getParsed(v),_=qe(y[u]),k=p[c]=a.getPixelForValue(y[c],v),w=p[u]=n||_?o.getBasePixel():o.getPixelForValue(l?this.applyStack(o,y,l):y[u],v);p.skip=isNaN(k)||isNaN(w)||_,p.stop=v>0&&Math.abs(y[c]-x[c])>f,g&&(p.parsed=y,p.raw=r.data[v]),d&&(p.options=h||this.resolveDataElementOptions(v,s.active?"active":i)),m||this.updateElement(s,v,p,i),x=y}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,s=e.options&&e.options.borderWidth||0,i=t.data||[];if(!i.length)return s;const n=i[0].size(this.resolveDataElementOptions(0)),a=i[i.length-1].size(this.resolveDataElementOptions(i.length-1));return Math.max(s,n,a)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}(0,Gt.A)(mo,"id","line"),(0,Gt.A)(mo,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,Gt.A)(mo,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class bo extends Ya{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,i=s.data.labels||[],n=vi(e._parsed[t].r,s.options.locale);return{label:i[t]||"",value:n}}parseObjectData(t,e,s,i){return Fn.bind(this)(t,e,s,i)}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,s)=>{const i=this.getParsed(s).r;!isNaN(i)&&this.chart.getDataVisibility(s)&&(ie.max&&(e.max=i))}),e}_updateRadius(){const t=this.chart,e=t.chartArea,s=t.options,i=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(i/2,0),a=Math.max(s.cutoutPercentage?n/100*s.cutoutPercentage:1,0),o=(n-a)/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,s,i){const n="reset"===i,a=this.chart,o=a.options,l=o.animation,r=this._cachedMeta.rScale,h=r.xCenter,d=r.yCenter,c=r.getIndexAngle(0)-.5*bs;let u,p=c;const g=360/this.countVisibleElements();for(u=0;u{!isNaN(this.getParsed(s).r)&&this.chart.getDataVisibility(s)&&e++}),e}_computeAngle(t,e,s){return this.chart.getDataVisibility(t)?Ls(this.resolveDataElementOptions(t,e).angle||s):0}}(0,Gt.A)(bo,"id","polarArea"),(0,Gt.A)(bo,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),(0,Gt.A)(bo,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:s,color:i}}=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:i,lineWidth:o.borderWidth,pointStyle:s,hidden:!t.getDataVisibility(n),index:n}})}return[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});class yo extends fo{}(0,Gt.A)(yo,"id","pie"),(0,Gt.A)(yo,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class xo extends Ya{getLabelAndValue(t){const e=this._cachedMeta.vScale,s=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(s[e.axis])}}parseObjectData(t,e,s,i){return Fn.bind(this)(t,e,s,i)}update(t){const e=this._cachedMeta,s=e.dataset,i=e.data||[],n=e.iScale.getLabels();if(s.points=i,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const a={_loop:!0,_fullLoop:n.length===i.length,options:e};this.updateElement(s,void 0,a,t)}this.updateElements(i,0,i.length,t)}updateElements(t,e,s,i){const n=this._cachedMeta.rScale,a="reset"===i;for(let o=e;o0&&this.getParsed(e-1);for(let x=e;x0&&Math.abs(s[u]-y[u])>m,f&&(h.parsed=s,h.raw=r.data[x]),c&&(h.options=d||this.resolveDataElementOptions(x,e.active?"active":i)),b||this.updateElement(e,x,h,i),y=s}this.updateSharedOptions(d,i,h)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let s=e.length-1;s>=0;--s)t=Math.max(t,e[s].size(this.resolveDataElementOptions(s))/2);return t>0&&t}const s=t.dataset,i=s.options&&s.options.borderWidth||0;if(!e.length)return i;const n=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(i,n,a)/2}}(0,Gt.A)(vo,"id","scatter"),(0,Gt.A)(vo,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,Gt.A)(vo,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function _o(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class ko{static override(t){Object.assign(ko.prototype,t)}constructor(t){(0,Gt.A)(this,"options",void 0),this.options=t||{}}init(){}formats(){return _o()}parse(){return _o()}format(){return _o()}add(){return _o()}diff(){return _o()}startOf(){return _o()}endOf(){return _o()}}var wo={_date:ko};function Co(t,e,s,i){const{controller:n,data:a,_sorted:o}=t,l=n._cachedMeta.iScale,r=t.dataset&&t.dataset.options?t.dataset.options.spanGaps:null;if(l&&e===l.axis&&"r"!==e&&o&&a.length){const o=l._reversePixels?Xs:Hs;if(!i){const i=o(a,e,s);if(r){const{vScale:e}=n._cachedMeta,{_parsed:s}=t,a=s.slice(0,i.lo+1).reverse().findIndex(t=>!qe(t[e.axis]));i.lo-=Math.max(0,a);const o=s.slice(i.hi).findIndex(t=>!qe(t[e.axis]));i.hi+=Math.max(0,o)}return i}if(n._sharedOptions){const t=a[0],i="function"===typeof t.getRange&&t.getRange(e);if(i){const t=o(a,e,s-i),n=o(a,e,s+i);return{lo:t.lo,hi:n.hi}}}}return{lo:0,hi:a.length-1}}function So(t,e,s,i,n){const a=t.getSortedVisibleDatasetMetas(),o=s[e];for(let l=0,r=a.length;l{t[o]&&t[o](e[s],n)&&(a.push({element:t,datasetIndex:i,index:r}),l=l||t.inRange(e.x,e.y,n))}),i&&!l?[]:a}var $o={evaluateInteractionItems:So,modes:{index(t,e,s,i){const n=Hn(e,t),a=s.axis||"x",o=s.includeInvisible||!1,l=s.intersect?To(t,n,a,i,o):Ao(t,n,a,!1,i,o),r=[];return l.length?(t.getSortedVisibleDatasetMetas().forEach(t=>{const e=l[0].index,s=t.data[e];s&&!s.skip&&r.push({element:s,datasetIndex:t.index,index:e})}),r):[]},dataset(t,e,s,i){const n=Hn(e,t),a=s.axis||"xy",o=s.includeInvisible||!1;let l=s.intersect?To(t,n,a,i,o):Ao(t,n,a,!1,i,o);if(l.length>0){const e=l[0].datasetIndex,s=t.getDatasetMeta(e).data;l=[];for(let t=0;tt.pos===e)}function Eo(t,e){return t.filter(t=>-1===Vo.indexOf(t.pos)&&t.box.axis===e)}function Uo(t,e){return t.sort((t,s)=>{const i=e?s:t,n=e?t:s;return i.weight===n.weight?i.index-n.index:i.weight-n.weight})}function Io(t){const e=[];let s,i,n,a,o,l;for(s=0,i=(t||[]).length;st.box.fullSize),!0),i=Uo(Lo(e,"left"),!0),n=Uo(Lo(e,"right")),a=Uo(Lo(e,"top"),!0),o=Uo(Lo(e,"bottom")),l=Eo(e,"x"),r=Eo(e,"y");return{fullSize:s,leftAndTop:i.concat(a),rightAndBottom:n.concat(r).concat(o).concat(l),chartArea:Lo(e,"chartArea"),vertical:i.concat(n).concat(r),horizontal:a.concat(o).concat(l)}}function Bo(t,e,s,i){return Math.max(t[s],e[s])+Math.max(t[i],e[i])}function No(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 zo(t,e,s,i){const{pos:n,box:a}=s,o=t.maxPadding;if(!Xe(n)){s.size&&(t[n]-=s.size);const e=i[s.stack]||{size:0,count:1};e.size=Math.max(e.size,s.horizontal?a.height:a.width),s.size=e.size/e.count,t[n]+=s.size}a.getPadding&&No(o,a.getPadding());const l=Math.max(0,e.outerWidth-Bo(o,t,"left","right")),r=Math.max(0,e.outerHeight-Bo(o,t,"top","bottom")),h=l!==t.w,d=r!==t.h;return t.w=l,t.h=r,s.horizontal?{same:h,other:d}:{same:d,other:h}}function jo(t){const e=t.maxPadding;function s(s){const i=Math.max(e[s]-t[s],0);return t[s]+=i,i}t.y+=s("top"),t.x+=s("left"),s("right"),s("bottom")}function qo(t,e){const s=e.maxPadding;function i(t){const i={left:0,top:0,right:0,bottom:0};return t.forEach(t=>{i[t]=Math.max(e[t],s[t])}),i}return i(t?["left","right"]:["top","bottom"])}function Ho(t,e,s,i){const n=[];let a,o,l,r,h,d;for(a=0,o=t.length,h=0;a{"function"===typeof t.beforeLayout&&t.beforeLayout()});const d=r.reduce((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1,0)||1,c=Object.freeze({outerWidth:e,outerHeight:s,padding:n,availableWidth:a,availableHeight:o,vBoxMaxWidth:a/2/d,hBoxMaxHeight:o/2}),u=Object.assign({},n);No(u,en(i));const p=Object.assign({maxPadding:u,w:a,h:o,x:n.left,y:n.top},n),g=Ro(r.concat(h),c);Ho(l.fullSize,p,c,g),Ho(r,p,c,g),Ho(h,p,c,g)&&Ho(r,p,c,g),jo(p),Ko(l.leftAndTop,p,c,g),p.x+=p.w,p.y+=p.h,Ko(l.rightAndBottom,p,c,g),t.chartArea={left:p.left,top:p.top,right:p.left+p.w,bottom:p.top+p.h,height:p.h,width:p.w},ts(l.chartArea,e=>{const s=e.box;Object.assign(s,t.chartArea),s.update(p.w,p.h,{left:0,top:0,right:0,bottom:0})})}};class Qo{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,s){}removeEventListener(t,e,s){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,s,i){return e=Math.max(0,e||t.width),s=s||t.height,{width:e,height:Math.max(0,i?Math.floor(e/i):s)}}isAttached(t){return!0}updateConfig(t){}}class Go extends Qo{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Jo="$chartjs",Zo={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},tl=t=>null===t||""===t;function el(t,e){const s=t.style,i=t.getAttribute("height"),n=t.getAttribute("width");if(t[Jo]={initial:{height:i,width:n,style:{display:s.display,height:s.height,width:s.width}}},s.display=s.display||"block",s.boxSizing=s.boxSizing||"border-box",tl(n)){const e=Jn(t,"width");void 0!==e&&(t.width=e)}if(tl(i))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Jn(t,"height");void 0!==e&&(t.height=e)}return t}const sl=!!Gn&&{passive:!0};function il(t,e,s){t&&t.addEventListener(e,s,sl)}function nl(t,e,s){t&&t.canvas&&t.canvas.removeEventListener(e,s,sl)}function al(t,e){const s=Zo[t.type]||t.type,{x:i,y:n}=Hn(t,e);return{type:s,chart:e,native:t,x:void 0!==i?i:null,y:void 0!==n?n:null}}function ol(t,e){for(const s of t)if(s===e||s.contains(e))return!0}function ll(t,e,s){const i=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const s of t)e=e||ol(s.addedNodes,i),e=e&&!ol(s.removedNodes,i);e&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}function rl(t,e,s){const i=t.canvas,n=new MutationObserver(t=>{let e=!1;for(const s of t)e=e||ol(s.removedNodes,i),e=e&&!ol(s.addedNodes,i);e&&s()});return n.observe(document,{childList:!0,subtree:!0}),n}const hl=new Map;let dl=0;function cl(){const t=window.devicePixelRatio;t!==dl&&(dl=t,hl.forEach((e,s)=>{s.currentDevicePixelRatio!==t&&e()}))}function ul(t,e){hl.size||window.addEventListener("resize",cl),hl.set(t,e)}function pl(t){hl.delete(t),hl.size||window.removeEventListener("resize",cl)}function gl(t,e,s){const i=t.canvas,n=i&&On(i);if(!n)return;const a=ti((t,e)=>{const i=n.clientWidth;s(t,e),i{const e=t[0],s=e.contentRect.width,i=e.contentRect.height;0===s&&0===i||a(s,i)});return o.observe(n),ul(t,a),o}function fl(t,e,s){s&&s.disconnect(),"resize"===e&&pl(t)}function ml(t,e,s){const i=t.canvas,n=ti(e=>{null!==t.ctx&&s(al(e,t))},t);return il(i,e,n),n}class bl extends Qo{acquireContext(t,e){const s=t&&t.getContext&&t.getContext("2d");return s&&s.canvas===t?(el(t,e),s):null}releaseContext(t){const e=t.canvas;if(!e[Jo])return!1;const s=e[Jo].initial;["height","width"].forEach(t=>{const i=s[t];qe(i)?e.removeAttribute(t):e.setAttribute(t,i)});const i=s.style||{};return Object.keys(i).forEach(t=>{e.style[t]=i[t]}),e.width=e.width,delete e[Jo],!0}addEventListener(t,e,s){this.removeEventListener(t,e);const i=t.$proxies||(t.$proxies={}),n={attach:ll,detach:rl,resize:gl},a=n[e]||ml;i[e]=a(t,e,s)}removeEventListener(t,e){const s=t.$proxies||(t.$proxies={}),i=s[e];if(!i)return;const n={attach:fl,detach:fl,resize:fl},a=n[e]||nl;a(t,e,i),s[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,s,i){return Yn(t,e,s,i)}isAttached(t){const e=t&&On(t);return!(!e||!e.isConnected)}}function yl(t){return!In()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?Go:bl}class xl{constructor(){(0,Gt.A)(this,"x",void 0),(0,Gt.A)(this,"y",void 0),(0,Gt.A)(this,"active",!1),(0,Gt.A)(this,"options",void 0),(0,Gt.A)(this,"$animations",void 0)}tooltipPosition(t){const{x:e,y:s}=this.getProps(["x","y"],t);return{x:e,y:s}}hasValue(){return Ds(this.x)&&Ds(this.y)}getProps(t,e){const s=this.$animations;if(!e||!s)return this;const i={};return t.forEach(t=>{i[t]=s[t]&&s[t].active()?s[t]._to:this[t]}),i}}function vl(t,e){const s=t.options.ticks,i=_l(t),n=Math.min(s.maxTicksLimit||i,i),a=s.major.enabled?wl(e):[],o=a.length,l=a[0],r=a[o-1],h=[];if(o>n)return Cl(e,h,a,o/n),h;const d=kl(a,e,n);if(o>0){let t,s;const i=o>1?Math.round((r-l)/(o-1)):null;for(Sl(e,h,d,qe(i)?0:l-i,l),t=0,s=o-1;tn)return t}return Math.max(n,1)}function wl(t){const e=[];let s,i;for(s=0,i=t.length;s"left"===t?"right":"right"===t?"left":t,Pl=(t,e,s)=>"top"===e||"left"===e?t[e]+s:t[e]-s,Ml=(t,e)=>Math.min(e||t,t);function Al(t,e){const s=[],i=t.length/e,n=t.length;let a=0;for(;ao+l)))return h}function $l(t,e){ts(t,t=>{const s=t.gc,i=s.length/2;let n;if(i>e){for(n=0;ni?i:s,i=n&&s>i?s:i,{min:Ye(s,Ye(i,s)),max:Ye(i,Ye(s,i))}}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(){Ze(this.options.beforeUpdate,[this])}update(t,e,s){const{beginAtZero:i,grace:n,ticks:a}=this.options,o=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=s=Object.assign({left:0,right:0,top:0,bottom:0},s),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+s.left+s.right:this.height+s.top+s.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=an(this,n,i),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const l=o=n||s<=1||!this.isHorizontal())return void(this.labelRotation=i);const h=this._getLabelSizes(),d=h.widest.width,c=h.highest.height,u=Ns(this.chart.width-d,0,this.maxWidth);a=t.offset?this.maxWidth/s:u/(s-1),d+6>a&&(a=u/(s-(t.offset?.5:1)),o=this.maxHeight-Vl(t.grid)-e.padding-Ll(t.title,this.chart.options.font),l=Math.sqrt(d*d+c*c),r=Es(Math.min(Math.asin(Ns((h.highest.height+6)/a,-1,1)),Math.asin(Ns(o/l,-1,1))-Math.asin(Ns(c/l,-1,1)))),r=Math.max(i,Math.min(n,r))),this.labelRotation=r}afterCalculateLabelRotation(){Ze(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){Ze(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:s,title:i,grid:n}}=this,a=this._isVisible(),o=this.isHorizontal();if(a){const a=Ll(i,e.options.font);if(o?(t.width=this.maxWidth,t.height=Vl(n)+a):(t.height=this.maxHeight,t.width=Vl(n)+a),s.display&&this.ticks.length){const{first:e,last:i,widest:n,highest:a}=this._getLabelSizes(),l=2*s.padding,r=Ls(this.labelRotation),h=Math.cos(r),d=Math.sin(r);if(o){const e=s.mirror?0:d*n.width+h*a.height;t.height=Math.min(this.maxHeight,t.height+e+l)}else{const e=s.mirror?0:h*n.width+d*a.height;t.width=Math.min(this.maxWidth,t.width+e+l)}this._calculatePadding(e,i,d,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,s,i){const{ticks:{align:n,padding:a},position:o}=this.options,l=0!==this.labelRotation,r="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 d=0,c=0;l?r?(d=i*t.width,c=s*e.height):(d=s*t.height,c=i*e.width):"start"===n?c=e.width:"end"===n?d=t.width:"inner"!==n&&(d=t.width/2,c=e.width/2),this.paddingLeft=Math.max((d-o+a)*this.width/(this.width-o),0),this.paddingRight=Math.max((c-h+a)*this.width/(this.width-h),0)}else{let s=e.height/2,i=t.height/2;"start"===n?(s=0,i=t.height):"end"===n&&(s=e.height,i=0),this.paddingTop=s+a,this.paddingBottom=i+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(){Ze(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,s;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,s=t.length;e({width:a[t]||0,height:o[t]||0});return{first:w(0),last:w(e-1),widest:w(_),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 zs(this._alignToPixels?Li(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*i?o/s:l/i:l*i0}_computeGridLineItems(t){const e=this.axis,s=this.chart,i=this.options,{grid:n,position:a,border:o}=i,l=n.offset,r=this.isHorizontal(),h=this.ticks,d=h.length+(l?1:0),c=Vl(n),u=[],p=o.setContext(this.getContext()),g=p.display?p.width:0,f=g/2,m=function(t){return Li(s,t,g)};let b,y,x,v,_,k,w,C,S,F,T,P;if("top"===a)b=m(this.bottom),k=this.bottom-c,C=b-f,F=m(t.top)+f,P=t.bottom;else if("bottom"===a)b=m(this.top),F=t.top,P=m(t.bottom)-f,k=b+f,C=this.top+c;else if("left"===a)b=m(this.right),_=this.right-c,w=b-f,S=m(t.left)+f,T=t.right;else if("right"===a)b=m(this.left),S=t.left,T=m(t.right)-f,_=b+f,w=this.left+c;else if("x"===e){if("center"===a)b=m((t.top+t.bottom)/2+.5);else if(Xe(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}F=t.top,P=t.bottom,k=b+f,C=k+c}else if("y"===e){if("center"===a)b=m((t.left+t.right)/2);else if(Xe(a)){const t=Object.keys(a)[0],e=a[t];b=m(this.chart.scales[t].getPixelForValue(e))}_=b-f,w=_-c,S=t.left,T=t.right}const M=Qe(i.ticks.maxTicksLimit,d),A=Math.max(1,Math.ceil(d/M));for(y=0;y0&&(a-=i/2);break}c={left:a,top:n,width:i+e.width,height:s+e.height,color:t.backdropColor}}f.push({label:x,font:C,textOffset:T,options:{rotation:g,color:s,strokeColor:l,strokeWidth:h,textAlign:u,textBaseline:P,translation:[v,_],backdrop:c}})}return f}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options,s=-Ls(this.labelRotation);if(s)return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:s,mirror:i,padding:n}}=this.options,a=this._getLabelSizes(),o=t+n,l=a.widest.width;let r,h;return"left"===e?i?(h=this.right+n,"near"===s?r="left":"center"===s?(r="center",h+=l/2):(r="right",h+=l)):(h=this.right-o,"near"===s?r="right":"center"===s?(r="center",h-=l/2):(r="left",h=this.left)):"right"===e?i?(h=this.left+n,"near"===s?r="right":"center"===s?(r="center",h-=l/2):(r="left",h-=l)):(h=this.left+o,"near"===s?r="left":"center"===s?(r="center",h+=l/2):(r="right",h=this.right)):r="right",{textAlign:r,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:s,top:i,width:n,height:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(s,i,n,a),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const s=this.ticks,i=s.findIndex(e=>e.value===t);if(i>=0){const t=e.setContext(this.getContext(i));return t.lineWidth}return 0}drawGrid(t){const e=this.options.grid,s=this.ctx,i=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,a;const o=(t,e,i)=>{i.width&&i.color&&(s.save(),s.lineWidth=i.width,s.strokeStyle=i.color,s.setLineDash(i.borderDash||[]),s.lineDashOffset=i.borderDashOffset,s.beginPath(),s.moveTo(t.x,t.y),s.lineTo(e.x,e.y),s.stroke(),s.restore())};if(e.display)for(n=0,a=i.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),s=this.axis+"AxisID",i=[];let n,a;for(n=0,a=e.length;n{const i=s.split("."),n=i.pop(),a=[t].concat(i).join("."),o=e[s].split("."),l=o.pop(),r=o.join(".");Ai.route(a,n,r,l)})}function zl(t){return"id"in t&&"defaults"in t}class jl{constructor(){this.controllers=new Wl(Ya,"datasets",!0),this.elements=new Wl(xl,"elements"),this.plugins=new Wl(Object,"plugins"),this.scales=new Wl(Rl,"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,s){[...e].forEach(e=>{const i=s||this._getRegistryForType(e);s||i.isForType(e)||i===this.plugins&&e.id?this._exec(t,i,e):ts(e,e=>{const i=s||this._getRegistryForType(e);this._exec(t,i,e)})})}_exec(t,e,s){const i=us(t);Ze(s["before"+i],[],s),e[t](s),Ze(s["after"+i],[],s)}_getRegistryForType(t){for(let e=0;et.filter(t=>!e.some(e=>t.plugin.id===e.plugin.id));this._notify(i(e,s),t,"stop"),this._notify(i(s,e),t,"start")}}function Xl(t){const e={},s=[],i=Object.keys(ql.plugins.items);for(let a=0;a1&&tr(t[0].toLowerCase());if(e)return e}throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function ir(t,e,s){if(s[e+"AxisID"]===t)return{axis:e}}function nr(t,e){if(e.data&&e.data.datasets){const s=e.data.datasets.filter(e=>e.xAxisID===t||e.yAxisID===t);if(s.length)return ir(t,"x",s[0])||ir(t,"y",s[0])}return{}}function ar(t,e){const s=Si[t.type]||{scales:{}},i=e.scales||{},n=Gl(t.type,e),a=Object.create(null);return Object.keys(i).forEach(e=>{const o=i[e];if(!Xe(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 l=sr(e,o,nr(e,t),Ai.scales[o.type]),r=Zl(l,n),h=s.scales||{};a[e]=os(Object.create(null),[{axis:l},o,h[l],h[r]])}),t.data.datasets.forEach(s=>{const n=s.type||t.type,o=s.indexAxis||Gl(n,e),l=Si[n]||{},r=l.scales||{};Object.keys(r).forEach(t=>{const e=Jl(t,o),n=s[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),os(a[n],[{axis:e},i[n],r[t]])})}),Object.keys(a).forEach(t=>{const e=a[t];os(e,[Ai.scales[e.type],Ai.scale])}),a}function or(t){const e=t.options||(t.options={});e.plugins=Qe(e.plugins,{}),e.scales=ar(t,e)}function lr(t){return t=t||{},t.datasets=t.datasets||[],t.labels=t.labels||[],t}function rr(t){return t=t||{},t.data=lr(t.data),or(t),t}const hr=new Map,dr=new Set;function cr(t,e){let s=hr.get(t);return s||(s=e(),hr.set(t,s),dr.add(s)),s}const ur=(t,e,s)=>{const i=cs(e,s);void 0!==i&&t.add(i)};class pr{constructor(t){this._config=rr(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=lr(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(),or(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return cr(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return cr(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return cr(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,s=this.type;return cr(`${s}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){const s=this._scopeCache;let i=s.get(t);return i&&!e||(i=new Map,s.set(t,i)),i}getOptionScopes(t,e,s){const{options:i,type:n}=this,a=this._cachedScopes(t,s),o=a.get(e);if(o)return o;const l=new Set;e.forEach(e=>{t&&(l.add(t),e.forEach(e=>ur(l,t,e))),e.forEach(t=>ur(l,i,t)),e.forEach(t=>ur(l,Si[n]||{},t)),e.forEach(t=>ur(l,Ai,t)),e.forEach(t=>ur(l,Fi,t))});const r=Array.from(l);return 0===r.length&&r.push(Object.create(null)),dr.has(e)&&a.set(e,r),r}chartOptionScopes(){const{options:t,type:e}=this;return[t,Si[e]||{},Ai.datasets[e]||{},{type:e},Ai,Fi]}resolveNamedOptions(t,e,s,i=[""]){const n={$shared:!0},{resolver:a,subPrefixes:o}=gr(this._resolverCache,t,i);let l=a;if(mr(a,e)){n.$shared=!1,s=gs(s)?s():s;const e=this.createResolver(t,s,o);l=rn(a,s,e)}for(const r of e)n[r]=l[r];return n}createResolver(t,e,s=[""],i){const{resolver:n}=gr(this._resolverCache,t,s);return Xe(e)?rn(n,e,void 0,i):n}}function gr(t,e,s){let i=t.get(e);i||(i=new Map,t.set(e,i));const n=s.join();let a=i.get(n);if(!a){const t=ln(e,s);a={resolver:t,subPrefixes:s.filter(t=>!t.toLowerCase().includes("hover"))},i.set(n,a)}return a}const fr=t=>Xe(t)&&Object.getOwnPropertyNames(t).some(e=>gs(t[e]));function mr(t,e){const{isScriptable:s,isIndexable:i}=hn(t);for(const n of e){const e=s(n),a=i(n),o=(a||e)&&t[n];if(e&&(gs(o)||fr(o))||a&&He(o))return!0}return!1}var br="4.5.1";const yr=["top","bottom","left","right","chartArea"];function xr(t,e){return"top"===t||"bottom"===t||-1===yr.indexOf(t)&&"x"===e}function vr(t,e){return function(s,i){return s[t]===i[t]?s[e]-i[e]:s[t]-i[t]}}function _r(t){const e=t.chart,s=e.options.animation;e.notifyPlugins("afterRender"),Ze(s&&s.onComplete,[t],e)}function kr(t){const e=t.chart,s=e.options.animation;Ze(s&&s.onProgress,[t],e)}function wr(t){return In()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const Cr={},Sr=t=>{const e=wr(t);return Object.values(Cr).filter(t=>t.canvas===e).pop()};function Fr(t,e,s){const i=Object.keys(t);for(const n of i){const i=+n;if(i>=e){const a=t[n];delete t[n],(s>0||i>e)&&(t[i+s]=a)}}}function Tr(t,e,s,i){return s&&"mouseout"!==t.type?i?e:t:null}class Pr{static register(...t){ql.add(...t),Mr()}static unregister(...t){ql.remove(...t),Mr()}constructor(t,e){const s=this.config=new pr(e),i=wr(t),n=Sr(i);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=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||yl(i)),this.platform.updateConfig(s);const o=this.platform.acquireContext(i,a.aspectRatio),l=o&&o.canvas,r=l&&l.height,h=l&&l.width;this.id=je(),this.ctx=o,this.canvas=l,this.width=h,this.height=r,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 Hl,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=ei(t=>this.update(t),a.resizeDelay||0),this._dataChanges=[],Cr[this.id]=this,o&&l?(wa.listen(this,"complete",_r),wa.listen(this,"progress",kr),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:s,height:i,_aspectRatio:n}=this;return qe(t)?e&&n?n:i?s/i: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 ql}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Qn(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Ei(this.canvas,this.ctx),this}stop(){return wa.stop(this),this}resize(t,e){wa.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const s=this.options,i=this.canvas,n=s.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(i,t,e,n),o=s.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,Qn(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),Ze(s.onResize,[this,a],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){const t=this.options,e=t.scales||{};ts(e,(t,e)=>{t.id=e})}buildOrUpdateScales(){const t=this.options,e=t.scales,s=this.scales,i=Object.keys(s).reduce((t,e)=>(t[e]=!1,t),{});let n=[];e&&(n=n.concat(Object.keys(e).map(t=>{const s=e[t],i=sr(t,s),n="r"===i,a="x"===i;return{options:s,dposition:n?"chartArea":a?"bottom":"left",dtype:n?"radialLinear":a?"category":"linear"}}))),ts(n,e=>{const n=e.options,a=n.id,o=sr(a,n),l=Qe(n.type,e.dtype);void 0!==n.position&&xr(n.position,o)===xr(e.dposition)||(n.position=e.dposition),i[a]=!0;let r=null;if(a in s&&s[a].type===l)r=s[a];else{const t=ql.getScale(l);r=new t({id:a,type:l,ctx:this.ctx,chart:this}),s[r.id]=r}r.init(n,t)}),ts(i,(t,e)=>{t||delete s[e]}),ts(s,t=>{Yo.configure(this,t,t.options),Yo.addBox(this,t)})}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,s=t.length;if(t.sort((t,e)=>t.index-e.index),s>e){for(let t=e;te.length&&delete this._stacks,t.forEach((t,s)=>{0===e.filter(e=>e===t._dataset).length&&this._destroyDatasetMeta(s)})}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let s,i;for(this._removeUnreferencedMetasets(),s=0,i=e.length;s{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const s=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),i=this._animationsDisabled=!s.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 r=0,h=this.data.datasets.length;r{t.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(vr("z","_idx"));const{_active:o,_lastEvent:l}=this;l?this._eventHandler(l,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){ts(this.scales,t=>{Yo.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),s=new Set(t.events);fs(e,s)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:s,start:i,count:n}of e){const e="_removeElements"===s?-n:n;Fr(t,i,e)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,s=e=>new Set(t.filter(t=>t[0]===e).map((t,e)=>e+","+t.splice(1).join(","))),i=s(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;Yo.update(this,this.width,this.height,t);const e=this.chartArea,s=e.width<=0||e.height<=0;this._layers=[],ts(this.boxes,t=>{s&&"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,s={meta:t,index:t.index,cancelable:!0},i=_a(this,t);!1!==this.notifyPlugins("beforeDatasetDraw",s)&&(i&&Ri(e,i),t.controller.draw(),i&&Wi(e),s.cancelable=!1,this.notifyPlugins("afterDatasetDraw",s))}isPointInArea(t){return Oi(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,s,i){const n=$o.modes[e];return"function"===typeof n?n(this,t,s,i):[]}getDatasetMeta(t){const e=this.data.datasets[t],s=this._metasets;let i=s.filter(t=>t&&t._dataset===e).pop();return i||(i={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},s.push(i)),i}getContext(){return this.$context||(this.$context=on(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const s=this.getDatasetMeta(t);return"boolean"===typeof s.hidden?!s.hidden:!e.hidden}setDatasetVisibility(t,e){const s=this.getDatasetMeta(t);s.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,s){const i=s?"show":"hide",n=this.getDatasetMeta(t),a=n.controller._resolveAnimations(void 0,i);ps(e)?(n.data[e].hidden=!s,this.update()):(this.setDatasetVisibility(t,s),a.update(n,{visible:s}),this.update(e=>e.datasetIndex===t?i: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(),wa.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,s,i),t[s]=i},i=(t,e,s)=>{t.offsetX=e,t.offsetY=s,this._eventHandler(t)};ts(this.options.events,t=>s(t,i))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,s=(s,i)=>{e.addEventListener(this,s,i),t[s]=i},i=(s,i)=>{t[s]&&(e.removeEventListener(this,s,i),delete t[s])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let a;const o=()=>{i("attach",o),this.attached=!0,this.resize(),s("resize",n),s("detach",a)};a=()=>{this.attached=!1,i("resize",n),this._stop(),this._resize(0,0),s("attach",o)},e.isAttached(this.canvas)?o():a()}unbindEvents(){ts(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},ts(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,s){const i=s?"set":"remove";let n,a,o,l;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+i+"DatasetHoverStyle"]()),o=0,l=t.length;o{const s=this.getDatasetMeta(t);if(!s)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:s.data[e],index:e}}),i=!es(s,e);i&&(this._active=s,this._lastEvent=null,this._updateHoverStyles(s,e))}notifyPlugins(t,e,s){return this._plugins.notify(this,t,e,s)}isPluginEnabled(t){return 1===this._plugins._cache.filter(e=>e.plugin.id===t).length}_updateHoverStyles(t,e,s){const i=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=s?t:n(t,e);a.length&&this.updateHoverStyle(a,i.mode,!1),o.length&&i.mode&&this.updateHoverStyle(o,i.mode,!0)}_eventHandler(t,e){const s={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},i=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",s,i))return;const n=this._handleEvent(t,e,s.inChartArea);return s.cancelable=!1,this.notifyPlugins("afterEvent",s,i),(n||s.changed)&&this.render(),this}_handleEvent(t,e,s){const{_active:i=[],options:n}=this,a=e,o=this._getActiveElements(t,i,s,a),l=ms(t),r=Tr(t,this._lastEvent,s,l);s&&(this._lastEvent=null,Ze(n.onHover,[t,o,this],this),l&&Ze(n.onClick,[t,o,this],this));const h=!es(o,i);return(h||e)&&(this._active=o,this._updateHoverStyles(o,i,e)),this._lastEvent=r,h}_getActiveElements(t,e,s,i){if("mouseout"===t.type)return[];if(!s)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,i)}}function Mr(){return ts(Pr.instances,t=>t._plugins.invalidate())}function Ar(t,e,s){const{startAngle:i,x:n,y:a,outerRadius:o,innerRadius:l,options:r}=e,{borderWidth:h,borderJoinStyle:d}=r,c=Math.min(h/o,Ws(i-s));if(t.beginPath(),t.arc(n,a,o-h/2,i+c/2,s-c/2),l>0){const e=Math.min(h/l,Ws(i-s));t.arc(n,a,l+h/2,s-e/2,i+e/2,!0)}else{const e=Math.min(h/2,o*Ws(i-s));if("round"===d)t.arc(n,a,e,s-bs/2,i+bs/2,!0);else if("bevel"===d){const o=2*e*e,l=-o*Math.cos(s+bs/2)+n,r=-o*Math.sin(s+bs/2)+a,h=o*Math.cos(i+bs/2)+n,d=o*Math.sin(i+bs/2)+a;t.lineTo(l,r),t.lineTo(h,d)}}t.closePath(),t.moveTo(0,0),t.rect(0,0,t.canvas.width,t.canvas.height),t.clip("evenodd")}function Dr(t,e,s){const{startAngle:i,pixelMargin:n,x:a,y:o,outerRadius:l,innerRadius:r}=e;let h=n/l;t.beginPath(),t.arc(a,o,l,i-h,s+h),r>n?(h=n/r,t.arc(a,o,r,s+h,i-h,!0)):t.arc(a,o,n,s+ks,i-ks),t.closePath(),t.clip()}function $r(t){return Ji(t,["outerStart","outerEnd","innerStart","innerEnd"])}function Vr(t,e,s,i){const n=$r(t.options.borderRadius),a=(s-e)/2,o=Math.min(a,i*e/2),l=t=>{const e=(s-Math.min(a,t))*i/2;return Ns(t,0,Math.min(a,e))};return{outerStart:l(n.outerStart),outerEnd:l(n.outerEnd),innerStart:Ns(n.innerStart,0,o),innerEnd:Ns(n.innerEnd,0,o)}}function Lr(t,e,s,i){return{x:s+t*Math.cos(e),y:i+t*Math.sin(e)}}function Er(t,e,s,i,n,a){const{x:o,y:l,startAngle:r,pixelMargin:h,innerRadius:d}=e,c=Math.max(e.outerRadius+i+s-h,0),u=d>0?d+i+s+h:0;let p=0;const g=n-r;if(i){const t=d>0?d-i:0,e=c>0?c-i:0,s=(t+e)/2,n=0!==s?g*s/(s+i):g;p=(g-n)/2}const f=Math.max(.001,g*c-s/bs)/c,m=(g-f)/2,b=r+m+p,y=n-m-p,{outerStart:x,outerEnd:v,innerStart:_,innerEnd:k}=Vr(e,u,c,y-b),w=c-x,C=c-v,S=b+x/w,F=y-v/C,T=u+_,P=u+k,M=b+_/T,A=y-k/P;if(t.beginPath(),a){const e=(S+F)/2;if(t.arc(o,l,c,S,e),t.arc(o,l,c,e,F),v>0){const e=Lr(C,F,o,l);t.arc(e.x,e.y,v,F,y+ks)}const s=Lr(P,y,o,l);if(t.lineTo(s.x,s.y),k>0){const e=Lr(P,A,o,l);t.arc(e.x,e.y,k,y+ks,A+Math.PI)}const i=(y-k/u+(b+_/u))/2;if(t.arc(o,l,u,y-k/u,i,!0),t.arc(o,l,u,i,b+_/u,!0),_>0){const e=Lr(T,M,o,l);t.arc(e.x,e.y,_,M+Math.PI,b-ks)}const n=Lr(w,b,o,l);if(t.lineTo(n.x,n.y),x>0){const e=Lr(w,S,o,l);t.arc(e.x,e.y,x,b-ks,S)}}else{t.moveTo(o,l);const e=Math.cos(S)*c+o,s=Math.sin(S)*c+l;t.lineTo(e,s);const i=Math.cos(F)*c+o,n=Math.sin(F)*c+l;t.lineTo(i,n)}t.closePath()}function Ur(t,e,s,i,n){const{fullCircles:a,startAngle:o,circumference:l}=e;let r=e.endAngle;if(a){Er(t,e,s,i,r,n);for(let e=0;e=bs&&0===p&&"miter"!==d&&Ar(t,e,f),a||(Er(t,e,s,i,f,n),t.stroke())}(0,Gt.A)(Pr,"defaults",Ai),(0,Gt.A)(Pr,"instances",Cr),(0,Gt.A)(Pr,"overrides",Si),(0,Gt.A)(Pr,"registry",ql),(0,Gt.A)(Pr,"version",br),(0,Gt.A)(Pr,"getChart",Sr);class Or extends xl{constructor(t){super(),(0,Gt.A)(this,"circumference",void 0),(0,Gt.A)(this,"endAngle",void 0),(0,Gt.A)(this,"fullCircles",void 0),(0,Gt.A)(this,"innerRadius",void 0),(0,Gt.A)(this,"outerRadius",void 0),(0,Gt.A)(this,"pixelMargin",void 0),(0,Gt.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,s){const i=this.getProps(["x","y"],s),{angle:n,distance:a}=Is(i,{x:t,y:e}),{startAngle:o,endAngle:l,innerRadius:r,outerRadius:h,circumference:d}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],s),c=(this.options.spacing+this.options.borderWidth)/2,u=Qe(d,l-o),p=Bs(n,o,l)&&o!==l,g=u>=ys||p,f=js(a,r+c,h+c);return g&&f}getCenterPoint(t){const{x:e,y:s,startAngle:i,endAngle:n,innerRadius:a,outerRadius:o}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:l,spacing:r}=this.options,h=(i+n)/2,d=(a+o+r+l)/2;return{x:e+Math.cos(h)*d,y:s+Math.sin(h)*d}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:s}=this,i=(e.offset||0)/4,n=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=s>ys?Math.floor(s/ys):0,0===s||this.innerRadius<0||this.outerRadius<0)return;t.save();const o=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(o)*i,Math.sin(o)*i);const l=1-Math.sin(Math.min(bs,s||0)),r=i*l;t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,Ur(t,this,r,n,a),Ir(t,this,r,n,a),t.restore()}}function Rr(t,e,s=e){t.lineCap=Qe(s.borderCapStyle,e.borderCapStyle),t.setLineDash(Qe(s.borderDash,e.borderDash)),t.lineDashOffset=Qe(s.borderDashOffset,e.borderDashOffset),t.lineJoin=Qe(s.borderJoinStyle,e.borderJoinStyle),t.lineWidth=Qe(s.borderWidth,e.borderWidth),t.strokeStyle=Qe(s.borderColor,e.borderColor)}function Wr(t,e,s){t.lineTo(s.x,s.y)}function Br(t){return t.stepped?Bi:t.tension||"monotone"===t.cubicInterpolationMode?Ni:Wr}function Nr(t,e,s={}){const i=t.length,{start:n=0,end:a=i-1}=s,{start:o,end:l}=e,r=Math.max(n,o),h=Math.min(a,l),d=nl&&a>l;return{count:i,start:r,loop:e.loop,ilen:h(o+(h?l-t:t))%a,x=()=>{p!==g&&(t.lineTo(m,g),t.lineTo(m,p),t.lineTo(m,f))};for(r&&(c=n[y(0)],t.moveTo(c.x,c.y)),d=0;d<=l;++d){if(c=n[y(d)],c.skip)continue;const e=c.x,s=c.y,i=0|e;i===u?(sg&&(g=s),m=(b*m+e)/++b):(x(),t.lineTo(e,s),u=i,b=0,p=g=s),f=s}x()}function qr(t){const e=t.options,s=e.borderDash&&e.borderDash.length,i=!t._decimated&&!t._loop&&!e.tension&&"monotone"!==e.cubicInterpolationMode&&!e.stepped&&!s;return i?jr:zr}function Hr(t){return t.stepped?ta:t.tension||"monotone"===t.cubicInterpolationMode?ea:Zn}function Xr(t,e,s,i){let n=e._path;n||(n=e._path=new Path2D,e.path(n,s,i)&&n.closePath()),Rr(t,e.options),t.stroke(n)}function Kr(t,e,s,i){const{segments:n,options:a}=e,o=qr(e);for(const l of n)Rr(t,a,l.style),t.beginPath(),o(t,e,l,{start:s,end:s+i-1})&&t.closePath(),t.stroke()}(0,Gt.A)(Or,"id","arc"),(0,Gt.A)(Or,"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,Gt.A)(Or,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,Gt.A)(Or,"descriptors",{_scriptable:!0,_indexable:t=>"borderDash"!==t});const Yr="function"===typeof Path2D;function Qr(t,e,s,i){Yr&&!e.options.segment?Xr(t,e,s,i):Kr(t,e,s,i)}class Gr extends xl{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 s=this.options;if((s.tension||"monotone"===s.cubicInterpolationMode)&&!s.stepped&&!this._pointsUpdated){const i=s.spanGaps?this._loop:this._fullLoop;Un(this._points,s,t,i,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=ga(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,s=t.length;return s&&e[t[s-1].end]}interpolate(t,e){const s=this.options,i=t[e],n=this.points,a=ca(this,{property:e,start:i,end:i});if(!a.length)return;const o=[],l=Hr(s);let r,h;for(r=0,h=a.length;r"borderDash"!==t&&"fill"!==t});class Zr extends xl{constructor(t){super(),(0,Gt.A)(this,"parsed",void 0),(0,Gt.A)(this,"skip",void 0),(0,Gt.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,s){const i=this.options,{x:n,y:a}=this.getProps(["x","y"],s);return Math.pow(t-n,2)+Math.pow(e-a,2){let{boxHeight:s=e,boxWidth:i=e}=t;return t.usePointStyle&&(s=Math.min(s,e),i=t.pointStyleWidth||Math.min(i,e)),{boxWidth:i,boxHeight:s,itemHeight:Math.max(e,s)}},ch=(t,e)=>null!==t&&null!==e&&t.datasetIndex===e.datasetIndex&&t.index===e.index;class uh extends xl{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,s){this.maxWidth=t,this.maxHeight=e,this._margins=s,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=Ze(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(e=>t.filter(e,this.chart.data))),t.sort&&(e=e.sort((e,s)=>t.sort(e,s,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 s=t.labels,i=sn(s.font),n=i.size,a=this._computeTitleHeight(),{boxWidth:o,itemHeight:l}=dh(s,n);let r,h;e.font=i.string,this.isHorizontal()?(r=this.maxWidth,h=this._fitRows(a,n,o,l)+10):(h=this.maxHeight,r=this._fitCols(a,i,o,l)+10),this.width=Math.min(r,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,s,i){const{ctx:n,maxWidth:a,options:{labels:{padding:o}}}=this,l=this.legendHitBoxes=[],r=this.lineWidths=[0],h=i+o;let d=t;n.textAlign="left",n.textBaseline="middle";let c=-1,u=-h;return this.legendItems.forEach((t,p)=>{const g=s+e/2+n.measureText(t.text).width;(0===p||r[r.length-1]+g+2*o>a)&&(d+=h,r[r.length-(p>0?0:1)]=0,u+=h,c++),l[p]={left:0,top:u,row:c,width:g,height:i},r[r.length-1]+=g+o}),d}_fitCols(t,e,s,i){const{ctx:n,maxHeight:a,options:{labels:{padding:o}}}=this,l=this.legendHitBoxes=[],r=this.columnSizes=[],h=a-t;let d=o,c=0,u=0,p=0,g=0;return this.legendItems.forEach((t,a)=>{const{itemWidth:f,itemHeight:m}=ph(s,e,n,t,i);a>0&&u+m+2*o>h&&(d+=c+o,r.push({width:c,height:u}),p+=c+o,g++,c=u=0),l[a]={left:p,top:u,col:g,width:f,height:m},c=Math.max(c,f),u+=m+o}),d+=c,r.push({width:c,height:u}),d}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:s,labels:{padding:i},rtl:n}}=this,a=na(n,this.left,this.width);if(this.isHorizontal()){let n=0,o=ii(s,this.left+i,this.right-this.lineWidths[n]);for(const l of e)n!==l.row&&(n=l.row,o=ii(s,this.left+i,this.right-this.lineWidths[n])),l.top+=this.top+t+i,l.left=a.leftForLtr(a.x(o),l.width),o+=l.width+i}else{let n=0,o=ii(s,this.top+t+i,this.bottom-this.columnSizes[n].height);for(const l of e)l.col!==n&&(n=l.col,o=ii(s,this.top+t+i,this.bottom-this.columnSizes[n].height)),l.top=o,l.left+=this.left+i,l.left=a.leftForLtr(a.x(l.left),l.width),o+=l.height+i}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Ri(t,this),this._draw(),Wi(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:s,ctx:i}=this,{align:n,labels:a}=t,o=Ai.color,l=na(t.rtl,this.left,this.width),r=sn(a.font),{padding:h}=a,d=r.size,c=d/2;let u;this.drawTitle(),i.textAlign=l.textAlign("left"),i.textBaseline="middle",i.lineWidth=.5,i.font=r.string;const{boxWidth:p,boxHeight:g,itemHeight:f}=dh(a,d),m=function(t,e,s){if(isNaN(p)||p<=0||isNaN(g)||g<0)return;i.save();const n=Qe(s.lineWidth,1);if(i.fillStyle=Qe(s.fillStyle,o),i.lineCap=Qe(s.lineCap,"butt"),i.lineDashOffset=Qe(s.lineDashOffset,0),i.lineJoin=Qe(s.lineJoin,"miter"),i.lineWidth=n,i.strokeStyle=Qe(s.strokeStyle,o),i.setLineDash(Qe(s.lineDash,[])),a.usePointStyle){const o={radius:g*Math.SQRT2/2,pointStyle:s.pointStyle,rotation:s.rotation,borderWidth:n},r=l.xPlus(t,p/2),h=e+c;Ii(i,o,r,h,a.pointStyleWidth&&p)}else{const a=e+Math.max((d-g)/2,0),o=l.leftForLtr(t,p),r=tn(s.borderRadius);i.beginPath(),Object.values(r).some(t=>0!==t)?Xi(i,{x:o,y:a,w:p,h:g,radius:r}):i.rect(o,a,p,g),i.fill(),0!==n&&i.stroke()}i.restore()},b=function(t,e,s){Hi(i,s.text,t,e+f/2,r,{strikethrough:s.hidden,textAlign:l.textAlign(s.textAlign)})},y=this.isHorizontal(),x=this._computeTitleHeight();u=y?{x:ii(n,this.left+h,this.right-s[0]),y:this.top+h+x,line:0}:{x:this.left+h,y:ii(n,this.top+x+h,this.bottom-e[0].height),line:0},aa(this.ctx,t.textDirection);const v=f+h;this.legendItems.forEach((o,d)=>{i.strokeStyle=o.fontColor,i.fillStyle=o.fontColor;const g=i.measureText(o.text).width,f=l.textAlign(o.textAlign||(o.textAlign=a.textAlign)),_=p+c+g;let k=u.x,w=u.y;l.setWidth(this.width),y?d>0&&k+_+h>this.right&&(w=u.y+=v,u.line++,k=u.x=ii(n,this.left+h,this.right-s[u.line])):d>0&&w+v>this.bottom&&(k=u.x=k+e[u.line].width+h,u.line++,w=u.y=ii(n,this.top+x+h,this.bottom-e[u.line].height));const C=l.x(k);if(m(C,w,o),k=ni(f,k+p+c,y?k+_:this.right,t.rtl),b(l.x(k),w,o),y)u.x+=_+h;else if("string"!==typeof o.text){const t=r.lineHeight;u.y+=mh(o,t)+h}else u.y+=v}),oa(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,s=sn(e.font),i=en(e.padding);if(!e.display)return;const n=na(t.rtl,this.left,this.width),a=this.ctx,o=e.position,l=s.size/2,r=i.top+l;let h,d=this.left,c=this.width;if(this.isHorizontal())c=Math.max(...this.lineWidths),h=this.top+r,d=ii(t.align,d,this.right-c);else{const e=this.columnSizes.reduce((t,e)=>Math.max(t,e.height),0);h=r+ii(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=ii(o,d,d+c);a.textAlign=n.textAlign(si(o)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=s.string,Hi(a,e.text,u,h,s)}_computeTitleHeight(){const t=this.options.title,e=sn(t.font),s=en(t.padding);return t.display?e.lineHeight+s.height:0}_getLegendItemAt(t,e){let s,i,n;if(js(t,this.left,this.right)&&js(e,this.top,this.bottom))for(n=this.legendHitBoxes,s=0;st.length>e.length?t:e)),e+s.size/2+i.measureText(n).width}function fh(t,e,s){let i=t;return"string"!==typeof e.text&&(i=mh(e,s)),i}function mh(t,e){const s=t.text?t.text.length:0;return e*s}function bh(t,e){return!("mousemove"!==t&&"mouseout"!==t||!e.onHover&&!e.onLeave)||!(!e.onClick||"click"!==t&&"mouseup"!==t)}var yh={id:"legend",_element:uh,start(t,e,s){const i=t.legend=new uh({ctx:t.ctx,options:s,chart:t});Yo.configure(t,i,s),Yo.addBox(t,i)},stop(t){Yo.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,s){const i=t.legend;Yo.configure(t,i,s),i.options=s},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,s){const i=e.datasetIndex,n=s.chart;n.isDatasetVisible(i)?(n.hide(i),e.hidden=!0):(n.show(i),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:s,pointStyle:i,textAlign:n,color:a,useBorderRadius:o,borderRadius:l}}=t.legend.options;return t._getSortedDatasetMetas().map(t=>{const r=t.controller.getStyle(s?0:void 0),h=en(r.borderWidth);return{text:e[t.index].label,fillStyle:r.backgroundColor,fontColor:a,hidden:!t.visible,lineCap:r.borderCapStyle,lineDash:r.borderDash,lineDashOffset:r.borderDashOffset,lineJoin:r.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:r.borderColor,pointStyle:i||r.pointStyle,rotation:r.rotation,textAlign:n||r.textAlign,borderRadius:o&&(l||r.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 xh={average(t){if(!t.length)return!1;let e,s,i=new Set,n=0,a=0;for(e=0,s=t.length;et+e)/i.size;return{x:o,y:n/a}},nearest(t,e){if(!t.length)return!1;let s,i,n,a=e.x,o=e.y,l=Number.POSITIVE_INFINITY;for(s=0,i=t.length;s-1?t.split("\n"):t}function kh(t,e){const{element:s,datasetIndex:i,index:n}=e,a=t.getDatasetMeta(i).controller,{label:o,value:l}=a.getLabelAndValue(n);return{chart:t,label:o,parsed:a.getParsed(n),raw:t.data.datasets[i].data[n],formattedValue:l,dataset:a.getDataset(),dataIndex:n,datasetIndex:i,element:s}}function wh(t,e){const s=t.chart.ctx,{body:i,footer:n,title:a}=t,{boxWidth:o,boxHeight:l}=e,r=sn(e.bodyFont),h=sn(e.titleFont),d=sn(e.footerFont),c=a.length,u=n.length,p=i.length,g=en(e.padding);let f=g.height,m=0,b=i.reduce((t,e)=>t+e.before.length+e.lines.length+e.after.length,0);if(b+=t.beforeBody.length+t.afterBody.length,c&&(f+=c*h.lineHeight+(c-1)*e.titleSpacing+e.titleMarginBottom),b){const t=e.displayColors?Math.max(l,r.lineHeight):r.lineHeight;f+=p*t+(b-p)*r.lineHeight+(b-1)*e.bodySpacing}u&&(f+=e.footerMarginTop+u*d.lineHeight+(u-1)*e.footerSpacing);let y=0;const x=function(t){m=Math.max(m,s.measureText(t).width+y)};return s.save(),s.font=h.string,ts(t.title,x),s.font=r.string,ts(t.beforeBody.concat(t.afterBody),x),y=e.displayColors?o+2+e.boxPadding:0,ts(i,t=>{ts(t.before,x),ts(t.lines,x),ts(t.after,x)}),y=0,s.font=d.string,ts(t.footer,x),s.restore(),m+=g.width,{width:m,height:f}}function Ch(t,e){const{y:s,height:i}=e;return st.height-i/2?"bottom":"center"}function Sh(t,e,s,i){const{x:n,width:a}=i,o=s.caretSize+s.caretPadding;return"left"===t&&n+a+o>e.width||("right"===t&&n-a-o<0||void 0)}function Fh(t,e,s,i){const{x:n,width:a}=s,{width:o,chartArea:{left:l,right:r}}=t;let h="center";return"center"===i?h=n<=(l+r)/2?"left":"right":n<=a/2?h="left":n>=o-a/2&&(h="right"),Sh(h,t,e,s)&&(h="center"),h}function Th(t,e,s){const i=s.yAlign||e.yAlign||Ch(t,s);return{xAlign:s.xAlign||e.xAlign||Fh(t,e,s,i),yAlign:i}}function Ph(t,e){let{x:s,width:i}=t;return"right"===e?s-=i:"center"===e&&(s-=i/2),s}function Mh(t,e,s){let{y:i,height:n}=t;return"top"===e?i+=s:i-="bottom"===e?n+s:n/2,i}function Ah(t,e,s,i){const{caretSize:n,caretPadding:a,cornerRadius:o}=t,{xAlign:l,yAlign:r}=s,h=n+a,{topLeft:d,topRight:c,bottomLeft:u,bottomRight:p}=tn(o);let g=Ph(e,l);const f=Mh(e,r,h);return"center"===r?"left"===l?g+=h:"right"===l&&(g-=h):"left"===l?g-=Math.max(d,u)+n:"right"===l&&(g+=Math.max(c,p)+n),{x:Ns(g,0,i.width-e.width),y:Ns(f,0,i.height-e.height)}}function Dh(t,e,s){const i=en(s.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-i.right:t.x+i.left}function $h(t){return vh([],_h(t))}function Vh(t,e,s){return on(t,{tooltip:e,tooltipItems:s,type:"tooltip"})}function Lh(t,e){const s=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return s?t.override(s):t}const Eh={beforeTitle:ze,title(t){if(t.length>0){const e=t[0],s=e.chart.data.labels,i=s?s.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(i>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=Lh(s,t);vh(e.before,_h(Uh(n,"beforeLabel",this,t))),vh(e.lines,Uh(n,"label",this,t)),vh(e.after,_h(Uh(n,"afterLabel",this,t))),i.push(e)}),i}getAfterBody(t,e){return $h(Uh(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:s}=e,i=Uh(s,"beforeFooter",this,t),n=Uh(s,"footer",this,t),a=Uh(s,"afterFooter",this,t);let o=[];return o=vh(o,_h(i)),o=vh(o,_h(n)),o=vh(o,_h(a)),o}_createItems(t){const e=this._active,s=this.chart.data,i=[],n=[],a=[];let o,l,r=[];for(o=0,l=e.length;ot.filter(e,i,n,s))),t.itemSort&&(r=r.sort((e,i)=>t.itemSort(e,i,s))),ts(r,e=>{const s=Lh(t.callbacks,e);i.push(Uh(s,"labelColor",this,e)),n.push(Uh(s,"labelPointStyle",this,e)),a.push(Uh(s,"labelTextColor",this,e))}),this.labelColors=i,this.labelPointStyles=n,this.labelTextColors=a,this.dataPoints=r,r}update(t,e){const s=this.options.setContext(this.getContext()),i=this._active;let n,a=[];if(i.length){const t=xh[s.position].call(this,i,this._eventPosition);a=this._createItems(s),this.title=this.getTitle(a,s),this.beforeBody=this.getBeforeBody(a,s),this.body=this.getBody(a,s),this.afterBody=this.getAfterBody(a,s),this.footer=this.getFooter(a,s);const e=this._size=wh(this,s),o=Object.assign({},t,e),l=Th(this.chart,s,o),r=Ah(s,o,l,this.chart);this.xAlign=l.xAlign,this.yAlign=l.yAlign,n={opacity:1,x:r.x,y:r.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&&s.external&&s.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,s,i){const n=this.getCaretPosition(t,s,i);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,s){const{xAlign:i,yAlign:n}=this,{caretSize:a,cornerRadius:o}=s,{topLeft:l,topRight:r,bottomLeft:h,bottomRight:d}=tn(o),{x:c,y:u}=t,{width:p,height:g}=e;let f,m,b,y,x,v;return"center"===n?(x=u+g/2,"left"===i?(f=c,m=f-a,y=x+a,v=x-a):(f=c+p,m=f+a,y=x-a,v=x+a),b=f):(m="left"===i?c+Math.max(l,h)+a:"right"===i?c+p-Math.max(r,d)-a:this.caretX,"top"===n?(y=u,x=y-a,f=m-a,b=m+a):(y=u+g,x=y+a,f=m+a,b=m-a),v=y),{x1:f,x2:m,x3:b,y1:y,y2:x,y3:v}}drawTitle(t,e,s){const i=this.title,n=i.length;let a,o,l;if(n){const r=na(s.rtl,this.x,this.width);for(t.x=Dh(this,s.titleAlign,s),e.textAlign=r.textAlign(s.titleAlign),e.textBaseline="middle",a=sn(s.titleFont),o=s.titleSpacing,e.fillStyle=s.titleColor,e.font=a.string,l=0;l0!==t)?(t.beginPath(),t.fillStyle=n.multiKeyBackground,Xi(t,{x:e,y:p,w:r,h:l,radius:o}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),Xi(t,{x:s,y:p+1,w:r-2,h:l-2,radius:o}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,p,r,l),t.strokeRect(e,p,r,l),t.fillStyle=a.backgroundColor,t.fillRect(s,p+1,r-2,l-2))}t.fillStyle=this.labelTextColors[s]}drawBody(t,e,s){const{body:i}=this,{bodySpacing:n,bodyAlign:a,displayColors:o,boxHeight:l,boxWidth:r,boxPadding:h}=s,d=sn(s.bodyFont);let c=d.lineHeight,u=0;const p=na(s.rtl,this.x,this.width),g=function(s){e.fillText(s,p.x(t.x+u),t.y+c/2),t.y+=c+n},f=p.textAlign(a);let m,b,y,x,v,_,k;for(e.textAlign=a,e.textBaseline="middle",e.font=d.string,t.x=Dh(this,f,s),e.fillStyle=s.bodyColor,ts(this.beforeBody,g),u=o&&"right"!==f?"center"===a?r/2+h:r+2+h:0,x=0,_=i.length;x<_;++x){for(m=i[x],b=this.labelTextColors[x],e.fillStyle=b,ts(m.before,g),y=m.lines,o&&y.length&&(this._drawColorBox(e,t,x,p,s),c=Math.max(d.lineHeight,l)),v=0,k=y.length;v0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,s=this.$animations,i=s&&s.x,n=s&&s.y;if(i||n){const s=xh[t.position].call(this,this._active,this._eventPosition);if(!s)return;const a=this._size=wh(this,t),o=Object.assign({},s,this._size),l=Th(e,t,o),r=Ah(t,o,l,e);i._to===r.x&&n._to===r.y||(this.xAlign=l.xAlign,this.yAlign=l.yAlign,this.width=a.width,this.height=a.height,this.caretX=s.x,this.caretY=s.y,this._resolveAnimations().update(this,r))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let s=this.opacity;if(!s)return;this._updateAnimationTarget(e);const i={width:this.width,height:this.height},n={x:this.x,y:this.y};s=Math.abs(s)<.001?0:s;const a=en(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=s,this.drawBackground(n,t,i,e),aa(t,e.textDirection),n.y+=a.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),oa(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const s=this._active,i=t.map(({datasetIndex:t,index:e})=>{const s=this.chart.getDatasetMeta(t);if(!s)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:s.data[e],index:e}}),n=!es(s,i),a=this._positionChanged(i,e);(n||a)&&(this._active=i,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,s=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const i=this.options,n=this._active||[],a=this._getActiveElements(t,n,e,s),o=this._positionChanged(a,t),l=e||!es(a,n)||o;return l&&(this._active=a,(i.enabled||i.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,s,i){const n=this.options;if("mouseout"===t.type)return[];if(!i)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,s);return n.reverse&&a.reverse(),a}_positionChanged(t,e){const{caretX:s,caretY:i,options:n}=this,a=xh[n.position].call(this,t,e);return!1!==a&&(s!==a.x||i!==a.y)}}(0,Gt.A)(Ih,"positioners",xh);var Oh={id:"tooltip",_element:Ih,positioners:xh,afterInit(t,e,s){s&&(t.tooltip=new Ih({chart:t,options:s}))},beforeUpdate(t,e,s){t.tooltip&&t.tooltip.initialize(s)},reset(t,e,s){t.tooltip&&t.tooltip.initialize(s)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const s={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...s,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",s)}},afterEvent(t,e){if(t.tooltip){const s=e.replay;t.tooltip.handleEvent(e.event,s,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:Eh},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 Rh=(t,e,s,i)=>("string"===typeof e?(s=t.push(e)-1,i.unshift({index:s,label:e})):isNaN(e)&&(s=null),s);function Wh(t,e,s,i){const n=t.indexOf(e);if(-1===n)return Rh(t,e,s,i);const a=t.lastIndexOf(e);return n!==a?s:n}const Bh=(t,e)=>null===t?null:Ns(Math.round(t),0,e);function Nh(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 jh(t,e){const s=[],i=1e-14,{bounds:n,step:a,min:o,max:l,precision:r,count:h,maxTicks:d,maxDigits:c,includeBounds:u}=t,p=a||1,g=d-1,{min:f,max:m}=e,b=!qe(o),y=!qe(l),x=!qe(h),v=(m-f)/(c+1);let _,k,w,C,S=Ps((m-f)/g/p)*p;if(Sg&&(S=Ps(C*S/g/p)*p),qe(r)||(_=Math.pow(10,r),S=Math.ceil(S*_)/_),"ticks"===n?(k=Math.floor(f/S)*S,w=Math.ceil(m/S)*S):(k=f,w=m),b&&y&&a&&$s((l-o)/a,S/1e3)?(C=Math.round(Math.min((l-o)/S,d)),S=(l-o)/C,k=o,w=l):x?(k=b?o:k,w=y?l:w,C=h-1,S=(w-k)/C):(C=(w-k)/S,C=Ts(C,Math.round(C),S/1e3)?Math.round(C):Math.ceil(C));const F=Math.max(Us(S),Us(k));_=Math.pow(10,qe(r)?F:r),k=Math.round(k*_)/_,w=Math.round(w*_)/_;let T=0;for(b&&(u&&k!==o?(s.push({value:o}),kl)break;s.push({value:t})}return y&&u&&w!==l?s.length&&Ts(s[s.length-1].value,l,qh(l,v,t))?s[s.length-1].value=l:s.push({value:l}):y&&w!==l||s.push({value:w}),s}function qh(t,e,{horizontal:s,minRotation:i}){const n=Ls(i),a=(s?Math.sin(n):Math.cos(n))||.001,o=.75*e*(""+t).length;return Math.min(e/a,o)}(0,Gt.A)(zh,"id","category"),(0,Gt.A)(zh,"defaults",{ticks:{callback:Nh}});class Hh extends Rl{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 qe(t)||("number"===typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:s}=this.getUserBounds();let{min:i,max:n}=this;const a=t=>i=e?i:t,o=t=>n=s?n:t;if(t){const t=Fs(i),e=Fs(n);t<0&&e<0?o(0):t>0&&e>0&&a(0)}if(i===n){let e=0===n?1:Math.abs(.05*n);o(n+e),t||a(i-e)}this.min=i,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:s,stepSize:i}=t;return i?(e=Math.ceil(this.max/i)-Math.floor(this.min/i)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${i} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),s=s||11),s&&(e=Math.min(s,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let s=this.getTickLimit();s=Math.max(2,s);const i={maxTicks:s,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=jh(i,n);return"ticks"===t.bounds&&Vs(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,s=this.max;if(super.configure(),this.options.offset&&t.length){const i=(s-e)/Math.max(t.length-1,1)/2;e-=i,s+=i}this._startValue=e,this._endValue=s,this._valueRange=s-e}getLabelForValue(t){return vi(t,this.chart.options.locale,this.options.ticks.format)}}class Xh extends Hh{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ke(t)?t:0,this.max=Ke(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,s=Ls(this.options.ticks.minRotation),i=(t?Math.sin(s):Math.cos(s))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/i))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}(0,Gt.A)(Xh,"id","linear"),(0,Gt.A)(Xh,"defaults",{ticks:{callback:wi.formatters.numeric}});const Kh=t=>Math.floor(Ss(t)),Yh=(t,e)=>Math.pow(10,Kh(t)+e);function Qh(t){const e=t/Math.pow(10,Kh(t));return 1===e}function Gh(t,e,s){const i=Math.pow(10,s),n=Math.floor(t/i),a=Math.ceil(e/i);return a-n}function Jh(t,e){const s=e-t;let i=Kh(s);while(Gh(t,e,i)>10)i++;while(Gh(t,e,i)<10)i--;return Math.min(i,Kh(t))}function Zh(t,{min:e,max:s}){e=Ye(t.min,e);const i=[],n=Kh(e);let a=Jh(e,s),o=a<0?Math.pow(10,Math.abs(a)):1;const l=Math.pow(10,a),r=n>a?Math.pow(10,n):0,h=Math.round((e-r)*o)/o,d=Math.floor((e-r)/l/10)*l*10;let c=Math.floor((h-d)/Math.pow(10,a)),u=Ye(t.min,Math.round((r+d+c*Math.pow(10,a))*o)/o);while(u=10?c=c<15?15:20:c++,c>=20&&(a++,c=2,o=a>=0?1:o),u=Math.round((r+d+c*Math.pow(10,a))*o)/o;const p=Ye(t.max,u);return i.push({value:p,major:Qh(p),significand:c}),i}class td extends Rl{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const s=Hh.prototype.parse.apply(this,[t,e]);if(0!==s)return Ke(s)&&s>0?s:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=Ke(t)?Math.max(0,t):null,this.max=Ke(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!Ke(this._userMin)&&(this.min=t===Yh(this.min,0)?Yh(this.min,-1):Yh(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let s=this.min,i=this.max;const n=e=>s=t?s:e,a=t=>i=e?i:t;s===i&&(s<=0?(n(1),a(10)):(n(Yh(s,-1)),a(Yh(i,1)))),s<=0&&n(Yh(i,-1)),i<=0&&a(Yh(s,1)),this.min=s,this.max=i}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},s=Zh(e,this);return"ticks"===t.bounds&&Vs(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}getLabelForValue(t){return void 0===t?"0":vi(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=Ss(t),this._valueRange=Ss(this.max)-Ss(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(Ss(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function ed(t){const e=t.ticks;if(e.display&&t.display){const t=en(e.backdropPadding);return Qe(e.font&&e.font.size,Ai.font.size)+t.height}return 0}function sd(t,e,s){return s=He(s)?s:[s],{w:Vi(t,e.string,s),h:s.length*e.lineHeight}}function id(t,e,s,i,n){return t===i||t===n?{start:e-s/2,end:e+s/2}:tn?{start:e-s,end:e}:{start:e,end:e+s}}function nd(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},s=Object.assign({},e),i=[],n=[],a=t._pointLabels.length,o=t.options.pointLabels,l=o.centerPointLabels?bs/a:0;for(let r=0;re.r&&(l=(i.end-e.r)/a,t.r=Math.max(t.r,e.r+l)),n.starte.b&&(r=(n.end-e.b)/o,t.b=Math.max(t.b,e.b+r))}function od(t,e,s){const i=t.drawingArea,{extra:n,additionalAngle:a,padding:o,size:l}=s,r=t.getPointPosition(e,i+n+o,a),h=Math.round(Es(Ws(r.angle+ks))),d=cd(r.y,l.h,h),c=hd(h),u=dd(r.x,l.w,c);return{visible:!0,x:r.x,y:d,textAlign:c,left:u,top:d,right:u+l.w,bottom:d+l.h}}function ld(t,e){if(!e)return!0;const{left:s,top:i,right:n,bottom:a}=t,o=Oi({x:s,y:i},e)||Oi({x:s,y:a},e)||Oi({x:n,y:i},e)||Oi({x:n,y:a},e);return!o}function rd(t,e,s){const i=[],n=t._pointLabels.length,a=t.options,{centerPointLabels:o,display:l}=a.pointLabels,r={extra:ed(a)/2,additionalAngle:o?bs/n:0};let h;for(let d=0;d270||s<90)&&(t-=e),t}function ud(t,e,s){const{left:i,top:n,right:a,bottom:o}=s,{backdropColor:l}=e;if(!qe(l)){const s=tn(e.borderRadius),r=en(e.backdropPadding);t.fillStyle=l;const h=i-r.left,d=n-r.top,c=a-i+r.width,u=o-n+r.height;Object.values(s).some(t=>0!==t)?(t.beginPath(),Xi(t,{x:h,y:d,w:c,h:u,radius:s}),t.fill()):t.fillRect(h,d,c,u)}}function pd(t,e){const{ctx:s,options:{pointLabels:i}}=t;for(let n=e-1;n>=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const a=i.setContext(t.getPointLabelContext(n));ud(s,a,e);const o=sn(a.font),{x:l,y:r,textAlign:h}=e;Hi(s,t._pointLabels[n],l,r+o.lineHeight/2,o,{color:a.color,textAlign:h,textBaseline:"middle"})}}function gd(t,e,s,i){const{ctx:n}=t;if(s)n.arc(t.xCenter,t.yCenter,e,0,ys);else{let s=t.getPointPosition(0,e);n.moveTo(s.x,s.y);for(let a=1;a{const s=Ze(this.options.pointLabels.callback,[t,e],this);return s||0===s?s:""}).filter((t,e)=>this.chart.getDataVisibility(e))}fit(){const t=this.options;t.display&&t.pointLabels.display?nd(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,s,i){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((s-i)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,s,i))}getIndexAngle(t){const e=ys/(this._pointLabels.length||1),s=this.options.startAngle||0;return Ws(t*e+Ls(s))}getDistanceFromCenterForValue(t){if(qe(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(qe(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){l=this.getDistanceFromCenterForValue(t.value);const s=this.getContext(e),o=i.setContext(s),r=n.setContext(s);fd(this,o,l,a,r)}}),s.display){for(t.save(),o=a-1;o>=0;o--){const i=s.setContext(this.getPointLabelContext(o)),{color:n,lineWidth:a}=i;a&&n&&(t.lineWidth=a,t.strokeStyle=n,t.setLineDash(i.borderDash),t.lineDashOffset=i.borderDashOffset,l=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),r=this.getPointPosition(o,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(r.x,r.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,s=e.ticks;if(!s.display)return;const i=this.getIndexAngle(0);let n,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(i),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((i,o)=>{if(0===o&&this.min>=0&&!e.reverse)return;const l=s.setContext(this.getContext(o)),r=sn(l.font);if(n=this.getDistanceFromCenterForValue(this.ticks[o].value),l.showLabelBackdrop){t.font=r.string,a=t.measureText(i.label).width,t.fillStyle=l.backdropColor;const e=en(l.backdropPadding);t.fillRect(-a/2-e.left,-n-r.size/2-e.top,a+e.width,r.size+e.height)}Hi(t,i.label,0,-n,r,{color:l.color,strokeColor:l.textStrokeColor,strokeWidth:l.textStrokeWidth})}),t.restore()}drawTitle(){}}(0,Gt.A)(bd,"id","radialLinear"),(0,Gt.A)(bd,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:wi.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),(0,Gt.A)(bd,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,Gt.A)(bd,"descriptors",{angleLines:{_fallback:"grid"}});const yd={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}},xd=Object.keys(yd);function vd(t,e){return t-e}function _d(t,e){if(qe(e))return null;const s=t._adapter,{parser:i,round:n,isoWeekday:a}=t._parseOpts;let o=e;return"function"===typeof i&&(o=i(o)),Ke(o)||(o="string"===typeof i?s.parse(o,i):s.parse(o)),null===o?null:(n&&(o="week"!==n||!Ds(a)&&!0!==a?s.startOf(o,n):s.startOf(o,"isoWeek",a)),+o)}function kd(t,e,s,i){const n=xd.length;for(let a=xd.indexOf(t);a=xd.indexOf(s);a--){const s=xd[a];if(yd[s].common&&t._adapter.diff(n,i,s)>=e-1)return s}return xd[s?xd.indexOf(s):0]}function Cd(t){for(let e=xd.indexOf(t)+1,s=xd.length;e=e?s[i]:s[n];t[a]=!0}}else t[e]=!0}function Fd(t,e,s,i){const n=t._adapter,a=+n.startOf(e[0].value,i),o=e[e.length-1].value;let l,r;for(l=a;l<=o;l=+n.add(l,1,i))r=s[l],r>=0&&(e[r].major=!0);return e}function Td(t,e,s){const i=[],n={},a=e.length;let o,l;for(o=0;o+t.value))}initOffsets(t=[]){let e,s,i=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),i=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,s=this.getDecimalForValue(t[t.length-1]),n=1===t.length?s:(s-this.getDecimalForValue(t[t.length-2]))/2);const a=t.length<3?.5:.25;i=Ns(i,0,a),n=Ns(n,0,a),this._offsets={start:i,end:n,factor:1/(i+1+n)}}_generate(){const t=this._adapter,e=this.min,s=this.max,i=this.options,n=i.time,a=n.unit||kd(n.minUnit,e,s,this._getLabelCapacity(e)),o=Qe(i.ticks.stepSize,1),l="week"===a&&n.isoWeekday,r=Ds(l)||!0===l,h={};let d,c,u=e;if(r&&(u=+t.startOf(u,"isoWeek",l)),u=+t.startOf(u,r?"day":a),t.diff(s,e,a)>1e5*o)throw new Error(e+" and "+s+" are too far apart with stepSize of "+o+" "+a);const p="data"===i.ticks.source&&this.getDataTimestamps();for(d=u,c=0;d+t)}getLabelForValue(t){const e=this._adapter,s=this.options.time;return s.tooltipFormat?e.format(t,s.tooltipFormat):e.format(t,s.displayFormats.datetime)}format(t,e){const s=this.options,i=s.time.displayFormats,n=this._unit,a=e||i[n];return this._adapter.format(t,a)}_tickFormatFunction(t,e,s,i){const n=this.options,a=n.ticks.callback;if(a)return Ze(a,[t,e,s],this);const o=n.time.displayFormats,l=this._unit,r=this._majorUnit,h=l&&o[l],d=r&&o[r],c=s[e],u=r&&d&&c&&c.major;return this._adapter.format(t,i||(u?d:h))}generateTickLabels(t){let e,s,i;for(e=0,s=t.length;e0?o:1}getDataTimestamps(){let t,e,s=this._cache.data||[];if(s.length)return s;const i=this.getMatchingVisibleMetas();if(this._normalized&&i.length)return this._cache.data=i[0].controller.getAllParsedValues(this);for(t=0,e=i.length;t=t[l].pos&&e<=t[r].pos&&({lo:l,hi:r}=Hs(t,"pos",e)),({pos:i,time:a}=t[l]),({pos:n,time:o}=t[r])):(e>=t[l].time&&e<=t[r].time&&({lo:l,hi:r}=Hs(t,"time",e)),({time:i,pos:a}=t[l]),({time:n,pos:o}=t[r]));const h=n-i;return h?a+(o-a)*(e-i)/h:a}(0,Gt.A)(Pd,"id","time"),(0,Gt.A)(Pd,"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 Ad extends Pd{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=Md(e,this.min),this._tableRange=Md(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:s}=this,i=[],n=[];let a,o,l,r,h;for(a=0,o=t.length;a=e&&r<=s&&i.push(r);if(i.length<2)return[{time:e,pos:0},{time:s,pos:1}];for(a=0,o=i.length;at-e)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),s=this.getLabelTimestamps();return t=e.length&&s.length?this.normalize(e.concat(s)):e.length?e:s,t=this._cache.all=t,t}getDecimalForValue(t){return(Md(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,s=this.getDecimalForPixel(t)/e.factor-e.end;return Md(this._table,s*this._tableRange+this._minPos,!0)}}(0,Gt.A)(Ad,"id","timeseries"),(0,Gt.A)(Ad,"defaults",Pd.defaults);var Dd=s(90144);const $d={data:{type:Object,required:!0},options:{type:Object,default:()=>({})},plugins:{type:Array,default:()=>[]},datasetIdKey:{type:String,default:"label"},updateMode:{type:String,default:void 0}},Vd={ariaLabel:{type:String},ariaDescribedby:{type:String}},Ld={type:{type:String,required:!0},destroyDelay:{type:Number,default:0},...$d,...Vd},Ed="2"===i.rE[0]?(t,e)=>Object.assign(t,{attrs:e}):(t,e)=>Object.assign(t,e);function Ud(t){return(0,Dd.ju)(t)?(0,Dd.ux)(t):t}function Id(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return(0,Dd.ju)(e)?new Proxy(t,{}):t}function Od(t,e){const s=t.options;s&&e&&Object.assign(s,e)}function Rd(t,e){t.labels=e}function Wd(t,e,s){const i=[];t.datasets=e.map(e=>{const n=t.datasets.find(t=>t[s]===e[s]);return n&&e.data&&!i.includes(n)?(i.push(n),Object.assign(n,e),n):{...e}})}function Bd(t,e){const s={labels:[],datasets:[]};return Rd(s,t.labels),Wd(s,t.datasets,e),s}const Nd=(0,i.pM)({props:Ld,setup(t,e){let{expose:s,slots:n}=e;const a=(0,Dd.KR)(null),o=(0,Dd.IJ)(null);s({chart:o});const l=()=>{if(!a.value)return;const{type:e,data:s,options:i,plugins:n,datasetIdKey:l}=t,r=Bd(s,l),h=Id(r,s);o.value=new Pr(a.value,{type:e,data:h,options:{...i},plugins:n})},r=()=>{const e=(0,Dd.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,i.sV)(l),(0,i.hi)(r),(0,i.wB)([()=>t.options,()=>t.data],(e,s)=>{let[n,a]=e,[l,r]=s;const d=(0,Dd.ux)(o.value);if(!d)return;let c=!1;if(n){const t=Ud(n),e=Ud(l);t&&t!==e&&(Od(d,t),c=!0)}if(a){const e=Ud(a.labels),s=Ud(r.labels),i=Ud(a.datasets),n=Ud(r.datasets);e!==s&&(Rd(d.config.data,e),c=!0),i&&i!==n&&(Wd(d.config.data,i,t.datasetIdKey),c=!0)}c&&(0,i.dY)(()=>{h(d)})},{deep:!0}),()=>(0,i.h)("canvas",{role:"img","aria-label":t.ariaLabel,"aria-describedby":t.ariaDescribedby,ref:a},[(0,i.h)("p",{},[n.default?n.default():""])])}});function zd(t,e){return Pr.register(e),(0,i.pM)({props:$d,setup(e,s){let{expose:n}=s;const a=(0,Dd.IJ)(null),o=t=>{a.value=t?.chart};return n({chart:a}),()=>(0,i.h)(Nd,Ed({ref:o},{type:t,...e}))}})}const jd=zd("doughnut",fo);s(16573),s(78100),s(77936),s(79577),s(41549),s(49797),s(49631),s(35623),s(14603),s(47566),s(98721);class qd extends Error{constructor(t,e,s=!1,i=""){super(t),this.name="BatchOperationError",this.code=e,this.recoverable=s,this.suggestion=i}}const Hd={401:()=>new qd("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录"),403:()=>new qd("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限"),400:t=>new qd(`请求数据无效: ${t}`,"INVALID_DATA",!0,"请检查数据格式后重试"),500:()=>new qd("服务器内部错误","SERVER_ERROR",!0,"请稍后重试,如果问题持续请联系管理员"),NETWORK:()=>new qd("网络连接失败","NETWORK_ERROR",!0,"请检查网络连接后重试"),ABORT:()=>new qd("操作已取消","ABORTED",!1,"")};function Xd(t,e=""){if("AbortError"===t.name)return Hd.ABORT();if(t instanceof Response||t&&"number"===typeof t.status){const s=Hd[t.status];return s?s(e):new qd(`请求失败: ${t.status}`,"HTTP_ERROR",!0,"请稍后重试")}return t instanceof TypeError&&t.message.includes("fetch")?Hd.NETWORK():new qd(t.message||"未知错误","UNKNOWN_ERROR",!0,"请稍后重试")}class Kd{constructor(t={}){this.batchSize=t.batchSize||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.abortController=null}async fetchAllRecords(t=!1){this.abortController=new AbortController;const e=[];let s=null,i=0,n=0;try{do{if(this.abortController.signal.aborted)break;const a=await this.fetchBatch(s,t);e.push(...a.records),s=a.nextCursor,i+=a.records.length,n++,this.onProgress({phase:"fetching",current:i,batchCount:n,message:`已获取 ${i} 条记录...`})}while(s&&!this.abortController.signal.aborted);if(this.abortController.signal.aborted)throw Hd.ABORT();return e}catch(a){const t=a instanceof qd?a:Xd(a);throw this.onError(t),t}}async fetchBatch(t,e){const s=new URLSearchParams;t&&s.set("cursor",t),e&&s.set("includeValue","true"),s.set("limit",String(this.batchSize));try{const t=await(0,Yt.A)(`/api/manage/batch/list?${s}`,{signal:this.abortController.signal});if(!t.ok){let e="";try{const s=await t.json();e=s.error||""}catch{}throw Xd(t,e)}const e=await t.json();if(!e.success)throw new qd(e.error||"请求失败","API_ERROR",!0,"请稍后重试");return{records:e.records||[],nextCursor:e.nextCursor||null,totalProcessed:e.totalProcessed||0}}catch(i){if(i instanceof qd)throw i;throw Xd(i)}}abort(){this.abortController&&this.abortController.abort()}isAborted(){return!!this.abortController&&this.abortController.signal.aborted}reset(){this.abortController=null}}var Yd=Kd;class Qd{constructor(t={}){this.chunkSize=t.chunkSize||null,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.sessionId=this.generateSessionId(),this.aborted=!1}async fetchConfig(){try{const t=await(0,Yt.A)("/api/manage/batch/index/config");if(!t.ok)throw new Error("获取配置失败");const e=await t.json();if(e.success)return{chunkSize:e.chunkSize||500,databaseType:e.databaseType||"unknown"};throw new Error(e.error||"获取配置失败")}catch(t){return console.warn("Failed to fetch index config, using default:",t),{chunkSize:500,databaseType:"unknown"}}}async rebuild(){this.aborted=!1;try{if(!this.chunkSize){const t=await this.fetchConfig();this.chunkSize=t.chunkSize}this.onProgress({phase:"fetching",message:"正在获取数据...",current:0});const t=new Yd({onProgress:t=>this.onProgress({...t,phase:"fetching"}),onError:t=>this.onError(t)}),e=await t.fetchAllRecords(!1);if(this.aborted)throw new qd("操作已取消","ABORTED",!1,"");if(this.onProgress({phase:"sorting",message:"正在排序...",current:0,total:e.length}),this.sortByTimestampDescending(e),this.aborted)throw new qd("操作已取消","ABORTED",!1,"");const s=this.splitIntoChunks(e);for(let i=0;i{const s=t.metadata&&t.metadata.TimeStamp||0,i=e.metadata&&e.metadata.TimeStamp||0;return i-s})}splitIntoChunks(t){const e=[];for(let s=0;st.toString(16).padStart(2,"0")).join("")}let n=2166136261,a=2166136261;for(let o=0;o>>0,a=Math.imul(a^i[o],16777635)>>>0;return n.toString(16).padStart(8,"0")+a.toString(16).padStart(8,"0")}createHttpError(t,e=""){switch(t){case 401:return new qd("认证失败,请重新登录","AUTH_FAILED",!1,"请刷新页面并重新登录");case 403:return new qd("权限不足或请求被拒绝","FORBIDDEN",!1,"请确认您有管理员权限");case 400:return new qd(`请求数据无效: ${e}`,"INVALID_DATA",!0,"请检查数据格式后重试");case 404:return new qd("会话不存在","SESSION_NOT_FOUND",!1,"请重新开始索引重建");case 410:return new qd("会话已过期","SESSION_EXPIRED",!1,"请重新开始索引重建");case 500:default:return new qd(`服务器错误: ${e||t}`,"SERVER_ERROR",!0,"请稍后重试")}}sleep(t){return new Promise(e=>setTimeout(e,t))}abort(){this.aborted=!0}reset(){this.aborted=!1,this.sessionId=this.generateSessionId()}}var Gd=Qd;class Jd{constructor(t={}){this.onProgress=t.onProgress||(()=>{}),this.processor=null}async generateBackup(){this.processor=new Yd({onProgress:t=>this.onProgress({...t,phase:"fetching"})});const t=await this.processor.fetchAllRecords(!0);this.onProgress({phase:"building",message:"正在构建备份数据..."});const e={timestamp:Date.now(),version:Qt.rE,data:{fileCount:t.length,files:{},settings:{}}};for(const n of t)e.data.files[n.id]={metadata:n.metadata,value:n.value||null};const s=await this.fetchSettings();e.data.settings=s,this.onProgress({phase:"downloading",message:"正在生成下载..."}),this.downloadBackup(e);const i=Object.keys(s).length;return{success:!0,fileCount:t.length,settingsCount:i}}async fetchSettings(){try{const t=await(0,Yt.A)("/api/manage/batch/settings");if(!t.ok)return console.warn("Failed to fetch settings:",t.status),{};const e=await t.json();return e.settings||{}}catch(t){return console.warn("Failed to fetch settings:",t),{}}}downloadBackup(t){const e=JSON.stringify(t,null,2),s=new Blob([e],{type:"application/json"}),i=URL.createObjectURL(s),n=document.createElement("a");n.href=i,n.download=`imgbed_backup_${(new Date).toISOString().split("T")[0]}.json`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(i)}abort(){this.processor&&this.processor.abort()}isAborted(){return!!this.processor&&this.processor.isAborted()}}var Zd=Jd;class tc{constructor(t={}){this.chunkSize=t.chunkSize||50,this.maxRetries=t.maxRetries||3,this.retryDelay=t.retryDelay||1e3,this.onProgress=t.onProgress||(()=>{}),this.onError=t.onError||(()=>{}),this.aborted=!1}async restore(t){if(this.aborted=!1,!t||!t.data)throw new qd("备份文件格式无效","INVALID_BACKUP",!1,"请选择有效的备份文件");const{files:e={},settings:s={}}=t.data,i=Object.entries(e),n=Object.entries(s),a=i.length,o=n.length,l=a+o;let r=0,h=0,d=0,c=0;try{this.onProgress({phase:"restoring_files",message:"正在恢复文件数据...",current:0,total:l});const e=this.splitIntoChunks(i,this.chunkSize);for(let t=0;tsetTimeout(e,t))}abort(){this.aborted=!0}}var ec=tc;Pr.register(Or,Oh,yh);var sc={name:"SysCogStatus",components:{Doughnut:jd},data(){return{loading:!1,rebuilding:!1,backing:!1,restoring:!1,indexInfo:{},version:Qt.rE,loadErrors:{newest:!1,oldest:!1},channelColors:["#8B5CF6","#EC4899","#06B6D4","#10B981","#F59E0B","#EF4444","#6366F1","#84CC16"],typeColors:["#10B981","#3B82F6","#F59E0B","#EF4444","#8B5CF6","#EC4899","#06B6D4","#84CC16"],isProcessing:!1,processingPhase:"",processingProgress:{current:0,total:0,message:"",percentage:0},processingError:null,processingStartTime:null,currentRebuilder:null,currentBackupGenerator:null,currentRestoreProcessor:null}},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.aggregatedTypeStats;return{labels:Object.keys(t),datasets:[{data:Object.values(t),backgroundColor:this.typeColors.slice(0,Object.keys(t).length),borderWidth:0}]}},aggregatedTypeStats(){const t=this.indexInfo.typeStats||{},e={};for(const[s,i]of Object.entries(t)){const t="Block"===s?this.$t("sysStatus.blocked"):this.$t("sysStatus.normalStatus");e[t]=(e[t]||0)+i}return e},chartOptions(){return{responsive:!0,maintainAspectRatio:!0,cutout:"65%",hoverOffset:8,layout:{padding:10},plugins:{legend:{display:!1},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#fff",bodyColor:"#fff",padding:12,cornerRadius:8,displayColors:!0,z:100,callbacks:{label:t=>{const e=t.raw,s=t.dataset.data.reduce((t,e)=>t+e,0),i=(e/s*100).toFixed(1);return` ${e.toLocaleString()} (${i}%)`}}}},animation:{animateRotate:!0,animateScale:!0}}},estimatedTimeRemaining(){if(!this.isProcessing||!this.processingStartTime)return"";if(0===this.processingProgress.current||0===this.processingProgress.percentage)return"";const t=Date.now()-this.processingStartTime,e=this.processingProgress.percentage/100;if(e<=0)return"";const s=t/e,i=s-t;if(i<=0)return this.$t("sysStatus.aboutToComplete");const n=Math.ceil(i/1e3);if(n<60)return this.$t("sysStatus.seconds",{count:n});const a=Math.ceil(n/60);if(a<60)return this.$t("sysStatus.minutes",{count:a});const o=Math.floor(a/60),l=a%60;return this.$t("sysStatus.hoursMinutes",{hours:o,minutes:l})},phaseDescription(){const t={fetching:this.$t("sysStatus.phaseFetching"),sorting:this.$t("sysStatus.phaseSorting"),uploading:this.$t("sysStatus.phaseUploading"),finalizing:this.$t("sysStatus.phaseFinalizing"),building:this.$t("sysStatus.phaseBuilding"),downloading:this.$t("sysStatus.phaseDownloading"),restoring_files:this.$t("sysStatus.phaseRestoringFiles"),restoring_settings:this.$t("sysStatus.phaseRestoringSettings"),completed:this.$t("sysStatus.phaseCompleted"),retrying:this.$t("sysStatus.phaseRetrying")};return t[this.processingPhase]||this.processingPhase}},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,Yt.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(this.$t("sysStatus.fetchIndexFailed"))}finally{this.loading=!1}},async rebuildIndex(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.rebuilding=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentRebuilder=new Gd({onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});try{const t=await this.currentRebuilder.rebuild();this.$message.success(this.$t("sysStatus.rebuildSuccess",{count:t.totalFiles.toLocaleString()})),setTimeout(()=>{this.fetchIndexInfo()},1e3)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.rebuilding=!1,this.isProcessing=!1,this.currentRebuilder=null,this.processingStartTime=null}}},async backupData(){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.backing=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0},this.currentBackupGenerator=new Zd({onProgress:t=>this.handleProgress(t)});try{const t=await this.currentBackupGenerator.generateBackup(),e=t.settingsCount>0?this.$t("sysStatus.backupSuccessWithSettings",{fileCount:t.fileCount.toLocaleString(),settingsCount:t.settingsCount}):this.$t("sysStatus.backupSuccess",{count:t.fileCount.toLocaleString()});this.$message.success(e)}catch(t){if("ABORTED"!==t.code){const e=t.suggestion?`${t.message}。${t.suggestion}`:t.message;this.$message.error(e),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}}}finally{this.backing=!1,this.isProcessing=!1,this.currentBackupGenerator=null,this.processingStartTime=null}}},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(this.$t("sysStatus.restoreConfirmMessage"),this.$t("sysStatus.restoreConfirmTitle"),{confirmButtonText:this.$t("sysStatus.restoreConfirmOk"),cancelButtonText:this.$t("sysStatus.restoreConfirmCancel"),type:"warning"}),await this.restoreData(e)}catch(s){"cancel"!==s&&console.error("确认恢复失败:",s)}t.target.value=""}else this.$message.error(this.$t("sysStatus.selectJsonFile"))},async restoreData(t){if(this.isProcessing)this.$message.warning(this.$t("sysStatus.operationInProgress"));else{this.restoring=!0,this.isProcessing=!0,this.processingError=null,this.processingStartTime=Date.now(),this.processingProgress={current:0,total:0,message:"",percentage:0};try{const s=await t.text();let i;try{i=JSON.parse(s)}catch(e){throw new Error(this.$t("sysStatus.invalidBackupFile"))}this.currentRestoreProcessor=new ec({chunkSize:100,onProgress:t=>this.handleProgress(t),onError:t=>this.handleError(t)});const n=await this.currentRestoreProcessor.restore(i);this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,this.$message.success(this.$t("sysStatus.restoreSuccess",{files:n.restoredFiles,settings:n.restoredSettings})),await new Promise(t=>setTimeout(t,500)),await this.rebuildIndex()}catch(s){if(console.error("恢复数据失败:",s),this.restoring=!1,this.isProcessing=!1,this.currentRestoreProcessor=null,this.processingStartTime=null,"ABORTED"!==s.code){const t=s.suggestion?`${s.message}。${s.suggestion}`:s.message;this.$message.error(this.$t("sysStatus.restoreFailed")+": "+t),this.processingError={message:s.message,suggestion:s.suggestion,recoverable:s.recoverable}}}}},formatTime(t){if(!t)return this.$t("sysStatus.unknown");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(),s=e-t,i=Math.floor(s/6e4),n=Math.floor(s/36e5),a=Math.floor(s/864e5);return a>0?this.$t("sysStatus.daysAgo",{count:a}):n>0?this.$t("sysStatus.hoursAgo",{count:n}):i>0?this.$t("sysStatus.minutesAgo",{count:i}):this.$t("sysStatus.justNow")},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||"",s=e.substring(e.lastIndexOf(".")+1).toLowerCase(),i=["jpg","jpeg","png","gif","bmp","webp","svg","ico","tiff","tif","avif","heic","heif"];return i.includes(s)},isVideoFile(t){if(!t)return!1;if(t.metadata?.FileType?.includes("video"))return!0;const e=t.metadata?.FileName||t.id||"",s=e.substring(e.lastIndexOf(".")+1).toLowerCase(),i=["mp4","webm","ogg","avi","mov","flv","wmv","mkv","m4v","3gp","mpeg","mpg"];return i.includes(s)},openFileInNewTab(t){t?.id&&window.open("/file/"+t.id+"?from=admin","_blank")},handleProgress(t){this.processingPhase=t.phase,this.processingProgress.message=t.message||"",this.processingProgress.current=t.current||0,"fetching"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0?this.processingProgress.percentage=Math.min(60,t.current/t.total*60):this.processingProgress.percentage=Math.min(50,15*Math.log10(t.current+1))):"sorting"===t.phase?(this.processingProgress.percentage=65,this.processingProgress.total=t.total||this.processingProgress.total):"uploading"===t.phase?(this.processingProgress.total=t.total||0,t.total&&t.total>0&&(this.processingProgress.percentage=70+t.current/t.total*25)):"finalizing"===t.phase?this.processingProgress.percentage=97:"building"===t.phase?this.processingProgress.percentage=80:"downloading"===t.phase?this.processingProgress.percentage=95:"restoring_files"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||0):"restoring_settings"===t.phase?(this.processingProgress.total=t.total||0,this.processingProgress.percentage=t.percentage||80):"completed"===t.phase?this.processingProgress.percentage=100:"retrying"===t.phase&&(this.processingProgress.message=t.message)},handleError(t){console.error("批量操作错误:",t),this.processingError={message:t.message,suggestion:t.suggestion,recoverable:t.recoverable}},cancelOperation(){this.currentRebuilder&&(this.currentRebuilder.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentBackupGenerator&&(this.currentBackupGenerator.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild"))),this.currentRestoreProcessor&&(this.currentRestoreProcessor.abort(),this.$message.info(this.$t("sysStatus.cancellingRebuild")))},retryOperation(){this.processingError=null,this.rebuilding?(this.rebuilding=!1,this.isProcessing=!1,this.$nextTick(()=>{this.rebuildIndex()})):this.backing&&(this.backing=!1,this.isProcessing=!1,this.$nextTick(()=>{this.backupData()}))},dismissError(){this.processingError=null}}};const ic=(0,d.A)(sc,[["render",Kt],["__scopeId","data-v-3cf4ee46"]]);var nc=ic,ac=s(59869),oc=(s(70415),s(73565),s(9267)),lc=(s(15616),s(82006)),rc=(s(98642),s(81418)),hc=(s(50333),s(39623)),dc=(s(29092),s(63003),s(76018)),cc=(s(96808),s(67819),s(55558)),uc=(s(10456),s(12687)),pc=(s(18785),s(45130));const gc=["onClick"];function fc(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.CE)("div",{class:(0,n.C4)(["custom-select",{"is-open":o.isOpen}]),style:(0,n.Tr)({width:s.width})},[(0,i.Lk)("div",{class:"custom-select-trigger",onClick:e[0]||(e[0]=(...t)=>l.toggleDropdown&&l.toggleDropdown(...t))},[(0,i.Lk)("span",{class:(0,n.C4)(["custom-select-value",{"is-placeholder":!s.modelValue}])},(0,n.v_)(l.displayLabel),3),(0,i.bF)(r,{icon:"chevron-down",class:"custom-select-arrow"})]),(0,i.bF)(pc.eB,{name:"dropdown-fade"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:"custom-select-dropdown",onClick:e[1]||(e[1]=(0,pc.D$)(()=>{},["stop"]))},[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.options,e=>((0,i.uX)(),(0,i.CE)("div",{key:e.value,class:(0,n.C4)(["custom-select-option",{"is-selected":s.modelValue===e.value}]),onClick:t=>l.selectOption(e.value)},[(0,i.RG)(t.$slots,"option",{option:e},()=>[e.icon?((0,i.uX)(),(0,i.Wv)(r,{key:0,icon:e.icon,class:"option-icon"},null,8,["icon"])):(0,i.Q3)("",!0),(0,i.Lk)("span",null,(0,n.v_)(e.label),1)],!0)],10,gc))),128))],512),[[pc.aG,o.isOpen]])]),_:3})],6)}var mc={name:"CustomSelect",props:{modelValue:{type:[String,Number],default:""},options:{type:Array,required:!0},placeholder:{type:String,default:""},width:{type:String,default:"160px"}},emits:["update:modelValue","change"],data(){return{isOpen:!1}},computed:{resolvedPlaceholder(){return this.placeholder||this.$t("common.select")},displayLabel(){const t=this.options.find(t=>t.value===this.modelValue);return t?t.label:this.resolvedPlaceholder}},mounted(){document.addEventListener("click",this.handleClickOutside)},beforeUnmount(){document.removeEventListener("click",this.handleClickOutside)},methods:{toggleDropdown(){this.isOpen=!this.isOpen},selectOption(t){this.$emit("update:modelValue",t),this.$emit("change",t),this.isOpen=!1},handleClickOutside(t){this.$el.contains(t.target)||(this.isOpen=!1)}}};const bc=(0,d.A)(mc,[["render",fc],["__scopeId","data-v-55080c16"]]);var yc=bc;const xc={class:"upload-settings"},vc={class:"page-header"},_c={class:"first-title"},kc={class:"header-actions"},wc={class:"group-header"},Cc={class:"group-title"},Sc={key:0,class:"load-balance-switch"},Fc={class:"switch-label"},Tc={key:0,class:"channel-cards"},Pc=["onMousemove","onMouseleave"],Mc={class:"card-header"},Ac={class:"card-title"},Dc={class:"channel-name"},$c={class:"card-body"},Vc={class:"card-info"},Lc={class:"info-item"},Ec={class:"info-text"},Uc={key:0,class:"info-item"},Ic={class:"info-text"},Oc={key:1,class:"info-item"},Rc=["title"],Wc={class:"info-item"},Bc={class:"info-text"},Nc={key:0,class:"info-item"},zc=["title"],jc={class:"info-item"},qc={class:"info-text"},Hc={class:"info-item"},Xc={class:"info-text"},Kc={class:"info-item"},Yc={class:"info-text"},Qc={class:"info-item"},Gc=["title"],Jc={key:0,class:"info-item"},Zc=["title"],tu={key:0,class:"quota-mini"},eu={class:"quota-text"},su={class:"card-actions"},iu={key:1,class:"empty-tip"},nu={key:0,class:"form-warning",style:{"margin-top":"0"}},au=["innerHTML"],ou={class:"form-tip"},lu={class:"form-tip"},ru={class:"form-tip"},hu={class:"form-warning"},du={class:"form-tip"},cu={class:"form-tip"},uu={class:"form-tip"},pu={class:"quota-label"},gu={class:"quota-status"},fu={class:"form-tip"},mu={class:"form-tip"},bu={class:"form-tip"};function yu(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),h=g.R7,d=yc,c=k.S2,u=uc.u,p=cc.qi,f=w.ve,m=dc.P9,b=dc.AV,y=lc.xE,x=hc.WK,_=rc.lq,C=lc.US,S=oc.kZ,F=ac.MF,T=ac.TS,P=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",xc,[(0,i.Lk)("div",vc,[(0,i.Lk)("h3",_c,[(0,i.eW)((0,n.v_)(t.$t("sysUpload.title"))+" ",1),(0,i.bF)(h,{content:t.$t("sysUpload.titleTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",class:"help-icon"})]),_:1},8,["content"])]),(0,i.Lk)("div",kc,[(0,i.bF)(d,{modelValue:o.channelFilter,"onUpdate:modelValue":e[0]||(e[0]=t=>o.channelFilter=t),options:l.filterOptions,placeholder:t.$t("sysUpload.filterPlaceholder"),width:"160px"},null,8,["modelValue","options","placeholder"]),(0,i.bF)(c,{type:"primary",onClick:e[1]||(e[1]=t=>o.showAddDialog=!0),class:"add-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"plus",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysUpload.addChannel")),1)]),_:1})])]),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.filteredChannels,s=>((0,i.uX)(),(0,i.CE)("div",{key:s.value,class:"channel-group"},[(0,i.Lk)("div",wc,[(0,i.Lk)("div",Cc,[(0,i.bF)(r,{icon:l.getChannelIcon(s.value),class:"group-icon"},null,8,["icon"]),(0,i.Lk)("span",null,(0,n.v_)(s.label),1),(0,i.bF)(u,{size:"small",type:"info",class:"channel-count"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getChannelList(s.value).length),1)]),_:2},1024)]),l.hasLoadBalance(s.value)?((0,i.uX)(),(0,i.CE)("div",Sc,[(0,i.Lk)("span",Fc,(0,n.v_)(t.$t("sysUpload.loadBalance")),1),(0,i.bF)(p,{modelValue:l.getSettings(s.value).loadBalance.enabled,"onUpdate:modelValue":t=>l.getSettings(s.value).loadBalance.enabled=t,size:"small",onChange:l.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])])):(0,i.Q3)("",!0)]),l.getChannelList(s.value).length>0?((0,i.uX)(),(0,i.CE)("div",Tc,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.getChannelList(s.value),(a,o)=>((0,i.uX)(),(0,i.CE)("div",{key:a.name||o,class:(0,n.C4)(["channel-card",[s.value,{disabled:!a.enabled,fixed:a.fixed}]]),onMousemove:t=>l.handleCardMouseMove(t,s.value,o),onMouseleave:t=>l.handleCardMouseLeave(s.value,o)},[(0,i.Lk)("div",{class:"card-glow",ref_for:!0,ref:`glow-${s.value}-${o}`},null,512),(0,i.Lk)("div",Mc,[(0,i.Lk)("div",Ac,[(0,i.Lk)("span",Dc,(0,n.v_)(a.name||t.$t("sysUpload.unnamedChannel")),1),a.fixed?((0,i.uX)(),(0,i.Wv)(u,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.envVariable")),1)]),_:1})):(0,i.Q3)("",!0)]),(0,i.bF)(p,{modelValue:a.enabled,"onUpdate:modelValue":t=>a.enabled=t,size:"small",onClick:e[2]||(e[2]=(0,pc.D$)(()=>{},["stop"])),onChange:l.saveSettings},null,8,["modelValue","onUpdate:modelValue","onChange"])]),(0,i.Lk)("div",$c,[(0,i.Lk)("div",Vc,["telegram"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.Lk)("div",Lc,[(0,i.bF)(r,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",Ec,"Bot: "+(0,n.v_)(l.maskText(a.botToken)),1)]),a.chatId?((0,i.uX)(),(0,i.CE)("div",Uc,[(0,i.bF)(r,{icon:"comments",class:"info-icon"}),(0,i.Lk)("span",Ic,"Channel: "+(0,n.v_)(l.maskText(a.chatId)),1)])):(0,i.Q3)("",!0)],64)):"cfr2"===s.value?((0,i.uX)(),(0,i.CE)("div",Oc,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl||t.$t("sysUpload.notSet")),9,Rc)])):"s3"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.Lk)("div",Wc,[(0,i.bF)(r,{icon:"server",class:"info-icon"}),(0,i.Lk)("span",Bc,(0,n.v_)(a.bucketName||t.$t("sysUpload.notSet")),1)]),a.endpoint?((0,i.uX)(),(0,i.CE)("div",Nc,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.endpoint},(0,n.v_)(a.endpoint),9,zc)])):(0,i.Q3)("",!0)],64)):"discord"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.Lk)("div",jc,[(0,i.bF)(r,{icon:"robot",class:"info-icon"}),(0,i.Lk)("span",qc,"Bot: "+(0,n.v_)(l.maskText(a.botToken)),1)]),(0,i.Lk)("div",Hc,[(0,i.bF)(r,{icon:"hashtag",class:"info-icon"}),(0,i.Lk)("span",Xc,"Channel: "+(0,n.v_)(l.maskText(a.channelId)),1)]),a.isNitro?((0,i.uX)(),(0,i.Wv)(u,{key:0,size:"small",type:"success"},{default:(0,i.k6)(()=>[...e[78]||(e[78]=[(0,i.eW)("Nitro",-1)])]),_:1})):(0,i.Q3)("",!0)],64)):"huggingface"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.Lk)("div",Kc,[(0,i.bF)(r,{icon:"database",class:"info-icon"}),(0,i.Lk)("span",Yc,(0,n.v_)(a.repo||t.$t("sysUpload.notSet")),1)]),a.isPrivate?((0,i.uX)(),(0,i.Wv)(u,{key:0,size:"small",type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.privateRepo")),1)]),_:1})):(0,i.Q3)("",!0)],64)):"webdav"===s.value?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.Lk)("div",Qc,[(0,i.bF)(r,{icon:"folder",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.baseUrl},(0,n.v_)(a.baseUrl||t.$t("sysUpload.notSet")),9,Gc)]),a.publicUrl?((0,i.uX)(),(0,i.CE)("div",Jc,[(0,i.bF)(r,{icon:"link",class:"info-icon"}),(0,i.Lk)("span",{class:"info-text",title:a.publicUrl},(0,n.v_)(a.publicUrl),9,Zc)])):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),a.quota?.enabled?((0,i.uX)(),(0,i.CE)("div",tu,[(0,i.bF)(f,{percentage:l.getQuotaPercentage(a),status:l.getQuotaStatus(a),"stroke-width":6},null,8,["percentage","status"]),(0,i.Lk)("span",eu,(0,n.v_)(l.getQuotaText(a)),1)])):(0,i.Q3)("",!0)]),(0,i.Lk)("div",su,[(0,i.bF)(c,{text:"",type:"primary",size:"small",onClick:t=>l.openDetailDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"eye",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.detail")),1)]),_:1},8,["onClick"]),(0,i.bF)(c,{text:"",type:"primary",size:"small",onClick:t=>l.openEditDialog(s.value,o)},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"edit",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(c,{text:"",type:"danger",size:"small",onClick:t=>l.deleteChannel(s.value,o),disabled:a.fixed},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"trash-alt",style:{"margin-right":"4px"}}),(0,i.eW)((0,n.v_)(t.$t("sysUpload.deleteBtn")),1)]),_:1},8,["onClick","disabled"])])],42,Pc))),128))])):((0,i.uX)(),(0,i.CE)("div",iu,[(0,i.bF)(r,{icon:"inbox",class:"empty-icon"}),(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysUpload.noChannels",{type:s.label})),1)]))]))),128)),(0,i.bF)(S,{modelValue:o.showAddDialog,"onUpdate:modelValue":e[35]||(e[35]=t=>o.showAddDialog=t),title:t.$t("sysUpload.addDialogTitle"),class:"channel-dialog","destroy-on-close":"",onClosed:l.resetAddForm},{footer:(0,i.k6)(()=>[(0,i.bF)(c,{onClick:e[34]||(e[34]=t=>o.showAddDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cancel")),1)]),_:1}),"cfr2"!==o.newChannel.type?((0,i.uX)(),(0,i.Wv)(c,{key:0,type:"primary",onClick:l.confirmAddChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.confirmAdd")),1)]),_:1},8,["onClick"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>[(0,i.bF)(C,{model:o.newChannel,"label-position":"top",ref:"addForm",rules:l.addRules},{default:(0,i.k6)(()=>[(0,i.bF)(y,{label:t.$t("sysUpload.channelTypeLabel"),prop:"type"},{default:(0,i.k6)(()=>[(0,i.bF)(b,{modelValue:o.newChannel.type,"onUpdate:modelValue":e[3]||(e[3]=t=>o.newChannel.type=t),placeholder:t.$t("sysUpload.channelTypePlaceholder"),style:{width:"100%"},onChange:l.onChannelTypeChange},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.addableChannels,t=>((0,i.uX)(),(0,i.Wv)(m,{key:t.value,label:t.label,value:t.value},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:l.getChannelIcon(t.value),class:"select-option-icon"},null,8,["icon"]),(0,i.eW)(" "+(0,n.v_)(t.label),1)]),_:2},1032,["label","value"]))),128))]),_:1},8,["modelValue","placeholder","onChange"])]),_:1},8,["label"]),"cfr2"===o.newChannel.type?((0,i.uX)(),(0,i.CE)("div",nu,[(0,i.bF)(r,{icon:"info-circle",style:{"margin-right":"6px"}}),(0,i.Lk)("span",{innerHTML:t.$t("sysUpload.r2ConfigNote")},null,8,au)])):((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(y,{label:t.$t("sysUpload.channelNameLabel"),prop:"name"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.name,"onUpdate:modelValue":e[4]||(e[4]=t=>o.newChannel.name=t),placeholder:t.$t("sysUpload.channelNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),"telegram"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[5]||(e[5]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.chatId,"onUpdate:modelValue":e[6]||(e[6]=t=>o.newChannel.chatId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.chatIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[7]||(e[7]=t=>o.newChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"s3"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(y,{label:t.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.endpoint,"onUpdate:modelValue":e[8]||(e[8]=t=>o.newChannel.endpoint=t),placeholder:t.$t("sysUpload.endpointPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.cdnDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.cdnDomain,"onUpdate:modelValue":e[9]||(e[9]=t=>o.newChannel.cdnDomain=t),placeholder:t.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"]),(0,i.Lk)("span",ou,(0,n.v_)(t.$t("sysUpload.cdnDomainTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.bucketName,"onUpdate:modelValue":e[10]||(e[10]=t=>o.newChannel.bucketName=t),placeholder:t.$t("sysUpload.bucketNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.region,"onUpdate:modelValue":e[11]||(e[11]=t=>o.newChannel.region=t),placeholder:t.$t("sysUpload.bucketRegionPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.accessKeyId,"onUpdate:modelValue":e[12]||(e[12]=t=>o.newChannel.accessKeyId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.accessKeyIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.secretAccessKey,"onUpdate:modelValue":e[13]||(e[13]=t=>o.newChannel.secretAccessKey=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.secretAccessKeyPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.pathStyle")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.newChannel.pathStyle,"onUpdate:modelValue":e[14]||(e[14]=t=>o.newChannel.pathStyle=t)},null,8,["modelValue"]),(0,i.Lk)("span",lu,(0,n.v_)(t.$t("sysUpload.pathStyleTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[15]||(e[15]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[16]||(e[16]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[17]||(e[17]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(y,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.botToken,"onUpdate:modelValue":e[18]||(e[18]=t=>o.newChannel.botToken=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.botTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.channelId,"onUpdate:modelValue":e[19]||(e[19]=t=>o.newChannel.channelId=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.channelIdPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.proxyUrl,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.nitroMember")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.newChannel.isNitro,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newChannel.isNitro=t)},null,8,["modelValue"]),(0,i.Lk)("span",ru,(0,n.v_)(t.$t("sysUpload.nitroTip")),1)]),_:1},8,["label"]),(0,i.Lk)("div",hu,[(0,i.bF)(r,{icon:"exclamation-triangle",style:{"margin-right":"6px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysUpload.discordWarning")),1)])],64)):"huggingface"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(y,{label:t.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.repo,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newChannel.repo=t),placeholder:t.$t("sysUpload.repoNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.token,"onUpdate:modelValue":e[23]||(e[23]=t=>o.newChannel.token=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.accessTokenPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.privateRepo")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.newChannel.isPrivate,"onUpdate:modelValue":e[24]||(e[24]=t=>o.newChannel.isPrivate=t)},null,8,["modelValue"]),(0,i.Lk)("span",du,(0,n.v_)(t.$t("sysUpload.privateRepoTip")),1)]),_:1},8,["label"])],64)):"webdav"===o.newChannel.type?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(y,{label:t.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.baseUrl,"onUpdate:modelValue":e[25]||(e[25]=t=>o.newChannel.baseUrl=t),placeholder:t.$t("sysUpload.webdavBaseUrlPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.username,"onUpdate:modelValue":e[26]||(e[26]=t=>o.newChannel.username=t),placeholder:t.$t("sysUpload.webdavUsernamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.password,"onUpdate:modelValue":e[27]||(e[27]=t=>o.newChannel.password=t),type:"password","show-password":"",placeholder:t.$t("sysUpload.webdavPasswordPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.publicUrl,"onUpdate:modelValue":e[28]||(e[28]=t=>o.newChannel.publicUrl=t),placeholder:t.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"]),(0,i.Lk)("span",cu,(0,n.v_)(t.$t("sysUpload.webdavPublicUrlTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newChannel.headersText,"onUpdate:modelValue":e[29]||(e[29]=t=>o.newChannel.headersText=t),type:"textarea",autosize:{minRows:2},placeholder:t.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavCreateDirectory")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.newChannel.createDirectory,"onUpdate:modelValue":e[30]||(e[30]=t=>o.newChannel.createDirectory=t)},null,8,["modelValue"]),(0,i.Lk)("span",uu,(0,n.v_)(t.$t("sysUpload.webdavCreateDirectoryTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.newChannel.quota.enabled,"onUpdate:modelValue":e[31]||(e[31]=t=>o.newChannel.quota.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),o.newChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.quota.limitGB,"onUpdate:modelValue":e[32]||(e[32]=t=>o.newChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.newChannel.quota.threshold,"onUpdate:modelValue":e[33]||(e[33]=t=>o.newChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)],64))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(S,{modelValue:o.showDetailDialog,"onUpdate:modelValue":e[37]||(e[37]=t=>o.showDetailDialog=t),title:t.$t("sysUpload.detailDialogTitle",{name:o.currentChannel?.name||""}),class:"channel-dialog",onClosed:l.resetDetailData},{footer:(0,i.k6)(()=>[(0,i.bF)(c,{onClick:e[36]||(e[36]=t=>o.showDetailDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.closeBtn")),1)]),_:1}),(0,i.bF)(c,{type:"primary",onClick:l.openEditFromDetail},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.editBtn")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(T,{column:1,border:""},{default:(0,i.k6)(()=>[(0,i.bF)(F,{label:t.$t("sysUpload.channelNameDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.name),1)]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.channelTypeDetail")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getChannelTypeLabel(o.currentChannelType)),1)]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.statusLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(u,{type:o.currentChannel?.enabled?"success":"info"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.enabled?t.$t("sysUpload.enabled"):t.$t("sysUpload.disabled")),1)]),_:1},8,["type"])]),_:1},8,["label"]),o.currentChannel?.fixed?((0,i.uX)(),(0,i.Wv)(F,{key:0,label:t.$t("sysUpload.configSource")},{default:(0,i.k6)(()=>[(0,i.bF)(u,{type:"warning"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.envVariable")),1)]),_:1})]),_:1},8,["label"])):(0,i.Q3)("",!0),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(F,{label:t.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.chatIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.chatId,6)),1)]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.Wv)(F,{key:2,label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{"model-value":o.currentChannel?.publicUrl||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"])):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(F,{label:t.$t("sysUpload.endpointLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{"model-value":o.currentChannel?.endpoint,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.cdnDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{"model-value":o.currentChannel?.cdnDomain||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.bucketName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.bucketName),1)]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.bucketRegion")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.region),1)]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.pathStyle")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.pathStyle?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(F,{label:t.$t("sysUpload.botTokenLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.botToken,10)),1)]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.channelIdLabel")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.maskText(o.currentChannel?.channelId,6)),1)]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.proxyUrl||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.nitroMember")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isNitro?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(F,{label:t.$t("sysUpload.repoName")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.repo),1)]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.privateRepo")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.isPrivate?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:6},[(0,i.bF)(F,{label:t.$t("sysUpload.webdavBaseUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{"model-value":o.currentChannel?.baseUrl,readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{"model-value":o.currentChannel?.publicUrl||t.$t("sysUpload.notSet"),readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.username||t.$t("sysUpload.notSet")),1)]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{"model-value":l.formatHeaders(o.currentChannel?.headers),type:"textarea",autosize:{minRows:2},readonly:""},null,8,["model-value"])]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.webdavCreateDirectory")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(!1!==o.currentChannel?.createDirectory?t.$t("sysUpload.isPathStyle"):t.$t("sysUpload.isNotPathStyle")),1)]),_:1},8,["label"])],64)):(0,i.Q3)("",!0),o.currentChannel?.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:7},[(0,i.bF)(F,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.limitGB)+" GB",1)]),_:1},8,["label"]),(0,i.bF)(F,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(o.currentChannel?.quota?.threshold)+"%",1)]),_:1},8,["label"]),(0,i.bF)(F,null,{label:(0,i.k6)(()=>[(0,i.Lk)("span",pu,[(0,i.eW)((0,n.v_)(t.$t("sysUpload.currentUsage"))+" ",1),(0,i.bF)(c,{link:"",type:"primary",onClick:l.refreshQuota,class:"refresh-btn"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"sync-alt",class:(0,n.C4)({"fa-spin":o.quotaLoading})},null,8,["class"])]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",gu,[(0,i.bF)(f,{percentage:l.getQuotaPercentage(o.currentChannel),status:l.getQuotaStatus(o.currentChannel),"stroke-width":16,"text-inside":!0,format:()=>l.getQuotaText(o.currentChannel)},null,8,["percentage","status","format"]),(0,i.Lk)("div",{class:(0,n.C4)(["quota-info",{"quota-warning":l.isQuotaExceeded(o.currentChannel)}])},(0,n.v_)(l.getQuotaStatusText(o.currentChannel)),3)])]),_:1})],64)):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["modelValue","title","onClosed"]),(0,i.bF)(S,{modelValue:o.showEditDialog,"onUpdate:modelValue":e[77]||(e[77]=t=>o.showEditDialog=t),title:t.$t("sysUpload.editDialogTitle",{name:o.editChannel?.name||""}),class:"channel-dialog","destroy-on-close":"",onClosed:l.resetEditData},{footer:(0,i.k6)(()=>[(0,i.bF)(c,{onClick:e[76]||(e[76]=t=>o.showEditDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.cancel")),1)]),_:1}),(0,i.bF)(c,{type:"primary",onClick:l.confirmEditChannel},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysUpload.saveChanges")),1)]),_:1},8,["onClick"])]),default:(0,i.k6)(()=>[(0,i.bF)(C,{model:o.editChannel,"label-position":"top",ref:"editForm",rules:l.editRules},{default:(0,i.k6)(()=>[(0,i.bF)(y,{label:t.$t("sysUpload.channelNameLabel"),prop:"name"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.name,"onUpdate:modelValue":e[38]||(e[38]=t=>o.editChannel.name=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.enableChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.enabled,"onUpdate:modelValue":e[39]||(e[39]=t=>o.editChannel.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),"telegram"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[40]||(e[40]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.chatIdLabel"),prop:"chatId"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.chatId,"onUpdate:modelValue":e[41]||(e[41]=t=>o.editChannel.chatId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[42]||(e[42]=t=>o.editChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"])],64)):"cfr2"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(y,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[43]||(e[43]=t=>o.editChannel.publicUrl=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[44]||(e[44]=t=>o.editChannel.quota.enabled=t),onChange:e[45]||(e[45]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[46]||(e[46]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[47]||(e[47]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"s3"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.bF)(y,{label:t.$t("sysUpload.endpointLabel"),prop:"endpoint"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.endpoint,"onUpdate:modelValue":e[48]||(e[48]=t=>o.editChannel.endpoint=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.cdnDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.cdnDomain,"onUpdate:modelValue":e[49]||(e[49]=t=>o.editChannel.cdnDomain=t),placeholder:t.$t("sysUpload.cdnDomainPlaceholder")},null,8,["modelValue","placeholder"]),(0,i.Lk)("span",fu,(0,n.v_)(t.$t("sysUpload.cdnDomainTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.bucketName"),prop:"bucketName"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.bucketName,"onUpdate:modelValue":e[50]||(e[50]=t=>o.editChannel.bucketName=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.bucketRegion"),prop:"region"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.region,"onUpdate:modelValue":e[51]||(e[51]=t=>o.editChannel.region=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.accessKeyId"),prop:"accessKeyId"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.accessKeyId,"onUpdate:modelValue":e[52]||(e[52]=t=>o.editChannel.accessKeyId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.secretAccessKey"),prop:"secretAccessKey"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.secretAccessKey,"onUpdate:modelValue":e[53]||(e[53]=t=>o.editChannel.secretAccessKey=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.pathStyle")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.pathStyle,"onUpdate:modelValue":e[54]||(e[54]=t=>o.editChannel.pathStyle=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[55]||(e[55]=t=>o.editChannel.quota.enabled=t),onChange:e[56]||(e[56]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[57]||(e[57]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[58]||(e[58]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):"discord"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.bF)(y,{label:t.$t("sysUpload.botTokenLabel"),prop:"botToken"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.botToken,"onUpdate:modelValue":e[59]||(e[59]=t=>o.editChannel.botToken=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.channelIdLabel"),prop:"channelId"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.channelId,"onUpdate:modelValue":e[60]||(e[60]=t=>o.editChannel.channelId=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.proxyDomain")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.proxyUrl,"onUpdate:modelValue":e[61]||(e[61]=t=>o.editChannel.proxyUrl=t),placeholder:t.$t("sysUpload.proxyDomainPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.nitroMember")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.isNitro,"onUpdate:modelValue":e[62]||(e[62]=t=>o.editChannel.isNitro=t)},null,8,["modelValue"])]),_:1},8,["label"])],64)):"huggingface"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:4},[(0,i.bF)(y,{label:t.$t("sysUpload.repoName"),prop:"repo"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.repo,"onUpdate:modelValue":e[63]||(e[63]=t=>o.editChannel.repo=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.accessToken"),prop:"token"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.token,"onUpdate:modelValue":e[64]||(e[64]=t=>o.editChannel.token=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.privateRepo")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.isPrivate,"onUpdate:modelValue":e[65]||(e[65]=t=>o.editChannel.isPrivate=t)},null,8,["modelValue"])]),_:1},8,["label"])],64)):"webdav"===o.currentChannelType?((0,i.uX)(),(0,i.CE)(i.FK,{key:5},[(0,i.bF)(y,{label:t.$t("sysUpload.webdavBaseUrl"),prop:"baseUrl"},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.baseUrl,"onUpdate:modelValue":e[66]||(e[66]=t=>o.editChannel.baseUrl=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.username,"onUpdate:modelValue":e[67]||(e[67]=t=>o.editChannel.username=t),disabled:o.editChannel.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.password,"onUpdate:modelValue":e[68]||(e[68]=t=>o.editChannel.password=t),disabled:o.editChannel.fixed,type:"password","show-password":""},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.publicUrl")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.publicUrl,"onUpdate:modelValue":e[69]||(e[69]=t=>o.editChannel.publicUrl=t),placeholder:t.$t("sysUpload.webdavPublicUrlPlaceholder")},null,8,["modelValue","placeholder"]),(0,i.Lk)("span",mu,(0,n.v_)(t.$t("sysUpload.webdavPublicUrlTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavHeaders")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editChannel.headersText,"onUpdate:modelValue":e[70]||(e[70]=t=>o.editChannel.headersText=t),type:"textarea",autosize:{minRows:2},placeholder:t.$t("sysUpload.webdavHeadersPlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.webdavCreateDirectory")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.createDirectory,"onUpdate:modelValue":e[71]||(e[71]=t=>o.editChannel.createDirectory=t)},null,8,["modelValue"]),(0,i.Lk)("span",bu,(0,n.v_)(t.$t("sysUpload.webdavCreateDirectoryTip")),1)]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimit")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.editChannel.quota.enabled,"onUpdate:modelValue":e[72]||(e[72]=t=>o.editChannel.quota.enabled=t),onChange:e[73]||(e[73]=t=>l.onQuotaEnabledChange(t,o.editChannel))},null,8,["modelValue"])]),_:1},8,["label"]),o.editChannel.quota?.enabled?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(y,{label:t.$t("sysUpload.quotaLimitGB")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.quota.limitGB,"onUpdate:modelValue":e[74]||(e[74]=t=>o.editChannel.quota.limitGB=t),min:.1,step:1,precision:1},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(y,{label:t.$t("sysUpload.quotaThreshold")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{modelValue:o.editChannel.quota.threshold,"onUpdate:modelValue":e[75]||(e[75]=t=>o.editChannel.quota.threshold=t),min:50,max:100,step:5},null,8,["modelValue"])]),_:1},8,["label"])],64)):(0,i.Q3)("",!0)],64)):(0,i.Q3)("",!0)]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","onClosed"])])),[[P,o.loading]])}var xu={components:{CustomSelect:yc},data(){return{channelFilter:"",channels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],addableChannels:[{value:"telegram",label:"Telegram"},{value:"cfr2",label:"CloudFlare R2"},{value:"s3",label:"S3"},{value:"discord",label:"Discord"},{value:"huggingface",label:"HuggingFace"},{value:"webdav",label:"WebDAV"}],telegramSettings:{loadBalance:{enabled:!1},channels:[]},cfr2Settings:{channels:[]},s3Settings:{loadBalance:{enabled:!1},channels:[]},discordSettings:{loadBalance:{enabled:!1},channels:[]},huggingfaceSettings:{loadBalance:{enabled:!1},channels:[]},webdavSettings:{loadBalance:{enabled:!1},channels:[]},showAddDialog:!1,showDetailDialog:!1,showEditDialog:!1,currentChannelType:"",currentChannelIndex:-1,currentChannel:null,editChannel:{},newChannel:{type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0},quotaStats:{},quotaLoading:!1,loading:!1}},computed:{filterOptions(){const t={telegram:"paper-plane",cfr2:"cloud",s3:"database",discord:"comments",huggingface:"robot",webdav:"folder"};return[{value:"",label:this.$t("common.all")},...this.channels.map(e=>({value:e.value,label:e.label,icon:t[e.value]||"server"}))]},filteredChannels(){return this.channelFilter?this.channels.filter(t=>t.value===this.channelFilter):this.channels},addRules(){return{type:[{required:!0,message:this.$t("sysUpload.channelTypePlaceholder"),trigger:"change"}],name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}},editRules(){return{name:[{required:!0,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"},{pattern:/^[\u4e00-\u9fa5a-zA-Z0-9_-]+$/,message:this.$t("sysUpload.channelNamePlaceholder"),trigger:"blur"}],botToken:[{required:!0,message:this.$t("sysUpload.botTokenPlaceholder"),trigger:"blur"}],chatId:[{required:!0,message:this.$t("sysUpload.chatIdPlaceholder"),trigger:"blur"}],channelId:[{required:!0,message:this.$t("sysUpload.channelIdPlaceholder"),trigger:"blur"}],endpoint:[{required:!0,message:this.$t("sysUpload.endpointPlaceholder"),trigger:"blur"}],bucketName:[{required:!0,message:this.$t("sysUpload.bucketNamePlaceholder"),trigger:"blur"}],region:[{required:!0,message:this.$t("sysUpload.bucketRegionPlaceholder"),trigger:"blur"}],accessKeyId:[{required:!0,message:this.$t("sysUpload.accessKeyIdPlaceholder"),trigger:"blur"}],secretAccessKey:[{required:!0,message:this.$t("sysUpload.secretAccessKeyPlaceholder"),trigger:"blur"}],repo:[{required:!0,message:this.$t("sysUpload.repoNamePlaceholder"),trigger:"blur"}],token:[{required:!0,message:this.$t("sysUpload.accessTokenPlaceholder"),trigger:"blur"}],baseUrl:[{required:!0,message:this.$t("sysUpload.webdavBaseUrlPlaceholder"),trigger:"blur"}]}}},methods:{handleCardMouseMove(t,e,s){const i=t.currentTarget,n=i.getBoundingClientRect(),a=t.clientX-n.left,o=t.clientY-n.top,l=`glow-${e}-${s}`,r=this.$refs[l];r&&r[0]&&(r[0].style.opacity="1",r[0].style.left=`${a}px`,r[0].style.top=`${o}px`)},handleCardMouseLeave(t,e){const s=`glow-${t}-${e}`,i=this.$refs[s];i&&i[0]&&(i[0].style.opacity="0")},getChannelIcon(t){const e={telegram:"paper-plane",cfr2:"cloud",s3:"database",discord:"comments",huggingface:"robot",webdav:"folder"};return e[t]||"server"},getChannelTypeLabel(t){const e=this.channels.find(e=>e.value===t);return e?e.label:t},getChannelList(t){return this.getSettings(t)?.channels||[]},getSettings(t){const e={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};return e[t]},hasLoadBalance(t){return["telegram","s3","discord","huggingface","webdav"].includes(t)},maskText(t,e=4){return t?t.length<=2*e?"****":t.slice(0,e)+"****"+t.slice(-e):this.$t("sysUpload.notSet")},formatHeaders(t){return!t||"object"===typeof t&&0===Object.keys(t).length?this.$t("sysUpload.notSet"):"string"===typeof t?t:JSON.stringify(t,null,2)},headersToText(t){return t?"string"===typeof t?t:JSON.stringify(t,null,2):""},parseHeadersText(t){if(!t||!t.trim())return{};try{const e=JSON.parse(t);return!e||"object"!==typeof e||Array.isArray(e)?null:e}catch(e){return null}},openDetailDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e,this.currentChannel=this.getChannelList(t)[e],this.showDetailDialog=!0},openEditDialog(t,e){this.currentChannelType=t,this.currentChannelIndex=e;const s=this.getChannelList(t)[e];this.editChannel=JSON.parse(JSON.stringify(s)),"webdav"===t&&(this.editChannel.headersText=this.headersToText(this.editChannel.headers),this.editChannel.createDirectory=!1!==this.editChannel.createDirectory),this.editChannel.quota||(this.editChannel.quota={enabled:!1,limitGB:10,threshold:95}),this.showEditDialog=!0},openEditFromDetail(){this.showDetailDialog=!1,this.openEditDialog(this.currentChannelType,this.currentChannelIndex)},resetAddForm(){this.newChannel={type:"",name:"",enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},resetDetailData(){this.currentChannel=null},resetEditData(){this.editChannel={}},onChannelTypeChange(){const{type:t,name:e}=this.newChannel;this.newChannel={type:t,name:e,enabled:!0,botToken:"",chatId:"",proxyUrl:"",endpoint:"",cdnDomain:"",bucketName:"",region:"auto",accessKeyId:"",secretAccessKey:"",pathStyle:!1,quota:{enabled:!1,limitGB:10,threshold:95},channelId:"",isNitro:!1,repo:"",token:"",isPrivate:!1,baseUrl:"",username:"",password:"",publicUrl:"",headersText:"",createDirectory:!0}},confirmAddChannel(){this.$refs.addForm.validate(t=>{if(!t)return;const{type:e,name:s}=this.newChannel,i=this.getSettings(e),n=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env","WebDAV_env"];if(n.includes(s))return void this.$message.warning(this.$t("sysUpload.reservedName"));const a=i.channels.some(t=>t.name===s);if(a)return void this.$message.warning(this.$t("sysUpload.duplicateName"));let o={id:i.channels.length+1,name:this.newChannel.name,type:e,savePath:"database",enabled:!0,fixed:!1};if("telegram"===e)Object.assign(o,{botToken:this.newChannel.botToken,chatId:this.newChannel.chatId,proxyUrl:this.newChannel.proxyUrl});else if("s3"===e)Object.assign(o,{endpoint:this.newChannel.endpoint,cdnDomain:this.newChannel.cdnDomain,bucketName:this.newChannel.bucketName,region:this.newChannel.region,accessKeyId:this.newChannel.accessKeyId,secretAccessKey:this.newChannel.secretAccessKey,pathStyle:this.newChannel.pathStyle,quota:{...this.newChannel.quota}});else if("discord"===e)Object.assign(o,{botToken:this.newChannel.botToken,channelId:this.newChannel.channelId,proxyUrl:this.newChannel.proxyUrl,isNitro:this.newChannel.isNitro});else if("huggingface"===e)Object.assign(o,{repo:this.newChannel.repo,token:this.newChannel.token,isPrivate:this.newChannel.isPrivate});else if("webdav"===e){const t=this.parseHeadersText(this.newChannel.headersText);if(null===t)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));Object.assign(o,{baseUrl:this.newChannel.baseUrl,username:this.newChannel.username,password:this.newChannel.password,publicUrl:this.newChannel.publicUrl,headers:t,createDirectory:!1!==this.newChannel.createDirectory,quota:{...this.newChannel.quota}})}i.channels.push(o),this.showAddDialog=!1,this.saveSettings()})},confirmEditChannel(){this.$refs.editForm.validate(t=>{if(!t)return;const e=this.getSettings(this.currentChannelType),s=this.editChannel.name,i=this.currentChannelIndex,n=this.editChannel.fixed;if(!n){const t=["Telegram_env","R2_env","S3_env","Discord_env","HuggingFace_env","WebDAV_env"];if(t.includes(s))return void this.$message.warning(this.$t("sysUpload.reservedName"));const n=e.channels.some((t,e)=>e!==i&&t.name===s);if(n)return void this.$message.warning(this.$t("sysUpload.duplicateName"))}const a={...this.editChannel};if("webdav"===this.currentChannelType){const t=this.parseHeadersText(a.headersText);if(null===t)return void this.$message.warning(this.$t("sysUpload.webdavHeadersInvalid"));a.headers=t,a.createDirectory=!1!==a.createDirectory,delete a.headersText}e.channels[this.currentChannelIndex]=a,this.showEditDialog=!1,this.saveSettings()})},deleteChannel(t,e){const s=this.getChannelList(t)[e];s.fixed?this.$message.warning(this.$t("sysUpload.fixedChannelCannotDelete")):this.$confirm(this.$t("sysUpload.deleteChannelConfirm"),this.$t("common.info"),{confirmButtonText:this.$t("common.confirm"),cancelButtonText:this.$t("common.cancel"),type:"warning"}).then(()=>{const s=this.getSettings(t);s.channels.splice(e,1),s.channels.forEach((t,e)=>{t.id=e+1}),this.saveSettings()}).catch(()=>{})},saveSettings(){const t={telegram:this.telegramSettings,cfr2:this.cfr2Settings,s3:this.s3Settings,discord:this.discordSettings,huggingface:this.huggingfaceSettings,webdav:this.webdavSettings};(0,Yt.A)("/api/manage/sysConfig/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}).then(()=>{this.$message.success(this.$t("sysOthers.settingsSaved"))})},async refreshQuota(){this.quotaLoading=!0;try{const t=await(0,Yt.A)("/api/manage/quota",{method:"POST"}),e=await t.json();if(e.success)this.quotaStats=e.channelStats||{};else{const t=await(0,Yt.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,Yt.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),s=t.quota?.limitGB||10,i=e/s*100;return Math.min(100,Math.round(10*i)/10)},getQuotaStatus(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s?"exception":e>=80?"warning":"success"},getQuotaText(t){const e=this.getChannelUsedGB(t),s=t.quota?.limitGB||10;return`${e.toFixed(2)} / ${s} GB`},isQuotaExceeded(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s},getQuotaStatusText(t){const e=this.getQuotaPercentage(t),s=t.quota?.threshold||95;return e>=s?`⚠️ 已达到容量阈值 (${s}%),渠道写入已暂停`:e>=80?"⚡ 容量使用较高,接近阈值":"✓ 容量正常"},async onQuotaEnabledChange(t,e){if(t&&e.name){const t=this.quotaStats[e.name];t||this.$confirm(this.$t("sysUpload.quotaInitConfirm"),this.$t("sysUpload.quotaInitTitle"),{confirmButtonText:this.$t("sysUpload.quotaInitConfirmBtn"),cancelButtonText:this.$t("sysUpload.quotaInitCancelBtn"),type:"info"}).then(async()=>{await this.recalculateQuota()}).catch(()=>{this.$message.info(this.$t("sysUpload.quotaInitLater"))})}},async recalculateQuota(){this.quotaLoading=!0;try{this.$message.info(this.$t("sysUpload.quotaCalculating"));const t=await(0,Yt.A)("/api/manage/quota",{method:"POST"}),e=await t.json();e.success?(this.quotaStats=e.channelStats||{},this.$message.success(this.$t("sysUpload.quotaCalculateSuccess"))):this.$message.error(this.$t("sysUpload.quotaCalculateError")+(e.error||""))}catch(t){console.error("Failed to recalculate quota:",t),this.$message.error(this.$t("sysUpload.quotaCalculateFailed"))}finally{this.quotaLoading=!1}}},mounted(){this.loading=!0,(0,Yt.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:[]},t.webdav&&t.webdav.channels&&(t.webdav.channels=t.webdav.channels.map(t=>({...t,username:t.username||"",password:t.password||"",publicUrl:t.publicUrl||"",headers:t.headers||{},createDirectory:!1!==t.createDirectory,quota:t.quota||{enabled:!1,limitGB:10,threshold:95}}))),this.webdavSettings=t.webdav||{loadBalance:{},channels:[]},this.loadQuotaStats()}).finally(()=>{this.loading=!1})}};const vu=(0,d.A)(xu,[["render",yu],["__scopeId","data-v-d225d330"]]);var _u=vu,ku=s(98469);s(49187);const wu={class:"save-text"};function Cu(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon");return(0,i.uX)(),(0,i.Wv)(pc.eB,{name:"fade-up"},{default:(0,i.k6)(()=>[(0,i.bo)((0,i.Lk)("div",{class:(0,n.C4)(["floating-save-btn",{"is-loading":s.loading}]),onClick:e[0]||(e[0]=(...t)=>l.handleClick&&l.handleClick(...t))},[s.loading?((0,i.uX)(),(0,i.Wv)(r,{key:0,icon:"spinner",spin:""})):((0,i.uX)(),(0,i.Wv)(r,{key:1,icon:"save"})),(0,i.Lk)("span",wu,(0,n.v_)(s.loading?t.$t("floatingSave.saving"):t.$t("floatingSave.save")),1)],2),[[pc.aG,o.visible]])]),_:1})}var Su={name:"FloatingSaveButton",emits:["click"],props:{loading:{type:Boolean,default:!1},show:{type:Boolean,default:!0}},data(){return{visible:!1}},watch:{show:{immediate:!0,handler(t){t?setTimeout(()=>{this.visible=!0},600):this.visible=!1}}},methods:{handleClick(){this.loading||this.$emit("click")}}};const Fu=(0,d.A)(Su,[["render",Cu],["__scopeId","data-v-53091626"]]);var Tu=Fu,Pu=s(84757);s(5802),s(64752),s(38736);const Mu={class:"security-settings"},Au={class:"first-settings"},Du={class:"first-title"},$u={class:"second-title"},Vu={style:{display:"flex",gap:"8px",width:"100%"}},Lu={class:"second-title"},Eu={style:{display:"flex",gap:"8px",width:"100%"}},Uu={class:"second-title token-title"},Iu={class:"token-actions"},Ou={class:"token-table-container"},Ru={class:"table-cell-content"},Wu={class:"table-cell-content"},Bu={class:"token-display"},Nu={class:"table-cell-content"},zu={class:"table-cell-content"},ju={class:"table-cell-content"},qu={class:"table-cell-content"},Hu={class:"table-cell-content action-buttons"},Xu={class:"first-settings"},Ku={class:"first-title"},Yu={class:"second-title"},Qu={class:"first-settings"},Gu={class:"first-title"},Ju={class:"second-title"},Zu={class:"second-title"},tp={class:"second-title"},ep={class:"form-item-hint"},sp={class:"form-item-hint"},ip={style:{display:"flex",gap:"10px",width:"100%"}},np={class:"dialog-footer"},ap={style:{display:"flex",gap:"10px",width:"100%"}},op={class:"dialog-footer"},lp={class:"token-result"},rp={style:{"margin-bottom":"15px",color:"#e6a23c"}},hp={class:"dialog-footer"};function dp(t,e,s,a,o,l){const r=hc.WK,h=ku.dI,d=lc.xE,c=lc.US,u=(0,i.g2)("font-awesome-icon"),p=k.S2,f=Pu.o8,m=uc.u,b=Pu.Up,y=g.R7,x=cc.qi,_=dc.P9,w=dc.AV,C=rc.lq,S=Tu,F=ku.o5,T=oc.kZ,P=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Mu,[(0,i.Lk)("div",Au,[(0,i.Lk)("h3",Du,(0,n.v_)(t.$t("sysSecurity.authManagement")),1),(0,i.Lk)("h4",$u,(0,n.v_)(t.$t("sysSecurity.userAuth")),1),(0,i.bF)(c,{model:o.authSettings.user,rules:l.userPassRules,ref:"userPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:t.$t("sysSecurity.uploadPassword"),prop:"authCode"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Vu,[(0,i.bF)(r,{modelValue:o.authSettings.user.authCode,"onUpdate:modelValue":e[0]||(e[0]=t=>o.authSettings.user.authCode=t),type:"password","show-password":"",onInput:l.handleUserPassInput,autocomplete:"new-password",placeholder:o.authSettings.user._hasPassword?t.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearUserPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.user._hasPassword?((0,i.uX)(),(0,i.Wv)(h,{key:0,modelValue:o.clearUserPassword,"onUpdate:modelValue":e[1]||(e[1]=t=>o.clearUserPassword=t),onChange:l.handleClearUserPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(pc.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showUserPassConfirm?((0,i.uX)(),(0,i.Wv)(d,{label:t.$t("sysSecurity.confirmPassword"),prop:"confirmNewUserPassword",key:"user-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.user.confirmNewUserPassword,"onUpdate:modelValue":e[2]||(e[2]=t=>o.authSettings.user.confirmNewUserPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Lu,(0,n.v_)(t.$t("sysSecurity.adminAuth")),1),(0,i.bF)(c,{model:o.authSettings.admin,rules:l.adminPassRules,ref:"adminPassForm","label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:t.$t("sysSecurity.adminUsername"),prop:"adminUsername"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.admin.adminUsername,"onUpdate:modelValue":e[3]||(e[3]=t=>o.authSettings.admin.adminUsername=t),autocomplete:"new-password",disabled:o.clearAdminPassword},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(d,{label:t.$t("sysSecurity.adminPassword"),prop:"adminPassword"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",Eu,[(0,i.bF)(r,{modelValue:o.authSettings.admin.adminPassword,"onUpdate:modelValue":e[4]||(e[4]=t=>o.authSettings.admin.adminPassword=t),type:"password","show-password":"",onInput:l.handleAdminPassInput,autocomplete:"new-password",placeholder:o.authSettings.admin._hasPassword?t.$t("sysSecurity.passwordUnchanged"):"",disabled:o.clearAdminPassword},null,8,["modelValue","onInput","placeholder","disabled"]),o.authSettings.admin._hasPassword?((0,i.uX)(),(0,i.Wv)(h,{key:0,modelValue:o.clearAdminPassword,"onUpdate:modelValue":e[5]||(e[5]=t=>o.clearAdminPassword=t),onChange:l.handleClearAdminPassword},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.clearPassword")),1)]),_:1},8,["modelValue","onChange"])):(0,i.Q3)("",!0)])]),_:1},8,["label"]),(0,i.bF)(pc.eB,{name:"fade-slide",mode:"out-in"},{default:(0,i.k6)(()=>[o.showAdminPassConfirm?((0,i.uX)(),(0,i.Wv)(d,{label:t.$t("sysSecurity.confirmPassword"),prop:"confirmNewAdminPassword",key:"admin-confirm"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.authSettings.admin.confirmNewAdminPassword,"onUpdate:modelValue":e[6]||(e[6]=t=>o.authSettings.admin.confirmNewAdminPassword=t),type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1})]),_:1},8,["model","rules"]),(0,i.Lk)("h4",Uu,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.apiTokenManagement"))+" ",1),(0,i.Lk)("a",Iu,[(0,i.bF)(p,{type:"primary",size:"small",onClick:e[7]||(e[7]=t=>o.showCreateTokenDialog=!0),circle:""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"plus"})]),_:1})])]),(0,i.Lk)("div",Ou,[(0,i.bo)(((0,i.uX)(),(0,i.Wv)(b,{data:o.apiTokens,class:"token-table"},{default:(0,i.k6)(()=>[(0,i.bF)(f,{prop:"name",label:t.$t("sysSecurity.tokenName"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Ru,(0,n.v_)(t.row.name),1)]),_:1},8,["label"]),(0,i.bF)(f,{prop:"token",label:t.$t("sysSecurity.tokenValue"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Wu,[(0,i.Lk)("span",Bu,(0,n.v_)(t.row.token),1)])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"permissions",label:t.$t("sysSecurity.permissions"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",Nu,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(t.row.permissions,t=>((0,i.uX)(),(0,i.Wv)(m,{key:t,size:"small",class:"permission-tag"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getPermissionText(t)),1)]),_:2},1024))),128))])]),_:1},8,["label"]),(0,i.bF)(f,{prop:"createdAt",label:t.$t("sysSecurity.createdAt"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",zu,(0,n.v_)(l.formatDate(t.row.createdAt)),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.status"),"header-align":"center",width:"90"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",ju,[(0,i.bF)(m,{type:"active"===l.getTokenStatus(t.row.expiresAt).status?"success":"danger",size:"small"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.getTokenStatus(t.row.expiresAt).label),1)]),_:2},1032,["type"])])]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.expiresAt"),"header-align":"center"},{default:(0,i.k6)(t=>[(0,i.Lk)("div",qu,(0,n.v_)(l.getTokenStatus(t.row.expiresAt).expiresText),1)]),_:1},8,["label"]),(0,i.bF)(f,{label:t.$t("sysSecurity.operation"),fixed:"right","header-align":"center"},{default:(0,i.k6)(e=>[(0,i.Lk)("div",Hu,[(0,i.bF)(p,{class:"action-button",size:"small",onClick:t=>l.editToken(e.row)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.editBtn")),1)]),_:1},8,["onClick"]),(0,i.bF)(p,{class:"action-button",size:"small",type:"danger",onClick:t=>l.deleteToken(e.row.id)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.deleteBtn")),1)]),_:1},8,["onClick"])])]),_:1},8,["label"])]),_:1},8,["data"])),[[P,o.tokenLoading]])])]),(0,i.Lk)("div",Xu,[(0,i.Lk)("h3",Ku,(0,n.v_)(t.$t("sysSecurity.uploadManagement")),1),(0,i.Lk)("h4",Yu,[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.imageReview"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.imageReviewTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(c,{model:o.uploadSettings.moderate,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:t.$t("sysSecurity.enableReview")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.uploadSettings.moderate.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>o.uploadSettings.moderate.enabled=t)},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(d,{label:t.$t("sysSecurity.reviewChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(w,{modelValue:o.uploadSettings.moderate.channel,"onUpdate:modelValue":e[9]||(e[9]=t=>o.uploadSettings.moderate.channel=t),placeholder:t.$t("sysSecurity.reviewChannelPlaceholder")},{default:(0,i.k6)(()=>[(0,i.bF)(_,{label:"moderatecontent.com",value:"moderatecontent.com"}),(0,i.bF)(_,{label:"nsfwjs",value:"nsfwjs"})]),_:1},8,["modelValue","placeholder"])]),_:1},8,["label"]),"moderatecontent.com"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(d,{key:0,label:t.$t("sysSecurity.apiKey")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.moderate.moderateContentApiKey,"onUpdate:modelValue":e[10]||(e[10]=t=>o.uploadSettings.moderate.moderateContentApiKey=t)},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0),"nsfwjs"===o.uploadSettings.moderate.channel?((0,i.uX)(),(0,i.Wv)(d,{key:1,label:t.$t("sysSecurity.apiPath")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.uploadSettings.moderate.nsfwApiPath,"onUpdate:modelValue":e[11]||(e[11]=t=>o.uploadSettings.moderate.nsfwApiPath=t),placeholder:"https://nsfwjs.your.domain"},null,8,["modelValue"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.Lk)("div",Qu,[(0,i.Lk)("h3",Gu,(0,n.v_)(t.$t("sysSecurity.accessManagement")),1),(0,i.Lk)("h4",Ju,(0,n.v_)(t.$t("sysSecurity.domainFilter")),1),(0,i.bF)(c,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(d,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.allowedDomains"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.allowedDomainsTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.accessSettings.allowedDomains,"onUpdate:modelValue":e[12]||(e[12]=t=>o.accessSettings.allowedDomains=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h4",Zu,(0,n.v_)(t.$t("sysSecurity.whiteListMode")),1),(0,i.bF)(c,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(d,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.enableWhiteList"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.enableWhiteListTooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.whiteListMode,"onUpdate:modelValue":e[13]||(e[13]=t=>o.accessSettings.whiteListMode=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h4",tp,(0,n.v_)(t.$t("sysSecurity.sessionSecurityPolicy")),1),(0,i.bF)(c,{model:o.accessSettings,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(d,null,{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.secureMode"))+" ",1),(0,i.bF)(y,{content:t.$t("sysSecurity.secureModeTooltip"),placement:"top"},{default:(0,i.k6)(()=>[(0,i.bF)(u,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.accessSettings.sessionSecure,"onUpdate:modelValue":e[14]||(e[14]=t=>o.accessSettings.sessionSecure=t)},null,8,["modelValue"])]),_:1}),(0,i.bF)(d,{label:t.$t("sysSecurity.userSessionMaxAge")},{default:(0,i.k6)(()=>[(0,i.bF)(C,{modelValue:o.accessSettings.userSessionMaxAge,"onUpdate:modelValue":e[15]||(e[15]=t=>o.accessSettings.userSessionMaxAge=t),min:1,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",ep,(0,n.v_)(t.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"]),(0,i.bF)(d,{label:t.$t("sysSecurity.adminSessionMaxAge")},{default:(0,i.k6)(()=>[(0,i.bF)(C,{modelValue:o.accessSettings.adminSessionMaxAge,"onUpdate:modelValue":e[16]||(e[16]=t=>o.accessSettings.adminSessionMaxAge=t),min:1,step:1,precision:0,"controls-position":"right"},null,8,["modelValue"]),(0,i.Lk)("span",sp,(0,n.v_)(t.$t("sysSecurity.sessionMaxAgeUnit")),1)]),_:1},8,["label"])]),_:1},8,["model"])]),(0,i.bF)(S,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"]),(0,i.bF)(T,{modelValue:o.showCreateTokenDialog,"onUpdate:modelValue":e[24]||(e[24]=t=>o.showCreateTokenDialog=t),title:t.$t("sysSecurity.createTokenTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",np,[(0,i.bF)(p,{onClick:e[23]||(e[23]=t=>o.showCreateTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:l.createToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.createBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(c,{model:o.newToken,rules:l.tokenRules,ref:"tokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:t.$t("sysSecurity.tokenNameLabel"),prop:"name"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.newToken.name,"onUpdate:modelValue":e[17]||(e[17]=t=>o.newToken.name=t),placeholder:t.$t("sysSecurity.tokenNamePlaceholder")},null,8,["modelValue","placeholder"])]),_:1},8,["label"]),(0,i.bF)(d,{label:t.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(F,{modelValue:o.newToken.permissions,"onUpdate:modelValue":e[18]||(e[18]=t=>o.newToken.permissions=t)},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(h,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(h,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(h,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(d,{label:t.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.neverExpire,"onUpdate:modelValue":e[19]||(e[19]=t=>o.newToken.neverExpire=t),onChange:l.onCreateNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(d,{key:0,label:t.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ip,[(0,i.bF)(C,{modelValue:o.newToken.expirationValue,"onUpdate:modelValue":e[20]||(e[20]=t=>o.newToken.expirationValue=t),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(w,{modelValue:o.newToken.expirationUnit,"onUpdate:modelValue":e[21]||(e[21]=t=>o.newToken.expirationUnit=t),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.value,label:t.$t(e.labelKey),value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.newToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(d,{key:1,label:t.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.newToken.autoDelete,"onUpdate:modelValue":e[22]||(e[22]=t=>o.newToken.autoDelete=t)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(T,{modelValue:o.showEditTokenDialog,"onUpdate:modelValue":e[32]||(e[32]=t=>o.showEditTokenDialog=t),title:t.$t("sysSecurity.editTokenTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",op,[(0,i.bF)(p,{onClick:e[31]||(e[31]=t=>o.showEditTokenDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("common.cancel")),1)]),_:1}),(0,i.bF)(p,{type:"primary",onClick:l.updateToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.updateBtn")),1)]),_:1},8,["onClick"])])]),default:(0,i.k6)(()=>[(0,i.bF)(c,{model:o.editingToken,rules:l.editTokenRules,ref:"editTokenForm","label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:t.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.editingToken.name,"onUpdate:modelValue":e[25]||(e[25]=t=>o.editingToken.name=t),disabled:""},null,8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(d,{label:t.$t("sysSecurity.permissionsLabel"),prop:"permissions"},{default:(0,i.k6)(()=>[(0,i.bF)(F,{modelValue:o.editingToken.permissions,"onUpdate:modelValue":e[26]||(e[26]=t=>o.editingToken.permissions=t)},{default:(0,i.k6)(()=>[(0,i.bF)(h,{label:"upload"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permUpload")),1)]),_:1}),(0,i.bF)(h,{label:"delete"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permDelete")),1)]),_:1}),(0,i.bF)(h,{label:"list"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permList")),1)]),_:1}),(0,i.bF)(h,{label:"manage"},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.permManage")),1)]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["label"]),(0,i.bF)(d,{label:t.$t("sysSecurity.neverExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.neverExpire,"onUpdate:modelValue":e[27]||(e[27]=t=>o.editingToken.neverExpire=t),onChange:l.onEditNeverExpireChange},null,8,["modelValue","onChange"])]),_:1},8,["label"]),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(d,{key:0,label:t.$t("sysSecurity.validPeriod"),prop:"expirationValue"},{default:(0,i.k6)(()=>[(0,i.Lk)("div",ap,[(0,i.bF)(C,{modelValue:o.editingToken.expirationValue,"onUpdate:modelValue":e[28]||(e[28]=t=>o.editingToken.expirationValue=t),min:1,step:1,"controls-position":"right",style:{flex:"1"}},null,8,["modelValue"]),(0,i.bF)(w,{modelValue:o.editingToken.expirationUnit,"onUpdate:modelValue":e[29]||(e[29]=t=>o.editingToken.expirationUnit=t),style:{width:"100px"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(o.timeUnitOptions,e=>((0,i.uX)(),(0,i.Wv)(_,{key:e.value,label:t.$t(e.labelKey),value:e.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])])]),_:1},8,["label"])),o.editingToken.neverExpire?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.Wv)(d,{key:1,label:t.$t("sysSecurity.autoDeleteOnExpire")},{default:(0,i.k6)(()=>[(0,i.bF)(x,{modelValue:o.editingToken.autoDelete,"onUpdate:modelValue":e[30]||(e[30]=t=>o.editingToken.autoDelete=t)},null,8,["modelValue"])]),_:1},8,["label"]))]),_:1},8,["model","rules"])]),_:1},8,["modelValue","title","width"]),(0,i.bF)(T,{modelValue:o.showTokenResultDialog,"onUpdate:modelValue":e[35]||(e[35]=t=>o.showTokenResultDialog=t),title:t.$t("sysSecurity.tokenCreatedTitle"),width:l.dialogWidth},{footer:(0,i.k6)(()=>[(0,i.Lk)("span",hp,[(0,i.bF)(p,{type:"primary",onClick:e[34]||(e[34]=t=>o.showTokenResultDialog=!1)},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.savedBtn")),1)]),_:1})])]),default:(0,i.k6)(()=>[(0,i.Lk)("div",lp,[(0,i.Lk)("p",rp,[(0,i.bF)(u,{icon:"exclamation-triangle",style:{"margin-right":"5px"}}),(0,i.eW)(" "+(0,n.v_)(t.$t("sysSecurity.tokenCreatedWarning")),1)]),(0,i.bF)(c,{"label-width":"100px"},{default:(0,i.k6)(()=>[(0,i.bF)(d,{label:t.$t("sysSecurity.tokenNameLabel")},{default:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(o.createdToken.name),1)]),_:1},8,["label"]),(0,i.bF)(d,{label:t.$t("sysSecurity.fullToken")},{default:(0,i.k6)(()=>[(0,i.bF)(r,{modelValue:o.createdToken.token,"onUpdate:modelValue":e[33]||(e[33]=t=>o.createdToken.token=t),readonly:""},{append:(0,i.k6)(()=>[(0,i.bF)(p,{onClick:l.copyToken},{default:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(t.$t("sysSecurity.copyBtn")),1)]),_:1},8,["onClick"])]),_:1},8,["modelValue"])]),_:1},8,["label"])]),_:1})])]),_:1},8,["modelValue","title","width"])])),[[P,o.loading]])}s(81148);const cp={s:1e3,m:6e4,h:36e5,d:864e5};function up(t,e,s){if(!Number.isFinite(e)||e<=0)throw new Error("有效期数值必须大于 0");const i="string"===typeof t?new Date(t):new Date(t.getTime());if(cp[s])return new Date(i.getTime()+e*cp[s]).toISOString();if("M"===s)return i.setUTCMonth(i.getUTCMonth()+e),i.toISOString();if("Y"===s)return i.setUTCFullYear(i.getUTCFullYear()+e),i.toISOString();throw new Error(`无效的时间单位: ${s}`)}function pp(t){const e=new Date(t),s=e.getFullYear(),i=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),a=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0"),l=String(e.getSeconds()).padStart(2,"0");return`${s}-${i}-${n} ${a}:${o}:${l}`}function gp(t,e=new Date){if(null===t||void 0===t)return{status:"active",label:"有效",expiresText:"永不过期"};const s=new Date(t),i=e instanceof Date?e:new Date(e),n=pp(t);return i.getTime()>s.getTime()?{status:"expired",label:"已过期",expiresText:n}:{status:"active",label:"有效",expiresText:n}}var fp={components:{FloatingSaveButton:Tu},data(){return{authSettings:{user:{},admin:{}},uploadSettings:{moderate:{}},accessSettings:{},apiTokens:[],loading:!0,tokenLoading:!1,oriUserPassword:"",oriAdminPassword:"",showUserPassConfirm:!1,showAdminPassConfirm:!1,clearUserPassword:!1,clearAdminPassword:!1,showCreateTokenDialog:!1,showEditTokenDialog:!1,showTokenResultDialog:!1,timeUnitOptions:[{labelKey:"sysSecurity.timeUnitSeconds",value:"s"},{labelKey:"sysSecurity.timeUnitMinutes",value:"m"},{labelKey:"sysSecurity.timeUnitHours",value:"h"},{labelKey:"sysSecurity.timeUnitDays",value:"d"},{labelKey:"sysSecurity.timeUnitMonths",value:"M"},{labelKey:"sysSecurity.timeUnitYears",value:"Y"}],newToken:{name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},editingToken:{id:"",name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},createdToken:{name:"",token:""}}},computed:{dialogWidth(){return window.innerWidth>768?"50%":"90%"},userPassRules(){return{authCode:[{validator:(t,e,s)=>{const i=["%","&","?","#","/"],n=i.some(t=>e&&e.includes(t));n?s(new Error(this.$t("sysSecurity.passwordUrlReserved"))):s()},trigger:"blur"}],confirmNewUserPassword:[{validator:(t,e,s)=>{e?e!==this.authSettings.user.authCode?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmUploadPassword")))},trigger:"blur"}]}},adminPassRules(){return{confirmNewAdminPassword:[{validator:(t,e,s)=>{e?e!==this.authSettings.admin.adminPassword?s(new Error(this.$t("sysSecurity.passwordMismatch"))):s():s(new Error(this.$t("sysSecurity.confirmAdminPassword")))},trigger:"blur"}]}},tokenRules(){return{name:[{required:!0,message:this.$t("sysSecurity.tokenNameRequired"),trigger:"blur"}],permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(t,e,s)=>{this.newToken.neverExpire||e&&!(e<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}},editTokenRules(){return{permissions:[{required:!0,message:this.$t("sysSecurity.permissionsRequired"),trigger:"change"}],expirationValue:[{validator:(t,e,s)=>{this.editingToken.neverExpire||e&&!(e<=0)?s():s(new Error(this.$t("sysSecurity.validPeriodRequired")))},trigger:"blur"}]}}},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},handleClearUserPassword(t){t&&(this.authSettings.user.authCode="",this.showUserPassConfirm=!1)},handleClearAdminPassword(t){t&&(this.authSettings.admin.adminPassword="",this.authSettings.admin.adminUsername="",this.showAdminPassConfirm=!1)},getPermissionText(t){const e={upload:this.$t("sysSecurity.permUpload"),delete:this.$t("sysSecurity.permDelete"),list:this.$t("sysSecurity.permList"),manage:this.$t("sysSecurity.permManage")};return e[t]||t},formatDate(t){return new Date(t).toLocaleString("zh-CN")},async loadApiTokens(){this.tokenLoading=!0;try{const t=await(0,Yt.A)("/api/manage/apiTokens"),e=await t.json();this.apiTokens=e.tokens||[]}catch(t){this.$message.error(this.$t("sysSecurity.tokenListFailed"))}finally{this.tokenLoading=!1}},createToken(){this.$refs.tokenForm.validate(async t=>{if(t)try{this.newToken.owner="admin";let t=null,e=!1;this.newToken.neverExpire||(t=up(new Date,this.newToken.expirationValue,this.newToken.expirationUnit),e=this.newToken.autoDelete);const s=await(0,Yt.A)("/api/manage/apiTokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:this.newToken.name,owner:this.newToken.owner,permissions:this.newToken.permissions,expiresAt:t,autoDelete:e})}),i=await s.json();s.ok?(this.createdToken={name:i.name,token:i.token},this.showCreateTokenDialog=!1,this.showTokenResultDialog=!0,this.newToken={name:"",owner:"",permissions:[],neverExpire:!0,expirationValue:1,expirationUnit:"d",autoDelete:!1},await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenCreateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenCreateFailed"))}catch(e){this.$message.error(this.$t("sysSecurity.tokenCreateFailed"))}})},editToken(t){const e=null!==t.expiresAt&&void 0!==t.expiresAt;this.editingToken={id:t.id,name:t.name,owner:t.owner,permissions:[...t.permissions],neverExpire:!e,expirationValue:1,expirationUnit:"d",autoDelete:t.autoDelete||!1},this.showEditTokenDialog=!0},updateToken(){this.$refs.editTokenForm.validate(async t=>{if(t)try{let t=null,e=!1;this.editingToken.neverExpire||(t=up(new Date,this.editingToken.expirationValue,this.editingToken.expirationUnit),e=this.editingToken.autoDelete);const s=await(0,Yt.A)("/api/manage/apiTokens",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({tokenId:this.editingToken.id,permissions:this.editingToken.permissions,expiresAt:t,autoDelete:e})}),i=await s.json();s.ok?(this.showEditTokenDialog=!1,await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenUpdateSuccess"))):this.$message.error(i.error||this.$t("sysSecurity.tokenUpdateFailed"))}catch(e){this.$message.error(this.$t("sysSecurity.tokenUpdateFailed"))}})},async deleteToken(t){try{await this.$confirm(this.$t("sysSecurity.tokenDeleteConfirm"),this.$t("sysSecurity.tokenDeleteConfirmTitle"),{confirmButtonText:this.$t("sysSecurity.tokenDeleteConfirmOk"),cancelButtonText:this.$t("sysSecurity.tokenDeleteConfirmCancel"),type:"warning"});const e=await(0,Yt.A)(`/api/manage/apiTokens?id=${t}`,{method:"DELETE"}),s=await e.json();e.ok?(await this.loadApiTokens(),this.$message.success(this.$t("sysSecurity.tokenDeleteSuccess"))):this.$message.error(s.error||this.$t("sysSecurity.tokenDeleteFailed"))}catch(e){"cancel"!==e&&this.$message.error(this.$t("sysSecurity.tokenDeleteFailed"))}},async copyToken(){try{await navigator.clipboard.writeText(this.createdToken.token),this.$message.success(this.$t("sysSecurity.tokenCopied"))}catch(t){this.$message.error(this.$t("sysSecurity.copyFailed"))}},onCreateNeverExpireChange(t){t&&(this.newToken.autoDelete=!1)},onEditNeverExpireChange(t){t&&(this.editingToken.autoDelete=!1)},getTokenStatus(t){return gp(t)},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;if(this.accessSettings.userSessionMaxAge<1||!Number.isInteger(this.accessSettings.userSessionMaxAge)||this.accessSettings.adminSessionMaxAge<1||!Number.isInteger(this.accessSettings.adminSessionMaxAge))return void this.$message.error(this.$t("sysSecurity.sessionMaxAgeInvalid"));const s={auth:this.authSettings,upload:this.uploadSettings,access:this.accessSettings};delete s.auth.user.confirmNewUserPassword,delete s.auth.admin.confirmNewAdminPassword,this.clearUserPassword&&(s.auth.user._clear=!0,s.auth.user.authCode=""),this.clearAdminPassword&&(s.auth.admin._clear=!0,s.auth.admin.adminPassword=""),(0,Yt.A)("/api/manage/sysConfig/security",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}).then(t=>t.json()).then(t=>{if(t.adminPasswordChanged){const t=this.$t("sysSecurity.adminPasswordChangedRelogin");return this.$message.warning(t),void setTimeout(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")},1500)}this.$message.success(this.$t("sysSecurity.settingsSaved")),this.authSettings.user.authCode="",this.authSettings.admin.adminPassword="",this.oriUserPassword="",this.oriAdminPassword="",s.auth.user.authCode&&!s.auth.user._clear?this.authSettings.user._hasPassword=!0:s.auth.user._clear&&(this.authSettings.user._hasPassword=!1),s.auth.admin.adminPassword&&!s.auth.admin._clear?this.authSettings.admin._hasPassword=!0:s.auth.admin._clear&&(this.authSettings.admin._hasPassword=!1),this.showUserPassConfirm=!1,this.showAdminPassConfirm=!1,this.clearUserPassword=!1,this.clearAdminPassword=!1}).catch(()=>{})})}},mounted(){this.loading=!0,(0,Yt.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.oriAdminPassword="",this.authSettings.user.confirmNewUserPassword="",this.authSettings.admin.confirmNewAdminPassword="",this.loadApiTokens()}).finally(()=>{this.loading=!1})}};const mp=(0,d.A)(fp,[["render",dp],["__scopeId","data-v-2962b112"]]);var bp=mp;const yp={class:"page-settings"},xp={class:"first-title"};function vp(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),h=g.R7,d=dc.P9,c=dc.AV,u=cc.qi,p=hc.WK,f=lc.xE,m=lc.US,b=Tu,y=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",yp,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.groupedSettings,(e,s)=>((0,i.uX)(),(0,i.CE)("div",{key:s,class:"first-settings"},[(0,i.Lk)("h3",xp,(0,n.v_)(s),1),(0,i.bF)(m,{model:o.settings,"label-width":"150px"},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e,(e,s)=>((0,i.uX)(),(0,i.Wv)(f,{key:e.id},{label:(0,i.k6)(()=>[(0,i.eW)((0,n.v_)(l.localized(e,"label"))+" ",1),e.tooltip?((0,i.uX)(),(0,i.Wv)(h,{key:0,content:l.localized(e,"tooltip"),placement:"top","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])):(0,i.Q3)("",!0)]),default:(0,i.k6)(()=>["select"===e.type?((0,i.uX)(),(0,i.Wv)(c,{key:0,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,disabled:e.fixed,placeholder:l.localized(e,"placeholder"),style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.options,t=>((0,i.uX)(),(0,i.Wv)(d,{key:t.value,label:l.localizedOption(t),value:t.value},null,8,["label","value"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"channelName"===e.type?((0,i.uX)(),(0,i.Wv)(c,{key:1,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,disabled:!l.currentUploadChannel||0===l.currentChannelList.length,placeholder:t.$t("sysPage.channelSelectPlaceholder"),clearable:"",style:{width:"100%"}},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.currentChannelList,t=>((0,i.uX)(),(0,i.Wv)(d,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","onUpdate:modelValue","disabled","placeholder"])):"boolean"===e.type?((0,i.uX)(),(0,i.Wv)(u,{key:2,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,disabled:e.fixed},null,8,["modelValue","onUpdate:modelValue","disabled"])):"textarea"===e.type?((0,i.uX)(),(0,i.Wv)(p,{key:3,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,type:"textarea",autosize:{minRows:2},resize:"vertical",disabled:e.fixed,placeholder:l.localized(e,"placeholder")},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"])):((0,i.uX)(),(0,i.Wv)(p,{key:4,modelValue:e.value,"onUpdate:modelValue":t=>e.value=t,disabled:e.fixed,placeholder:l.localized(e,"placeholder")},null,8,["modelValue","onUpdate:modelValue","disabled","placeholder"]))]),_:2},1024))),128))]),_:2},1032,["model"])]))),128)),(0,i.bF)(b,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"])])),[[y,o.loading]])}var _p=s(457),kp={components:{FloatingSaveButton:Tu},data(){return{settings:{config:[]},loading:!0,availableChannels:{}}},computed:{isEn(){return"en"===this.$i18n.locale},groupedSettings(){const t={};return this.settings.config&&this.settings.config.forEach(e=>{const s=this.isEn?e.category_en||e.category||this.$t("sysPage.otherSettings"):e.category||this.$t("sysPage.otherSettings");t[s]||(t[s]=[]),t[s].push(e)}),t},currentUploadChannel(){const t=this.settings.config?.find(t=>"defaultUploadChannel"===t.id);return t?.value||""},currentChannelList(){return this.availableChannels[this.currentUploadChannel]||[]}},watch:{currentUploadChannel(t,e){if(t!==e){const e=this.settings.config?.find(t=>"defaultChannelName"===t.id);if(e){const s=this.availableChannels[t]||[];s.some(t=>t.name===e.value)||(e.value="")}}}},methods:{localized(t,e){return this.isEn&&t[e+"_en"]?t[e+"_en"]:t[e]||""},localizedOption(t){return this.isEn&&t.label_en?t.label_en:t.label},saveSettings(){(0,Yt.A)("/api/manage/sysConfig/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success(this.$t("sysPage.settingsSaved")))},async fetchAvailableChannels(){try{const t=await _p.A.get("/api/channels");t.data&&(this.availableChannels=t.data)}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,this.fetchAvailableChannels(),(0,Yt.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 wp=(0,d.A)(kp,[["render",vp],["__scopeId","data-v-e4c3a742"]]);var Cp=wp;const Sp={class:"others-settings"},Fp={class:"first-settings"},Tp={class:"first-title"},Pp={class:"first-title"},Mp={class:"first-title"},Ap={class:"first-title"},Dp=["innerHTML"],$p={class:"first-title"};function Vp(t,e,s,a,o,l){const r=(0,i.g2)("font-awesome-icon"),h=g.R7,d=cc.qi,c=lc.xE,u=lc.US,p=hc.WK,f=dc.P9,m=dc.AV,b=Tu,y=v.A;return(0,i.bo)(((0,i.uX)(),(0,i.CE)("div",Sp,[(0,i.Lk)("div",Fp,[(0,i.Lk)("h3",Tp,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.remoteTelemetry"))+" ",1),(0,i.bF)(h,{content:t.$t("sysOthers.remoteTelemetryTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.telemetry,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(d,{modelValue:o.settings.telemetry.enabled,"onUpdate:modelValue":e[0]||(e[0]=t=>o.settings.telemetry.enabled=t),disabled:o.settings.telemetry.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"])]),_:1},8,["model"]),(0,i.Lk)("h3",Pp,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.cloudflareApiToken"))+" ",1),(0,i.bF)(h,{content:t.$t("sysOthers.cloudflareApiTokenTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.cloudflareApiToken,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysOthers.zoneId")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_ZONE_ID,"onUpdate:modelValue":e[1]||(e[1]=t=>o.settings.cloudflareApiToken.CF_ZONE_ID=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysOthers.accountEmail")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_EMAIL,"onUpdate:modelValue":e[2]||(e[2]=t=>o.settings.cloudflareApiToken.CF_EMAIL=t),disabled:o.settings.cloudflareApiToken.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:"API Key"},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.cloudflareApiToken.CF_API_KEY,"onUpdate:modelValue":e[3]||(e[3]=t=>o.settings.cloudflareApiToken.CF_API_KEY=t),disabled:o.settings.cloudflareApiToken.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Mp,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.randomImageApi"))+" ",1),(0,i.bF)(h,{content:t.$t("sysOthers.randomImageApiTooltip"),placement:"right"},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.randomImageAPI,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(d,{modelValue:o.settings.randomImageAPI.enabled,"onUpdate:modelValue":e[4]||(e[4]=t=>o.settings.randomImageAPI.enabled=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{prop:"randomImageAPI.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysOthers.directory")),1),(0,i.bF)(h,{content:t.$t("sysOthers.directoryTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.randomImageAPI.allowedDir,"onUpdate:modelValue":e[5]||(e[5]=t=>o.settings.randomImageAPI.allowedDir=t),disabled:o.settings.randomImageAPI.fixed},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",Ap,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.publicBrowse"))+" ",1),(0,i.bF)(h,{content:t.$t("sysOthers.publicBrowseTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.publicBrowse,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(d,{modelValue:o.settings.publicBrowse.enabled,"onUpdate:modelValue":e[6]||(e[6]=t=>o.settings.publicBrowse.enabled=t),disabled:o.settings.publicBrowse.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{prop:"publicBrowse.allowedDir"},{label:(0,i.k6)(()=>[(0,i.Lk)("span",null,(0,n.v_)(t.$t("sysOthers.openDirectory")),1),(0,i.bF)(h,{placement:"right","raw-content":""},{content:(0,i.k6)(()=>[(0,i.Lk)("div",{style:{"max-width":"320px","line-height":"1.6"},innerHTML:t.$t("sysOthers.openDirectoryTooltip")},null,8,Dp)]),default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1})]),default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.publicBrowse.allowedDir,"onUpdate:modelValue":e[7]||(e[7]=t=>o.settings.publicBrowse.allowedDir=t),disabled:o.settings.publicBrowse.fixed,placeholder:"wallpaper,photos,album"},null,8,["modelValue","disabled"])]),_:1})]),_:1},8,["model"]),(0,i.Lk)("h3",$p,[(0,i.eW)((0,n.v_)(t.$t("sysOthers.webdav"))+" ",1),(0,i.bF)(h,{content:t.$t("sysOthers.webdavTooltip"),placement:"right","raw-content":""},{default:(0,i.k6)(()=>[(0,i.bF)(r,{icon:"question-circle",style:{"margin-left":"5px",cursor:"pointer"}})]),_:1},8,["content"])]),(0,i.bF)(u,{model:o.settings.webDAV,"label-width":"120px"},{default:(0,i.k6)(()=>[(0,i.bF)(c,{label:t.$t("sysOthers.enable")},{default:(0,i.k6)(()=>[(0,i.bF)(d,{modelValue:o.settings.webDAV.enabled,"onUpdate:modelValue":e[8]||(e[8]=t=>o.settings.webDAV.enabled=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysOthers.webdavUsername")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.username,"onUpdate:modelValue":e[9]||(e[9]=t=>o.settings.webDAV.username=t),disabled:o.settings.webDAV.fixed},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysOthers.webdavPassword")},{default:(0,i.k6)(()=>[(0,i.bF)(p,{modelValue:o.settings.webDAV.password,"onUpdate:modelValue":e[10]||(e[10]=t=>o.settings.webDAV.password=t),disabled:o.settings.webDAV.fixed,type:"password","show-password":"",autocomplete:"new-password"},null,8,["modelValue","disabled"])]),_:1},8,["label"]),(0,i.bF)(c,{label:t.$t("sysOthers.webdavUploadChannel")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.uploadChannel,"onUpdate:modelValue":e[11]||(e[11]=t=>o.settings.webDAV.uploadChannel=t),disabled:o.settings.webDAV.fixed,placeholder:t.$t("sysOthers.webdavDefaultChannel"),clearable:""},{default:(0,i.k6)(()=>[(0,i.bF)(f,{label:"Telegram",value:"telegram"}),(0,i.bF)(f,{label:"Cloudflare R2",value:"cfr2"}),(0,i.bF)(f,{label:"S3",value:"s3"}),(0,i.bF)(f,{label:"Discord",value:"discord"}),(0,i.bF)(f,{label:"HuggingFace",value:"huggingface"}),(0,i.bF)(f,{label:"WebDAV",value:"webdav"})]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"]),o.settings.webDAV.uploadChannel&&l.webdavChannelList.length>1?((0,i.uX)(),(0,i.Wv)(c,{key:0,label:t.$t("sysOthers.webdavChannelName")},{default:(0,i.k6)(()=>[(0,i.bF)(m,{modelValue:o.settings.webDAV.channelName,"onUpdate:modelValue":e[12]||(e[12]=t=>o.settings.webDAV.channelName=t),disabled:o.settings.webDAV.fixed,placeholder:t.$t("uploadSettings.autoSelect"),clearable:""},{default:(0,i.k6)(()=>[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(l.webdavChannelList,t=>((0,i.uX)(),(0,i.Wv)(f,{key:t.name,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled","placeholder"])]),_:1},8,["label"])):(0,i.Q3)("",!0)]),_:1},8,["model"])]),(0,i.bF)(b,{show:!o.loading,onClick:l.saveSettings},null,8,["show","onClick"])])),[[y,o.loading]])}var Lp={components:{FloatingSaveButton:Tu},data(){return{settings:{telemetry:{},randomImageAPI:{},cloudflareApiToken:{},webDAV:{},publicBrowse:{}},availableChannels:{},loading:!0}},computed:{webdavChannelList(){const t=this.settings.webDAV?.uploadChannel;return t&&this.availableChannels[t]||[]}},watch:{"settings.webDAV.uploadChannel"(){this.settings.webDAV&&(this.settings.webDAV.channelName="")}},methods:{saveSettings(){(0,Yt.A)("/api/manage/sysConfig/others",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.settings)}).then(()=>this.$message.success(this.$t("sysOthers.settingsSaved")))},async fetchAvailableChannels(){try{const t=await(0,Yt.A)("/api/channels");t.ok&&(this.availableChannels=await t.json())}catch(t){console.error("Failed to fetch available channels:",t)}}},mounted(){this.loading=!0,(0,Yt.A)("/api/manage/sysConfig/others").then(t=>t.json()).then(t=>{this.settings=t}).finally(()=>{this.loading=!1}),this.fetchAvailableChannels()}};const Ep=(0,d.A)(Lp,[["render",Vp],["__scopeId","data-v-67b1b002"]]);var Up=Ep,Ip=s(48903),Op={name:"SystemConfig",mixins:[Ip.A],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:nc,SysCogUpload:_u,SysCogSecurity:bp,SysCogPage:Cp,SysCogOthers:Up},computed:{disableTooltip(){return window.innerWidth<768},currentComponent(){const t=this.$route.hash.replace("#","");switch(t){case"status":return nc;case"upload":return _u;case"security":return bp;case"page":return Cp;case"others":return Up;default:return nc}}},methods:{handleLogout(){const t="/api/auth/logout";fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({authType:"admin"})}).finally(()=>{this.$store.commit("setAdminLoggedIn",!1),this.$router.push("/adminLogin")})},setDefaultHash(){const t="#status";window.location.hash=t,this.activeIndex=t.replace("#","")}},mounted(){this.initializeBackground("adminBkImg",".container",!1,!0),window.location.hash||this.setDefaultHash()}};const Rp=(0,d.A)(Op,[["render",x],["__scopeId","data-v-7607b77d"]]);var Wp=Rp},63003:function(t,e,s){s(85331)},64752:function(t,e,s){s(85331),s(38736),s(18785)},70415:function(t,e,s){s(85331),s(73565)},73565:function(t,e,s){s(85331)},91114:function(t,e,s){function i(t){return i="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},i(t)}function n(t,e){if("object"!=i(t)||!t)return t;var s=t[Symbol.toPrimitive];if(void 0!==s){var n=s.call(t,e||"default");if("object"!=i(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"==i(e)?e:e+""}function o(t,e,s){return(e=a(e))in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}s.d(e,{A:function(){return o}})},98642:function(t,e,s){s(85331)}}]); -//# sourceMappingURL=75.75dccc00.js.map \ No newline at end of file diff --git a/frontend-dist/js/75.75dccc00.js.gz b/frontend-dist/js/75.75dccc00.js.gz deleted file mode 100644 index d9049068fb5989151e15ef1251dbd9b8991f25d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94505 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 E0B_Qc8UO$Q diff --git a/frontend-dist/js/75.75dccc00.js.map b/frontend-dist/js/75.75dccc00.js.map deleted file mode 100644 index 42541a4f..00000000 --- a/frontend-dist/js/75.75dccc00.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"js/75.75dccc00.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue?54ab","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue","webpack://sanyue_imghub/./src/components/config/SysConfigTabs.vue?cf73","webpack://sanyue_imghub/./src/views/SystemConfig.vue?c088","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue?7cb2","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/utils/batchProcessor.js","webpack://sanyue_imghub/./src/utils/indexRebuilder.js","webpack://sanyue_imghub/./src/utils/backupGenerator.js","webpack://sanyue_imghub/./src/utils/restoreProcessor.js","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue","webpack://sanyue_imghub/./src/components/config/SysCogStatus.vue?ce78","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue?8ff0","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue","webpack://sanyue_imghub/./src/components/config/CustomSelect.vue?1e7e","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue?49b5","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue","webpack://sanyue_imghub/./src/components/config/SysCogUpload.vue?a7b6","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?6295","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue","webpack://sanyue_imghub/./src/components/FloatingSaveButton.vue?45e6","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue?0b47","webpack://sanyue_imghub/./src/utils/tokenExpiration.js","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue","webpack://sanyue_imghub/./src/components/config/SysCogSecurity.vue?3739","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue?0bc4","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue","webpack://sanyue_imghub/./src/components/config/SysCogPage.vue?4209","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue?5501","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue","webpack://sanyue_imghub/./src/components/config/SysCogOthers.vue?780f","webpack://sanyue_imghub/./src/views/SystemConfig.vue","webpack://sanyue_imghub/./src/views/SystemConfig.vue?d269","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"],"sourcesContent":["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, normalizeStyle as _normalizeStyle } 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 ref: \"sidebar\",\n style: _normalizeStyle($options.sidebarStyle)\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(_ctx.$t(item.titleKey)), 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\"])])], 6);\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 expandedWidth: null,\n menuItems: [{\n index: 'status',\n icon: 'chart-bar',\n titleKey: 'sysConfigTabs.systemStatus'\n }, {\n index: 'upload',\n icon: 'cloud-upload',\n titleKey: 'sysConfigTabs.uploadSettings'\n }, {\n index: 'security',\n icon: 'shield',\n titleKey: 'sysConfigTabs.securitySettings'\n }, {\n index: 'page',\n icon: 'pager',\n titleKey: 'sysConfigTabs.pageSettings'\n }, {\n index: 'others',\n icon: 'cog',\n titleKey: 'sysConfigTabs.otherSettings'\n }]\n };\n },\n computed: {\n collapsedWidth() {\n return window.innerWidth <= 768 ? 50 : 56;\n },\n sidebarStyle() {\n if (this.isCollapse) {\n return {\n width: this.collapsedWidth + 'px'\n };\n }\n return this.expandedWidth ? {\n width: this.expandedWidth + 'px'\n } : {};\n }\n },\n watch: {\n '$i18n.locale'() {\n this.$nextTick(() => this.measureWidth());\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 measureWidth() {\n const el = this.$refs.sidebar;\n if (!el) return;\n // Temporarily expand to measure natural content width\n const prevWidth = el.style.width;\n const prevTransition = el.style.transition;\n const wasCollapsed = el.classList.contains('is-collapsed');\n el.style.transition = 'none';\n if (wasCollapsed) {\n el.classList.remove('is-collapsed');\n }\n el.style.width = 'auto';\n // Force reflow to apply changes\n void el.offsetWidth;\n const natural = el.scrollWidth;\n // Restore original state\n el.style.width = prevWidth;\n if (wasCollapsed) {\n el.classList.add('is-collapsed');\n }\n void el.offsetWidth;\n el.style.transition = prevTransition;\n this.expandedWidth = natural;\n }\n },\n mounted() {\n this.checkMobile();\n this.$nextTick(() => this.measureWidth());\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=2718059d&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=2718059d&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-2718059d\"]])\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: _ctx.$t('sysConfig.logout'),\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\", \"content\"])])])]),\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-title\"\n};\nconst _hoisted_6 = {\n class: \"card-value\"\n};\nconst _hoisted_7 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_8 = {\n class: \"overview-card index-status\"\n};\nconst _hoisted_9 = {\n class: \"card-icon\"\n};\nconst _hoisted_10 = {\n class: \"card-content\"\n};\nconst _hoisted_11 = {\n class: \"card-title\"\n};\nconst _hoisted_12 = {\n class: \"card-value\"\n};\nconst _hoisted_13 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_14 = {\n class: \"card-icon\"\n};\nconst _hoisted_15 = {\n class: \"card-content\"\n};\nconst _hoisted_16 = {\n class: \"card-title\"\n};\nconst _hoisted_17 = {\n class: \"card-value\"\n};\nconst _hoisted_18 = {\n class: \"card-subtitle\"\n};\nconst _hoisted_19 = {\n class: \"charts-section\"\n};\nconst _hoisted_20 = {\n class: \"chart-card\"\n};\nconst _hoisted_21 = {\n class: \"chart-header\"\n};\nconst _hoisted_22 = {\n class: \"chart-content\"\n};\nconst _hoisted_23 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_24 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_25 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_26 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_27 = {\n class: \"center-value\"\n};\nconst _hoisted_28 = {\n class: \"center-label\"\n};\nconst _hoisted_29 = {\n class: \"chart-legend\"\n};\nconst _hoisted_30 = {\n class: \"legend-label\"\n};\nconst _hoisted_31 = {\n class: \"legend-value\"\n};\nconst _hoisted_32 = {\n class: \"legend-percent\"\n};\nconst _hoisted_33 = {\n class: \"chart-card\"\n};\nconst _hoisted_34 = {\n class: \"chart-header\"\n};\nconst _hoisted_35 = {\n class: \"chart-content\"\n};\nconst _hoisted_36 = {\n key: 0,\n class: \"empty-state\"\n};\nconst _hoisted_37 = {\n key: 1,\n class: \"pie-chart-container\"\n};\nconst _hoisted_38 = {\n class: \"pie-chart-wrapper\"\n};\nconst _hoisted_39 = {\n class: \"chart-center-text\"\n};\nconst _hoisted_40 = {\n class: \"center-value\"\n};\nconst _hoisted_41 = {\n class: \"center-label\"\n};\nconst _hoisted_42 = {\n class: \"chart-legend\"\n};\nconst _hoisted_43 = {\n class: \"legend-label\"\n};\nconst _hoisted_44 = {\n class: \"legend-value\"\n};\nconst _hoisted_45 = {\n class: \"legend-percent\"\n};\nconst _hoisted_46 = {\n class: \"actions-section\"\n};\nconst _hoisted_47 = {\n class: \"action-card\"\n};\nconst _hoisted_48 = {\n class: \"action-header\"\n};\nconst _hoisted_49 = {\n class: \"action-content\"\n};\nconst _hoisted_50 = {\n key: 0,\n class: \"progress-container\"\n};\nconst _hoisted_51 = {\n class: \"progress-header\"\n};\nconst _hoisted_52 = {\n class: \"progress-phase\"\n};\nconst _hoisted_53 = {\n class: \"progress-percentage\"\n};\nconst _hoisted_54 = {\n class: \"progress-details\"\n};\nconst _hoisted_55 = {\n key: 0,\n class: \"progress-count\"\n};\nconst _hoisted_56 = {\n key: 1,\n class: \"progress-time\"\n};\nconst _hoisted_57 = {\n key: 0,\n class: \"progress-message\"\n};\nconst _hoisted_58 = {\n key: 1,\n class: \"error-container\"\n};\nconst _hoisted_59 = {\n class: \"error-icon\"\n};\nconst _hoisted_60 = {\n class: \"error-content\"\n};\nconst _hoisted_61 = {\n class: \"error-message\"\n};\nconst _hoisted_62 = {\n key: 0,\n class: \"error-suggestion\"\n};\nconst _hoisted_63 = {\n class: \"error-actions\"\n};\nconst _hoisted_64 = {\n key: 2,\n class: \"action-buttons\"\n};\nconst _hoisted_65 = {\n class: \"restore-section\"\n};\nconst _hoisted_66 = {\n key: 0,\n class: \"file-info-section\"\n};\nconst _hoisted_67 = [\"src\"];\nconst _hoisted_68 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_69 = {\n class: \"file-card-header\"\n};\nconst _hoisted_70 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_71 = {\n class: \"file-name\"\n};\nconst _hoisted_72 = {\n class: \"file-meta\"\n};\nconst _hoisted_73 = [\"src\"];\nconst _hoisted_74 = {\n key: 2,\n class: \"card-bg-fallback\"\n};\nconst _hoisted_75 = {\n class: \"file-card-header warning\"\n};\nconst _hoisted_76 = {\n class: \"info-card-footer\"\n};\nconst _hoisted_77 = {\n class: \"file-name\"\n};\nconst _hoisted_78 = {\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_progress = _resolveComponent(\"el-progress\");\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, [_createElementVNode(\"div\", _hoisted_5, _toDisplayString(_ctx.$t('sysStatus.totalFiles')), 1), _createElementVNode(\"div\", _hoisted_6, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_7, _toDisplayString(_ctx.$t('sysStatus.clickToRefresh')), 1)])]), _createElementVNode(\"div\", _hoisted_8, [_createElementVNode(\"div\", _hoisted_9, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n })]), _createElementVNode(\"div\", _hoisted_10, [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(_ctx.$t('sysStatus.indexUpdateTime')), 1), _createElementVNode(\"div\", _hoisted_12, _toDisplayString($options.formatTime($data.indexInfo.lastUpdated)), 1), _createElementVNode(\"div\", _hoisted_13, _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_14, [_createVNode(_component_font_awesome_icon, {\n icon: \"code-branch\"\n })]), _createElementVNode(\"div\", _hoisted_15, [_createElementVNode(\"div\", _hoisted_16, _toDisplayString(_ctx.$t('sysStatus.systemVersion')), 1), _createElementVNode(\"div\", _hoisted_17, \"v\" + _toDisplayString($data.version), 1), _createElementVNode(\"div\", _hoisted_18, _toDisplayString(_ctx.$t('sysStatus.clickToViewChangelog')), 1)])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"div\", _hoisted_20, [_createElementVNode(\"div\", _hoisted_21, [_createVNode(_component_font_awesome_icon, {\n icon: \"share-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.channelDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_22, [Object.keys($data.indexInfo.channelStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_23, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_24, [_createElementVNode(\"div\", _hoisted_25, [_createVNode(_component_Doughnut, {\n data: $options.channelChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_26, [_createElementVNode(\"div\", _hoisted_27, _toDisplayString($data.indexInfo.totalFiles?.toLocaleString() || '0'), 1), _createElementVNode(\"div\", _hoisted_28, _toDisplayString(_ctx.$t('sysStatus.totalFilesLabel')), 1)])]), _createElementVNode(\"div\", _hoisted_29, [(_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_30, _toDisplayString(channel), 1), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_32, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])]), _createElementVNode(\"div\", _hoisted_33, [_createElementVNode(\"div\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.fileStatusDistribution')), 1)]), _createElementVNode(\"div\", _hoisted_35, [Object.keys($data.indexInfo.typeStats || {}).length === 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_36, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.noData')), 1)])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_37, [_createElementVNode(\"div\", _hoisted_38, [_createVNode(_component_Doughnut, {\n data: $options.typeChartData,\n options: $options.chartOptions\n }, null, 8, [\"data\", \"options\"]), _createElementVNode(\"div\", _hoisted_39, [_createElementVNode(\"div\", _hoisted_40, _toDisplayString(Object.keys($data.indexInfo.typeStats).length), 1), _createElementVNode(\"div\", _hoisted_41, _toDisplayString(_ctx.$t('sysStatus.statusTypes')), 1)])]), _createElementVNode(\"div\", _hoisted_42, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.aggregatedTypeStats, (count, status, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: status,\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_43, _toDisplayString(status), 1), _createElementVNode(\"span\", _hoisted_44, _toDisplayString(count.toLocaleString()), 1), _createElementVNode(\"span\", _hoisted_45, _toDisplayString($options.getPercentage(count, $data.indexInfo.totalFiles)) + \"%\", 1)]);\n }), 128))])]))])])]), _createElementVNode(\"div\", _hoisted_46, [_createElementVNode(\"div\", _hoisted_47, [_createElementVNode(\"div\", _hoisted_48, [_createVNode(_component_font_awesome_icon, {\n icon: \"tools\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.systemMaintenance')), 1)]), _createElementVNode(\"div\", _hoisted_49, [$data.isProcessing ? (_openBlock(), _createElementBlock(\"div\", _hoisted_50, [_createElementVNode(\"div\", _hoisted_51, [_createElementVNode(\"span\", _hoisted_52, _toDisplayString($options.phaseDescription), 1), _createElementVNode(\"span\", _hoisted_53, _toDisplayString(Math.round($data.processingProgress.percentage)) + \"%\", 1)]), _createVNode(_component_el_progress, {\n percentage: $data.processingProgress.percentage,\n \"stroke-width\": 12,\n \"show-text\": false,\n class: \"progress-bar\"\n }, null, 8, [\"percentage\"]), _createElementVNode(\"div\", _hoisted_54, [$data.processingProgress.current > 0 ? (_openBlock(), _createElementBlock(\"span\", _hoisted_55, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\"\n }), _createTextVNode(\" \" + _toDisplayString($data.processingProgress.current.toLocaleString()) + \" \", 1), $data.processingProgress.total > 0 ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createTextVNode(\" / \" + _toDisplayString($data.processingProgress.total.toLocaleString()), 1)], 64)) : _createCommentVNode(\"\", true), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.records')), 1)])) : _createCommentVNode(\"\", true), $options.estimatedTimeRemaining ? (_openBlock(), _createElementBlock(\"span\", _hoisted_56, [_createVNode(_component_font_awesome_icon, {\n icon: \"clock\"\n }), _createTextVNode(\" \" + _toDisplayString($options.estimatedTimeRemaining), 1)])) : _createCommentVNode(\"\", true)]), $data.processingProgress.message ? (_openBlock(), _createElementBlock(\"div\", _hoisted_57, _toDisplayString($data.processingProgress.message), 1)) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"danger\",\n plain: \"\",\n size: \"small\",\n onClick: $options.cancelOperation,\n class: \"cancel-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"times\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.cancelOperation')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])) : $data.processingError ? (_openBlock(), _createElementBlock(\"div\", _hoisted_58, [_createElementVNode(\"div\", _hoisted_59, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\"\n })]), _createElementVNode(\"div\", _hoisted_60, [_createElementVNode(\"div\", _hoisted_61, _toDisplayString($data.processingError.message), 1), $data.processingError.suggestion ? (_openBlock(), _createElementBlock(\"div\", _hoisted_62, _toDisplayString($data.processingError.suggestion), 1)) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_63, [$data.processingError.recoverable ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n size: \"small\",\n onClick: $options.retryOperation\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"redo\"\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysStatus.retry')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true), _createVNode(_component_el_button, {\n type: \"default\",\n size: \"small\",\n onClick: $options.dismissError\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysStatus.close')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_64, [_createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.rebuildTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"primary\",\n loading: $data.rebuilding,\n disabled: $data.isProcessing,\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 ? _ctx.$t('sysStatus.rebuilding') : _ctx.$t('sysStatus.rebuildIndex')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.backupTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_button, {\n type: \"success\",\n loading: $data.backing,\n disabled: $data.isProcessing,\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 ? _ctx.$t('sysStatus.backingUp') : _ctx.$t('sysStatus.backupData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])]),\n _: 1\n }, 8, [\"content\"]), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysStatus.restoreTooltip'),\n placement: \"top\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_65, [_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 disabled: $data.isProcessing,\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 ? _ctx.$t('sysStatus.restoring') : _ctx.$t('sysStatus.restoreData')), 1)]),\n _: 1\n }, 8, [\"loading\", \"disabled\", \"onClick\"])])]),\n _: 1\n }, 8, [\"content\"])]))])])]), $data.indexInfo.newestFile || $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", _hoisted_66, [$data.indexInfo.newestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 0,\n class: \"file-info-card info-card-newest\",\n onClick: _cache[5] || (_cache[5] = $event => $options.openFileInNewTab($data.indexInfo.newestFile))\n }, [$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_67)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_68, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_69, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-up\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.latestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_70, [_createElementVNode(\"div\", _hoisted_71, _toDisplayString($data.indexInfo.newestFile.metadata?.FileName || $data.indexInfo.newestFile.id), 1), _createElementVNode(\"div\", _hoisted_72, _toDisplayString($options.formatTime($data.indexInfo.newestFile.metadata?.TimeStamp)), 1)])])) : _createCommentVNode(\"\", true), $data.indexInfo.oldestFile ? (_openBlock(), _createElementBlock(\"div\", {\n key: 1,\n class: \"file-info-card info-card-oldest\",\n onClick: _cache[8] || (_cache[8] = $event => $options.openFileInNewTab($data.indexInfo.oldestFile))\n }, [$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[6] || (_cache[6] = $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[7] || (_cache[7] = $event => $options.handleImageError('oldest'))\n }, null, 40, _hoisted_73)) : (_openBlock(), _createElementBlock(\"div\", _hoisted_74, [_createVNode(_component_font_awesome_icon, {\n icon: \"file-alt\",\n class: \"fallback-icon\"\n })])), _createElementVNode(\"div\", _hoisted_75, [_createVNode(_component_font_awesome_icon, {\n icon: \"arrow-down\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysStatus.earliestUpload')), 1)]), _createElementVNode(\"div\", _hoisted_76, [_createElementVNode(\"div\", _hoisted_77, _toDisplayString($data.indexInfo.oldestFile.metadata?.FileName || $data.indexInfo.oldestFile.id), 1), _createElementVNode(\"div\", _hoisted_78, _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","/**\r\n * BatchProcessor - 批量数据处理类\r\n * \r\n * 处理批量数据获取和处理的核心类,使用 cursor 分页机制获取所有数据。\r\n * 支持进度回调和取消功能。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\n\r\n/**\r\n * 批量操作错误类\r\n * 提供错误代码、是否可恢复、建议操作等信息\r\n */\r\nexport class BatchOperationError extends Error {\r\n constructor(message, code, recoverable = false, suggestion = '') {\r\n super(message);\r\n this.name = 'BatchOperationError';\r\n this.code = code;\r\n this.recoverable = recoverable;\r\n this.suggestion = suggestion;\r\n }\r\n}\r\n\r\n/**\r\n * 错误处理器映射\r\n * 根据 HTTP 状态码返回对应的错误对象\r\n */\r\nconst ERROR_HANDLERS = {\r\n 401: () => new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n ),\r\n 403: () => new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n ),\r\n 400: (details) => new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n ),\r\n 500: () => new BatchOperationError(\r\n '服务器内部错误',\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试,如果问题持续请联系管理员'\r\n ),\r\n NETWORK: () => new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n ),\r\n ABORT: () => new BatchOperationError(\r\n '操作已取消',\r\n 'ABORTED',\r\n false,\r\n ''\r\n )\r\n};\r\n\r\n/**\r\n * 根据错误创建 BatchOperationError\r\n * @param {Error|Response} error - 原始错误或响应对象\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\nfunction createError(error, details = '') {\r\n // 处理取消操作\r\n if (error.name === 'AbortError') {\r\n return ERROR_HANDLERS.ABORT();\r\n }\r\n \r\n // 处理 HTTP 响应错误\r\n if (error instanceof Response || (error && typeof error.status === 'number')) {\r\n const handler = ERROR_HANDLERS[error.status];\r\n if (handler) {\r\n return handler(details);\r\n }\r\n return new BatchOperationError(\r\n `请求失败: ${error.status}`,\r\n 'HTTP_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n \r\n // 处理网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n return ERROR_HANDLERS.NETWORK();\r\n }\r\n \r\n // 其他错误\r\n return new BatchOperationError(\r\n error.message || '未知错误',\r\n 'UNKNOWN_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n}\r\n\r\n/**\r\n * BatchProcessor 类\r\n * \r\n * 用于批量获取和处理数据的核心类\r\n */\r\nclass BatchProcessor {\r\n /**\r\n * 创建 BatchProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.batchSize - 每批数据量,默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.batchSize = options.batchSize || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.abortController = null;\r\n }\r\n\r\n /**\r\n * 获取所有数据记录\r\n * 使用 cursor 分页机制循环获取所有数据,直到没有更多数据或操作被取消\r\n * \r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 所有记录的数组\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async fetchAllRecords(includeValue = false) {\r\n // 创建新的 AbortController 用于取消操作\r\n this.abortController = new AbortController();\r\n const allRecords = [];\r\n let cursor = null;\r\n let totalFetched = 0;\r\n let batchCount = 0;\r\n\r\n try {\r\n do {\r\n // 检查是否已取消\r\n if (this.abortController.signal.aborted) {\r\n break;\r\n }\r\n\r\n // 获取一批数据\r\n const response = await this.fetchBatch(cursor, includeValue);\r\n \r\n // 合并数据到总数组\r\n allRecords.push(...response.records);\r\n cursor = response.nextCursor;\r\n totalFetched += response.records.length;\r\n batchCount++;\r\n\r\n // 调用进度回调\r\n this.onProgress({\r\n phase: 'fetching',\r\n current: totalFetched,\r\n batchCount: batchCount,\r\n message: `已获取 ${totalFetched} 条记录...`\r\n });\r\n\r\n } while (cursor && !this.abortController.signal.aborted);\r\n\r\n // 如果是因为取消而退出循环,抛出取消错误\r\n if (this.abortController.signal.aborted) {\r\n throw ERROR_HANDLERS.ABORT();\r\n }\r\n\r\n return allRecords;\r\n } catch (error) {\r\n // 调用错误回调\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : createError(error);\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 获取单批数据\r\n * \r\n * @param {string|null} cursor - 分页游标,首次请求为 null\r\n * @param {boolean} includeValue - 是否包含分块文件的 value 数据\r\n * @returns {Promise} 包含 records 和 nextCursor 的响应对象\r\n * @throws {BatchOperationError} 当请求失败时抛出\r\n */\r\n async fetchBatch(cursor, includeValue) {\r\n // 构建查询参数\r\n const params = new URLSearchParams();\r\n if (cursor) {\r\n params.set('cursor', cursor);\r\n }\r\n if (includeValue) {\r\n params.set('includeValue', 'true');\r\n }\r\n params.set('limit', String(this.batchSize));\r\n\r\n try {\r\n // 发送请求,传入 abort signal 支持取消\r\n const response = await fetchWithAuth(\r\n `/api/manage/batch/list?${params}`,\r\n { signal: this.abortController.signal }\r\n );\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw createError(response, errorDetails);\r\n }\r\n\r\n // 解析响应数据\r\n const data = await response.json();\r\n \r\n // 验证响应格式\r\n if (!data.success) {\r\n throw new BatchOperationError(\r\n data.error || '请求失败',\r\n 'API_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return {\r\n records: data.records || [],\r\n nextCursor: data.nextCursor || null,\r\n totalProcessed: data.totalProcessed || 0\r\n };\r\n } catch (error) {\r\n // 如果已经是 BatchOperationError,直接抛出\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 否则转换为 BatchOperationError\r\n throw createError(error);\r\n }\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n * 调用此方法将中止正在进行的 fetch 请求\r\n */\r\n abort() {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.abortController ? this.abortController.signal.aborted : false;\r\n }\r\n\r\n /**\r\n * 重置处理器状态\r\n * 在开始新的批量操作前调用\r\n */\r\n reset() {\r\n this.abortController = null;\r\n }\r\n}\r\n\r\nexport default BatchProcessor;\r\n","/**\r\n * IndexRebuilder - 索引重建类\r\n * \r\n * 处理索引重建的完整流程,包括数据获取、排序、分块上传和完成。\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport BatchProcessor, { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * IndexRebuilder 类\r\n * \r\n * 用于重建索引的核心类,协调数据获取、排序和分块上传\r\n */\r\nclass IndexRebuilder {\r\n /**\r\n * 创建 IndexRebuilder 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每个分块的记录数,默认从后端获取\r\n * @param {number} options.maxRetries - 分块上传最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || null; // 从后端获取\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.sessionId = this.generateSessionId();\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 从后端获取索引配置(分块大小等)\r\n * @returns {Promise} 配置对象 { chunkSize, databaseType }\r\n */\r\n async fetchConfig() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/config');\r\n if (!response.ok) {\r\n throw new Error('获取配置失败');\r\n }\r\n const result = await response.json();\r\n if (result.success) {\r\n return {\r\n chunkSize: result.chunkSize || 500,\r\n databaseType: result.databaseType || 'unknown'\r\n };\r\n }\r\n throw new Error(result.error || '获取配置失败');\r\n } catch (error) {\r\n // 获取失败时使用保守的默认值(兼容 D1)\r\n console.warn('Failed to fetch index config, using default:', error);\r\n return { chunkSize: 500, databaseType: 'unknown' };\r\n }\r\n }\r\n\r\n /**\r\n * 执行索引重建\r\n * \r\n * 完整流程:\r\n * 1. 获取配置(分块大小)\r\n * 2. 获取所有记录\r\n * 3. 按时间戳降序排序\r\n * 4. 分块上传\r\n * 5. 完成重建\r\n * \r\n * @returns {Promise} 重建结果 { success: boolean, totalFiles: number }\r\n * @throws {BatchOperationError} 当发生错误时抛出\r\n */\r\n async rebuild() {\r\n this.aborted = false;\r\n \r\n try {\r\n // 获取配置(分块大小)\r\n if (!this.chunkSize) {\r\n const config = await this.fetchConfig();\r\n this.chunkSize = config.chunkSize;\r\n }\r\n\r\n // 获取所有记录\r\n this.onProgress({ \r\n phase: 'fetching', \r\n message: '正在获取数据...',\r\n current: 0\r\n });\r\n \r\n const processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' }),\r\n onError: (e) => this.onError(e)\r\n });\r\n \r\n const records = await processor.fetchAllRecords(false);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 排序(按时间戳降序)\r\n this.onProgress({ \r\n phase: 'sorting', \r\n message: '正在排序...',\r\n current: 0,\r\n total: records.length\r\n });\r\n \r\n this.sortByTimestampDescending(records);\r\n \r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n // 分块上传\r\n const chunks = this.splitIntoChunks(records);\r\n \r\n for (let i = 0; i < chunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n \r\n // 使用重试机制上传分块\r\n await this.uploadChunkWithRetry(chunks[i], i);\r\n \r\n this.onProgress({\r\n phase: 'uploading',\r\n current: i + 1,\r\n total: chunks.length,\r\n message: `正在上传分块 ${i + 1}/${chunks.length}...`\r\n });\r\n }\r\n\r\n // 完成重建\r\n this.onProgress({ \r\n phase: 'finalizing', \r\n message: '正在完成重建...',\r\n current: chunks.length,\r\n total: chunks.length\r\n });\r\n \r\n await this.finalize(chunks.length, records.length);\r\n\r\n this.onProgress({\r\n phase: 'completed',\r\n message: `索引重建完成,共 ${records.length} 个文件`,\r\n current: records.length,\r\n total: records.length\r\n });\r\n\r\n return { success: true, totalFiles: records.length };\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError \r\n ? error \r\n : new BatchOperationError(\r\n error.message || '索引重建失败',\r\n 'REBUILD_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 按时间戳降序排序记录\r\n * \r\n * @param {Array} records - 要排序的记录数组(原地排序)\r\n */\r\n sortByTimestampDescending(records) {\r\n records.sort((a, b) => {\r\n const timestampA = (a.metadata && a.metadata.TimeStamp) || 0;\r\n const timestampB = (b.metadata && b.metadata.TimeStamp) || 0;\r\n return timestampB - timestampA;\r\n });\r\n }\r\n\r\n /**\r\n * 将记录分割为多个块\r\n * \r\n * @param {Array} records - 要分割的记录数组\r\n * @returns {Array} 分块后的二维数组\r\n */\r\n splitIntoChunks(records) {\r\n const chunks = [];\r\n for (let i = 0; i < records.length; i += this.chunkSize) {\r\n chunks.push(records.slice(i, i + this.chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当所有重试都失败时抛出\r\n */\r\n async uploadChunkWithRetry(chunk, chunkId) {\r\n let lastError;\r\n \r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(chunk, chunkId);\r\n } catch (error) {\r\n lastError = error;\r\n \r\n // 不重试的错误类型\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' || \r\n error.code === 'FORBIDDEN' || \r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n \r\n // 如果还有重试机会,等待后重试\r\n if (attempt < this.maxRetries) {\r\n // 指数退避\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n \r\n this.onProgress({\r\n phase: 'retrying',\r\n message: `分块 ${chunkId + 1} 上传失败,正在重试 (${attempt}/${this.maxRetries})...`,\r\n current: chunkId,\r\n attempt: attempt\r\n });\r\n }\r\n }\r\n }\r\n \r\n // 所有重试都失败\r\n throw lastError instanceof BatchOperationError \r\n ? lastError \r\n : new BatchOperationError(\r\n `分块 ${chunkId + 1} 上传失败,已重试 ${this.maxRetries} 次`,\r\n 'CHUNK_UPLOAD_FAILED',\r\n false,\r\n '请检查网络连接后重新开始重建'\r\n );\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n * \r\n * @param {Array} chunk - 要上传的分块数据\r\n * @param {number} chunkId - 分块 ID\r\n * @returns {Promise} 上传响应\r\n * @throws {BatchOperationError} 当上传失败时抛出\r\n */\r\n async uploadChunk(chunk, chunkId) {\r\n const checksum = await this.calculateChecksum(chunk);\r\n \r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n chunkId: String(chunkId),\r\n sessionId: this.sessionId,\r\n data: chunk,\r\n checksum\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n // 网络错误\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '分块上传失败',\r\n 'CHUNK_UPLOAD_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 完成索引重建\r\n * \r\n * @param {number} totalChunks - 总分块数\r\n * @param {number} totalFiles - 总文件数\r\n * @returns {Promise} 完成响应\r\n * @throws {BatchOperationError} 当完成请求失败时抛出\r\n */\r\n async finalize(totalChunks, totalFiles) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/index/finalize', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n sessionId: this.sessionId,\r\n totalChunks,\r\n totalFiles\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n \r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n throw new BatchOperationError(\r\n error.message || '索引完成失败',\r\n 'FINALIZE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 生成唯一的会话 ID\r\n * \r\n * @returns {string} 会话 ID\r\n */\r\n generateSessionId() {\r\n return `rebuild_${Date.now()}_${Math.random().toString(36).slice(2)}`;\r\n }\r\n\r\n /**\r\n * 计算数据的 SHA-256 校验和\r\n * \r\n * @param {Array} data - 要计算校验和的数据\r\n * @returns {Promise} 十六进制格式的校验和\r\n */\r\n async calculateChecksum(data) {\r\n const text = JSON.stringify(data);\r\n const encoder = new TextEncoder();\r\n const dataBuffer = encoder.encode(text);\r\n\r\n // crypto.subtle 仅在安全上下文(HTTPS / localhost)下可用\r\n // 通过 0.0.0.0 等非安全上下文访问时需要 fallback\r\n if (typeof crypto !== 'undefined' && crypto.subtle) {\r\n const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n // Fallback: 简单但足够用于校验的哈希实现 (FNV-1a 变体, 产生 64 位十六进制)\r\n let h1 = 0x811c9dc5 >>> 0;\r\n let h2 = 0x811c9dc5 >>> 0;\r\n for (let i = 0; i < dataBuffer.length; i++) {\r\n h1 = Math.imul(h1 ^ dataBuffer[i], 0x01000193) >>> 0;\r\n h2 = Math.imul(h2 ^ dataBuffer[i], 0x01000193 + 0x10) >>> 0;\r\n }\r\n return h1.toString(16).padStart(8, '0') + h2.toString(16).padStart(8, '0');\r\n }\r\n\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n * \r\n * @param {number} status - HTTP 状态码\r\n * @param {string} details - 错误详情\r\n * @returns {BatchOperationError}\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查数据格式后重试'\r\n );\r\n case 404:\r\n return new BatchOperationError(\r\n '会话不存在',\r\n 'SESSION_NOT_FOUND',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 410:\r\n return new BatchOperationError(\r\n '会话已过期',\r\n 'SESSION_EXPIRED',\r\n false,\r\n '请重新开始索引重建'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n * \r\n * @param {number} ms - 延迟毫秒数\r\n * @returns {Promise}\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n\r\n /**\r\n * 重置重建器状态\r\n * 在开始新的重建操作前调用\r\n */\r\n reset() {\r\n this.aborted = false;\r\n this.sessionId = this.generateSessionId();\r\n }\r\n}\r\n\r\nexport default IndexRebuilder;\r\n","/**\r\n * BackupGenerator - 备份数据生成类\r\n * \r\n * 处理前端辅助备份功能,获取所有文件记录(包含分块文件的 value),\r\n * 构建完整的备份 JSON 文件,并触发浏览器下载。\r\n */\r\n\r\nimport BatchProcessor from '@/utils/batchProcessor';\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport packageInfo from '../../package.json'\r\n\r\n/**\r\n * BackupGenerator 类\r\n * \r\n * 用于生成和下载备份数据的类\r\n */\r\nclass BackupGenerator {\r\n /**\r\n * 创建 BackupGenerator 实例\r\n * @param {Object} options - 配置选项\r\n * @param {Function} options.onProgress - 进度回调函数\r\n */\r\n constructor(options = {}) {\r\n this.onProgress = options.onProgress || (() => {});\r\n this.processor = null;\r\n }\r\n\r\n /**\r\n * 生成并下载备份\r\n * \r\n * 完整流程:\r\n * 1. 获取所有文件记录(包含分块文件的 value)\r\n * 2. 构建备份数据结构\r\n * 3. 获取系统设置\r\n * 4. 生成并触发下载\r\n * \r\n * @returns {Promise} 包含 success 和 fileCount 的结果对象\r\n * @throws {Error} 当备份过程中发生错误时抛出\r\n */\r\n async generateBackup() {\r\n // 获取所有文件记录(包含分块文件的 value)\r\n this.processor = new BatchProcessor({\r\n onProgress: (p) => this.onProgress({ ...p, phase: 'fetching' })\r\n });\r\n\r\n const records = await this.processor.fetchAllRecords(true);\r\n\r\n // 构建备份数据\r\n this.onProgress({ phase: 'building', message: '正在构建备份数据...' });\r\n\r\n const backupData = {\r\n timestamp: Date.now(),\r\n version: packageInfo.version,\r\n data: {\r\n fileCount: records.length,\r\n files: {},\r\n settings: {}\r\n }\r\n };\r\n\r\n // 将记录转换为以 id 为键的对象格式\r\n for (const record of records) {\r\n backupData.data.files[record.id] = {\r\n metadata: record.metadata,\r\n value: record.value || null\r\n };\r\n }\r\n\r\n // 3. 获取系统设置\r\n const settings = await this.fetchSettings();\r\n backupData.data.settings = settings;\r\n\r\n // 生成下载\r\n this.onProgress({ phase: 'downloading', message: '正在生成下载...' });\r\n this.downloadBackup(backupData);\r\n\r\n const settingsCount = Object.keys(settings).length;\r\n return { success: true, fileCount: records.length, settingsCount };\r\n }\r\n\r\n /**\r\n * 获取系统设置\r\n * \r\n * @returns {Promise} 系统设置对象,失败时返回空对象\r\n */\r\n async fetchSettings() {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/settings');\r\n if (!response.ok) {\r\n console.warn('Failed to fetch settings:', response.status);\r\n return {};\r\n }\r\n const data = await response.json();\r\n // 返回 settings 字段,而不是整个响应\r\n return data.settings || {};\r\n } catch (error) {\r\n console.warn('Failed to fetch settings:', error);\r\n return {};\r\n }\r\n }\r\n\r\n /**\r\n * 触发浏览器下载备份文件\r\n * \r\n * @param {Object} data - 备份数据对象\r\n */\r\n downloadBackup(data) {\r\n // 将数据转换为格式化的 JSON 字符串\r\n const json = JSON.stringify(data, null, 2);\r\n \r\n // 创建 Blob 对象\r\n const blob = new Blob([json], { type: 'application/json' });\r\n \r\n // 创建下载 URL\r\n const url = URL.createObjectURL(blob);\r\n\r\n // 创建临时下载链接\r\n const a = document.createElement('a');\r\n a.href = url;\r\n // 使用日期作为文件名的一部分\r\n a.download = `imgbed_backup_${new Date().toISOString().split('T')[0]}.json`;\r\n \r\n // 触发下载\r\n document.body.appendChild(a);\r\n a.click();\r\n \r\n // 清理\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * 取消当前备份操作\r\n */\r\n abort() {\r\n if (this.processor) {\r\n this.processor.abort();\r\n }\r\n }\r\n\r\n /**\r\n * 检查操作是否已被取消\r\n * @returns {boolean}\r\n */\r\n isAborted() {\r\n return this.processor ? this.processor.isAborted() : false;\r\n }\r\n}\r\n\r\nexport default BackupGenerator;\r\n","/**\r\n * RestoreProcessor - 分批恢复数据类\r\n * \r\n * 将备份数据分批上传到后端进行恢复,避免 CPU 超时\r\n */\r\n\r\nimport fetchWithAuth from '@/utils/fetchWithAuth';\r\nimport { BatchOperationError } from '@/utils/batchProcessor';\r\n\r\n/**\r\n * RestoreProcessor 类\r\n */\r\nclass RestoreProcessor {\r\n /**\r\n * 创建 RestoreProcessor 实例\r\n * @param {Object} options - 配置选项\r\n * @param {number} options.chunkSize - 每批数据量,默认 50\r\n * @param {number} options.maxRetries - 最大重试次数,默认 3\r\n * @param {number} options.retryDelay - 重试延迟基数(毫秒),默认 1000\r\n * @param {Function} options.onProgress - 进度回调函数\r\n * @param {Function} options.onError - 错误回调函数\r\n */\r\n constructor(options = {}) {\r\n this.chunkSize = options.chunkSize || 50;\r\n this.maxRetries = options.maxRetries || 3;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.onProgress = options.onProgress || (() => {});\r\n this.onError = options.onError || (() => {});\r\n this.aborted = false;\r\n }\r\n\r\n /**\r\n * 执行恢复操作\r\n * \r\n * @param {Object} backupData - 备份数据对象\r\n * @returns {Promise} 恢复结果\r\n */\r\n async restore(backupData) {\r\n this.aborted = false;\r\n\r\n // 验证备份数据格式\r\n if (!backupData || !backupData.data) {\r\n throw new BatchOperationError(\r\n '备份文件格式无效',\r\n 'INVALID_BACKUP',\r\n false,\r\n '请选择有效的备份文件'\r\n );\r\n }\r\n\r\n const { files = {}, settings = {} } = backupData.data;\r\n const fileEntries = Object.entries(files);\r\n const settingEntries = Object.entries(settings);\r\n \r\n const totalFiles = fileEntries.length;\r\n const totalSettings = settingEntries.length;\r\n const totalItems = totalFiles + totalSettings;\r\n\r\n let restoredFiles = 0;\r\n let restoredSettings = 0;\r\n let failedFiles = 0;\r\n let failedSettings = 0;\r\n\r\n try {\r\n // 1. 分批恢复文件数据\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: '正在恢复文件数据...',\r\n current: 0,\r\n total: totalItems\r\n });\r\n\r\n const fileChunks = this.splitIntoChunks(fileEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < fileChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = fileChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('files', chunkData);\r\n restoredFiles += result.restoredCount;\r\n failedFiles += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_files',\r\n message: `正在恢复文件数据 ${restoredFiles}/${totalFiles}...`,\r\n current: restoredFiles,\r\n total: totalItems,\r\n percentage: (restoredFiles / totalItems) * 80\r\n });\r\n }\r\n\r\n // 2. 分批恢复系统设置\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: '正在恢复系统设置...',\r\n current: restoredFiles,\r\n total: totalItems\r\n });\r\n\r\n const settingChunks = this.splitIntoChunks(settingEntries, this.chunkSize);\r\n \r\n for (let i = 0; i < settingChunks.length; i++) {\r\n if (this.aborted) {\r\n throw new BatchOperationError('操作已取消', 'ABORTED', false, '');\r\n }\r\n\r\n const chunk = settingChunks[i];\r\n const chunkData = Object.fromEntries(chunk);\r\n \r\n const result = await this.uploadChunkWithRetry('settings', chunkData);\r\n restoredSettings += result.restoredCount;\r\n failedSettings += result.failedCount;\r\n\r\n this.onProgress({\r\n phase: 'restoring_settings',\r\n message: `正在恢复系统设置 ${restoredSettings}/${totalSettings}...`,\r\n current: restoredFiles + restoredSettings,\r\n total: totalItems,\r\n percentage: 80 + (restoredSettings / totalSettings) * 20\r\n });\r\n }\r\n\r\n // 3. 完成\r\n this.onProgress({\r\n phase: 'completed',\r\n message: '恢复完成',\r\n current: totalItems,\r\n total: totalItems,\r\n percentage: 100\r\n });\r\n\r\n return {\r\n success: true,\r\n restoredFiles,\r\n restoredSettings,\r\n failedFiles,\r\n failedSettings,\r\n backupTimestamp: backupData.timestamp\r\n };\r\n\r\n } catch (error) {\r\n const batchError = error instanceof BatchOperationError\r\n ? error\r\n : new BatchOperationError(\r\n error.message || '恢复失败',\r\n 'RESTORE_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n this.onError(batchError);\r\n throw batchError;\r\n }\r\n }\r\n\r\n /**\r\n * 将数组分割为多个块\r\n */\r\n splitIntoChunks(entries, chunkSize) {\r\n const chunks = [];\r\n for (let i = 0; i < entries.length; i += chunkSize) {\r\n chunks.push(entries.slice(i, i + chunkSize));\r\n }\r\n return chunks;\r\n }\r\n\r\n /**\r\n * 带重试机制的分块上传\r\n */\r\n async uploadChunkWithRetry(type, data) {\r\n let lastError;\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\r\n try {\r\n return await this.uploadChunk(type, data);\r\n } catch (error) {\r\n lastError = error;\r\n\r\n if (error instanceof BatchOperationError) {\r\n if (error.code === 'AUTH_FAILED' ||\r\n error.code === 'FORBIDDEN' ||\r\n error.code === 'ABORTED') {\r\n throw error;\r\n }\r\n }\r\n\r\n if (attempt < this.maxRetries) {\r\n const delay = this.retryDelay * Math.pow(2, attempt - 1);\r\n await this.sleep(delay);\r\n }\r\n }\r\n }\r\n\r\n throw lastError;\r\n }\r\n\r\n /**\r\n * 上传单个分块\r\n */\r\n async uploadChunk(type, data) {\r\n try {\r\n const response = await fetchWithAuth('/api/manage/batch/restore/chunk', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ type, data })\r\n });\r\n\r\n if (!response.ok) {\r\n let errorDetails = '';\r\n try {\r\n const errorData = await response.json();\r\n errorDetails = errorData.error || '';\r\n } catch {\r\n // 忽略 JSON 解析错误\r\n }\r\n throw this.createHttpError(response.status, errorDetails);\r\n }\r\n\r\n const result = await response.json();\r\n\r\n if (!result.success) {\r\n throw new BatchOperationError(\r\n result.error || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n if (error instanceof BatchOperationError) {\r\n throw error;\r\n }\r\n if (error instanceof TypeError && error.message.includes('fetch')) {\r\n throw new BatchOperationError(\r\n '网络连接失败',\r\n 'NETWORK_ERROR',\r\n true,\r\n '请检查网络连接后重试'\r\n );\r\n }\r\n throw new BatchOperationError(\r\n error.message || '恢复分块失败',\r\n 'CHUNK_RESTORE_FAILED',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 根据 HTTP 状态码创建错误对象\r\n */\r\n createHttpError(status, details = '') {\r\n switch (status) {\r\n case 401:\r\n return new BatchOperationError(\r\n '认证失败,请重新登录',\r\n 'AUTH_FAILED',\r\n false,\r\n '请刷新页面并重新登录'\r\n );\r\n case 403:\r\n return new BatchOperationError(\r\n '权限不足或请求被拒绝',\r\n 'FORBIDDEN',\r\n false,\r\n '请确认您有管理员权限'\r\n );\r\n case 400:\r\n return new BatchOperationError(\r\n `请求数据无效: ${details}`,\r\n 'INVALID_DATA',\r\n true,\r\n '请检查备份文件格式'\r\n );\r\n case 500:\r\n default:\r\n return new BatchOperationError(\r\n `服务器错误: ${details || status}`,\r\n 'SERVER_ERROR',\r\n true,\r\n '请稍后重试'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 延迟执行\r\n */\r\n sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n /**\r\n * 取消当前操作\r\n */\r\n abort() {\r\n this.aborted = true;\r\n }\r\n}\r\n\r\nexport default RestoreProcessor;\r\n","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.reduce.js\";\nimport \"core-js/modules/esnext.json.parse.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';\nimport IndexRebuilder from '@/utils/indexRebuilder';\nimport BackupGenerator from '@/utils/backupGenerator';\nimport RestoreProcessor from '@/utils/restoreProcessor';\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 isProcessing: false,\n processingPhase: '',\n // fetching, sorting, uploading, finalizing, building, downloading, completed\n processingProgress: {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n },\n processingError: null,\n processingStartTime: null,\n // 当前处理器实例(用于取消操作)\n currentRebuilder: null,\n currentBackupGenerator: null,\n currentRestoreProcessor: null\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 // 文件状态图表数据 - 将Block映射为\"已屏蔽\",其余为\"正常\"\n typeChartData() {\n const aggregatedStats = this.aggregatedTypeStats;\n return {\n labels: Object.keys(aggregatedStats),\n datasets: [{\n data: Object.values(aggregatedStats),\n backgroundColor: this.typeColors.slice(0, Object.keys(aggregatedStats).length),\n borderWidth: 0\n }]\n };\n },\n // 聚合后的状态统计:Block -> 已屏蔽,其余 -> 正常\n aggregatedTypeStats() {\n const stats = this.indexInfo.typeStats || {};\n const aggregatedStats = {};\n for (const [status, count] of Object.entries(stats)) {\n const mappedStatus = status === 'Block' ? this.$t('sysStatus.blocked') : this.$t('sysStatus.normalStatus');\n aggregatedStats[mappedStatus] = (aggregatedStats[mappedStatus] || 0) + count;\n }\n return aggregatedStats;\n },\n // 图表配置\n chartOptions() {\n return {\n responsive: true,\n maintainAspectRatio: true,\n cutout: '65%',\n hoverOffset: 8,\n layout: {\n padding: 10\n },\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 z: 100,\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 estimatedTimeRemaining() {\n if (!this.isProcessing || !this.processingStartTime) return '';\n if (this.processingProgress.current === 0 || this.processingProgress.percentage === 0) return '';\n const elapsed = Date.now() - this.processingStartTime;\n const progress = this.processingProgress.percentage / 100;\n if (progress <= 0) return '';\n const totalEstimated = elapsed / progress;\n const remaining = totalEstimated - elapsed;\n if (remaining <= 0) return this.$t('sysStatus.aboutToComplete');\n const seconds = Math.ceil(remaining / 1000);\n if (seconds < 60) return this.$t('sysStatus.seconds', {\n count: seconds\n });\n const minutes = Math.ceil(seconds / 60);\n if (minutes < 60) return this.$t('sysStatus.minutes', {\n count: minutes\n });\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return this.$t('sysStatus.hoursMinutes', {\n hours,\n minutes: remainingMinutes\n });\n },\n // 处理阶段描述\n phaseDescription() {\n const phaseMap = {\n 'fetching': this.$t('sysStatus.phaseFetching'),\n 'sorting': this.$t('sysStatus.phaseSorting'),\n 'uploading': this.$t('sysStatus.phaseUploading'),\n 'finalizing': this.$t('sysStatus.phaseFinalizing'),\n 'building': this.$t('sysStatus.phaseBuilding'),\n 'downloading': this.$t('sysStatus.phaseDownloading'),\n 'restoring_files': this.$t('sysStatus.phaseRestoringFiles'),\n 'restoring_settings': this.$t('sysStatus.phaseRestoringSettings'),\n 'completed': this.$t('sysStatus.phaseCompleted'),\n 'retrying': this.$t('sysStatus.phaseRetrying')\n };\n return phaseMap[this.processingPhase] || this.processingPhase;\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(this.$t('sysStatus.fetchIndexFailed'));\n } finally {\n this.loading = false;\n }\n },\n // 重建索引 - 使用前端辅助重建流程\n async rebuildIndex() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.rebuilding = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 IndexRebuilder 实例\n this.currentRebuilder = new IndexRebuilder({\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n try {\n const result = await this.currentRebuilder.rebuild();\n\n // 成功完成\n this.$message.success(this.$t('sysStatus.rebuildSuccess', {\n count: result.totalFiles.toLocaleString()\n }));\n\n // 刷新索引信息\n setTimeout(() => {\n this.fetchIndexInfo();\n }, 1000);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.rebuilding = false;\n this.isProcessing = false;\n this.currentRebuilder = null;\n this.processingStartTime = null;\n }\n },\n // 备份数据 - 使用前端辅助备份流程\n async backupData() {\n if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.backing = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n\n // 创建 BackupGenerator 实例\n this.currentBackupGenerator = new BackupGenerator({\n onProgress: progress => this.handleProgress(progress)\n });\n try {\n const result = await this.currentBackupGenerator.generateBackup();\n\n // 成功完成\n const settingsMsg = result.settingsCount > 0 ? this.$t('sysStatus.backupSuccessWithSettings', {\n fileCount: result.fileCount.toLocaleString(),\n settingsCount: result.settingsCount\n }) : this.$t('sysStatus.backupSuccess', {\n count: result.fileCount.toLocaleString()\n });\n this.$message.success(settingsMsg);\n } catch (error) {\n // 错误处理\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n } finally {\n this.backing = false;\n this.isProcessing = false;\n this.currentBackupGenerator = null;\n this.processingStartTime = null;\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(this.$t('sysStatus.selectJsonFile'));\n return;\n }\n\n // 确认恢复操作\n try {\n await this.$confirm(this.$t('sysStatus.restoreConfirmMessage'), this.$t('sysStatus.restoreConfirmTitle'), {\n confirmButtonText: this.$t('sysStatus.restoreConfirmOk'),\n cancelButtonText: this.$t('sysStatus.restoreConfirmCancel'),\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 if (this.isProcessing) {\n this.$message.warning(this.$t('sysStatus.operationInProgress'));\n return;\n }\n this.restoring = true;\n this.isProcessing = true;\n this.processingError = null;\n this.processingStartTime = Date.now();\n this.processingProgress = {\n current: 0,\n total: 0,\n message: '',\n percentage: 0\n };\n try {\n // 解析备份文件\n const fileContent = await file.text();\n let backupData;\n try {\n backupData = JSON.parse(fileContent);\n } catch (parseError) {\n throw new Error(this.$t('sysStatus.invalidBackupFile'));\n }\n\n // 创建 RestoreProcessor 实例\n this.currentRestoreProcessor = new RestoreProcessor({\n chunkSize: 100,\n // 每批恢复 100 条\n onProgress: progress => this.handleProgress(progress),\n onError: error => this.handleError(error)\n });\n const result = await this.currentRestoreProcessor.restore(backupData);\n\n // 恢复完成,重置恢复状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n\n // 显示恢复成功消息\n this.$message.success(this.$t('sysStatus.restoreSuccess', {\n files: result.restoredFiles,\n settings: result.restoredSettings\n }));\n\n // 短暂延迟后自动开始重建索引\n await new Promise(resolve => setTimeout(resolve, 500));\n await this.rebuildIndex();\n } catch (error) {\n console.error('恢复数据失败:', error);\n\n // 出错时重置状态\n this.restoring = false;\n this.isProcessing = false;\n this.currentRestoreProcessor = null;\n this.processingStartTime = null;\n if (error.code !== 'ABORTED') {\n const errorMessage = error.suggestion ? `${error.message}。${error.suggestion}` : error.message;\n this.$message.error(this.$t('sysStatus.restoreFailed') + ': ' + errorMessage);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n }\n }\n },\n // 格式化时间\n formatTime(timestamp) {\n if (!timestamp) return this.$t('sysStatus.unknown');\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 this.$t('sysStatus.daysAgo', {\n count: days\n });\n if (hours > 0) return this.$t('sysStatus.hoursAgo', {\n count: hours\n });\n if (minutes > 0) return this.$t('sysStatus.minutesAgo', {\n count: minutes\n });\n return this.$t('sysStatus.justNow');\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 openFileInNewTab(file) {\n if (!file?.id) return;\n window.open('/file/' + file.id + '?from=admin', '_blank');\n },\n // 处理进度更新\n handleProgress(progress) {\n this.processingPhase = progress.phase;\n this.processingProgress.message = progress.message || '';\n this.processingProgress.current = progress.current || 0;\n\n // 根据不同阶段计算进度百分比\n if (progress.phase === 'fetching') {\n // 获取阶段:基于已获取的记录数估算(假设总数未知时显示已获取数量)\n this.processingProgress.total = progress.total || 0;\n // 获取阶段占总进度的 60%\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = Math.min(60, progress.current / progress.total * 60);\n } else {\n // 未知总数时,使用对数增长模拟进度\n this.processingProgress.percentage = Math.min(50, Math.log10(progress.current + 1) * 15);\n }\n } else if (progress.phase === 'sorting') {\n // 排序阶段:占 60-70%\n this.processingProgress.percentage = 65;\n this.processingProgress.total = progress.total || this.processingProgress.total;\n } else if (progress.phase === 'uploading') {\n // 上传阶段:占 70-95%\n this.processingProgress.total = progress.total || 0;\n if (progress.total && progress.total > 0) {\n this.processingProgress.percentage = 70 + progress.current / progress.total * 25;\n }\n } else if (progress.phase === 'finalizing') {\n // 完成阶段:95-100%\n this.processingProgress.percentage = 97;\n } else if (progress.phase === 'building') {\n // 构建备份阶段:70-90%\n this.processingProgress.percentage = 80;\n } else if (progress.phase === 'downloading') {\n // 下载阶段:90-100%\n this.processingProgress.percentage = 95;\n } else if (progress.phase === 'restoring_files') {\n // 恢复文件阶段:0-80%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 0;\n } else if (progress.phase === 'restoring_settings') {\n // 恢复设置阶段:80-100%\n this.processingProgress.total = progress.total || 0;\n this.processingProgress.percentage = progress.percentage || 80;\n } else if (progress.phase === 'completed') {\n // 完成\n this.processingProgress.percentage = 100;\n } else if (progress.phase === 'retrying') {\n // 重试阶段:保持当前进度\n this.processingProgress.message = progress.message;\n }\n },\n // 处理错误\n handleError(error) {\n console.error('批量操作错误:', error);\n this.processingError = {\n message: error.message,\n suggestion: error.suggestion,\n recoverable: error.recoverable\n };\n },\n // 取消当前操作\n cancelOperation() {\n if (this.currentRebuilder) {\n this.currentRebuilder.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentBackupGenerator) {\n this.currentBackupGenerator.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n if (this.currentRestoreProcessor) {\n this.currentRestoreProcessor.abort();\n this.$message.info(this.$t('sysStatus.cancellingRebuild'));\n }\n },\n // 重试操作\n retryOperation() {\n this.processingError = null;\n if (this.rebuilding) {\n this.rebuilding = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.rebuildIndex();\n });\n } else if (this.backing) {\n this.backing = false;\n this.isProcessing = false;\n this.$nextTick(() => {\n this.backupData();\n });\n }\n },\n // 关闭错误提示\n dismissError() {\n this.processingError = null;\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogStatus.vue?vue&type=template&id=3cf4ee46&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=3cf4ee46&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-3cf4ee46\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, renderSlot as _renderSlot, createBlock as _createBlock, createCommentVNode as _createCommentVNode, vShow as _vShow, withModifiers as _withModifiers, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx, normalizeStyle as _normalizeStyle } from \"vue\";\nconst _hoisted_1 = [\"onClick\"];\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([\"custom-select\", {\n 'is-open': $data.isOpen\n }]),\n style: _normalizeStyle({\n width: $props.width\n })\n }, [_createElementVNode(\"div\", {\n class: \"custom-select-trigger\",\n onClick: _cache[0] || (_cache[0] = (...args) => $options.toggleDropdown && $options.toggleDropdown(...args))\n }, [_createElementVNode(\"span\", {\n class: _normalizeClass([\"custom-select-value\", {\n 'is-placeholder': !$props.modelValue\n }])\n }, _toDisplayString($options.displayLabel), 3), _createVNode(_component_font_awesome_icon, {\n icon: \"chevron-down\",\n class: \"custom-select-arrow\"\n })]), _createVNode(_Transition, {\n name: \"dropdown-fade\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: \"custom-select-dropdown\",\n onClick: _cache[1] || (_cache[1] = _withModifiers(() => {}, [\"stop\"]))\n }, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($props.options, option => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: option.value,\n class: _normalizeClass([\"custom-select-option\", {\n 'is-selected': $props.modelValue === option.value\n }]),\n onClick: $event => $options.selectOption(option.value)\n }, [_renderSlot(_ctx.$slots, \"option\", {\n option: option\n }, () => [option.icon ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: option.icon,\n class: \"option-icon\"\n }, null, 8, [\"icon\"])) : _createCommentVNode(\"\", true), _createElementVNode(\"span\", null, _toDisplayString(option.label), 1)], true)], 10, _hoisted_1);\n }), 128))], 512), [[_vShow, $data.isOpen]])]),\n _: 3\n })], 6);\n}","import \"core-js/modules/es.iterator.constructor.js\";\nimport \"core-js/modules/es.iterator.find.js\";\nexport default {\n name: 'CustomSelect',\n props: {\n modelValue: {\n type: [String, Number],\n default: ''\n },\n options: {\n type: Array,\n required: true\n // 格式: [{ value: '', label: '', icon?: '' }]\n },\n placeholder: {\n type: String,\n default: ''\n },\n width: {\n type: String,\n default: '160px'\n }\n },\n emits: ['update:modelValue', 'change'],\n data() {\n return {\n isOpen: false\n };\n },\n computed: {\n resolvedPlaceholder() {\n return this.placeholder || this.$t('common.select');\n },\n displayLabel() {\n const selected = this.options.find(opt => opt.value === this.modelValue);\n return selected ? selected.label : this.resolvedPlaceholder;\n }\n },\n mounted() {\n document.addEventListener('click', this.handleClickOutside);\n },\n beforeUnmount() {\n document.removeEventListener('click', this.handleClickOutside);\n },\n methods: {\n toggleDropdown() {\n this.isOpen = !this.isOpen;\n },\n selectOption(value) {\n this.$emit('update:modelValue', value);\n this.$emit('change', value);\n this.isOpen = false;\n },\n handleClickOutside(e) {\n if (!this.$el.contains(e.target)) {\n this.isOpen = false;\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./CustomSelect.vue?vue&type=template&id=55080c16&scoped=true\"\nimport script from \"./CustomSelect.vue?vue&type=script&lang=js\"\nexport * from \"./CustomSelect.vue?vue&type=script&lang=js\"\n\nimport \"./CustomSelect.vue?vue&type=style&index=0&id=55080c16&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-55080c16\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, 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, createCommentVNode as _createCommentVNode, createBlock as _createBlock, withModifiers as _withModifiers, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from \"vue\";\nconst _hoisted_1 = {\n class: \"upload-settings\"\n};\nconst _hoisted_2 = {\n class: \"page-header\"\n};\nconst _hoisted_3 = {\n class: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"header-actions\"\n};\nconst _hoisted_5 = {\n class: \"group-header\"\n};\nconst _hoisted_6 = {\n class: \"group-title\"\n};\nconst _hoisted_7 = {\n key: 0,\n class: \"load-balance-switch\"\n};\nconst _hoisted_8 = {\n class: \"switch-label\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"channel-cards\"\n};\nconst _hoisted_10 = [\"onMousemove\", \"onMouseleave\"];\nconst _hoisted_11 = {\n class: \"card-header\"\n};\nconst _hoisted_12 = {\n class: \"card-title\"\n};\nconst _hoisted_13 = {\n class: \"channel-name\"\n};\nconst _hoisted_14 = {\n class: \"card-body\"\n};\nconst _hoisted_15 = {\n class: \"card-info\"\n};\nconst _hoisted_16 = {\n class: \"info-item\"\n};\nconst _hoisted_17 = {\n class: \"info-text\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_19 = {\n class: \"info-text\"\n};\nconst _hoisted_20 = {\n key: 1,\n class: \"info-item\"\n};\nconst _hoisted_21 = [\"title\"];\nconst _hoisted_22 = {\n class: \"info-item\"\n};\nconst _hoisted_23 = {\n class: \"info-text\"\n};\nconst _hoisted_24 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_25 = [\"title\"];\nconst _hoisted_26 = {\n class: \"info-item\"\n};\nconst _hoisted_27 = {\n class: \"info-text\"\n};\nconst _hoisted_28 = {\n class: \"info-item\"\n};\nconst _hoisted_29 = {\n class: \"info-text\"\n};\nconst _hoisted_30 = {\n class: \"info-item\"\n};\nconst _hoisted_31 = {\n class: \"info-text\"\n};\nconst _hoisted_32 = {\n class: \"info-item\"\n};\nconst _hoisted_33 = [\"title\"];\nconst _hoisted_34 = {\n key: 0,\n class: \"info-item\"\n};\nconst _hoisted_35 = [\"title\"];\nconst _hoisted_36 = {\n key: 0,\n class: \"quota-mini\"\n};\nconst _hoisted_37 = {\n class: \"quota-text\"\n};\nconst _hoisted_38 = {\n class: \"card-actions\"\n};\nconst _hoisted_39 = {\n key: 1,\n class: \"empty-tip\"\n};\nconst _hoisted_40 = {\n key: 0,\n class: \"form-warning\",\n style: {\n \"margin-top\": \"0\"\n }\n};\nconst _hoisted_41 = [\"innerHTML\"];\nconst _hoisted_42 = {\n class: \"form-tip\"\n};\nconst _hoisted_43 = {\n class: \"form-tip\"\n};\nconst _hoisted_44 = {\n class: \"form-tip\"\n};\nconst _hoisted_45 = {\n class: \"form-warning\"\n};\nconst _hoisted_46 = {\n class: \"form-tip\"\n};\nconst _hoisted_47 = {\n class: \"form-tip\"\n};\nconst _hoisted_48 = {\n class: \"form-tip\"\n};\nconst _hoisted_49 = {\n class: \"quota-label\"\n};\nconst _hoisted_50 = {\n class: \"quota-status\"\n};\nconst _hoisted_51 = {\n class: \"form-tip\"\n};\nconst _hoisted_52 = {\n class: \"form-tip\"\n};\nconst _hoisted_53 = {\n class: \"form-tip\"\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_CustomSelect = _resolveComponent(\"CustomSelect\");\n const _component_el_button = _resolveComponent(\"el-button\");\n const _component_el_tag = _resolveComponent(\"el-tag\");\n const _component_el_switch = _resolveComponent(\"el-switch\");\n const _component_el_progress = _resolveComponent(\"el-progress\");\n const _component_el_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_el_form_item = _resolveComponent(\"el-form-item\");\n const _component_el_input = _resolveComponent(\"el-input\");\n const _component_el_input_number = _resolveComponent(\"el-input-number\");\n const _component_el_form = _resolveComponent(\"el-form\");\n const _component_el_dialog = _resolveComponent(\"el-dialog\");\n const _component_el_descriptions_item = _resolveComponent(\"el-descriptions-item\");\n const _component_el_descriptions = _resolveComponent(\"el-descriptions\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.title')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysUpload.titleTooltip'),\n placement: \"right\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"question-circle\",\n class: \"help-icon\"\n })]),\n _: 1\n }, 8, [\"content\"])]), _createElementVNode(\"div\", _hoisted_4, [_createVNode(_component_CustomSelect, {\n modelValue: $data.channelFilter,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = $event => $data.channelFilter = $event),\n options: $options.filterOptions,\n placeholder: _ctx.$t('sysUpload.filterPlaceholder'),\n width: \"160px\"\n }, null, 8, [\"modelValue\", \"options\", \"placeholder\"]), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[1] || (_cache[1] = $event => $data.showAddDialog = true),\n class: \"add-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"plus\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.addChannel')), 1)]),\n _: 1\n })])]), (_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.filteredChannels, channelType => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channelType.value,\n class: \"channel-group\"\n }, [_createElementVNode(\"div\", _hoisted_5, [_createElementVNode(\"div\", _hoisted_6, [_createVNode(_component_font_awesome_icon, {\n icon: $options.getChannelIcon(channelType.value),\n class: \"group-icon\"\n }, null, 8, [\"icon\"]), _createElementVNode(\"span\", null, _toDisplayString(channelType.label), 1), _createVNode(_component_el_tag, {\n size: \"small\",\n type: \"info\",\n class: \"channel-count\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelList(channelType.value).length), 1)]),\n _: 2\n }, 1024)]), $options.hasLoadBalance(channelType.value) ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [_createElementVNode(\"span\", _hoisted_8, _toDisplayString(_ctx.$t('sysUpload.loadBalance')), 1), _createVNode(_component_el_switch, {\n modelValue: $options.getSettings(channelType.value).loadBalance.enabled,\n \"onUpdate:modelValue\": $event => $options.getSettings(channelType.value).loadBalance.enabled = $event,\n size: \"small\",\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])])) : _createCommentVNode(\"\", true)]), $options.getChannelList(channelType.value).length > 0 ? (_openBlock(), _createElementBlock(\"div\", _hoisted_9, [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.getChannelList(channelType.value), (channel, index) => {\n return _openBlock(), _createElementBlock(\"div\", {\n key: channel.name || index,\n class: _normalizeClass([\"channel-card\", [channelType.value, {\n 'disabled': !channel.enabled,\n 'fixed': channel.fixed\n }]]),\n onMousemove: $event => $options.handleCardMouseMove($event, channelType.value, index),\n onMouseleave: $event => $options.handleCardMouseLeave(channelType.value, index)\n }, [_createElementVNode(\"div\", {\n class: \"card-glow\",\n ref_for: true,\n ref: `glow-${channelType.value}-${index}`\n }, null, 512), _createElementVNode(\"div\", _hoisted_11, [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(channel.name || _ctx.$t('sysUpload.unnamedChannel')), 1), channel.fixed ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)]), _createVNode(_component_el_switch, {\n modelValue: channel.enabled,\n \"onUpdate:modelValue\": $event => channel.enabled = $event,\n size: \"small\",\n onClick: _cache[2] || (_cache[2] = _withModifiers(() => {}, [\"stop\"])),\n onChange: $options.saveSettings\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"onChange\"])]), _createElementVNode(\"div\", _hoisted_14, [_createElementVNode(\"div\", _hoisted_15, [channelType.value === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_17, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), channel.chatId ? (_openBlock(), _createElementBlock(\"div\", _hoisted_18, [_createVNode(_component_font_awesome_icon, {\n icon: \"comments\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_19, \"Channel: \" + _toDisplayString($options.maskText(channel.chatId)), 1)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_20, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_21)])) : channelType.value === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createElementVNode(\"div\", _hoisted_22, [_createVNode(_component_font_awesome_icon, {\n icon: \"server\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_23, _toDisplayString(channel.bucketName || _ctx.$t('sysUpload.notSet')), 1)]), channel.endpoint ? (_openBlock(), _createElementBlock(\"div\", _hoisted_24, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.endpoint\n }, _toDisplayString(channel.endpoint), 9, _hoisted_25)])) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createElementVNode(\"div\", _hoisted_26, [_createVNode(_component_font_awesome_icon, {\n icon: \"robot\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_27, \"Bot: \" + _toDisplayString($options.maskText(channel.botToken)), 1)]), _createElementVNode(\"div\", _hoisted_28, [_createVNode(_component_font_awesome_icon, {\n icon: \"hashtag\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_29, \"Channel: \" + _toDisplayString($options.maskText(channel.channelId)), 1)]), channel.isNitro ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"success\"\n }, {\n default: _withCtx(() => [...(_cache[78] || (_cache[78] = [_createTextVNode(\"Nitro\", -1)]))]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createElementVNode(\"div\", _hoisted_30, [_createVNode(_component_font_awesome_icon, {\n icon: \"database\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", _hoisted_31, _toDisplayString(channel.repo || _ctx.$t('sysUpload.notSet')), 1)]), channel.isPrivate ? (_openBlock(), _createBlock(_component_el_tag, {\n key: 0,\n size: \"small\",\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.privateRepo')), 1)]),\n _: 1\n })) : _createCommentVNode(\"\", true)], 64)) : channelType.value === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createElementVNode(\"div\", _hoisted_32, [_createVNode(_component_font_awesome_icon, {\n icon: \"folder\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.baseUrl\n }, _toDisplayString(channel.baseUrl || _ctx.$t('sysUpload.notSet')), 9, _hoisted_33)]), channel.publicUrl ? (_openBlock(), _createElementBlock(\"div\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"link\",\n class: \"info-icon\"\n }), _createElementVNode(\"span\", {\n class: \"info-text\",\n title: channel.publicUrl\n }, _toDisplayString(channel.publicUrl), 9, _hoisted_35)])) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]), channel.quota?.enabled ? (_openBlock(), _createElementBlock(\"div\", _hoisted_36, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage(channel),\n status: $options.getQuotaStatus(channel),\n \"stroke-width\": 6\n }, null, 8, [\"percentage\", \"status\"]), _createElementVNode(\"span\", _hoisted_37, _toDisplayString($options.getQuotaText(channel)), 1)])) : _createCommentVNode(\"\", true)]), _createElementVNode(\"div\", _hoisted_38, [_createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openDetailDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"eye\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.detail')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"primary\",\n size: \"small\",\n onClick: $event => $options.openEditDialog(channelType.value, index)\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"edit\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"]), _createVNode(_component_el_button, {\n text: \"\",\n type: \"danger\",\n size: \"small\",\n onClick: $event => $options.deleteChannel(channelType.value, index),\n disabled: channel.fixed\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"trash-alt\",\n style: {\n \"margin-right\": \"4px\"\n }\n }), _createTextVNode(_toDisplayString(_ctx.$t('sysUpload.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\", \"disabled\"])])], 42, _hoisted_10);\n }), 128))])) : (_openBlock(), _createElementBlock(\"div\", _hoisted_39, [_createVNode(_component_font_awesome_icon, {\n icon: \"inbox\",\n class: \"empty-icon\"\n }), _createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysUpload.noChannels', {\n type: channelType.label\n })), 1)]))]);\n }), 128)), _createVNode(_component_el_dialog, {\n modelValue: $data.showAddDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showAddDialog = $event),\n title: _ctx.$t('sysUpload.addDialogTitle'),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetAddForm\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[34] || (_cache[34] = $event => $data.showAddDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), $data.newChannel.type !== 'cfr2' ? (_openBlock(), _createBlock(_component_el_button, {\n key: 0,\n type: \"primary\",\n onClick: $options.confirmAddChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.confirmAdd')), 1)]),\n _: 1\n }, 8, [\"onClick\"])) : _createCommentVNode(\"\", true)]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newChannel,\n \"label-position\": \"top\",\n ref: \"addForm\",\n rules: $options.addRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelTypeLabel'),\n prop: \"type\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.newChannel.type,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.newChannel.type = $event),\n placeholder: _ctx.$t('sysUpload.channelTypePlaceholder'),\n style: {\n \"width\": \"100%\"\n },\n onChange: $options.onChannelTypeChange\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.addableChannels, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.value,\n label: ch.label,\n value: ch.value\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: $options.getChannelIcon(ch.value),\n class: \"select-option-icon\"\n }, null, 8, [\"icon\"]), _createTextVNode(\" \" + _toDisplayString(ch.label), 1)]),\n _: 2\n }, 1032, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"placeholder\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.type === 'cfr2' ? (_openBlock(), _createElementBlock(\"div\", _hoisted_40, [_createVNode(_component_font_awesome_icon, {\n icon: \"info-circle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createElementVNode(\"span\", {\n innerHTML: _ctx.$t('sysUpload.r2ConfigNote')\n }, null, 8, _hoisted_41)])) : (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelNameLabel'),\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.name,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.newChannel.name = $event),\n placeholder: _ctx.$t('sysUpload.channelNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.type === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.chatId,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.newChannel.chatId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.chatIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.newChannel.type === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.endpoint,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.newChannel.endpoint = $event),\n placeholder: _ctx.$t('sysUpload.endpointPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.cdnDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.newChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"]), _createElementVNode(\"span\", _hoisted_42, _toDisplayString(_ctx.$t('sysUpload.cdnDomainTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.bucketName,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.newChannel.bucketName = $event),\n placeholder: _ctx.$t('sysUpload.bucketNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.region,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.newChannel.region = $event),\n placeholder: _ctx.$t('sysUpload.bucketRegionPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.newChannel.accessKeyId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessKeyIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.newChannel.secretAccessKey = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.secretAccessKeyPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.pathStyle')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.newChannel.pathStyle = $event)\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_43, _toDisplayString(_ctx.$t('sysUpload.pathStyleTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.newChannel.type === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.botToken,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.newChannel.botToken = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.botTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.channelId,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.newChannel.channelId = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.channelIdPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.nitroMember')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isNitro,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_44, _toDisplayString(_ctx.$t('sysUpload.nitroTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createElementVNode(\"div\", _hoisted_45, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"6px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysUpload.discordWarning')), 1)])], 64)) : $data.newChannel.type === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.repo,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newChannel.repo = $event),\n placeholder: _ctx.$t('sysUpload.repoNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.token,\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $data.newChannel.token = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.accessTokenPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.privateRepo')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.newChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_46, _toDisplayString(_ctx.$t('sysUpload.privateRepoTip')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.newChannel.type === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.newChannel.baseUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavBaseUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.username,\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $data.newChannel.username = $event),\n placeholder: _ctx.$t('sysUpload.webdavUsernamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.password,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.newChannel.password = $event),\n type: \"password\",\n \"show-password\": \"\",\n placeholder: _ctx.$t('sysUpload.webdavPasswordPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.newChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"]), _createElementVNode(\"span\", _hoisted_47, _toDisplayString(_ctx.$t('sysUpload.webdavPublicUrlTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newChannel.headersText,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.newChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavCreateDirectory')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.newChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_48, _toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectoryTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $data.newChannel.quota.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.newChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.newChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.newChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.newChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)], 64))]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showDetailDialog,\n \"onUpdate:modelValue\": _cache[37] || (_cache[37] = $event => $data.showDetailDialog = $event),\n title: _ctx.$t('sysUpload.detailDialogTitle', {\n name: $data.currentChannel?.name || ''\n }),\n class: \"channel-dialog\",\n onClosed: $options.resetDetailData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[36] || (_cache[36] = $event => $data.showDetailDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.closeBtn')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.openEditFromDetail\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.editBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_descriptions, {\n column: 1,\n border: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelNameDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelTypeDetail')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getChannelTypeLabel($data.currentChannelType)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.statusLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: $data.currentChannel?.enabled ? 'success' : 'info'\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.enabled ? _ctx.$t('sysUpload.enabled') : _ctx.$t('sysUpload.disabled')), 1)]),\n _: 1\n }, 8, [\"type\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannel?.fixed ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 0,\n label: _ctx.$t('sysUpload.configSource')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_tag, {\n type: \"warning\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.envVariable')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.chatIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.chatId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createBlock(_component_el_descriptions_item, {\n key: 2,\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"])) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.endpointLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.endpoint,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.cdnDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.cdnDomain || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.bucketName), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.bucketRegion')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.region), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.pathStyle')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.pathStyle ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.botTokenLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.botToken, 10)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.channelIdLabel')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.maskText($data.currentChannel?.channelId, 6)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.proxyUrl || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.nitroMember')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isNitro ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.repoName')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.repo), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.privateRepo')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.isPrivate ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 6\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.baseUrl,\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $data.currentChannel?.publicUrl || _ctx.$t('sysUpload.notSet'),\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.username || _ctx.$t('sysUpload.notSet')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n \"model-value\": $options.formatHeaders($data.currentChannel?.headers),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n readonly: \"\"\n }, null, 8, [\"model-value\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.webdavCreateDirectory')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.createDirectory !== false ? _ctx.$t('sysUpload.isPathStyle') : _ctx.$t('sysUpload.isNotPathStyle')), 1)]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true), $data.currentChannel?.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 7\n }, [_createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.limitGB) + \" GB\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($data.currentChannel?.quota?.threshold) + \"%\", 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_descriptions_item, null, {\n label: _withCtx(() => [_createElementVNode(\"span\", _hoisted_49, [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.currentUsage')) + \" \", 1), _createVNode(_component_el_button, {\n link: \"\",\n type: \"primary\",\n onClick: $options.refreshQuota,\n class: \"refresh-btn\"\n }, {\n default: _withCtx(() => [_createVNode(_component_font_awesome_icon, {\n icon: \"sync-alt\",\n class: _normalizeClass({\n 'fa-spin': $data.quotaLoading\n })\n }, null, 8, [\"class\"])]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_50, [_createVNode(_component_el_progress, {\n percentage: $options.getQuotaPercentage($data.currentChannel),\n status: $options.getQuotaStatus($data.currentChannel),\n \"stroke-width\": 16,\n \"text-inside\": true,\n format: () => $options.getQuotaText($data.currentChannel)\n }, null, 8, [\"percentage\", \"status\", \"format\"]), _createElementVNode(\"div\", {\n class: _normalizeClass([\"quota-info\", {\n 'quota-warning': $options.isQuotaExceeded($data.currentChannel)\n }])\n }, _toDisplayString($options.getQuotaStatusText($data.currentChannel)), 3)])]),\n _: 1\n })], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditDialog,\n \"onUpdate:modelValue\": _cache[77] || (_cache[77] = $event => $data.showEditDialog = $event),\n title: _ctx.$t('sysUpload.editDialogTitle', {\n name: $data.editChannel?.name || ''\n }),\n class: \"channel-dialog\",\n \"destroy-on-close\": \"\",\n onClosed: $options.resetEditData\n }, {\n footer: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: _cache[76] || (_cache[76] = $event => $data.showEditDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.confirmEditChannel\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysUpload.saveChanges')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editChannel,\n \"label-position\": \"top\",\n ref: \"editForm\",\n rules: $options.editRules\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelNameLabel'),\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.name,\n \"onUpdate:modelValue\": _cache[38] || (_cache[38] = $event => $data.editChannel.name = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.enableChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.enabled,\n \"onUpdate:modelValue\": _cache[39] || (_cache[39] = $event => $data.editChannel.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.currentChannelType === 'telegram' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[40] || (_cache[40] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.chatIdLabel'),\n prop: \"chatId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.chatId,\n \"onUpdate:modelValue\": _cache[41] || (_cache[41] = $event => $data.editChannel.chatId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[42] || (_cache[42] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'cfr2' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 1\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[43] || (_cache[43] = $event => $data.editChannel.publicUrl = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[44] || (_cache[44] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[45] || (_cache[45] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[46] || (_cache[46] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[47] || (_cache[47] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 's3' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 2\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.endpointLabel'),\n prop: \"endpoint\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.endpoint,\n \"onUpdate:modelValue\": _cache[48] || (_cache[48] = $event => $data.editChannel.endpoint = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.cdnDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.cdnDomain,\n \"onUpdate:modelValue\": _cache[49] || (_cache[49] = $event => $data.editChannel.cdnDomain = $event),\n placeholder: _ctx.$t('sysUpload.cdnDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"]), _createElementVNode(\"span\", _hoisted_51, _toDisplayString(_ctx.$t('sysUpload.cdnDomainTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketName'),\n prop: \"bucketName\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.bucketName,\n \"onUpdate:modelValue\": _cache[50] || (_cache[50] = $event => $data.editChannel.bucketName = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.bucketRegion'),\n prop: \"region\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.region,\n \"onUpdate:modelValue\": _cache[51] || (_cache[51] = $event => $data.editChannel.region = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessKeyId'),\n prop: \"accessKeyId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.accessKeyId,\n \"onUpdate:modelValue\": _cache[52] || (_cache[52] = $event => $data.editChannel.accessKeyId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.secretAccessKey'),\n prop: \"secretAccessKey\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.secretAccessKey,\n \"onUpdate:modelValue\": _cache[53] || (_cache[53] = $event => $data.editChannel.secretAccessKey = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.pathStyle')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.pathStyle,\n \"onUpdate:modelValue\": _cache[54] || (_cache[54] = $event => $data.editChannel.pathStyle = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[55] || (_cache[55] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[56] || (_cache[56] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[57] || (_cache[57] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[58] || (_cache[58] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : $data.currentChannelType === 'discord' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 3\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.botTokenLabel'),\n prop: \"botToken\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.botToken,\n \"onUpdate:modelValue\": _cache[59] || (_cache[59] = $event => $data.editChannel.botToken = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.channelIdLabel'),\n prop: \"channelId\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.channelId,\n \"onUpdate:modelValue\": _cache[60] || (_cache[60] = $event => $data.editChannel.channelId = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.proxyDomain')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.proxyUrl,\n \"onUpdate:modelValue\": _cache[61] || (_cache[61] = $event => $data.editChannel.proxyUrl = $event),\n placeholder: _ctx.$t('sysUpload.proxyDomainPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.nitroMember')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isNitro,\n \"onUpdate:modelValue\": _cache[62] || (_cache[62] = $event => $data.editChannel.isNitro = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'huggingface' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 4\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.repoName'),\n prop: \"repo\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.repo,\n \"onUpdate:modelValue\": _cache[63] || (_cache[63] = $event => $data.editChannel.repo = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.accessToken'),\n prop: \"token\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.token,\n \"onUpdate:modelValue\": _cache[64] || (_cache[64] = $event => $data.editChannel.token = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.privateRepo')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.isPrivate,\n \"onUpdate:modelValue\": _cache[65] || (_cache[65] = $event => $data.editChannel.isPrivate = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : $data.currentChannelType === 'webdav' ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 5\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavBaseUrl'),\n prop: \"baseUrl\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.baseUrl,\n \"onUpdate:modelValue\": _cache[66] || (_cache[66] = $event => $data.editChannel.baseUrl = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavUsername')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.username,\n \"onUpdate:modelValue\": _cache[67] || (_cache[67] = $event => $data.editChannel.username = $event),\n disabled: $data.editChannel.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavPassword')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.password,\n \"onUpdate:modelValue\": _cache[68] || (_cache[68] = $event => $data.editChannel.password = $event),\n disabled: $data.editChannel.fixed,\n type: \"password\",\n \"show-password\": \"\"\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.publicUrl')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.publicUrl,\n \"onUpdate:modelValue\": _cache[69] || (_cache[69] = $event => $data.editChannel.publicUrl = $event),\n placeholder: _ctx.$t('sysUpload.webdavPublicUrlPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"]), _createElementVNode(\"span\", _hoisted_52, _toDisplayString(_ctx.$t('sysUpload.webdavPublicUrlTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavHeaders')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editChannel.headersText,\n \"onUpdate:modelValue\": _cache[70] || (_cache[70] = $event => $data.editChannel.headersText = $event),\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n placeholder: _ctx.$t('sysUpload.webdavHeadersPlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.webdavCreateDirectory')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.createDirectory,\n \"onUpdate:modelValue\": _cache[71] || (_cache[71] = $event => $data.editChannel.createDirectory = $event)\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_53, _toDisplayString(_ctx.$t('sysUpload.webdavCreateDirectoryTip')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimit')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editChannel.quota.enabled,\n \"onUpdate:modelValue\": _cache[72] || (_cache[72] = $event => $data.editChannel.quota.enabled = $event),\n onChange: _cache[73] || (_cache[73] = val => $options.onQuotaEnabledChange(val, $data.editChannel))\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), $data.editChannel.quota?.enabled ? (_openBlock(), _createElementBlock(_Fragment, {\n key: 0\n }, [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaLimitGB')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.limitGB,\n \"onUpdate:modelValue\": _cache[74] || (_cache[74] = $event => $data.editChannel.quota.limitGB = $event),\n min: 0.1,\n step: 1,\n precision: 1\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysUpload.quotaThreshold')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.editChannel.quota.threshold,\n \"onUpdate:modelValue\": _cache[75] || (_cache[75] = $event => $data.editChannel.quota.threshold = $event),\n min: 50,\n max: 100,\n step: 5\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])], 64)) : _createCommentVNode(\"\", true)], 64)) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"onClosed\"])])), [[_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.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.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport \"core-js/modules/esnext.json.parse.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport CustomSelect from './CustomSelect.vue';\nexport default {\n components: {\n CustomSelect\n },\n data() {\n return {\n // 渠道类型筛选\n channelFilter: '',\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 value: 'webdav',\n label: 'WebDAV'\n }],\n // 可添加的渠道类型\n addableChannels: [{\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 value: 'webdav',\n label: 'WebDAV'\n }],\n // 各渠道配置\n telegramSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n cfr2Settings: {\n channels: []\n },\n s3Settings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n discordSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n huggingfaceSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n webdavSettings: {\n loadBalance: {\n enabled: false\n },\n channels: []\n },\n // 弹窗控制\n showAddDialog: false,\n showDetailDialog: false,\n showEditDialog: false,\n // 当前操作的渠道\n currentChannelType: '',\n currentChannelIndex: -1,\n currentChannel: null,\n editChannel: {},\n // 新增渠道表单\n newChannel: {\n type: '',\n name: '',\n enabled: true,\n // Telegram\n botToken: '',\n chatId: '',\n proxyUrl: '',\n // S3\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n // Discord\n channelId: '',\n isNitro: false,\n // HuggingFace\n repo: '',\n token: '',\n isPrivate: false,\n // WebDAV\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n },\n // 容量统计数据\n quotaStats: {},\n quotaLoading: false,\n // 加载状态\n loading: false\n };\n },\n computed: {\n // 筛选下拉框选项\n filterOptions() {\n const iconMap = {\n telegram: 'paper-plane',\n cfr2: 'cloud',\n s3: 'database',\n discord: 'comments',\n huggingface: 'robot',\n webdav: 'folder'\n };\n return [{\n value: '',\n label: this.$t('common.all')\n }, ...this.channels.map(ch => ({\n value: ch.value,\n label: ch.label,\n icon: iconMap[ch.value] || 'server'\n }))];\n },\n // 根据筛选条件过滤渠道类型\n filteredChannels() {\n if (!this.channelFilter) {\n return this.channels;\n }\n return this.channels.filter(ch => ch.value === this.channelFilter);\n },\n addRules() {\n return {\n type: [{\n required: true,\n message: this.$t('sysUpload.channelTypePlaceholder'),\n trigger: 'change'\n }],\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n },\n editRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }, {\n pattern: /^[\\u4e00-\\u9fa5a-zA-Z0-9_-]+$/,\n message: this.$t('sysUpload.channelNamePlaceholder'),\n trigger: 'blur'\n }],\n botToken: [{\n required: true,\n message: this.$t('sysUpload.botTokenPlaceholder'),\n trigger: 'blur'\n }],\n chatId: [{\n required: true,\n message: this.$t('sysUpload.chatIdPlaceholder'),\n trigger: 'blur'\n }],\n channelId: [{\n required: true,\n message: this.$t('sysUpload.channelIdPlaceholder'),\n trigger: 'blur'\n }],\n endpoint: [{\n required: true,\n message: this.$t('sysUpload.endpointPlaceholder'),\n trigger: 'blur'\n }],\n bucketName: [{\n required: true,\n message: this.$t('sysUpload.bucketNamePlaceholder'),\n trigger: 'blur'\n }],\n region: [{\n required: true,\n message: this.$t('sysUpload.bucketRegionPlaceholder'),\n trigger: 'blur'\n }],\n accessKeyId: [{\n required: true,\n message: this.$t('sysUpload.accessKeyIdPlaceholder'),\n trigger: 'blur'\n }],\n secretAccessKey: [{\n required: true,\n message: this.$t('sysUpload.secretAccessKeyPlaceholder'),\n trigger: 'blur'\n }],\n repo: [{\n required: true,\n message: this.$t('sysUpload.repoNamePlaceholder'),\n trigger: 'blur'\n }],\n token: [{\n required: true,\n message: this.$t('sysUpload.accessTokenPlaceholder'),\n trigger: 'blur'\n }],\n baseUrl: [{\n required: true,\n message: this.$t('sysUpload.webdavBaseUrlPlaceholder'),\n trigger: 'blur'\n }]\n };\n }\n },\n methods: {\n // 卡片光斑跟随鼠标\n handleCardMouseMove(event, channelType, index) {\n const card = event.currentTarget;\n const rect = card.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '1';\n glowEl[0].style.left = `${x}px`;\n glowEl[0].style.top = `${y}px`;\n }\n },\n handleCardMouseLeave(channelType, index) {\n const refKey = `glow-${channelType}-${index}`;\n const glowEl = this.$refs[refKey];\n if (glowEl && glowEl[0]) {\n glowEl[0].style.opacity = '0';\n }\n },\n // 获取渠道图标\n getChannelIcon(type) {\n const icons = {\n telegram: 'paper-plane',\n cfr2: 'cloud',\n s3: 'database',\n discord: 'comments',\n huggingface: 'robot',\n webdav: 'folder'\n };\n return icons[type] || 'server';\n },\n // 获取渠道类型标签\n getChannelTypeLabel(type) {\n const channel = this.channels.find(c => c.value === type);\n return channel ? channel.label : type;\n },\n // 获取渠道列表\n getChannelList(type) {\n return this.getSettings(type)?.channels || [];\n },\n // 获取渠道设置对象\n getSettings(type) {\n const map = {\n telegram: this.telegramSettings,\n cfr2: this.cfr2Settings,\n s3: this.s3Settings,\n discord: this.discordSettings,\n huggingface: this.huggingfaceSettings,\n webdav: this.webdavSettings\n };\n return map[type];\n },\n // 是否有负载均衡选项\n hasLoadBalance(type) {\n return ['telegram', 's3', 'discord', 'huggingface', 'webdav'].includes(type);\n },\n // 文本脱敏\n maskText(text, showLength = 4) {\n if (!text) return this.$t('sysUpload.notSet');\n if (text.length <= showLength * 2) return '****';\n return text.slice(0, showLength) + '****' + text.slice(-showLength);\n },\n formatHeaders(headers) {\n if (!headers || typeof headers === 'object' && Object.keys(headers).length === 0) {\n return this.$t('sysUpload.notSet');\n }\n if (typeof headers === 'string') {\n return headers;\n }\n return JSON.stringify(headers, null, 2);\n },\n headersToText(headers) {\n if (!headers) return '';\n if (typeof headers === 'string') return headers;\n return JSON.stringify(headers, null, 2);\n },\n parseHeadersText(text) {\n if (!text || !text.trim()) return {};\n try {\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return null;\n }\n return parsed;\n } catch (error) {\n return null;\n }\n },\n // 打开详情弹窗\n openDetailDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n this.currentChannel = this.getChannelList(type)[index];\n this.showDetailDialog = true;\n },\n // 打开编辑弹窗\n openEditDialog(type, index) {\n this.currentChannelType = type;\n this.currentChannelIndex = index;\n const channel = this.getChannelList(type)[index];\n this.editChannel = JSON.parse(JSON.stringify(channel));\n if (type === 'webdav') {\n this.editChannel.headersText = this.headersToText(this.editChannel.headers);\n this.editChannel.createDirectory = this.editChannel.createDirectory !== false;\n }\n // 确保 quota 对象存在\n if (!this.editChannel.quota) {\n this.editChannel.quota = {\n enabled: false,\n limitGB: 10,\n threshold: 95\n };\n }\n this.showEditDialog = true;\n },\n // 从详情页打开编辑\n openEditFromDetail() {\n this.showDetailDialog = false;\n this.openEditDialog(this.currentChannelType, this.currentChannelIndex);\n },\n // 重置添加表单\n resetAddForm() {\n this.newChannel = {\n type: '',\n name: '',\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 重置详情弹窗数据\n resetDetailData() {\n this.currentChannel = null;\n },\n // 重置编辑弹窗数据\n resetEditData() {\n this.editChannel = {};\n },\n // 渠道类型变更时重置表单\n onChannelTypeChange() {\n // 保留 type 和 name,重置其他字段\n const {\n type,\n name\n } = this.newChannel;\n this.newChannel = {\n type,\n name,\n enabled: true,\n botToken: '',\n chatId: '',\n proxyUrl: '',\n endpoint: '',\n cdnDomain: '',\n bucketName: '',\n region: 'auto',\n accessKeyId: '',\n secretAccessKey: '',\n pathStyle: false,\n quota: {\n enabled: false,\n limitGB: 10,\n threshold: 95\n },\n channelId: '',\n isNitro: false,\n repo: '',\n token: '',\n isPrivate: false,\n baseUrl: '',\n username: '',\n password: '',\n publicUrl: '',\n headersText: '',\n createDirectory: true\n };\n },\n // 确认添加渠道\n confirmAddChannel() {\n this.$refs.addForm.validate(valid => {\n if (!valid) return;\n const {\n type,\n name\n } = this.newChannel;\n const settings = this.getSettings(type);\n\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env', 'WebDAV_env'];\n if (reservedNames.includes(name)) {\n this.$message.warning(this.$t('sysUpload.reservedName'));\n return;\n }\n\n // 检查名称是否重复\n const isDuplicate = settings.channels.some(ch => ch.name === name);\n if (isDuplicate) {\n this.$message.warning(this.$t('sysUpload.duplicateName'));\n return;\n }\n let newChannelData = {\n id: settings.channels.length + 1,\n name: this.newChannel.name,\n type: type,\n savePath: 'database',\n enabled: true,\n fixed: false\n };\n\n // 根据类型添加特定字段\n if (type === 'telegram') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n chatId: this.newChannel.chatId,\n proxyUrl: this.newChannel.proxyUrl\n });\n } else if (type === 's3') {\n Object.assign(newChannelData, {\n endpoint: this.newChannel.endpoint,\n cdnDomain: this.newChannel.cdnDomain,\n bucketName: this.newChannel.bucketName,\n region: this.newChannel.region,\n accessKeyId: this.newChannel.accessKeyId,\n secretAccessKey: this.newChannel.secretAccessKey,\n pathStyle: this.newChannel.pathStyle,\n quota: {\n ...this.newChannel.quota\n }\n });\n } else if (type === 'discord') {\n Object.assign(newChannelData, {\n botToken: this.newChannel.botToken,\n channelId: this.newChannel.channelId,\n proxyUrl: this.newChannel.proxyUrl,\n isNitro: this.newChannel.isNitro\n });\n } else if (type === 'huggingface') {\n Object.assign(newChannelData, {\n repo: this.newChannel.repo,\n token: this.newChannel.token,\n isPrivate: this.newChannel.isPrivate\n });\n } else if (type === 'webdav') {\n const headers = this.parseHeadersText(this.newChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n Object.assign(newChannelData, {\n baseUrl: this.newChannel.baseUrl,\n username: this.newChannel.username,\n password: this.newChannel.password,\n publicUrl: this.newChannel.publicUrl,\n headers,\n createDirectory: this.newChannel.createDirectory !== false,\n quota: {\n ...this.newChannel.quota\n }\n });\n }\n settings.channels.push(newChannelData);\n this.showAddDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 确认编辑渠道\n confirmEditChannel() {\n this.$refs.editForm.validate(valid => {\n if (!valid) return;\n const settings = this.getSettings(this.currentChannelType);\n const newName = this.editChannel.name;\n const currentIndex = this.currentChannelIndex;\n const isFixedChannel = this.editChannel.fixed;\n\n // 非环境变量渠道才检查名称\n if (!isFixedChannel) {\n // 检查是否为保留名称({type}_env)\n const reservedNames = ['Telegram_env', 'R2_env', 'S3_env', 'Discord_env', 'HuggingFace_env', 'WebDAV_env'];\n if (reservedNames.includes(newName)) {\n this.$message.warning(this.$t('sysUpload.reservedName'));\n return;\n }\n\n // 检查名称是否与其他渠道重复(排除当前编辑的渠道)\n const isDuplicate = settings.channels.some((ch, idx) => idx !== currentIndex && ch.name === newName);\n if (isDuplicate) {\n this.$message.warning(this.$t('sysUpload.duplicateName'));\n return;\n }\n }\n const editedChannel = {\n ...this.editChannel\n };\n if (this.currentChannelType === 'webdav') {\n const headers = this.parseHeadersText(editedChannel.headersText);\n if (headers === null) {\n this.$message.warning(this.$t('sysUpload.webdavHeadersInvalid'));\n return;\n }\n editedChannel.headers = headers;\n editedChannel.createDirectory = editedChannel.createDirectory !== false;\n delete editedChannel.headersText;\n }\n settings.channels[this.currentChannelIndex] = editedChannel;\n this.showEditDialog = false;\n // 自动保存全部设置\n this.saveSettings();\n });\n },\n // 删除渠道\n deleteChannel(type, index) {\n const channel = this.getChannelList(type)[index];\n if (channel.fixed) {\n this.$message.warning(this.$t('sysUpload.fixedChannelCannotDelete'));\n return;\n }\n this.$confirm(this.$t('sysUpload.deleteChannelConfirm'), this.$t('common.info'), {\n confirmButtonText: this.$t('common.confirm'),\n cancelButtonText: this.$t('common.cancel'),\n type: 'warning'\n }).then(() => {\n const settings = this.getSettings(type);\n settings.channels.splice(index, 1);\n // 重新调整 id\n settings.channels.forEach((item, i) => {\n item.id = i + 1;\n });\n // 自动保存\n this.saveSettings();\n }).catch(() => {});\n },\n saveSettings() {\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 webdav: this.webdavSettings\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(this.$t('sysOthers.settingsSaved'));\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(this.$t('sysUpload.quotaInitConfirm'), this.$t('sysUpload.quotaInitTitle'), {\n confirmButtonText: this.$t('sysUpload.quotaInitConfirmBtn'),\n cancelButtonText: this.$t('sysUpload.quotaInitCancelBtn'),\n type: 'info'\n }).then(async () => {\n await this.recalculateQuota();\n }).catch(() => {\n this.$message.info(this.$t('sysUpload.quotaInitLater'));\n });\n }\n }\n },\n // 重新统计容量\n async recalculateQuota() {\n this.quotaLoading = true;\n try {\n this.$message.info(this.$t('sysUpload.quotaCalculating'));\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(this.$t('sysUpload.quotaCalculateSuccess'));\n } else {\n this.$message.error(this.$t('sysUpload.quotaCalculateError') + (data.error || ''));\n }\n } catch (error) {\n console.error('Failed to recalculate quota:', error);\n this.$message.error(this.$t('sysUpload.quotaCalculateFailed'));\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 // 确保 WebDAV 渠道有默认值\n if (data.webdav && data.webdav.channels) {\n data.webdav.channels = data.webdav.channels.map(channel => ({\n ...channel,\n username: channel.username || '',\n password: channel.password || '',\n publicUrl: channel.publicUrl || '',\n headers: channel.headers || {},\n createDirectory: channel.createDirectory !== false,\n quota: channel.quota || {\n enabled: false,\n limitGB: 10,\n threshold: 95\n }\n }));\n }\n this.webdavSettings = data.webdav || {\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=d225d330&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=d225d330&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-d225d330\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, vShow as _vShow, normalizeClass as _normalizeClass, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx } from \"vue\";\nconst _hoisted_1 = {\n class: \"save-text\"\n};\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_font_awesome_icon = _resolveComponent(\"font-awesome-icon\");\n return _openBlock(), _createBlock(_Transition, {\n name: \"fade-up\"\n }, {\n default: _withCtx(() => [_withDirectives(_createElementVNode(\"div\", {\n class: _normalizeClass([\"floating-save-btn\", {\n 'is-loading': $props.loading\n }]),\n onClick: _cache[0] || (_cache[0] = (...args) => $options.handleClick && $options.handleClick(...args))\n }, [$props.loading ? (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 0,\n icon: \"spinner\",\n spin: \"\"\n })) : (_openBlock(), _createBlock(_component_font_awesome_icon, {\n key: 1,\n icon: \"save\"\n })), _createElementVNode(\"span\", _hoisted_1, _toDisplayString($props.loading ? _ctx.$t('floatingSave.saving') : _ctx.$t('floatingSave.save')), 1)], 2), [[_vShow, $data.visible]])]),\n _: 1\n });\n}","export default {\n name: 'FloatingSaveButton',\n emits: ['click'],\n props: {\n loading: {\n type: Boolean,\n default: false\n },\n show: {\n type: Boolean,\n default: true\n }\n },\n data() {\n return {\n visible: false\n };\n },\n watch: {\n show: {\n immediate: true,\n handler(val) {\n if (val) {\n // 延迟显示,等待 Element Plus 加载遮罩淡出动画完成\n setTimeout(() => {\n this.visible = true;\n }, 600);\n } else {\n this.visible = false;\n }\n }\n }\n },\n methods: {\n handleClick() {\n if (!this.loading) {\n this.$emit('click');\n }\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./FloatingSaveButton.vue?vue&type=template&id=53091626&scoped=true\"\nimport script from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\nexport * from \"./FloatingSaveButton.vue?vue&type=script&lang=js\"\n\nimport \"./FloatingSaveButton.vue?vue&type=style&index=0&id=53091626&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-53091626\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, createVNode as _createVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, Transition as _Transition, 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: \"first-title\"\n};\nconst _hoisted_4 = {\n class: \"second-title\"\n};\nconst _hoisted_5 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_6 = {\n class: \"second-title\"\n};\nconst _hoisted_7 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"8px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_8 = {\n class: \"second-title token-title\"\n};\nconst _hoisted_9 = {\n class: \"token-actions\"\n};\nconst _hoisted_10 = {\n class: \"token-table-container\"\n};\nconst _hoisted_11 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_12 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_13 = {\n class: \"token-display\"\n};\nconst _hoisted_14 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_15 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_16 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_17 = {\n class: \"table-cell-content\"\n};\nconst _hoisted_18 = {\n class: \"table-cell-content action-buttons\"\n};\nconst _hoisted_19 = {\n class: \"first-settings\"\n};\nconst _hoisted_20 = {\n class: \"first-title\"\n};\nconst _hoisted_21 = {\n class: \"second-title\"\n};\nconst _hoisted_22 = {\n class: \"first-settings\"\n};\nconst _hoisted_23 = {\n class: \"first-title\"\n};\nconst _hoisted_24 = {\n class: \"second-title\"\n};\nconst _hoisted_25 = {\n class: \"second-title\"\n};\nconst _hoisted_26 = {\n class: \"second-title\"\n};\nconst _hoisted_27 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_28 = {\n class: \"form-item-hint\"\n};\nconst _hoisted_29 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_30 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_31 = {\n style: {\n \"display\": \"flex\",\n \"gap\": \"10px\",\n \"width\": \"100%\"\n }\n};\nconst _hoisted_32 = {\n class: \"dialog-footer\"\n};\nconst _hoisted_33 = {\n class: \"token-result\"\n};\nconst _hoisted_34 = {\n style: {\n \"margin-bottom\": \"15px\",\n \"color\": \"#e6a23c\"\n }\n};\nconst _hoisted_35 = {\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_checkbox = _resolveComponent(\"el-checkbox\");\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_input_number = _resolveComponent(\"el-input-number\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\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, [_createElementVNode(\"h3\", _hoisted_3, _toDisplayString(_ctx.$t('sysSecurity.authManagement')), 1), _createElementVNode(\"h4\", _hoisted_4, _toDisplayString(_ctx.$t('sysSecurity.userAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.user,\n rules: $options.userPassRules,\n ref: \"userPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.uploadPassword'),\n prop: \"authCode\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_5, [_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 placeholder: $data.authSettings.user._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearUserPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.user._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearUserPassword,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.clearUserPassword = $event),\n onChange: $options.handleClearUserPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showUserPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\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[2] || (_cache[2] = $event => $data.authSettings.user.confirmNewUserPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_6, _toDisplayString(_ctx.$t('sysSecurity.adminAuth')), 1), _createVNode(_component_el_form, {\n model: $data.authSettings.admin,\n rules: $options.adminPassRules,\n ref: \"adminPassForm\",\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminUsername'),\n prop: \"adminUsername\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminUsername,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $data.authSettings.admin.adminUsername = $event),\n autocomplete: \"new-password\",\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminPassword'),\n prop: \"adminPassword\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_7, [_createVNode(_component_el_input, {\n modelValue: $data.authSettings.admin.adminPassword,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.authSettings.admin.adminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n onInput: $options.handleAdminPassInput,\n autocomplete: \"new-password\",\n placeholder: $data.authSettings.admin._hasPassword ? _ctx.$t('sysSecurity.passwordUnchanged') : '',\n disabled: $data.clearAdminPassword\n }, null, 8, [\"modelValue\", \"onInput\", \"placeholder\", \"disabled\"]), $data.authSettings.admin._hasPassword ? (_openBlock(), _createBlock(_component_el_checkbox, {\n key: 0,\n modelValue: $data.clearAdminPassword,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $data.clearAdminPassword = $event),\n onChange: $options.handleClearAdminPassword\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.clearPassword')), 1)]),\n _: 1\n }, 8, [\"modelValue\", \"onChange\"])) : _createCommentVNode(\"\", true)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_Transition, {\n name: \"fade-slide\",\n mode: \"out-in\"\n }, {\n default: _withCtx(() => [$data.showAdminPassConfirm ? (_openBlock(), _createBlock(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.confirmPassword'),\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[6] || (_cache[6] = $event => $data.authSettings.admin.confirmNewAdminPassword = $event),\n type: \"password\",\n \"show-password\": \"\",\n autocomplete: \"new-password\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\", \"rules\"]), _createElementVNode(\"h4\", _hoisted_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.apiTokenManagement')) + \" \", 1), _createElementVNode(\"a\", _hoisted_9, [_createVNode(_component_el_button, {\n type: \"primary\",\n size: \"small\",\n onClick: _cache[7] || (_cache[7] = $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_10, [_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: _ctx.$t('sysSecurity.tokenName'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_11, _toDisplayString(scope.row.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"token\",\n label: _ctx.$t('sysSecurity.tokenValue'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_12, [_createElementVNode(\"span\", _hoisted_13, _toDisplayString(scope.row.token), 1)])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"permissions\",\n label: _ctx.$t('sysSecurity.permissions'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_14, [(_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 }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n prop: \"createdAt\",\n label: _ctx.$t('sysSecurity.createdAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_15, _toDisplayString($options.formatDate(scope.row.createdAt)), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.status'),\n \"header-align\": \"center\",\n width: \"90\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_16, [_createVNode(_component_el_tag, {\n type: $options.getTokenStatus(scope.row.expiresAt).status === 'active' ? 'success' : 'danger',\n size: \"small\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString($options.getTokenStatus(scope.row.expiresAt).label), 1)]),\n _: 2\n }, 1032, [\"type\"])])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.expiresAt'),\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_17, _toDisplayString($options.getTokenStatus(scope.row.expiresAt).expiresText), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_table_column, {\n label: _ctx.$t('sysSecurity.operation'),\n fixed: \"right\",\n \"header-align\": \"center\"\n }, {\n default: _withCtx(scope => [_createElementVNode(\"div\", _hoisted_18, [_createVNode(_component_el_button, {\n class: \"action-button\",\n size: \"small\",\n onClick: $event => $options.editToken(scope.row)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.editBtn')), 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(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.deleteBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"data\"])), [[_directive_loading, $data.tokenLoading]])])]), _createElementVNode(\"div\", _hoisted_19, [_createElementVNode(\"h3\", _hoisted_20, _toDisplayString(_ctx.$t('sysSecurity.uploadManagement')), 1), _createElementVNode(\"h4\", _hoisted_21, [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.imageReview')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.imageReviewTooltip'),\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 }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.uploadSettings.moderate,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.enableReview')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.uploadSettings.moderate.enabled,\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $data.uploadSettings.moderate.enabled = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.reviewChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.uploadSettings.moderate.channel,\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $data.uploadSettings.moderate.channel = $event),\n placeholder: _ctx.$t('sysSecurity.reviewChannelPlaceholder')\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\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.uploadSettings.moderate.channel === 'moderatecontent.com' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.apiKey')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.moderateContentApiKey,\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $data.uploadSettings.moderate.moderateContentApiKey = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), $data.uploadSettings.moderate.channel === 'nsfwjs' ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.apiPath')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.uploadSettings.moderate.nsfwApiPath,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.uploadSettings.moderate.nsfwApiPath = $event),\n placeholder: \"https://nsfwjs.your.domain\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createElementVNode(\"div\", _hoisted_22, [_createElementVNode(\"h3\", _hoisted_23, _toDisplayString(_ctx.$t('sysSecurity.accessManagement')), 1), _createElementVNode(\"h4\", _hoisted_24, _toDisplayString(_ctx.$t('sysSecurity.domainFilter')), 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(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.allowedDomains')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.allowedDomainsTooltip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.accessSettings.allowedDomains,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.accessSettings.allowedDomains = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_25, _toDisplayString(_ctx.$t('sysSecurity.whiteListMode')), 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(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.enableWhiteList')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.enableWhiteListTooltip'),\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\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.whiteListMode,\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $data.accessSettings.whiteListMode = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n })]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h4\", _hoisted_26, _toDisplayString(_ctx.$t('sysSecurity.sessionSecurityPolicy')), 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(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.secureMode')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysSecurity.secureModeTooltip'),\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 }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.accessSettings.sessionSecure,\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $data.accessSettings.sessionSecure = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.userSessionMaxAge')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.userSessionMaxAge,\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $data.accessSettings.userSessionMaxAge = $event),\n min: 1,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_27, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.adminSessionMaxAge')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input_number, {\n modelValue: $data.accessSettings.adminSessionMaxAge,\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $data.accessSettings.adminSessionMaxAge = $event),\n min: 1,\n step: 1,\n precision: 0,\n \"controls-position\": \"right\"\n }, null, 8, [\"modelValue\"]), _createElementVNode(\"span\", _hoisted_28, _toDisplayString(_ctx.$t('sysSecurity.sessionMaxAgeUnit')), 1)]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showCreateTokenDialog,\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $data.showCreateTokenDialog = $event),\n title: _ctx.$t('sysSecurity.createTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_30, [_createVNode(_component_el_button, {\n onClick: _cache[23] || (_cache[23] = $event => $data.showCreateTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.createToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.createBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.newToken,\n rules: $options.tokenRules,\n ref: \"tokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel'),\n prop: \"name\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.newToken.name,\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $data.newToken.name = $event),\n placeholder: _ctx.$t('sysSecurity.tokenNamePlaceholder')\n }, null, 8, [\"modelValue\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.newToken.permissions,\n \"onUpdate:modelValue\": _cache[18] || (_cache[18] = $event => $data.newToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.neverExpire,\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $data.newToken.neverExpire = $event),\n onChange: $options.onCreateNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_29, [_createVNode(_component_el_input_number, {\n modelValue: $data.newToken.expirationValue,\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $data.newToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.newToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $data.newToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.newToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.newToken.autoDelete,\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $data.newToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showEditTokenDialog,\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $data.showEditTokenDialog = $event),\n title: _ctx.$t('sysSecurity.editTokenTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_32, [_createVNode(_component_el_button, {\n onClick: _cache[31] || (_cache[31] = $event => $data.showEditTokenDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('common.cancel')), 1)]),\n _: 1\n }), _createVNode(_component_el_button, {\n type: \"primary\",\n onClick: $options.updateToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.updateBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])])]),\n default: _withCtx(() => [_createVNode(_component_el_form, {\n model: $data.editingToken,\n rules: $options.editTokenRules,\n ref: \"editTokenForm\",\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.editingToken.name,\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $data.editingToken.name = $event),\n disabled: \"\"\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.permissionsLabel'),\n prop: \"permissions\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox_group, {\n modelValue: $data.editingToken.permissions,\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $data.editingToken.permissions = $event)\n }, {\n default: _withCtx(() => [_createVNode(_component_el_checkbox, {\n label: \"upload\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permUpload')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"delete\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permDelete')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"list\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permList')), 1)]),\n _: 1\n }), _createVNode(_component_el_checkbox, {\n label: \"manage\"\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.permManage')), 1)]),\n _: 1\n })]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.neverExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.neverExpire,\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $data.editingToken.neverExpire = $event),\n onChange: $options.onEditNeverExpireChange\n }, null, 8, [\"modelValue\", \"onChange\"])]),\n _: 1\n }, 8, [\"label\"]), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysSecurity.validPeriod'),\n prop: \"expirationValue\"\n }, {\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_31, [_createVNode(_component_el_input_number, {\n modelValue: $data.editingToken.expirationValue,\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $data.editingToken.expirationValue = $event),\n min: 1,\n step: 1,\n \"controls-position\": \"right\",\n style: {\n \"flex\": \"1\"\n }\n }, null, 8, [\"modelValue\"]), _createVNode(_component_el_select, {\n modelValue: $data.editingToken.expirationUnit,\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $data.editingToken.expirationUnit = $event),\n style: {\n \"width\": \"100px\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($data.timeUnitOptions, opt => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: opt.value,\n label: _ctx.$t(opt.labelKey),\n value: opt.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\"])])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true), !$data.editingToken.neverExpire ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 1,\n label: _ctx.$t('sysSecurity.autoDeleteOnExpire')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.editingToken.autoDelete,\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $data.editingToken.autoDelete = $event)\n }, null, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\", \"rules\"])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"]), _createVNode(_component_el_dialog, {\n modelValue: $data.showTokenResultDialog,\n \"onUpdate:modelValue\": _cache[35] || (_cache[35] = $event => $data.showTokenResultDialog = $event),\n title: _ctx.$t('sysSecurity.tokenCreatedTitle'),\n width: $options.dialogWidth\n }, {\n footer: _withCtx(() => [_createElementVNode(\"span\", _hoisted_35, [_createVNode(_component_el_button, {\n type: \"primary\",\n onClick: _cache[34] || (_cache[34] = $event => $data.showTokenResultDialog = false)\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.savedBtn')), 1)]),\n _: 1\n })])]),\n default: _withCtx(() => [_createElementVNode(\"div\", _hoisted_33, [_createElementVNode(\"p\", _hoisted_34, [_createVNode(_component_font_awesome_icon, {\n icon: \"exclamation-triangle\",\n style: {\n \"margin-right\": \"5px\"\n }\n }), _createTextVNode(\" \" + _toDisplayString(_ctx.$t('sysSecurity.tokenCreatedWarning')), 1)]), _createVNode(_component_el_form, {\n \"label-width\": \"100px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.tokenNameLabel')\n }, {\n default: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString($data.createdToken.name), 1)]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysSecurity.fullToken')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.createdToken.token,\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $data.createdToken.token = $event),\n readonly: \"\"\n }, {\n append: _withCtx(() => [_createVNode(_component_el_button, {\n onClick: $options.copyToken\n }, {\n default: _withCtx(() => [_createTextVNode(_toDisplayString(_ctx.$t('sysSecurity.copyBtn')), 1)]),\n _: 1\n }, 8, [\"onClick\"])]),\n _: 1\n }, 8, [\"modelValue\"])]),\n _: 1\n }, 8, [\"label\"])]),\n _: 1\n })])]),\n _: 1\n }, 8, [\"modelValue\", \"title\", \"width\"])])), [[_directive_loading, $data.loading]]);\n}","/**\r\n * Token 过期时间工具模块\r\n * 提供 Token 有效期计算、状态判定和向后兼容默认值填充功能\r\n */\r\n\r\n/**\r\n * 时间单位到毫秒的映射(月和年需要特殊处理)\r\n */\r\nconst SIMPLE_UNIT_MS = {\r\n s: 1000,\r\n m: 60 * 1000,\r\n h: 60 * 60 * 1000,\r\n d: 24 * 60 * 60 * 1000,\r\n};\r\n\r\n/**\r\n * 根据基准时间、数值和时间单位计算过期时间\r\n * @param {Date|string} baseTime - 基准时间(Date 对象或 ISO 8601 字符串)\r\n * @param {number} value - 正整数有效期数值\r\n * @param {string} unit - 时间单位:'s','m','h','d','M','Y'\r\n * @returns {string} 过期时间 ISO 8601 字符串\r\n * @throws {Error} 当 value <= 0 或 unit 无效时抛出错误\r\n */\r\nexport function computeExpiresAt(baseTime, value, unit) {\r\n if (!Number.isFinite(value) || value <= 0) {\r\n throw new Error('有效期数值必须大于 0');\r\n }\r\n\r\n const base = typeof baseTime === 'string' ? new Date(baseTime) : new Date(baseTime.getTime());\r\n\r\n if (SIMPLE_UNIT_MS[unit]) {\r\n return new Date(base.getTime() + value * SIMPLE_UNIT_MS[unit]).toISOString();\r\n }\r\n\r\n if (unit === 'M') {\r\n base.setUTCMonth(base.getUTCMonth() + value);\r\n return base.toISOString();\r\n }\r\n\r\n if (unit === 'Y') {\r\n base.setUTCFullYear(base.getUTCFullYear() + value);\r\n return base.toISOString();\r\n }\r\n\r\n throw new Error(`无效的时间单位: ${unit}`);\r\n}\r\n\r\n\r\n/**\r\n * 格式化过期时间为可读字符串\r\n * @param {string} isoString - ISO 8601 时间字符串\r\n * @returns {string} 格式化后的时间字符串\r\n */\r\nfunction formatExpiresTime(isoString) {\r\n const date = new Date(isoString);\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hours = String(date.getHours()).padStart(2, '0');\r\n const minutes = String(date.getMinutes()).padStart(2, '0');\r\n const seconds = String(date.getSeconds()).padStart(2, '0');\r\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\r\n}\r\n\r\n/**\r\n * 获取 Token 的状态信息\r\n * @param {string|null} expiresAt - 过期时间 ISO 8601 字符串,null 表示永不过期\r\n * @param {Date} [now=new Date()] - 当前时间\r\n * @returns {{ status: 'active'|'expired', label: '有效'|'已过期', expiresText: string }}\r\n */\r\nexport function getTokenStatus(expiresAt, now = new Date()) {\r\n if (expiresAt === null || expiresAt === undefined) {\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: '永不过期',\r\n };\r\n }\r\n\r\n const expiresDate = new Date(expiresAt);\r\n const currentTime = now instanceof Date ? now : new Date(now);\r\n const formattedTime = formatExpiresTime(expiresAt);\r\n\r\n if (currentTime.getTime() > expiresDate.getTime()) {\r\n return {\r\n status: 'expired',\r\n label: '已过期',\r\n expiresText: formattedTime,\r\n };\r\n }\r\n\r\n return {\r\n status: 'active',\r\n label: '有效',\r\n expiresText: formattedTime,\r\n };\r\n}\r\n\r\n\r\n/**\r\n * 为缺少过期相关字段的旧 Token 数据填充默认值\r\n * @param {Object} tokenData - Token 数据对象\r\n * @returns {Object} 填充默认值后的新 Token 数据对象\r\n */\r\nexport function applyTokenDefaults(tokenData) {\r\n return {\r\n ...tokenData,\r\n expiresAt: tokenData.expiresAt ?? null,\r\n autoDelete: tokenData.autoDelete ?? false,\r\n };\r\n}\r\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';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nimport { computeExpiresAt, getTokenStatus } from '@/utils/tokenExpiration';\nexport default {\n components: {\n FloatingSaveButton\n },\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: true,\n tokenLoading: false,\n // 修改密码相关\n oriUserPassword: '',\n // 原上传密码\n oriAdminPassword: '',\n // 原管理端密码\n\n showUserPassConfirm: false,\n // 显示用户密码确认框\n showAdminPassConfirm: false,\n // 显示管理密码确认框\n clearUserPassword: false,\n // 清除用户密码开关\n clearAdminPassword: false,\n // 清除管理密码开关\n\n // Token对话框相关\n showCreateTokenDialog: false,\n showEditTokenDialog: false,\n showTokenResultDialog: false,\n timeUnitOptions: [{\n labelKey: 'sysSecurity.timeUnitSeconds',\n value: 's'\n }, {\n labelKey: 'sysSecurity.timeUnitMinutes',\n value: 'm'\n }, {\n labelKey: 'sysSecurity.timeUnitHours',\n value: 'h'\n }, {\n labelKey: 'sysSecurity.timeUnitDays',\n value: 'd'\n }, {\n labelKey: 'sysSecurity.timeUnitMonths',\n value: 'M'\n }, {\n labelKey: 'sysSecurity.timeUnitYears',\n value: 'Y'\n }],\n newToken: {\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n editingToken: {\n id: '',\n name: '',\n owner: '',\n permissions: [],\n neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n },\n createdToken: {\n name: '',\n token: ''\n }\n };\n },\n computed: {\n dialogWidth() {\n return window.innerWidth > 768 ? '50%' : '90%';\n },\n userPassRules() {\n return {\n authCode: [{\n validator: (rule, value, callback) => {\n const urlReservedChars = ['%', '&', '?', '#', '/'];\n const hasReservedChar = urlReservedChars.some(char => value && value.includes(char));\n if (hasReservedChar) {\n callback(new Error(this.$t('sysSecurity.passwordUrlReserved')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }],\n confirmNewUserPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmUploadPassword')));\n } else if (value !== this.authSettings.user.authCode) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n adminPassRules() {\n return {\n confirmNewAdminPassword: [{\n validator: (rule, value, callback) => {\n if (!value) {\n callback(new Error(this.$t('sysSecurity.confirmAdminPassword')));\n } else if (value !== this.authSettings.admin.adminPassword) {\n callback(new Error(this.$t('sysSecurity.passwordMismatch')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n tokenRules() {\n return {\n name: [{\n required: true,\n message: this.$t('sysSecurity.tokenNameRequired'),\n trigger: 'blur'\n }],\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.newToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\n },\n editTokenRules() {\n return {\n permissions: [{\n required: true,\n message: this.$t('sysSecurity.permissionsRequired'),\n trigger: 'change'\n }],\n expirationValue: [{\n validator: (rule, value, callback) => {\n if (!this.editingToken.neverExpire && (!value || value <= 0)) {\n callback(new Error(this.$t('sysSecurity.validPeriodRequired')));\n } else {\n callback();\n }\n },\n trigger: 'blur'\n }]\n };\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 handleClearUserPassword(checked) {\n if (checked) {\n this.authSettings.user.authCode = '';\n this.showUserPassConfirm = false;\n }\n },\n handleClearAdminPassword(checked) {\n if (checked) {\n this.authSettings.admin.adminPassword = '';\n this.authSettings.admin.adminUsername = '';\n this.showAdminPassConfirm = false;\n }\n },\n // Token相关方法\n getPermissionText(permission) {\n const permissionMap = {\n 'upload': this.$t('sysSecurity.permUpload'),\n 'delete': this.$t('sysSecurity.permDelete'),\n 'list': this.$t('sysSecurity.permList'),\n 'manage': this.$t('sysSecurity.permManage')\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(this.$t('sysSecurity.tokenListFailed'));\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\n let expiresAt = null;\n let autoDelete = false;\n if (!this.newToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.newToken.expirationValue, this.newToken.expirationUnit);\n autoDelete = this.newToken.autoDelete;\n }\n const response = await fetchWithAuth('/api/manage/apiTokens', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n name: this.newToken.name,\n owner: this.newToken.owner,\n permissions: this.newToken.permissions,\n expiresAt,\n autoDelete\n })\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 neverExpire: true,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: false\n };\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenCreateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenCreateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenCreateFailed'));\n }\n });\n },\n editToken(token) {\n const hasExpiration = token.expiresAt !== null && token.expiresAt !== undefined;\n this.editingToken = {\n id: token.id,\n name: token.name,\n owner: token.owner,\n permissions: [...token.permissions],\n neverExpire: !hasExpiration,\n expirationValue: 1,\n expirationUnit: 'd',\n autoDelete: token.autoDelete || false\n };\n this.showEditTokenDialog = true;\n },\n updateToken() {\n this.$refs.editTokenForm.validate(async valid => {\n if (!valid) return;\n try {\n let expiresAt = null;\n let autoDelete = false;\n if (!this.editingToken.neverExpire) {\n expiresAt = computeExpiresAt(new Date(), this.editingToken.expirationValue, this.editingToken.expirationUnit);\n autoDelete = this.editingToken.autoDelete;\n }\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 expiresAt,\n autoDelete\n })\n });\n const data = await response.json();\n if (response.ok) {\n this.showEditTokenDialog = false;\n await this.loadApiTokens();\n this.$message.success(this.$t('sysSecurity.tokenUpdateSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenUpdateFailed'));\n }\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.tokenUpdateFailed'));\n }\n });\n },\n async deleteToken(tokenId) {\n try {\n await this.$confirm(this.$t('sysSecurity.tokenDeleteConfirm'), this.$t('sysSecurity.tokenDeleteConfirmTitle'), {\n confirmButtonText: this.$t('sysSecurity.tokenDeleteConfirmOk'),\n cancelButtonText: this.$t('sysSecurity.tokenDeleteConfirmCancel'),\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(this.$t('sysSecurity.tokenDeleteSuccess'));\n } else {\n this.$message.error(data.error || this.$t('sysSecurity.tokenDeleteFailed'));\n }\n } catch (error) {\n if (error !== 'cancel') {\n this.$message.error(this.$t('sysSecurity.tokenDeleteFailed'));\n }\n }\n },\n async copyToken() {\n try {\n await navigator.clipboard.writeText(this.createdToken.token);\n this.$message.success(this.$t('sysSecurity.tokenCopied'));\n } catch (error) {\n this.$message.error(this.$t('sysSecurity.copyFailed'));\n }\n },\n onCreateNeverExpireChange(val) {\n if (val) {\n this.newToken.autoDelete = false;\n }\n },\n onEditNeverExpireChange(val) {\n if (val) {\n this.editingToken.autoDelete = false;\n }\n },\n getTokenStatus(expiresAt) {\n return getTokenStatus(expiresAt);\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\n // 验证会话有效期为大于 0 的正整数\n if (this.accessSettings.userSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.userSessionMaxAge) || this.accessSettings.adminSessionMaxAge < 1 || !Number.isInteger(this.accessSettings.adminSessionMaxAge)) {\n this.$message.error(this.$t('sysSecurity.sessionMaxAgeInvalid'));\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\n // 标记清除密码\n if (this.clearUserPassword) {\n settings.auth.user._clear = true;\n settings.auth.user.authCode = '';\n }\n if (this.clearAdminPassword) {\n settings.auth.admin._clear = true;\n settings.auth.admin.adminPassword = '';\n }\n fetchWithAuth('/api/manage/sysConfig/security', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(settings)\n }).then(res => res.json()).then(data => {\n // 管理端密码变更后,当前会话已被清除,需要重新登录\n if (data.adminPasswordChanged) {\n const msg = this.$t('sysSecurity.adminPasswordChangedRelogin');\n this.$message.warning(msg);\n setTimeout(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n }, 1500);\n return;\n }\n this.$message.success(this.$t('sysSecurity.settingsSaved'));\n // 保存成功后重置密码字段为空(后端已处理)\n this.authSettings.user.authCode = '';\n this.authSettings.admin.adminPassword = '';\n this.oriUserPassword = '';\n this.oriAdminPassword = '';\n // 标记已有密码(如果用户刚设置了密码,且不是清除操作)\n if (settings.auth.user.authCode && !settings.auth.user._clear) {\n this.authSettings.user._hasPassword = true;\n } else if (settings.auth.user._clear) {\n this.authSettings.user._hasPassword = false;\n }\n if (settings.auth.admin.adminPassword && !settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = true;\n } else if (settings.auth.admin._clear) {\n this.authSettings.admin._hasPassword = false;\n }\n this.showUserPassConfirm = false;\n this.showAdminPassConfirm = false;\n this.clearUserPassword = false;\n this.clearAdminPassword = false;\n }).catch(() => {\n // 如果请求过程中 session 已失效导致 fetchWithAuth 跳转,忽略后续错误\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 = '';\n this.oriAdminPassword = '';\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=2962b112&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=2962b112&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-2962b112\"]])\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};\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_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\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($options.localized(setting, 'label')) + \" \", 1), setting.tooltip ? (_openBlock(), _createBlock(_component_el_tooltip, {\n key: 0,\n content: $options.localized(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: $options.localized(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: $options.localizedOption(option),\n value: option.value\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 2\n }, 1032, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'channelName' ? (_openBlock(), _createBlock(_component_el_select, {\n key: 1,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: !$options.currentUploadChannel || $options.currentChannelList.length === 0,\n placeholder: _ctx.$t('sysPage.channelSelectPlaceholder'),\n clearable: \"\",\n style: {\n \"width\": \"100%\"\n }\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.currentChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : setting.type === 'boolean' ? (_openBlock(), _createBlock(_component_el_switch, {\n key: 2,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\"])) : setting.type === 'textarea' ? (_openBlock(), _createBlock(_component_el_input, {\n key: 3,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n type: \"textarea\",\n autosize: {\n minRows: 2\n },\n resize: \"vertical\",\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"])) : (_openBlock(), _createBlock(_component_el_input, {\n key: 4,\n modelValue: setting.value,\n \"onUpdate:modelValue\": $event => setting.value = $event,\n disabled: setting.fixed,\n placeholder: $options.localized(setting, 'placeholder')\n }, null, 8, [\"modelValue\", \"onUpdate:modelValue\", \"disabled\", \"placeholder\"]))]),\n _: 2\n }, 1024);\n }), 128))]),\n _: 2\n }, 1032, [\"model\"])]);\n }), 128)), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"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.find.js\";\nimport \"core-js/modules/es.iterator.for-each.js\";\nimport \"core-js/modules/es.iterator.some.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport axios from '@/utils/axios';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n config: []\n },\n // 加载状态\n loading: true,\n // 可用渠道列表\n availableChannels: {}\n };\n },\n computed: {\n isEn() {\n return this.$i18n.locale === 'en';\n },\n // 根据category将配置项分组\n groupedSettings() {\n const grouped = {};\n if (this.settings.config) {\n this.settings.config.forEach(setting => {\n const category = this.isEn ? setting.category_en || setting.category || this.$t('sysPage.otherSettings') : setting.category || this.$t('sysPage.otherSettings');\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(setting);\n });\n }\n return grouped;\n },\n // 当前选择的上传渠道\n currentUploadChannel() {\n const channelSetting = this.settings.config?.find(s => s.id === 'defaultUploadChannel');\n return channelSetting?.value || '';\n },\n // 当前渠道类型对应的渠道列表\n currentChannelList() {\n return this.availableChannels[this.currentUploadChannel] || [];\n }\n },\n watch: {\n // 监听上传渠道变化,清空渠道名称(如果不在新列表中)\n currentUploadChannel(newVal, oldVal) {\n if (newVal !== oldVal) {\n const channelNameSetting = this.settings.config?.find(s => s.id === 'defaultChannelName');\n if (channelNameSetting) {\n const newChannelList = this.availableChannels[newVal] || [];\n if (!newChannelList.some(ch => ch.name === channelNameSetting.value)) {\n channelNameSetting.value = '';\n }\n }\n }\n }\n },\n methods: {\n localized(item, field) {\n if (this.isEn && item[field + '_en']) return item[field + '_en'];\n return item[field] || '';\n },\n localizedOption(option) {\n if (this.isEn && option.label_en) return option.label_en;\n return option.label;\n },\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(this.$t('sysPage.settingsSaved')));\n },\n // 获取可用渠道列表\n async fetchAvailableChannels() {\n try {\n const response = await axios.get('/api/channels');\n if (response.data) {\n this.availableChannels = response.data;\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\n }\n },\n mounted() {\n this.loading = true;\n // 获取可用渠道列表\n this.fetchAvailableChannels();\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=e4c3a742&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=e4c3a742&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-e4c3a742\"]])\n\nexport default __exports__","import { toDisplayString as _toDisplayString, 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, createBlock as _createBlock, createCommentVNode as _createCommentVNode, resolveDirective as _resolveDirective, 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 = [\"innerHTML\"];\nconst _hoisted_8 = {\n class: \"first-title\"\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_option = _resolveComponent(\"el-option\");\n const _component_el_select = _resolveComponent(\"el-select\");\n const _component_FloatingSaveButton = _resolveComponent(\"FloatingSaveButton\");\n const _directive_loading = _resolveDirective(\"loading\");\n return _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_1, [_createElementVNode(\"div\", _hoisted_2, [_createElementVNode(\"h3\", _hoisted_3, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.remoteTelemetry')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.remoteTelemetryTooltip'),\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 }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.telemetry,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\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 }, 8, [\"label\"])]),\n _: 1\n }, 8, [\"model\"]), _createElementVNode(\"h3\", _hoisted_4, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.cloudflareApiToken')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.cloudflareApiTokenTooltip'),\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 }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.cloudflareApiToken,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.zoneId')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_ZONE_ID,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $data.settings.cloudflareApiToken.CF_ZONE_ID = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.accountEmail')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.cloudflareApiToken.CF_EMAIL,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $data.settings.cloudflareApiToken.CF_EMAIL = $event),\n disabled: $data.settings.cloudflareApiToken.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _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[3] || (_cache[3] = $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_5, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.randomImageApi')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.randomImageApiTooltip'),\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 }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.randomImageAPI,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.randomImageAPI.enabled,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $data.settings.randomImageAPI.enabled = $event),\n disabled: $data.settings.randomImageAPI.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"randomImageAPI.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.directory')), 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.directoryTooltip'),\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 }, 8, [\"content\"])]),\n default: _withCtx(() => [_createVNode(_component_el_input, {\n modelValue: $data.settings.randomImageAPI.allowedDir,\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $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_6, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.publicBrowse')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.publicBrowseTooltip'),\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 }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.publicBrowse,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_switch, {\n modelValue: $data.settings.publicBrowse.enabled,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $data.settings.publicBrowse.enabled = $event),\n disabled: $data.settings.publicBrowse.fixed\n }, null, 8, [\"modelValue\", \"disabled\"])]),\n _: 1\n }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n prop: \"publicBrowse.allowedDir\"\n }, {\n label: _withCtx(() => [_createElementVNode(\"span\", null, _toDisplayString(_ctx.$t('sysOthers.openDirectory')), 1), _createVNode(_component_el_tooltip, {\n placement: \"right\",\n \"raw-content\": \"\"\n }, {\n content: _withCtx(() => [_createElementVNode(\"div\", {\n style: {\n \"max-width\": \"320px\",\n \"line-height\": \"1.6\"\n },\n innerHTML: _ctx.$t('sysOthers.openDirectoryTooltip')\n }, null, 8, _hoisted_7)]),\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[7] || (_cache[7] = $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_8, [_createTextVNode(_toDisplayString(_ctx.$t('sysOthers.webdav')) + \" \", 1), _createVNode(_component_el_tooltip, {\n content: _ctx.$t('sysOthers.webdavTooltip'),\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 }, 8, [\"content\"])]), _createVNode(_component_el_form, {\n model: $data.settings.webDAV,\n \"label-width\": \"120px\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.enable')\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 }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUsername')\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 }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavPassword')\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 }, 8, [\"label\"]), _createVNode(_component_el_form_item, {\n label: _ctx.$t('sysOthers.webdavUploadChannel')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.uploadChannel,\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $data.settings.webDAV.uploadChannel = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('sysOthers.webdavDefaultChannel'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [_createVNode(_component_el_option, {\n label: \"Telegram\",\n value: \"telegram\"\n }), _createVNode(_component_el_option, {\n label: \"Cloudflare R2\",\n value: \"cfr2\"\n }), _createVNode(_component_el_option, {\n label: \"S3\",\n value: \"s3\"\n }), _createVNode(_component_el_option, {\n label: \"Discord\",\n value: \"discord\"\n }), _createVNode(_component_el_option, {\n label: \"HuggingFace\",\n value: \"huggingface\"\n }), _createVNode(_component_el_option, {\n label: \"WebDAV\",\n value: \"webdav\"\n })]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"]), $data.settings.webDAV.uploadChannel && $options.webdavChannelList.length > 1 ? (_openBlock(), _createBlock(_component_el_form_item, {\n key: 0,\n label: _ctx.$t('sysOthers.webdavChannelName')\n }, {\n default: _withCtx(() => [_createVNode(_component_el_select, {\n modelValue: $data.settings.webDAV.channelName,\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $data.settings.webDAV.channelName = $event),\n disabled: $data.settings.webDAV.fixed,\n placeholder: _ctx.$t('uploadSettings.autoSelect'),\n clearable: \"\"\n }, {\n default: _withCtx(() => [(_openBlock(true), _createElementBlock(_Fragment, null, _renderList($options.webdavChannelList, ch => {\n return _openBlock(), _createBlock(_component_el_option, {\n key: ch.name,\n label: ch.name,\n value: ch.name\n }, null, 8, [\"label\", \"value\"]);\n }), 128))]),\n _: 1\n }, 8, [\"modelValue\", \"disabled\", \"placeholder\"])]),\n _: 1\n }, 8, [\"label\"])) : _createCommentVNode(\"\", true)]),\n _: 1\n }, 8, [\"model\"])]), _createVNode(_component_FloatingSaveButton, {\n show: !$data.loading,\n onClick: $options.saveSettings\n }, null, 8, [\"show\", \"onClick\"])])), [[_directive_loading, $data.loading]]);\n}","import \"core-js/modules/es.json.stringify.js\";\nimport fetchWithAuth from '@/utils/fetchWithAuth';\nimport FloatingSaveButton from '@/components/FloatingSaveButton.vue';\nexport default {\n components: {\n FloatingSaveButton\n },\n data() {\n return {\n settings: {\n telemetry: {},\n randomImageAPI: {},\n cloudflareApiToken: {},\n webDAV: {},\n publicBrowse: {}\n },\n availableChannels: {},\n // 可用渠道列表\n // 加载状态\n loading: true\n };\n },\n computed: {\n // WebDAV 当前渠道类型对应的渠道列表\n webdavChannelList() {\n const channelType = this.settings.webDAV?.uploadChannel;\n return channelType ? this.availableChannels[channelType] || [] : [];\n }\n },\n watch: {\n 'settings.webDAV.uploadChannel'() {\n // 切换渠道类型时清空指定的渠道名称\n if (this.settings.webDAV) {\n this.settings.webDAV.channelName = '';\n }\n }\n },\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(this.$t('sysOthers.settingsSaved')));\n },\n async fetchAvailableChannels() {\n try {\n const response = await fetchWithAuth('/api/channels');\n if (response.ok) {\n this.availableChannels = await response.json();\n }\n } catch (error) {\n console.error('Failed to fetch available channels:', error);\n }\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 this.fetchAvailableChannels();\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./SysCogOthers.vue?vue&type=template&id=67b1b002&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=67b1b002&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-67b1b002\"]])\n\nexport default __exports__","import \"core-js/modules/es.array.push.js\";\nimport \"core-js/modules/es.json.stringify.js\";\nimport DashboardTabs from '@/components/DashboardTabs.vue';\nimport SysConfigTabs from '@/components/config/SysConfigTabs.vue';\nimport SysCogStatus from '@/components/config/SysCogStatus.vue';\nimport SysCogUpload from '@/components/config/SysCogUpload.vue';\nimport SysCogSecurity from '@/components/config/SysCogSecurity.vue';\nimport SysCogPage from '@/components/config/SysCogPage.vue';\nimport SysCogOthers from '@/components/config/SysCogOthers.vue';\nimport backgroundManager from '@/mixins/backgroundManager';\nexport default {\n name: 'SystemConfig',\n mixins: [backgroundManager],\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 const url = process.env.NODE_ENV === 'production' ? '/api/auth/logout' : '/api/api/auth/logout';\n fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n authType: 'admin'\n })\n }).finally(() => {\n this.$store.commit('setAdminLoggedIn', false);\n this.$router.push('/adminLogin');\n });\n },\n // 设置默认锚点\n setDefaultHash() {\n const defaultHash = '#status'; // 默认锚点\n window.location.hash = defaultHash;\n this.activeIndex = defaultHash.replace('#', '');\n }\n },\n mounted() {\n // 初始化背景图\n this.initializeBackground('adminBkImg', '.container', false, true);\n\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=7607b77d&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=7607b77d&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-7607b77d\"]])\n\nexport default __exports__","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 };"],"names":["_hoisted_1","class","_hoisted_2","_hoisted_3","render","_ctx","_cache","$props","$setup","$data","$options","_component_font_awesome_icon","isCollapse","ref","style","sidebarStyle","menuItems","item","key","index","activeIndex","onClick","$event","handleSelect","icon","$t","titleKey","args","toggleCollapse","name","props","type","String","default","Boolean","data","expandedWidth","computed","collapsedWidth","window","innerWidth","this","width","watch","$nextTick","measureWidth","methods","$emit","checkMobile","isMobile","el","$refs","sidebar","prevWidth","prevTransition","transition","wasCollapsed","classList","contains","remove","offsetWidth","natural","scrollWidth","add","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","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_component_Doughnut","_component_el_progress","_component_el_button","_component_el_image","_directive_loading","fetchIndexInfo","indexInfo","totalFiles","toLocaleString","formatTime","lastUpdated","getTimeAgo","openReleases","version","Object","keys","channelStats","length","channelChartData","options","chartOptions","count","channel","background","getChartColor","getPercentage","typeStats","typeChartData","aggregatedTypeStats","status","getTypeChartColor","isProcessing","phaseDescription","Math","round","processingProgress","percentage","current","total","estimatedTimeRemaining","message","plain","size","cancelOperation","processingError","suggestion","recoverable","retryOperation","dismissError","loading","rebuilding","rebuildIndex","backing","backupData","accept","onChange","handleFileSelect","restoring","selectRestoreFile","newestFile","oldestFile","openFileInNewTab","isImageFile","loadErrors","src","id","fit","onError","handleImageError","isVideoFile","muted","loop","autoplay","metadata","FileName","TimeStamp","v","lim","l","h","max","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","d","e","f","hex","h1","h2","eq","isShort","r","g","hexParse","str","ret","len","alpha","hexString","undefined","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","i","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","t","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","constructor","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","p","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","isNullOrUndef","value","prototype","toString","call","slice","isObject","isNumberFinite","Number","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","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","o","y","_splitKey","parts","split","part","push","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","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","Symbol","toPrimitive","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","defineProperty","configurable","enumerable","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","title","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","writable","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","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","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","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","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","_defineProperty","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","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","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","param1","nextOptionsProxy","nextDataProxy","prevOptionsProxy","prevDataProxy","shouldUpdate","prevOptions","prevLabels","prevDatasets","nextTick","deep","role","createTypedChart","registerables","reforwardRef","Doughnut","BatchOperationError","code","ERROR_HANDLERS","details","NETWORK","ABORT","createError","Response","TypeError","BatchProcessor","batchSize","abortController","fetchAllRecords","includeValue","AbortController","allRecords","totalFetched","batchCount","signal","aborted","response","fetchBatch","records","nextCursor","phase","batchError","URLSearchParams","fetchWithAuth","errorDetails","errorData","json","success","totalProcessed","abort","isAborted","IndexRebuilder","chunkSize","maxRetries","retryDelay","sessionId","generateSessionId","fetchConfig","databaseType","rebuild","processor","sortByTimestampDescending","chunks","splitIntoChunks","uploadChunkWithRetry","finalize","timestampA","timestampB","chunkId","lastError","attempt","uploadChunk","sleep","checksum","calculateChecksum","headers","createHttpError","totalChunks","random","encoder","TextEncoder","dataBuffer","encode","crypto","subtle","hashBuffer","digest","hashArray","Uint8Array","padStart","imul","ms","BackupGenerator","generateBackup","packageInfo","fileCount","files","settings","record","fetchSettings","downloadBackup","settingsCount","blob","Blob","url","URL","createObjectURL","createElement","href","download","toISOString","appendChild","click","removeChild","revokeObjectURL","RestoreProcessor","fileEntries","settingEntries","totalSettings","totalItems","restoredFiles","restoredSettings","failedFiles","failedSettings","fileChunks","chunkData","fromEntries","restoredCount","failedCount","settingChunks","backupTimestamp","components","newest","oldest","channelColors","typeColors","processingPhase","processingStartTime","currentRebuilder","currentBackupGenerator","currentRestoreProcessor","stats","aggregatedStats","mappedStatus","toFixed","totalEstimated","seconds","minutes","hours","remainingMinutes","phaseMap","$message","warning","handleProgress","handleError","errorMessage","settingsMsg","fileInput","file","$confirm","confirmButtonText","cancelButtonText","restoreData","fileContent","parseError","days","isValidPreview","FileType","open","fileName","extension","substring","imageExtensions","videoExtensions","isOpen","toggleDropdown","modelValue","displayLabel","selectOption","$slots","placeholder","emits","resolvedPlaceholder","selected","opt","handleClickOutside","beforeUnmount","$el","_component_CustomSelect","_component_el_tag","_component_el_switch","_component_el_option","_component_el_select","_component_el_form_item","_component_el_input","_component_el_input_number","_component_el_form","_component_el_dialog","_component_el_descriptions_item","_component_el_descriptions","channelFilter","filterOptions","showAddDialog","filteredChannels","channelType","getChannelIcon","getChannelList","hasLoadBalance","getSettings","loadBalance","saveSettings","fixed","onMousemove","handleCardMouseMove","onMouseleave","handleCardMouseLeave","ref_for","maskText","botToken","chatId","publicUrl","bucketName","endpoint","channelId","isNitro","repo","isPrivate","baseUrl","quota","getQuotaPercentage","getQuotaStatus","getQuotaText","openDetailDialog","openEditDialog","deleteChannel","onClosed","resetAddForm","newChannel","confirmAddChannel","model","rules","addRules","onChannelTypeChange","addableChannels","ch","innerHTML","proxyUrl","cdnDomain","region","accessKeyId","secretAccessKey","pathStyle","limitGB","threshold","token","username","password","headersText","autosize","minRows","createDirectory","showDetailDialog","currentChannel","resetDetailData","openEditFromDetail","column","getChannelTypeLabel","currentChannelType","readonly","formatHeaders","link","refreshQuota","quotaLoading","isQuotaExceeded","getQuotaStatusText","showEditDialog","editChannel","resetEditData","confirmEditChannel","editRules","onQuotaEnabledChange","CustomSelect","channels","telegramSettings","cfr2Settings","s3Settings","discordSettings","huggingfaceSettings","webdavSettings","currentChannelIndex","quotaStats","iconMap","telegram","cfr2","s3","discord","huggingface","webdav","pattern","card","currentTarget","refKey","glowEl","icons","showLength","headersToText","parseHeadersText","trim","addForm","validate","reservedNames","isDuplicate","newChannelData","savePath","editForm","newName","currentIndex","isFixedChannel","editedChannel","catch","getResponse","getData","loadQuotaStats","getChannelUsedGB","usedMB","usedGB","async","recalculateQuota","finally","handleClick","spin","immediate","_component_el_checkbox","_component_el_table_column","_component_el_table","_component_FloatingSaveButton","_component_el_checkbox_group","authSettings","user","userPassRules","authCode","onInput","handleUserPassInput","autocomplete","_hasPassword","clearUserPassword","handleClearUserPassword","showUserPassConfirm","confirmNewUserPassword","admin","adminPassRules","adminUsername","clearAdminPassword","adminPassword","handleAdminPassInput","handleClearAdminPassword","showAdminPassConfirm","confirmNewAdminPassword","showCreateTokenDialog","circle","apiTokens","permissions","perm","getPermissionText","formatDate","createdAt","getTokenStatus","expiresAt","expiresText","editToken","deleteToken","tokenLoading","uploadSettings","moderate","moderateContentApiKey","nsfwApiPath","accessSettings","allowedDomains","whiteListMode","sessionSecure","userSessionMaxAge","adminSessionMaxAge","dialogWidth","createToken","newToken","tokenRules","neverExpire","onCreateNeverExpireChange","expirationValue","expirationUnit","timeUnitOptions","labelKey","autoDelete","showEditTokenDialog","updateToken","editingToken","editTokenRules","onEditNeverExpireChange","showTokenResultDialog","createdToken","append","copyToken","SIMPLE_UNIT_MS","computeExpiresAt","baseTime","getTime","setUTCMonth","getUTCMonth","setUTCFullYear","getUTCFullYear","formatExpiresTime","isoString","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","expiresDate","currentTime","formattedTime","FloatingSaveButton","oriUserPassword","oriAdminPassword","owner","validator","rule","urlReservedChars","hasReservedChar","char","checked","permission","permissionMap","dateString","loadApiTokens","tokens","tokenForm","hasExpiration","editTokenForm","tokenId","navigator","clipboard","writeText","validationPromises","userPassForm","adminPassForm","results","isValid","every","isInteger","auth","upload","access","_clear","adminPasswordChanged","msg","$store","commit","$router","groupedSettings","categoryGroup","categoryName","setting","localized","localizedOption","currentUploadChannel","currentChannelList","clearable","availableChannels","isEn","$i18n","category","category_en","channelSetting","newVal","oldVal","channelNameSetting","newChannelList","label_en","fetchAvailableChannels","axios","telemetry","cloudflareApiToken","CF_ZONE_ID","CF_EMAIL","CF_API_KEY","randomImageAPI","allowedDir","publicBrowse","webDAV","uploadChannel","webdavChannelList","channelName","mixins","backgroundManager","newHash","scrollTo","newIndex","hash","DashboardTabs","SysConfigTabs","SysCogStatus","SysCogUpload","SysCogSecurity","SysCogPage","SysCogOthers","$route","fetch","credentials","authType","setDefaultHash","defaultHash","location","initializeBackground","_typeof","iterator","toPropertyKey"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/75.75dccc00.js.map.gz b/frontend-dist/js/75.75dccc00.js.map.gz deleted file mode 100644 index dcbfadddf3e66de330bae9e46b1424fbc6b91581..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337730 zcmV()K;OR~iwFP!000023hcevcJj)yF8D6%)*c5irrULuN(otD8DxyHeTOlo?;B(4 zh){x#lY zN`?PbDtz>My=?Y>jW_?g{@1L#T#n|0&A)rRXXCo9R7YRel|I~Eo;Rl9 zQuVrb9V-1ib*3S zqQ$=g;=WSBf#9WwcZ?Y)FxhGse-9j`n+wK(7DJw9r5Xx<`qWpTRIqaBpVpXnt2J?` zotik)`1gc=yENk3PZmFP&R3648g-g(myk~FfO|vt6ac&@p3(*9TI;b^*A1n;k%MY9 z^#>g<>Haz1!j}%$Ae5sTw6^QE@?O>sK%|v^o}m|?w(G$Ki~{Aq(>fJFT6;;?n$Vz6 zi~C$UjBl79b>yR3OX+4E6MI$qfpNEeU3QdyqH1pQtXe;*Hqa;4I!U!wQf+ctt&voV z{%p`NHK@<~qg4lAw9=2XQl+u}29pc?|CJ6_KwU6WcuF5Nx1|zwbmA64mLXd&5wNvl z_?3ZqyubB3A`~O~;^!QnKi%V)QQe#qT6Il9NCh#>o7cYbs*PlSu1Aj2UX`2pI5srZ zJN^(5qzewW5oF*#XrWWgn-Q}fg0v7uZkz{e5eHdmM=7ZjwcAnD^(p#Jmy$9fncWZU|(e zhThhBI-7`!XtHk+7qsaFJth!tzwqbR>sRH?owo~(I|QV6|7_Hdi5HLh@ox3~d|~Ev zJ?O3TZsXlIqvRgALn}}`hPTIlHLiO~-#33kJAzWqdEk|29l}vUdpcnnE6X)XRkz?2prtiTYb0If;Gv5&E>b#S4&zO?2iz;7yqaA>k zJN~i9j~hNLV||%`^x69VY5vv4s+Tj^&e?1dj^+}&DN?i7>_ca7mR zddZE?2dlO4=-b#iy?uL1zia%agJqTQElLZXI|`rcO1nIKGXc#}FI~Qqd6=+6m^*i_ zcMk33$31E@8V(gnFnPkhC7c3pE}nY<{on1?>j>qwIKWolwMZPSF8Hw zj4}eX2*D$zzCm(Y(!&hw?%l9@#zKym38LZyGjH9<483ubw{*_g8~u5$uWx*P)MrO9 zUmQX@v7@T>eO$G=nb;-Ms=){EZe|zEt%8MJu&gF0{cdHKtfiz(B^$eBo4ir( zc3jY7%yjnl#J=p3gEjuQU2wDtvUWkvp4g3DlDCGxwF?UN@I||%WQ|g`3o2H@m0ggr zhadP>$^0!@bv`eyfNzN|0u}kuH$t}^Ic+c#TqFqw5;as*$Di)lt z?1GHl+2GD98QxiN9;HhB%W$69mB#)LaGu$<=64n}7k0_gE?LpN@88@ps{m+b74 zyzeVD&t)OQwOnRd&f-N*26TL3$I{^GwqM&xcF|dZu+9f%=1#{WS4qDJz8&VT`C*$hxN)r(d2SJAYw~8N2cH)97t=UtJ*--- zht<@0MTZv=(ep8BQT%D%X&4kdOaAvEFzBX1Fz~=GUIIZEQ(C5{RCX8_PZlxqtQJ^A z>$XNH)G5_$fCS+6Pns9(=3_K3qj~01^Amv33Wsl7LAa}bf^b(gNF6X7{UrPw5NWI{ zJwC&?(Fx$Xm^GliH5fNL!MN4$!F^1F`_@sacn0o`^dr(oH6m7@z%;5uns`z_XTvw2 z9$}_gux81-sm0e%GyQ|F-Gc>-{b%wFu2};0Sd}nx=1yut6Rp%t$K~dbd9g0$mR^x6 z@9vD0lw>pWx{W98Sg6VJROR!VeQ-w9j;Gt0v!*_NlBsw8bn1{ELNahNQt^)f+TFN9 zj!9PWkYjOHcm$5F>MU#hgs@^;$IG~WS%AP3?aHSAu-XggH}wCKeC1uMHR$pwtvETY z<{|tCTBfO=-qfzS*6WF~t;H9OKE7YpKQXSlAUkk9FgdCK>dZg$f$ z2EBGRtT%bh0rEEldDWZJ@ZM6NL5Dj1u3FI9@hNPd*4cXWMe2Y;gzrY&aZ-2hT6LE` z=q%>JgsX9^r}wWb)V5BH(6%L1&4SWe_U|%I#CVCF#kt4?axQv*d@i(7o3kVRCBV^2 zee=2wZr1(rNG}`+x#J`KboodZP8QVN`~RUMovr>6=)U#ON4m_X_w(_ep6J3)yJun4 z??Bpliba|B!A_yt^ezRItixj8lY@OF@c4s+T>g=@Sbw>{Jk~jT!^U@id92qhnX?6_gZ>lT z`~hR08EB z&~jp;+j~fh?}=qoGslLoSxA@lf%J+Zuzb!Sia(sS>?pk!gA5j*J2GIBEk!(#Y3dtm zmsa-PJnK&2SUH7b-hyN4<>XkT=I~*9{&M(5emZ(xsaF03aq3Vrot%Y=jk1-y(jYfQNvDv=_}pTi4nu}-cn7K?-@_0&OVHlR}ZWK8~mjP>>`X# zsD|*0b*1N3Fu`YnJ4AWNn;j8`w zN=zU`8FObRSfcwQZ{g-G8~DStz^~D|Rohr^Peo z$rgT^?BOSzoq=+mZ2HwHX*qa_ih6k$UeZS2rnJ$GKhQ>(?-F?ATpJ!&b*{hW%Hf7j z=;s=m@v&zv=Pq4d`?>|L4GWN_PDUs~*7>I-;TP8rPe*lgVQTqbOrw|S4Y+ZXy5$X6 z2S03pA*!!5WW}h=PbwL%y8D!D!`8jH4LAR>ZTMpR{M`S38@_nMrq1{Q+wlFL*an`C zY8TSmu;UBuWER+6(ENsBQSP2a?*6-FN*5_M2lU>I!Ju%SqgsMO!(X6Kkw1PGevd-M zP|P^C5C7ex{Q5Hv@qE492Sp8eMp4`8uqWa&n&4u6s%zGl-Ad*qJ zyeWYpvbLzhJL~we?kP2l2TW-tYLEC`n0fdEGQsC(KyRb}(6Qgx$3F9mW51DuFnsto zANvj9RsVn0vHz3R{)1zGVXgo3$3Ex%*|9JE?XmwlJ@%DL$DS7YXXjq@(kJJB6#V|V zT)P1D?vLj_-jz$|e(IfdeEHm`hWX*#HwcN+PwaML#|`FlA=U`tirK6!Ns#|9{HJv8 zT`}AANiYbrY`^i&!e#}B0AEa==L~d}SayVp#{kd61NjWHumYL=75@q{_%&d8LBO&F zpPAW!9+P?sKN=ngat_T%N|1QbtT8<{hyND-j-Rv&B~6FmL(6g+^mZ5i83_y5WN#Wvb1_}}tpp!B*1 z@B(qkX#JT#)F1f&bpXUys&-F6{QyO3N?{;ee(fHo=~9!m<{$M(s=`{GnnLZmxC_=4 z)f;Qxymp?+L_G^?kz?B7-SWu_tM)foHiUQfw+X&Q_O}sB((^!Zo+JAJl59OtnqlE$ zzeBj+B@Llst!BVWuP$Gyp~LP< zDqK0}CZLmCJ*zdpQ0x7y*5i3478x^aAK^xFD|Pp$Ju33B^VZIVMUV%SbGC|;nb*Z! zDp;S*bt*5Z`Cqia>K^~R!P!c?`#&9y-R^?5%jDuIp`-Ay0UgD=+h@!U@8g#6+Vbvk z!Tap{(}Mpbq3oRTX$O}uT4>o|bcx1uBG&iaPI zg*yn@MU9ai3y8?sh;0ZT68fg0Y`pTxf1zcZVO!8m`S6bM*F4QFZspmD)%@TQ{L z$)Eb*B=-e)lGZ*2fV~ZX&EKpE^eCQSu+ui&ezCOFs(jq|dj3yWwZf_n=o%&jL=BTw zvD+2-Gh5pq-wAmj@(q0sYuACg4}>r#C-M2#i8+&cTuN*U2zQ)~^jqEY?)WM9UoQk|Rx!{x2OlyZeeePHn?2E-54SA9UK7+v*Zi@qd)8823 zMW#=OswH2{Txq%9R5Sev;X12&T+o&~&Q$u0WV$|kd-7*^B*rtvIgf_Sfqn9}j9mBt z21-A!F`Yt86g-FrJ*A%^{t8MlaiCudlx5_s#zcaCU7-x_?O`Ux8-Ar>MaK!ZP6)ql zgQ>d<^@ho23w0slOUM|Q9WQnw+{hdy->gFXB>YR-LgruexB&m*`lowYL~7{ z=*q96mM{I-Y>f6Vpd)GY71c39(!Ly)~jC zCgcG>(6Ps_ig0T@o2%s)$D6oR$Ep|i94P%Z!7f&~x5s2gS3KWn?w-^3HLf6;^P9QD z()B!!@sQ9It{g4hbDCnh11HHerF}+wPP*G*c5C;X@Je?R%#L}3_8Eab>F%2=2U|Dh z{3CU8*Dw=kHQ8~KR^HfIh*vT-+A^*+cCkOaFAmx|;M3)*QA`Ov=4E*v~tZBt8j@=3)i&w#=w^YXyXRuUW^nkpin{8#@-q$d@|X@*; z_aF=>pvdoumo6BLhSGP!a74+U_2kd+;@4KXS;#H?0tC=;)Q#b%R)_koB)}NPwdfG$d7d`MC8mDu(49VaAd3l-E4qaZ5_0^j1 zWjI*fPVcXk=UfBWZUP+vv@>(9%mY@yuc3YYsmU1t3h z>c2%fW2undSPLJlAugl+WvJJ|9-RQn8u;>d{|$Y(42R43V0CsGA1+VFqA*OvT1>>O z#a~9F-+sM3+HVQSZ*lT6CHU>xwCY;R{Oug9wVgI=6aNZ9P@Qb(li)~32(I692n%C- z0xW8fJMLIU7!_Jp*@R?T!~_Ja44~U=1RdQL|Lj8H4854`nTMy6fxIt4+1L?ABt2Sr zLt3P(CNM1Gsn#nz!TJqbb3BjE`hraJ$din+^t#gp2a^d_Ve)Q#hLw<##})BH$50{| z5#Zj4-9N%|B*=ygw*nYvc=^_`au|}wN*kpQp%ENH5f!TBEla=KA{8fqxL^Vdfk?lpR(zaRNI8+wRsbxEHQFf3`m*N~Uam`x1VEO!jP z9?0Wi2~Ke<21*n)t&=>X!JV_ysQ;FHz);EC;+_FE;GKTQ+o-_%+Q0QuZxk&fBs&(J9+!N53coc^Ucdm-Ct`$7wgeY&o{_YNV%-R=!!hc zdO5x4^rg3*QKUiW3zb#Pg>=El*|sFRYS3Okh`_#nmAoLDVCU;)>(dc3h;N;I%2;ym zq;)(8C=Ke6LkBmGg#i>rOzWg|`MmWGt+DFh_N?_w()#;+{d{WbV>BL}G_LSd{JtHZ zQ^We=?-%QDH~#yRwrS*4t%pCONjuk+M-+6Xfx$Zab;COCXdKJa!dPBI?>G8Yie+Z> z>-p@>v(@&)={H^A`5xmlCR)!!btVL$B{A|u#RSdziv3=dwB zduo(Y9X6C|t3*+nbVUE4Be4JvVQ8T99v-9I&8roGRAgz6O(RBF#JUOWKsd}fKP9G! z1rQ7_Rhdc^;LFXWDkZLRNbF+-HK4``7F^kfbxp8B4>h}=FZ8o)2!*BC1we0qo9Y8r z0>R?vKIW-DUSfe~+{F>#xca$^N~#NBaJgZM7*Nebi%`$tTT;VU-dwPUwr7ORo+8d( z8OvHRDO_T4^C%`&_fRY#hSl=H5*k}_$U+g-oWS}jrl@#7kB z*hF$o@co5FSHQxo+WZg1f63jrjpQJ4#M7kPFaF-qfFDEU7#V@S(l$}FF4>pl&sc)+ zTA}H@1QS~dj7@w~*sQkk%p#44dp1h30V=>ABK)_1Ykk^-Qs6}4)1etl8S)yqNux9% z<Ja}Ru{h@+G_Br@RM2$lVocEN-222n2fCUCV`-y}&*k$Ema$2B8B@GrI?=`< zZo`16jgT{R0=>L@?D2st^FNIW5BN3=ad0`*d3|1Rzs~^T6_F|ZhbXt}!WzQiq zl}f_c=HAWh31@K|wB=)&4J)IZIQDW6?r8_}hTTB{{DOSE)IsrV3ggJ`0Tit*A20P# z<}rX?ffbSGNer&!1nDO+KOmC724ISO3qF729)QQ*wtfMyy7{tY?E3g(cC~>69^{?Gr~(J8u1rC!tQGaF`D8*3 zSKLj6nNcZAz@K1Oa%?7c8AaTgse&7P0}07BxOcbtPZ2rOHGT|v!UzD_#qiJ`@xZUxtEB|c=Q7ts=+&y8cAm! zFWFV&hS7@0U}ly;Kg_N5+PRxvOC}kwkd*cPAv?$vKNg=-w(Vp7woQm^@WMu!H2!P zL0^`qiDYpf_doaHi-m{&wEGybPbm6m@w?k={_Q*_eG;^xk4}dBc>3FUTs5t==+mWS znsyg_59ya7-^)+2DRF)b&+gWY--)$rP3JyL%rnB6jm@+SX~tF5h-Fi3W_LHEMYP{x z-@unwPbbzhaKL|71i4#h%2&qoggFsbvo{*taN2~C;e=o4bBG}4M$$;!i)(SisAa-I z$E?>7o)EVI82FAA(p*budY^-9hwL%`s?^#+oBHB2j?c?d#2xc~b7vVB%TU46O=b;Q z6Wg!u)2sD4gcNz<<@B=i^L#vxz^4hG^qF_O{}9`P&@{=l4?S)iVLf^D4gzY?A=M@C zTB~*=F>W3p*ulVIdRhUbYH{zX#dmYmMjYpp6;1F0-=Oi9A^*iu0oC&};#2UeyU%Ls zy?ad%^|~y`>B9u>4b{3Z$HW@m%^HYM_22+VieSyK?tJ2395B{Swl4u~THW)RGr7lh6;uXx|QyE@8*UlAek!-)S3YFY*5JKiP#4oPS>|g$R2f zxZ86tUWu@KhplRT5A1Pj{D1r%U?e_hOjSEXEIY&$Coqx!S@TEShChiH5T^k2ZSO12h+hgqz0fxi2{L@0wmPX zD#DKO(@6Ct#3d6n7~TX^o=s=Q|MVpA68+;%VR^%>He3oqVN756z~11|o9E3+sF(l5 z&FmGS^G4OQ7WD=T;MtNWnp2H{L-5?G#bfdi@W=e9dtBMyrjN{gp`Py{%!Mm&a`tt? zP=_JAHMPHS(EKAy(Dl)c$shbB%thKVe)0OY2|^JD<@b9?r3sN@K_i2nKY) z`y!TtomUG+p>V2llE+JH`3ee(e`rQ~XZd=DFOyf`3(_R5UlVkZt85X2*n3Rer-Cbh zH1i04s|euF(H?P_!doVrA%a;prg2$a`6BNvK3)_4_)j7?N|Z9O(@bXwdIQ=qV|%WG zYvsb>|MivXj}Q(b8Z(1PZV54oo{V7TGX?M1EgF{7#Xl83HAn6oAc@B%KFWv5&s-B9y{pD8qe;kd zA3c5|WF7k=#laFULM&sCYyXSk-OgJ$B@%3i<`iCB2xP_ldXyt%5f_H~rUNkwuktNM zM*k_pGi)okD;Z^`m_L8Nf@1JL(Kp9WZQl#)!K8p%d$q)MY*js_O7?MOxvR%C&{b=$ z+TQR4qA|!7Z|e;A>4$>AZQ`$WA_%fH$z+%3lm>gTW#c;rMhB1!RGne_#%_XX>_kTUYS zxlcfaFHEp}j>RV4lbD0e9urZD$5^DFg^asa2~9J+w{*T000^3r@CsmvGVu)#obZG}pI4xv)VK`^ly zed7*5FVv&6XB4Y{aX5W_eX8AfSzx8-t~0v706L&+iaA79LRfmX(|%2O*LN z&Y=&Za~^z!=YNMcyqiZ@i`ES&JO8G!W>AV^nE@-|7z-urN6Cxj)^&_oMhdxM+wvef z6@n{&RmGJ*ZbO6?nWqn%6;R%;F07tA2)w#Lzzg0LZ>?|nV-FGZHXbv^T;}JzBEnQd zra9%e0#f&Fbt2V-Bt*5uf_ceV@Qvl1#s~xoXL*u_63bk@;NWCfd@|y<)XUX__3a8-@T`vkb3$70-`G<-9H8_17|1(%W8@W2 zNzZuAKErd&6@HMY5);`@0pz^sN|+SL^Y3F5k+}mI@$z(@rF4HBIf5Qif zzrBvTwkjN2E@-nSU9Jb;!O9aJhC6Q6*`ssr!?2Bg3A7#y#no?qGmxrsF;fS3oFK?a zE;Za(OfBiY=4n?&O6Vgq6s>qKYrsF-szr@iRxNzS*)yyRQeA1oXd7bd=+KO{tV5>= zm=1Aam0HYQq(8z^AI+izk&b)nxvs>Cp~+9iH`i`6BDC>8@QqDj>U_BuI+lldV&Jd* z+YZ}DICqAe*DdC_zkg2fWdXUz14DbDtsh@Z)*eV@t_IGR$<9X?@)7qZ8!L;Y12NQW z9iqFYx z2}7?ve7EqPlirw22s2F&9i4FLcNF6-pMJw_=A9Mow8Iw|0h3bR3@c6jtn2xg2Q0lMr5A}KMt#Q58 z6sCaPf4F`>-v(z0Cmt|vxkmhy^HSdn+L6E@#jlGYb%p1H0I~CmVIP0&aHg5UBGwLuE>f~@lzmf9c=%P+h zvi6CFNXQay8WFZ_9BqElLy#ZJti4lF2CW7?p3)tjbVORi0=)}r0rm}4S%VFQr%tOx zJMY)nM5V}CFA?gw%}VxcO!Lu zeC3t*@9}NtxgPK{qWgft?W^dW`MEsevVJpOooB2L^<3X_Ki$VvAz!R}Be)j- zciJH2Kn-Cyi=})!hZmzmVxhs!t3bdvBDy{+-C20wvSbdg2-4agGswEG2)t>~G$Dcw zahjaLD2s`bUR#@pj8?CiJBtlR{wo^Jm#{Z1$6D%SLIZi)GHvef?yOBjNYyr5MB)*E zbSACwvpu1&x7dt8H42EqlCCJL`97(rIb)*M`FjhS3~k}~vs%p{s#eKk2#T-_ZmD(| z9<*TvzgxGTd_ZVGFIZ3?RoGC8!NR-``yw`z+4YT*$$ygkz=`EHv%Xc~GN5cXF2wi@ zAH)X~ve!4vi&-llJSG0|%%lYT;P`;XBo6JsiVK}{?s>79IaC3~PyXkNErAuIuVha` zRNlr{06u)lMmb_Xv_gmj1Y$4%X}H# zrN#-!VXW5RO0BJf{9gk{fjxgbT^Owh@s!d_`mu8o8=>BygfPq#dk1*B!=NO`O}08q zP5i1zV+|nd=hM(7r^x8nKwh68WtRAgV5sMK9dACF%^izvkjZtv*Aos{)?>}OMu43h>T z2l8r(Q8!5`B%5vH4zD6#euTsWaVYuV^LF7Fn=Ahz(FQSvSU5-5+Q%bUIjAAPL&=uT z!6$Z%m##=CnaOx%POSb+(Y?k_3G0iB__tm1S?Yh|C$?NKd5%7!tELXL$p_g5Vu-hn zDVu&8o6TVFl=~+e+)?_iERdp&c~$;n*@hgYt2GQo7sNvg9};txp!*C>;Q=Mw z%^pO3(?h%osyXl03Z}Ia-{CNay?0 zNPfY)YZ69y^&`$mc7gPDL)ynCzfilmM985(#xkK$Z-8 zW9JJ%e+BS$^BboIE;Ym@Ig5!?$_T2gz!IL1!~?t-=1vKhK3E^%@v z^3A!#-wReOcr4w99br9)gHVdA6HQs`cp)DD$;LMTPNxa80+<>=MT~3fN&cp)1yKXf zpvp*pjc$f~o+c8N9vV^BmNe=x9u6p+=tpc!UM0~hKL@lv(^jJxS zV3~7H#}e+?h~Oyk_F4DvCK?;I26%+&?EXHn83M}?!M$kc6LnWbO1GgkqjG!8%t>zp zM?&aDY4`Mz9%szz^v=92R{d+1GVMi+5V7Rp6%aG=ERb%EHH#3kw+!^K69J$X9P=o2AIo!Y~&mFLzJruf1Xp=wgKCh6l@oF zu^Q^_*84MXZW)}7<2g9L1e|MUF8VMSF1$V@CcF(cVo<%I2dk!vPMtp0q8t zAF#&qgC@YH?ZP%JpvYMuWFHwq#b;C)8~c!U%^@8)tnbxhjbKWzIN~PikZD!%3G9*9X5*T5u@ru?lbR+%`G=MIreJ ze^xK!6r1b}T;h54m1W0IBz3FHO(+j5Tw&m-7$gYkWx~zI@%|WlU| zXqnTA$aI!^!0G7vY`$uyW6dd6hIm7F6v3=%99^8*F+DT$f6Z3$(N8_|EGH4qavEKn zrOfp}_Wm^2IX?(T&JSH$z;qWf<>g;ZSpbXdebH}+nd=qizy8(yWfcXz!78@Dg!n1+ z5AIHuvj6L)#5=M5g9X{B_!Ti0A9z`ap?GlQtgOZfP`GlB^`&{7HmWOcude`^j6p-A zCKvsO=?CI^I6~YdDpy|C+#5VHY=)2a4w^RXI(=v3kFUJ7J9-p@hsSf=gpk?V+h2`O z&(aH3FAXc`peHi+^zp}Sz=hP_$3B>BV((48*(1)>{O7jcP3Rm>+Ah7tBU>*(Mmutr zk4gAQTsj5#(V3U&=MW;?qYrrkiNK6@bR9D>avBBPi&QC&3|(|pvW}fZV@CfR^}e4PlH-$m zu)#W;>2F)J7=6gLmukWj?jIiGeI!RXk_2DH5;_$e*=jiNem`2vJIeCdK1YJ6G?cFG z;}{WuWdJW^9HbKb5hc(qxOQAP5J;TXVmI{a zwc}$fkM3LtdU2?1&V1;BfAgrzwl` z%bN4NKPea~i${nN=5+90DZ*3{b}16oWz)3gWc)^e+&JY~eybcT>jWVW`)1+>lO1OOH zaM+DlL@!dAEs&~JfIc7Q*lf+iS6Ac6DOQ{1PYe(wp_%$hKjv8p5G+|dQ2Tx$S{8C< z5&dvvk#xv+rheFQDwBY7kmy>a!DVGyssC8~6nO@N!OWoKz?p>_yjYTR{KHOO7)I6A4 zEvwcu)C<174l_u_kw8;D<-gZb^XS1CR_C0BpUguWwS|6q1k^+2f3%Vc?pcLE`5%(8 zR2wgTenLNgB+aHR)aWbkar9)ZXzwJM&u({)Nq-s)oo>=+^Y zlYlW(H7Th5w`;ARaKHvWOx=vUpCZb~CuRVl+Q1n@wz0>wez2sUK$i&H{+1_}Fr=he zqWKYGnicB3f+GT%Awg@MEg@=kU&QU6nV0FR%Vv>mNskV5x;%rpeRv1o59a0C%-qkN z*qFw)CFw#=_>@}M0aR!(cdTX0D5`ZM0U%ssKC2(CbOCg98)Ii&v-~v+e0$t;D|kJ^ zol#9>W0UwIY}nOS-rCMnnuxR}Zmy8NUeD)wKYM&&UXgTic-|k%kSH zC%;Hk>aXdbR#hIrFrqM+$+q?ZHk1_s(Us_LDZ`RC*DPu6))TKnMq9kbJ=Ia)7+e_R zmrIyc_!+ZAE(jkPZX6bXh>fprW`_m{5Z@gN%zkH{yWs$JdmbV9IlYc~VFvK^WIEW{ ze<#Kg;Vl*+2&4~g8OOB)_u)J{f7Oo=o~{tt{$%B(itrGOqYk}eJ%vxc^2G^=XBFL@ z9gbkMa8lS#7&~bFqfd=|m96H|hlP<9Ms#pG>={T4Sj)r&dviC4kFt6_uR?JioFI1T zW2Q`XjB^SLn)-U~KUujFS+ zjaDTzfn7c2o7k~*`936FG;sNYDUyU|{9;XUOPz#UqUw;tuCv&k8|E8d!Pjn<4yWDH zb*tv~Qq9{oLcJ~8Se&o?=huW4cu(fovs1anQ(1mHCfi%^wEB*f3En-lYb`c~GWkw@ zQKii4_)YA|8cc240bNN%#U|k26RCOn$LsF(+fu{1-Y|%Z@d&&|sgo zm*Kqk17k|Nh(kSQ8q*n*mRjeX@_nKnYbftcOG0|s>Pw1lO40in zPoz%ie3pC>v{umU#+kfZaZuB|UZ<;cB@eDIWCr!j)YKl;0^}T-z1rv3S zW4}I~IL2-7pD2FqiSl#^C_LgH?=Umx3I+JZ#@YtcF%Nv?=OmJepWa4LZ>VlsDYsl-^ z*-Fb@&XGLbFqPlS_ph9oAd%DIK|U_6ZwuMroV@+X%J?YtvZk?t`q0Tq(G6zWg*k9u zzTN^J(E*J2yP$e87h@0l`7B9;GQiM5=N0*Sm2S(tW z7dUmST0xV(tJc6D_P`6CUpKHumAJU&hSkAb|J1>ZJLuG{4meQs%u$QbibK|b)q?PJ zMTFz(o|!rJj{0m->;eQC_QJ`f%SSij%)l$?u~>Qx$E%!EMnodoEikEfu-efQzLgBq z#im%lXI_{J6q$CuW~5(dmKWa3XCVzGdqcQpCMpkPP##MKXJ(_~SY9`Hr5tX6AS?9x zo?)BRR{0r*ZPg^KQm|)tkXDhyFx0lY)ax^OoL#~4ZbI(`ui&6ne+P@4X-Bq!CfDO2i3LHnitwrM$cBubF(ar& zuAr|iR^#|0IeKUQg7XT=mSJ2yVOU}|YwHkwh`H^9k3-v6-h0`PrM52xOC;xFf5`ZX z!S?{q6+|M~I4gZ!*V|eFe9Q`O_n}Ta1))}q*8DQ-t>8CbSb>o2+V)rWnwrzq=DQ%^ z>l<7bE8u(l+a$iyYi)|QFEHVKv46$Rq;o9=g_T@sA=zfZDvZ6`;MggmOW52NfB|bH z_)?R+V?{u+EOFt=wa!Z>XvXh|dA(*`TcW>o4b_(D<|7Ek8FW#JSE%Rijf69oxATnr zue=8gMM$DQj7=;BQmYzT50J#VlPDitL-4gid4Hooz1c$65K_V3gk zKGzdjSwmQ{Bv4PN4Rb`-oGaN1VBI6R5r?_UCnIQ+TX|vv4V&HlE|y}6DnD550q93- zPa*1%=wRpZxWsp(QGiAN#}biNWkP<1y(GM`BYsAHu3@4$D4)EIiT=Z;|J|HPiEzi7 z)z>9oqP-RT>RyCCT!k{Ac?W7mo^0%O~T zHn)+Nai(r^9DQ>fXD;*aHRRI^7OoM{h_n>0Oc_v`#+6VcF_ncyJ@9}%oP_AHFT@8s z_-J(i2d!>6TA|{g555|Rx9C23AP|DxAl{fnsFBDYvCHxR@i6y4bxi-{TFHH|Wt8cS zfYT%F-pI)T^1Yj#cq1QR6V?B|m58iJym<#B1qskIfh`h=dpj_vB@(oS^f%gkIdI*< zLD|da9fun*aTwrV0DmZcolk}BL7G6wMiW&%$7h!SM2OiE&IS(NiRDB!KXR|Hj36Y; z(eB=>Z%Lxdo2|`ek38Pp3Qm^KTcO9!H^OlYB_!bhZXYkh*lC$v%8(oyI+O5LZXQ3* z9UER1EX7VnKB8X3s?w!slQ!biS(+YfAx*hqPyLRH-Mce*2CxnzBS{lU=H&&YqJ(md zlnyyOvaZf%lBL!|__L*B<5SL(!Aw?;bx@gXk(R~V>o3$=!9`}8?&9kuX@v%PM;dHs zS{yW6LMU>Yzhyz5x{b8WqY5wsy>w(*JJ>2OP1;>QWnH*|VO0ev+E_`*-|=h8qHq-^ zuA(^?_%>#?w>iQrzc9-B|7)WNkj{bJQ_-D-3#H~yaQ7YJ!f6cfFPn|)A+&t$spv7S zk@#L_HCr#kkD$H21$pSKf2>VuQX~qJwXa1ix}V>{4#vx(qxM`nvcPa*SdpZ5wm;VX z!(m5~+c}NM!I$U{#rqyIHb^{sSlN-E2*Gy;3{!{i8gF*#SOnijZHwN(v_Z}%z0DCj zZ^rmB^n|MX?WAC@D3d9;|NY6xLMcI#_x;lWrUaV&*JJE$@}9x|G@kGr_<}^|8Lzt1 z?N6t@;^DBHUCF}qU@uc2N2#N5c!}e#2Bli;uS4-9d=}wynzHH$FUtn*5s7@&rktbC zKcOy16I?l$h!MNnH-9=I#!XJ=oQI##*{XB*6B7S!0+*@bIfAe>1s=7hb-R>t{B?q6(8}@Ucu$RVE5_*p@bK+Odm4}c?8Slb-bp}vM^eo|+>efoa@5q`@ z{ibfO;48XNQ>K-zn|5{D$yhrmB2 z4kM$=_-9y+r4sckFR>(mwTZ#jF~TY#0y#X6E9to~zDY1Z_+vBxNy2kJdvmSuw3& z?Fpqz^(5n`Q6IcPUi8Dp#5>~tqYW`rqHwsndM6RKJvQ~L zn~(-A){YGIy;aOQ+y)<-R)k_WK~*r^j4j0*b3T`iNf+TiYIcQ+V;Yq}%(7Kta+VY~JQO>-I+$wPG4}tQ>ls}FDB|zH0I{oS) z&Kb!a_13AlDale<)I39y`}iLS+*r@C-+L2L+=2nC!hp$C)KLE1$+BR%PMR^@979w* zLd82N=}kHL8OR-EB#A{J%0rUNLy7K#wH^>h zN5*|1I_N|Y-roDRMrr23tF0oL0p4&t@e+(+H8OV)LoQmTOTFtI*;hDgJYY+(9UAaX zM?Q~pME%a*LvM)`yp3Bq6-QB)ibzui88~sSL@NxB z{+L2meSivZJxU?m;t4msk5CpYjTGZ};6i01dZw`@i)|zs42BxojMgX)#UOl!f_=@} zksu8_Dk1kn7L(&+XT<{bkRm(O)Y89jAt%Z^RbOz)&?&nXIjQq@cpsVdnf`5oQNq#@ zhB2)1(G>@yN+z6exkXN^D|Ar*VuRXd)7onYt_-`R-#X^Og( zG6Ydx46WLbHJRQz&3QA z2^0ug*PUaTAV+asCPx&5gYVA$8&c~^?vQ6OC440+=%27DlK5i)BcB{lFzY2DU#Y$p zNfhFvV@&)FsX6{;%YVeJ^KO8RZIY$=B`0@LuxGS*x3CCazT?cl*dGh7{fjxvWmgEU z82tMcBcw|+_5z$>jzFw8f=fj*mhekX;qF&+D!ObUw|@Vj3o3*HFs_Pe@#}$O3FoS_ zivsVhV~O}xqs+z|-EBOQul&50d7Mt~cWv!iN@2yde+|1ZC-C9z;1B&@P0|-NwCu?h z;lE#UDtCV{H`qP4_wOe?&__In%rE5h>BfLt{s6d3_`;T4`Y;g3&98SDJM9pjgxTUR zPxaocQ1rPzGy;dVbvw+C@Zx~OeIMC1`r`4zwkb^LeW8~fr9M?0mI?XP*f6U(XA8CZ z6FwsRsn;Krs(B6IqtZ%{emg1&@^mZ>h_vy2dz zlAA?t79^dMRn(DAS;;Ltgr)P~0~aw|+n3NTtjI@A=Y@p~X7Btyp5sJMK#iw3sx$Jq z^OnxMbppYxjE%iex6Udj$sfdwSY!iDD9FN676HQ?Pj~T~=Ezw7pE$ySLCcF5+u6E|c*_mHp&7Dgv za3GlPqyz5J;V{r_m+FHO)R%kbECs>U2Z#^|)umi_9>=qGl_Vm_BJ2Ul zk|U+vXOma7rTkZ98GReUGB~S|q9*f^}d*wcn42&@2x;FSpD}T zh+OegQWnsoLLWnH2FDiPi|Y}^Tb#qJ-Uvhp(+A&<_fWDpK^h0HK}iTf%cGudN$ z^li>G=h_4+^@kt0swQ8Kq{5^HO`l-r9E)G0A!oeLRTHb&E09|0wl)4npa*e~6(`0C zC7RYHXN->P6RADLzuX#8W@B>YC1Krn&b%%h0%vjGq|B7pZQFTfWG>%2{E@D;o=d#* z1$7d{xfHyZ)&=Y}$Pz$2_3%o0MQ|9%j5u7BBY{w3J8IRd!X%QM5Z*r$!q%BdmP0z> z_w0@i$-|zzEAsU=hFSO=#`%MH+$Jreys799ktA2sPo_WG@FS!eI~F;=e1Wv^kGB#> z4Co-k?#h7#cmQ9I0?WPH#d_jH)%Ia>HHERBpJe@p%VH=o!zm)-)|qh>2Uu(O5tt+z z5uFRx^s2jSjB(6IAN(jZzdl)J^={%B(-Q~*i8O-y))gYyi0$~knRG1SfJSgyn#M!2 zu`BPVr1An(+wZ80&&7h}3wfH1qj12NEnSW)J4A5!;_eqz1F-#R=K_g>J18@Nh6d`*W2XNLLJEyL;J!_Q}=WLZ5S<0R%LR3ULngx6v(8W$$u>uaC z$PZ3!cb{=v2wACi+9dxj0iNoOZ5Bn+fwqrWaF*jKb#w8r7T(m93)5wudfzwu%z0~J zT#DF$#2mJ$XG!}q;uz6Q>@{bIkI#AAI+P{YUYGAr)17cUXN4S8LtVa0P6vFk*)v-| zB2Wg)&GhpmJ)aoI_-VL_U9ax@5lJPwX>ME<;O!1h>d;1}1I~W=2j?`5BZ<{j<>S{UR0zb`WRc1_bwJ~>?zjm8 zzjHDPJWf^V<)_0L^5OJ3UUXI6;&6s}`*=0Y>EeqgeY!-Td0^tT=N)H(34mn;GbRro^hK+}!TTs=unPXKqbxD&znba3_%{<0fa zqgBPvb9lM7RpK}~a58w#jGU{X7KN>6vJ|LSN!7>wezJc9)bBaVIIF}G(K<81C zPJflVl(B?dO9qZ{aFVb$2@L_lh4Gs|`u^ldOZ=!fe%SP$D^MVuv~ThXo+iz;1elSz zGMO-fObU$*-{k~pn3)m$Ilx_?X;y#E^7b(#T-crHO0utVM9VHeqo0HIyGgi6o?bH~ zV%R+}ojJOYT*#`fMiSrxA~{)X1IH;^444n9=q(|3|k3v-Xh*MmOt8#KwFxEFnB-_u+(gxr`+ghRubACB+{FNFah|Zr+V1FgB zufX(vfRu4#VQLp9;eC1!xM?KOsoUla(vq0fbW*0GvxOVYWFXmC`fv<-M+j;2L?Lw~ z|Gi^EycP~p@qIi6j%@(>an`YW z1^3elPQ;w=^k?KO{Q>r?v54a&1M?hFAZDV^(WVJ;@$M_+f$W6u;~avO=*PEd#|ho?{2jO1kR2)T+~{v~@g zi$KJmVaxyOhlPxOV}mKWfyizPxvfOhT)~re=%Ov8vyX{fumZW@VyxrLF%m_r!n5q) zK|FEbFB9FQ_9AnIcw%lDOIqQvxq%3Cj_dHlG|;(7JkNNFFBJC=+rLpDIDU%eqv z8lrwM_ws6?v7R$LSh(_7qEqWHWH)AjzuAs^mb|%@E9Y0^AWubmp0Rfsyb-z&^k85T zBIcD2hSz#=WUZN-q<~!kV7)3hpv}W~?hv=z$V{u%(?UNDC*rh-eX&hY?MIc;qVZ4Id;GFOz zaM|4_a1k$g6pRP(JC`JKc%5WnPth2_GkAG);%A%k%9A8gL&=?{?-b62v&8&#_zoca_T5w%)=oN#Fy0K0u3bDvs_LZFu0N%)wNw*5(YR{Nvmw$AxU z-1%VT+iH_N&SJkRDi4CtCOXrXz`VJ!I@govrG~j<1pC3@ii2>xtzq=in1~4aoy)k?=h%f=UqEH97tf0Er|+NCrN^# z5X-{%eUEoz7p4)d>0A8LnkK>017vKqjr<0=gr%$_o`{}nQTF!{s!Cnx+4RKsAgl-2 zUq7HbXAY9ty%G691t%2amU&6KB#!ca28H#jZ1UUA8We1u5vGHzWpRUY*6v*&9I<{u zXx4N;Cw24AB4+|d6jQNkXNx4PY(1AQTPzX{&f4|jtW&|kaTAZvf@y?gA)5hCIp-Np zCU2HxC)1P3Wt@wkFssuiE$WmS$KnlgLJf0*X_GG0^ODPsgkN*8A`5<9ykcX!Og;6{ zxow=Ip%ye02=w95Fwr$c!TtgDyx*f9Jr*R24TVn(I0eF;iH6YQ{z1zB02c#;i^6e9 z8rFL99Pf^s;COd1=6{eBW{f_}yi_X)D0#&zY#}`J8cDnO4X%+v1;KR3oIk9;L2sES zTn^c%qz1b&^${8$A)F(&8ph^Q<`#FuaM0B}M!w~$GI9YmD`&J6z=XXehXB!}#Xn>)M#_IH+blSoG&^^7;DpG(#8C4P`W4#5aP zxwZZc%KZ-8g1qzJKr}x=G<8pCtCD!>l7}(Q9*HRRW;+FW7!Cb{n{C+i5!}jW(QE@+ z;t_i%m`Zq9mtb;q=%@aNO;McQt>$esmmb@q`nzYZ#OopVRwh87%DjL8H zxw>>NRCOOxA1NTnP#3fI6&T?LrEN9 zWP31L^kX?onalx$7S0!q-WU@a*MdUXiM2o-rJtLL60$Kt#BrcA zjM98oru&@od9L@O;479Lc0+o8wkdkFyO-cb#G`}X0aoM+qH5|VA&LzuB0+_Di-Gw$ zBeH*k#Kre>H2aijgac;|=gbwJWw~x*jHMbBLD)La-#Rq`HeGHfoEX!nO&i1^2k!l< zOixSiIiJF2>~U|1Tts7u^P|6Q$H}&13!PcxFy<&xbLVSpjE6Z&*DXD3yu4Fz zjUcHZ!cI3a=qr+SGPD^jn9#(LAz#TS`$fWQeX=vmlLsWBFv=VUcO}o4x`_8nm{Vst zg+_|rP-|y1735N|ZsUt?-GT=k8#8n$uZEv<#R!028vcuC3Bclfvxq0H527$+Q<5HR z^zJ0utB8O?_B5yuGTlPJa*V91~fEA}Ew}IeBMkjN)8j7_k3t{=e z9mN6MBMvnaZ|cku5HA;aH?9^)dj-90MwEh9aN{faq+%gf7$>RGV~d?H#ULv#?aZW{L-q_9|+*^pyN+yhOr5pSRS+mFd)s(ZlNQ^O&TjmhQ zJrXf_Bg+bsMh+_An<^s3=JE5J4Mkf=@!Mcp7(!3g_+}zma*p>W+dsl&`;cJeK(IQH z4s=-BppPPp1HUA`PCPA0MLSCLd^7UrYvf(asr4vPQ*T)A5XyElDQgRTo;cZp1FPd4 zu99{Z)}`n;%3XnEXRqvMY{3ze*+?mUQ*h!O@j#PKVJ0!NVb>icj#}>B?bI=eJ3YQk zf`=qFW7hvG*DXo)>NYqEFj(isbK$>nr4 zL&&B)WGzd!)6Y3DkqTtH2T(z`3#hbZZ=IZT^&*NQIHks^Cx&=m&?@PlTTG2zcT$01 z#TNJ_v9E#I{tIk<8**7n)+H7g!=_F#iHz9b^2XWT;kFPX=je7W8nH3>Z3kBF12)!K zI`gF%uP!-K<5Xf7P8}1}6hZ*v57v5v%I*1SDU*b@SiLD-e8jvGFFX~moz7qlsu8A& z4dn9MYoOl@OvsvjuOeg(Y{2_@+viLT8dciRShn^YhNA)KOU(mQ>5SxO4@n5T7gXf1 z-r&94B?48Ql~Of|i9$@@9^h(yBOG|^2n*^ci{DX>f9t6>oyfa*+eENrSUK*SWJi?& z_cN84iV|o9r1;j4qngmU*h+9P6Gc;^YDTx9Vrv&lS6_mTppU_85()(-rzUec@}W18 zW7E<;Hh~HSp5={`!DxM~g=k#>CvGMH8zNGanJuE2{jt}xE;nyA2@V(@8LeJk=0S8|AaE_f<++h{Dw2G4HUZ!^tB;3h` z3nXljjMEcYz-f&RSvFK;C%+_|?V$ir4;FG~4j0(+tGTh$!=6{%8Fr~9u?pZ1)+#p9 zt^^dg#rYy2H#j&R&!)3sr0+o~(myb3*M``Gf_v){;x50k!%SQc)(PS^K=}WhaZ9oQ zgDadvTz^)Y76QzoYr4K(msTY4DVvaLMXPAhzpST#|J7^d4Y%cD>PUVfBE3sKuyI%f z7MkD;x0hv@pyjn-WGJqjwX8M~I(-vz90pY%YmPplHqm*EZt8lz(w9jV9#-wKJ|R18 zB6Jg6KnB1EK!^PX*#XtV^@Ir5`)61eEO1d6Xq!e~OSsvUB%3e-7NF7A8_fifKI~%@ zL5GH`74`t2IopLkr#W2NV^4O{R@1DO&U$4NVe!*gYf*FkOmSO8aaYTqNp@ai*#AB` zBjtv-)pMa!>A=QJnk2gMm+(^u1OZrTb7(R<=d8^FFVNmz8tw3J57&BY1#RP+vUlm6 zX9k}w;98WqO1;tGwbZQFpCBWd*uVm}7R1i@6&PagVNl)>YA|*Z>Fig8(+aiq=JoWPLh@8K z37&NxVFmgu{b@jX6&CLhxdkB-_&uN$@V>5%NqFtn7QwjhA&zriob^vm$+qa*Z3=7cJK@d zwrj^}B{5T)c!yLiXFZrG$^PcciRb=G>TC01b9bF}$ku7{2z5;+lIxwObPJ`MGklC$ z23pBrsX6O{lM`?vLb=LPFJv3x#=Y=$72!Q*^}@H|62fV85`GD5&}PHtJG_MB@W{&g z4TC3o)6y%P@egklP9-K{$v`MMw8I>u1I8@_9Y<6BAoe#X4khR14D#ZzgNy=&4F`7n;TD#a!$ zQ>RE%DmzTc04X=LOm7iph*M`04MzMG)X+KS`xW8#`c_Of2{}Ll6r%qP2`FdY zT(rOS(k^!6)7wWeG$}z#B9Av=7(f9#GrrmjuEhz683q)ENX2l)g5)}=xF1MN7nJiQ zEV^kV827*N;9OVjR)~rdBvpL2>W$?;lLh#Ie8JArVNcV0`M1pS)e45Ta3rV_KhJPU znCTxLlX;W$ziow3Gp)S%YPr~IZo--&2FDM85b>D-1hPS>l~Xv0KcCt%QG{`>C9yyh zYY>6St)%$ERL#~pgoI$5i z_;V%oOh^TmVsAzNT|u3N)Cmy4MtYou=%|EBGpV%29qvmaAb2u51yq_yrFE)Oxglaj zc4yp5xSUiK)*WgVV-B@&voR;uGBSpKVF{mg>%ffIz7Y;n{5Tf_U6F7=J{}doiA7vn zi%sV(E*MENH7&vZ6FPE=1x;2_Fl5~DBv7$kd5kTWdxXr-Y)QkRu06Kie>P@E4fsvy zEygPj?7T(-XMe%aX~Nh|HiXB9N`cJb+NM#bB8{#JLTXvtB|CP-c+BlQ&fpwMntOg- zS3l2j2=S=HNa! zvc=JnicwY+b0f?K42Paed&y@%#gA~bh?CoP*(Fj0ptFrOcVv$^lDX7hY{WOa-XY@ID@GQxi9@PVevPzHIogiXQmDz z@A3n=p;^PWq=@D0`zf=&g)4bSlAS=E7M1Ui!Vc_Bi!56aH+Y3PiQ43KEtb2I(eX9U z7h#4GT`%6uvtN0}R>9s@oq@V)Vsv;gY+FOv3=JW)cP{5|(TMG8fs`Y<)aPsj8X?|` z4=GZx&p75b^+}RjRTIS00wAAO5LE(%)s_DjcD2ao3Y*>fRmlW*WK(|QbLg5)qd~6T zIql^QYf3J=NenwXmHKv)8zcBPpoTOeaIdMoHbc0FxyQ?ykMHs;LRi8 zH0Z7JfK-A)bV?hRBjl;mfg?fXwh*q|UBHBrwiD;Zvhwe@Boq!~iP1g$9!*$zHC#Gp z7!WD_$>{Sv(uq34ja?60r>GQ|+`9h{dvDg9$g(X7{~)#*^JL#sMv$ZsLKKA%LT?%n z^E~tGKa1ranUM&oRQvSpd%LaA!>KKDj&TjX-1RErJ!!_rhx~T~?GSuF>iuH{oLEAi${LjKnOm}GVG@E zN-DyQd(8vNR*(262_~h10Nknsm}FJml92`nFn}|K$rgtAYC_LB6t?hTd||_58ek8a%J* zTW33PX2%0TvE3}7G?|tlavZJfVfj-wcu;1L2lAo@3Su+EB;Fn2jD}B zk3lT5&0?<^rJdP`q_aE&zx4nJA)+mnE1SRmK+idAuZT)ky@4a1rhjoMO20-85^&CG z*ZzSmXI?%n98=BIb685e$9pWWWi|Fh3%Jdp*Xo2~z1mVb#01h|6V^Tb3QpwuULxne zLlIu{g2?sR$tg`X@h{Ceueo}s>E=WE+pA+7nL*b!$-oIAk$5+zL29UwTJy~f%4@3G zK){9E>^_`VBfU~fDs-N4s96Z?1Q1EKTUi+%XggOSBKVW{uYoJt{I%{!?;eaRgWd(X z;Az1%Y7Cqt!lX=`qzNz~RkO@*{oaH~D1OVISWG@dJXf8E>PrjKP=rU;ik$!r&dLJ| zh-Y|=m=EV!%ziL^Ihp-nQ80MvngtKRK|#4VOFQ0{za6elsp@`=TWE${0RX#JY6OsT zB`k&$MCr3Ls$&a|*n)bhQ!{!WU`ecRew#4F4q4zlKBJEs=4h!hjFeIpiBz3^(NgQ1 zIlMrvXTQj!DKKAe1upJ6tZckl2Fbv=b2<#lP{^39CjI=K@eccCVIfXx@^1{({+k;weRwBJJ_=yKKF zKlW zGG~!G_w3c2z;%nn4~q1Tb`t7IR^+;#?^a8;j?v}Dd$wG@Vcn{6R}8;sFU*LP)tKxc zE12cn{#R(&)*8?v$ye$c3h64|fWr3C-WHkwK1+w`lfo>=CP!%-PxZ#7EkjB0EN4kQ?=^zD&?!2=c^ z9BM*bvQId51M7gnm5GFhUXDD7-^VKR^v_IrzCUAtc)Ca9WYAMv0xFlZg*hwSTy<*? zG;L!g6Tsi=EVvqFcK({l$-V4OBZs9uT|2PH?cIbM3orKLC;39Kt}PA7dU;tgO-<^~ zURVkB*onlNfagGhd}-#n`HMcQ-Lt`g4b*tb*!5Hkv#Qkk{+-P9pQyiU)bdMU7i-!^zaWoIAT zaq%%Cet}A57gTt-1*sp9Ca9z2X`!~J>MB?&)KoTx0dUuC$n5ghBShZU!YOsnAJ1Je zAjHYNdp4%5lmyTzSo|h7#xNXh@%hc&UWWMFwC@~51f~m}PZPL2cRdF(J(j1vO?m)Z zY3QDULIy9g22QJGhJjQ)_|`QJY_y|;z+)vYapLv26Xu{66PBSy2*cqx!p*fXho!g7 zx^Ji)V1VJy0%E;OW6U0~!1sxn6~-#*jF#~QjH@n`%3qz;HtS2a4|NR??38&9fx}%v zKIk+Ui%(yi)Aa(dEMTfQ;r5wIgNm>iI2-r?G>AiFsSfg*n*J9=+w14O7>mCy242CU zu{v&}n#8i$btaqbA9XY-&l6Vcn{Rwy;eqQKs8%2k5sFkbt+06fya6==!rx2;&ezfD z9}65>N=SI3MmI6wg-z!jC9!AOMLJr zGc~&*bz<=i!frbaMgdcjsFpj1MRxL<9n^gFMH@g_xxmeiEbW4**z%IyPO!GU`9Ssr zi5k>BWA;XTs$+UOeM+-SIsG2vO@AG zA!)Pb$bx%e)cLFug0Av5LNyEcU_(UQKPsXp?#m)=&=n3~YK2%TSpf12YQQg~NVtq@ z^nj_oz|)N++rl(z*9#tOb2=^NM=fTXzBr|SR|ecH+qZ}fo!5|j8|($Qd^g)iRXd0=;;^ul3SF_(g8YAlI!Y4j^=Y4~JIQ3$|*<@G8cd*GPC9Q^J>g0;em zEo(uCVS8Ve!gsMUs&-Vl6Jm*#V&*2op+o^jv)Kpyv)F*dQ1NOtH_lUpLulU66dE_Z zXEP{6o*uy~+`~|k^uw>{KhHB|BOZoGyJIuRra+$`tsgc1v+f1&aFNz?yv3wu8?NU0 zuU=H0g%txI)!dT55*ad4R@8G<=69X;u#u+V4H@3bUjqtDNan!$FGM z5f$HM_0zW=saV-REvJ7jo;83E@Y{M0-@mz1Lpy=Cem%f0e4W}+{%t?%~x%B zhj$0UkP;ZvtwRmdI>&dO*0CSHJvYW~wX){Ox1E*I*Xm8=zE_XRJ0=GX?a5ohO0s0s94 zY;@Zu$u{7Hi1#b0>zc$?Jcx57lx5Hj^!T0$pCZ&6-i#XCd&zPtf#xknGM}zPr2)MfTw!H%0qrN=E7}fKDrILe{Ts{3YY3qc2+0QF*>Ou54 zWc|xP0*Jg2wHVva8&-y5N%(4$OWenn`$O&k zbPXD63MrpP4w@ow&@NgYwP=0r-atc8#Qh2fSo2d-&?o3OnB0w78IP6>uxXa-{2F7w zM1#l_Q#dI5)LKQwS?vSWrRPNGnFwR0$k{kLzznd9Sx0=cuTW0$qb z!vYp)7;*iq-F46ctt9^*NCmVW>pDQ!42kj~=uo{?U@L8pkMV9=ux@^R)Ug2ojQqR3 zjXgad@5SkhyJr?GO5r2y+OEOD*{tnjtUr%ngr^gs-LX>WI?e}QYh784*eVb=Y z$Tl>3OAl3=b*N=`lIZ7onzpmsH2Qgq@Me<@zX9;+Ig9yT&$@Gm1eGC5djE$d2_RIxUZM&|2|ToEEG-6rtRk+p80Ly3-Heg-);@>IIXlS!m$2G7~Zpgh+TVtnSxYa4xp(w-@XK=dqZA zY?f4Ta*M+g0RV+ZDAHSqY68B{_cRZ&LDO} z(Uf}R@~7cM*E35doq$HoGbSYG%mk|`r?f?E&b$k#EotjaDzJtH5Q96mOG{+|J)U72 z)p@{=VsC3iV+f`RK{D%+z68k-{MMc>9gvKkTTop440(y5B%Fq3o7ck|tY3*G>2J#^ z*N^}MSaSu#VXX3esoVyO<63IN-mSq{V9SE8RC3#TA4bkfXlId|*PQ3RXUY~F{`MZaVnx~U{YE>-(OU?Zy82wYX|Y(w>-`^`U+;i>r)4e zesokOpc0;S4B_t(zCzm=1L&oJDl)~BWBL!y6!JSS({(5Z+JYpYSyxI+3K%7MZRw~S zglG|a>?P`gI*BhuyD*-#;Lay1i6V@4LGIfVsN54)qpr#8)LsFzBtJqk`6RtNS!t@A znFKZneFY9xS;kK6;J#XbrFDNlc3@wpF-p(S8WS}nL84kcKDI9FD9492sf-BJ#wcGE+yLZ&dI5IohYqBV}go_N_3YRJ0o-R#Uzi-EMtM1 zTqMr!9wi>HUrS{2DDEg_uiWjam3&9;=AV{VHJ?=zBBm<1o`7R%XKC}?k^5WeS_$?0P%4Z|jXbqB8)4-|$s3X2%DlD-rg3 zJy~oqU~>y~f}1*lE_Ee6V|sI-W9Ogk`6>7Oy;I9G#@^Z-22f9YARD)UUrx_3lyL0$ z5JLT8*oq944tfNlQ}F=B%CshtjKxmP=ynv8&C|%tz#Qo$iEQ>&ICZdo#uSkF&ki;Q zk-cWx#{R@e#^3_=Oz?=2X5O%Cbgmz2r*^2Rrk`+fjXWKq_N^aT=21%l)IN})-{TTc zv_%MgY#QGCF*E6H@cbEz&wpIr1Du2!Mbx<@g{BdPo%zt-AK#Ik$gvvHE05ft^Pp)*x!}x1}7U+|2AN}(oJqI;#kByTKhu91glxUm>b?KM2kU@3%qRFFK~ zUZ9~SYo{KkNowDwrNSPrLz)54sr7A;I|oM_^EFV}EBr0>iQZU^*R--E#>^aVjY&nz z*eb97hM2FPWw^U(_>&M!tHNs$rt380pvEVc7RyicrzR^u#W#$rHDrDfLe`t#PcFylxp-%M?f+C{ORTXd_>OLDw3L=+j>tmL;3y2d9 zRK=Ba#y9q%lT%Mi?!L>vP69{KWq+Qg1dFth{~GRBb*wP)H>(ZRRy_S16Zo$^IjFHT z)kDT9^yFaWj%xun)h}U9_wc(WFwZlxI1N=1E_hSwEBjXBLGSfxdG);7<#|@?#I+F4 zOmHqz5%plrL{iM#4R6@dt&k)$s$3Kt8W8!fKyJ4FdZg&IUSq)mg(`=~(||I@!>JDS zIvxOOz?AFG(;9P6+Bqerb}O{4zUN3cA7Sv{dTirxmN#T!-S8Nw)|ButsS? zWl{dU>W8;CZc(0rpCxD$#=c`f!Tfn!-O=p`wbb`ZWqDFOzk>fX;-(`++2p^0i`_sE zYkemu%CSq|0bCpa{x3toAP#NV>1iP`)k&c-i_j-8Q=E3fX$28@GxFfkZg32x6+&|W zTEl7WM9OXmfvDRcGAbK-;aW;uqEA-)dPt((1{Z5+L#3Vmp~L}a(UxVL>K$>oHclh)j}OKx!e49h zD>1u`1Dd-xUAac&J<74q*iTPf0@np;XvUI8YbWXeKVyf z6*AC;v(j8l!w-NgSi;q9E{LyP;wkkE*%t-O(^z2=Z~coMXQk2)81+!SV~n=|5y7`p z1-ria5`X`IpuRDqx59GX7D562Fn}m@8awa1CxA)Avk{gmlnHw_&^X8OSYgynR5p4G zndP7!CoOaKCVClQv9ij2nHj*I-6`b0p9UyyXu~&gef`?m8nj|Le-7`tsIQ%3IJ}La+ckWv zmyd8y@S(QjOfm_HrAaE29Z+CUNUNj~3-Wak*`8N&1LX>a>#$;zY+@)1XeR-f{v35l zf&C{7s*N}2E}iry1h*UTQvreG7yew&Y{;U_zjGTIk69n3Wm{>d!)oKdr2>thvI>R zJ&?UPFvx<}e?tQAA&Fl{Sv&(u25B|s?~|m`q@vihHlGK1SQFXm76nnyNSNt^&#=#kPX%1TTxV=HCUeCM zhFJ#YmHe}u&bq@@J%l>so}B@|1sC+a9i4EIIw_lgO<`&1mDAC9doe5p_KTfSt__sT zJYkkqmn~-tMeW?dTkF?iaIHa~^EA@uu*mBfX-EG9?gEyLBO!Rx7l#u(NI#$!q~UoF z2Z@^Xaf0NXA5f~^N7+qHrn|rNcNwyJFrBp6p&5!GuwfV-Gw@&fa zZ~_>v>t;q4_-J8(dS0nP(vcVDc;RF0!U8V@ey|4aGW!{%lq<74cRA=zJVKYjHv0-^ zB`?nUjk9dKmUcMpnA5S-?x`fr)9Sd_GJdaHoMhWTCSH4Z@xUs~cp1x&?noBH%1%el zyP}0=r@;3&cb9(?WH5J0WGx0YLb7Gz_c3fHeM4%Vb0(Ita7;qHkQb;SChc1gk;Z3 zsb$PQ`1RYdK;cT)y~Y01`oyt)vEb;BaSqnjiN5HWW7Pe-PRD$&N5F}-vKj5XT?0Am z+K{~2V``OZ%No}p};zm}=YNx^uD5t9%wC`-tIoU`mSV7-HOCY3|VNs1nbP1#^xm@Frt@ z4$?%JPpq2-C4OUneHeeSomuDr`l1i^pK0EG(cmu9fP6XcT_ZvtRetkBt0I^KEhk|{ z^L=v$!)EfgkwC15@9?p#TNa7<(E+EMoitD@y_(LGS0b5++Nq( z=QR5!vf~?FpY(M<0$!|XjpBn-r%;9}woo%@5Ik)_b1C6K3C=L@JBE@*t3kpC6YEPX z8S67>&mG9fdKh$M0ioI}?S z#}bhcHp-iU#9Au;7H{54W1!B!@ON(?mC6g8y+0)9`jE1HGgfkMFQ16Uw0YzD1DV1E@Q zFiuYaWM!+!$j&|mTG!&qw^yXk$h|nd1ra#I4q|R-OPG$gj=H-Eq#|ADOBH(c7F33Y z(0kdj^iY8pJRL{TNbx!uBM@kiPOo#pzg91o8o?O&A|v?XO`Zh)gW2+jhOG2<%8c0sVM7298OZiM*yslW((}H%F?W5NJcl1knz?A6Prrj_rx_kLoPb=4Z z>C<&7UU!u3&MfK|eOC8QPY&GujQgVwcB5k9!!q&cd(46<$QH~KqS=+k^{>~iUo$*J z!AH1RnUr=o(a(Uzm7wS&6t^~8U-bVbHgsmfbU~PWxq-bykWyv3Vd z)(i|EUZZfo*IIr=_e1o&@A(wYm|jBwIqBMvbl9XvT9m%5d!uRGXIQSuJ;YhVMuGSW zGvk9Bpy!`He)kjQauYnnd zLDz_jW25Yd$Lf=|GjJy*m);=HfpQqI+*Ov2&2?9;Ojqq!lsfu2#5ZXeiQUrOr})TG zmoaAtpeSS6)W-sa9WQ6LOeP2WkinR-PJ!*Ppd(00m=LjVxH|w-ptr+tgj=rH`oV=@ zcr&%_%Fm|=z_Cy!l9yyj&k8&_oh^XO!XY6}A1hoZ2Ng*r*RsSl=FX(alhmvfF#Vds zCINAsvFk#jum%gbUZ@QO0Bv`T>5UoHI^Kcib$mIQjVVXXqV5>U%n88Q(;F#D_9Je) z?DtuIrtoSdVet%Z^X!IILI1N+f1Hp-Ei}tg0}$MXb&o(Q*Rw!0hMMIej|7S@c(w|HnZ z+5q7|p^d(*doe8}@J6uz#r_UaX!6 z^7`ppr!E9n*JVX)A)`TyFHmWB;kpR*Ep4|W6nsVPuD+xB)1M>{CXN}R;rq4&sO*Z@f0Mg>PlY_guL zF{lQ9O#eci+J&K<$EusvHWWN5>VFE7iY`y7II?7S&x%^4`cmp#3S}I;09rg|KagCC zYh&+0z9%m%2}`#~aD4Yo40;RBa_nwdVy2_jruBurpQ!;^VMYUjN(IFGI+k_fiiaSm z=?skL4rHBM1H%NZKZfC768B}UAj@k_tW?-p`I!f>(oX#%E?YH`8Na?L5A8Es2b9n^ zEORN7IDEIPvgc(13u@WFcS8Uqr;>^mv^hF33Zspq%n(f9W^s13wJha30)UISwGdWj7$Rf0i<=j;$ldm+uSDE)NPcqB_SI9(=!1bUDO zt{*5tZwT|9aJzmb30pUZ!6Trr25zpCsxV*`3XsuhQGWO+;M~rZUt)1DJ4GUm)_!bX z$b8ohpuB1%)@Wg%tEvW??m` z1WZx0T=C)GdRxuD{XAQu=an(rc=~Xqwtfe~+=2wfgRLflqyv>0JKxNb(EW1dOX{f@ zxntBqUOZS|4SOI$egUF& zdrJ#IP~S`yGtn=7a|=T*{#Bu@X+vKgyg9oOL26MnQZpOSZCdQ@NF}R4ie_ODwe7lY zJO8j&V&+eMdTK7q!8}7=>t9gmglR!(vT;dY*hky6d-}9OzcQt!CHFIRQjMx0N+@$^ z<%(9TunxQA7PQqx9xoITsc}EG1^{f$yr}3(ZlNS>A2usRWFH1>mbOI0GfRbS8W&@> zUlFGBGcvbL2jnvqv%5_d`DO`&v4@KIrOsF+E-<@#t)|;p?R$oVFX<;?lvhUPijf zv1h01xUuMC&M`7ZbtjfLkGBeSDH~Z<1)QF&lM#k083mbA^le{bK|M;oFHHQkK7ZRx z;j_F}hV%<;E)$x`RG(yJkdR>29(SH3kiaZ= zCqBuiUt1V36bdRZPK2b2$VWB~D!ZLXB zn>FOU+F83!2--<+wFNrmFd3ZF0|TdspD*YrpQHLzMVaHm4Imf>$P~%GFm~am=?}yv zdT!kPaER*Y{Jb)imw{KWGD2bM@FkNcS}h_f8a%Vav?D2o=RDu8RI=7Npf}MuUOQVs zWlFBXAHgBXD-#!2M#2JqUUPGBQ;*p&)hJHjK}QPiWZeG>hqX>KQ9-l^fS>x=%4<~| z71O1YRrE=o%ka(8L_>X3S6%TCci2O7xKo23Cc-GClL`-BQr>`;7}6(ttnI1g6SZZW zze6ZRU3~Sbw_|newk!k0Tl~5bwTVd{p4AfhjK!}oFkLG*U9Tz_D~o|goq+zeLwsa= zj-Xlo^Vo(DI5J#(k^hd)(A6;wu~8Y@=f12j)5Nm8wAjVIXGW}pQpGZ~9>h-1Y?KZE z)r;CN3OmDMnsqbKERP)xzW_2q119CBn4yPbC)NviF3!pUt8NFQ?GF_ zcQBj7R@s|bxbb0ec|V^RuDX}Ps}aOCPH0d#o40<8p_wd9jEh6($gTD~Lh4Ck&*37e1y?{J% zXDp<*`e=ExXJsxvVv8cLWfnBY!had(+(1+tDFb=N5&5A~n1nXZ-ShJAZhbw*h1p9{ zT=}51oW>g;zqxUEZDr)UxwHyH#Dn~j4ura z;9UV*S5ze4pVHGDe8kGKP0_R@kmq53h1n`6nH5V}F+}-tPG2&GNDatu(CRLFA=#wY zEMyd8F;X25Kx#0U$(ZgYsx%eHQncppeec>QHPeWzzA)&pu0%5@-@PK~4f+k>Iyie{ z_Y`p{Xd{LaG%F#nh^VC|$RWB}>enK+eA@j{$M7VU1Q#Lsh18wR1`bHZmN%_a`53}g zZtNI{+ej3^;OxVGn+djCOZnu3q)c1dFF$ zi3W|(lvliRPr3+(imrA(Jvjr;!!20l#*430r{l`y8<<@K*3uSQE=7fh2Z+~{k6~t* zN{54!M%6$z$?ymNO)>^F$dK$W>b2fDLy@kGqzNGER?D*PU}aX9mq&?{fym=+HXu7~ zI>mZqo;yBaR8u6*a26Q9Kdbg2duruT$GkwmsyPQlt!l+EWfq*F;^*Kq9Igz;>FU3Yu*#ELSPD98|t*tz#upXKeop@2@`~ zD34?;o@H&x3`=*jGaZWJ)n0P=({&b*=+c}#2m!Ce$aG#SZfiZZ`v zc5;}Mzxi_5NSrYmkZ+#;D9eK7-#WY-sK$H4!$&3-X6=p{sXUP z3zwm`6JLvyUGP@%((dq#Ta9?Dp+qR_PatEfA3_kc8AG7Z@|UWJmaLZs6-$tzU#p@R zCDyKYB*EJ%4~gYvo??^u`>uQvAKf!UKh|Mq0Qc^{?y!cyi|=X;0N$~-K34wJ&;DFf z;wb)2x1W2kiO$0naVDby3cEI{ocS21($}eBp)`pcCu59hGy23NnujF6}OXGiIW-}D0H=O?WGU3#?pW#5jxKF_{_R+Ntm+1P zv1#RdBHKEi|A1~bR)PJsi50@r`&&oodMutydm~c7by;%}d!XYoKw%z~BYd z>lc8so5?~zW<%OduTiR6P8hF|tXfX7TH23Tq=d^gR2-N8Y=u;y;QU6TyS#cSG!#da z@hMGi{bX?vSy0)j@`PpQM`alwWa}z6EQ?VC;(T5+ogrC$Jq)?%Q;r`5dL(>i_w@)pt+`E-3=b1299 z51dospo-rMTc_~_&Hrc2lH8PK;2uj_)xHtbiEl41lHgYYdwjD_x>4y}{1%vz>7VUR z9XrLni@%h+#MeJO64)_Ne0#N(NCE1t^^hgmH{fc)fAK5+d(Gb#kgiNRvkSaeTbN}* z;W?y&BSFuLnVa|JXIQ2<{$>W_eG&g%f`(Q3S+dX0B72f)>5bI*L^<&{qr`o(>g^CX zURT7i@wyW*qfaC*I0aX&OwPwWY;l2oG+6}+Ebje3er0u5NSjLB1pl8+sg=>JHh=%q zHElsYHP2tvFV4NI+7nmG>$D++c^hIqH8`cXYKr?_ZQ1!T!0<-C2NX1sf`_MG*W8 z`p%0}QFrtMbE{7>F|oFq|JK;TTEBmHOs%IMnOb+Qffbe@L7u*zK>(>+#_XB;U)fse za{R&^FJwOE!umS;m)2L^%RK!}0nHBh=40>^VEvTUu<+!EXvdscR`gWWz%mU7zLQVK zQ+~-6Byn}}<)@V`D=xe1GZcz-PXDyTWy4ERac^tiQ#<{?4FCQ@S`j^5e^uPd^2jeR zmPa+fej9Jcp&F8yZ8p@A1r6*erQ3>mXRoJKT-*=0gl;#vyV~xmDt4I}$*{~v*+LKzJ5cLT*e8iH= z&?-D-PYdvX;6_#t?=I>ABRv9>-xxX(4S%a46Ze8Fsd4sRJnc<^Ty88dV_QpkQT=Xg zS{U@j1_-$2pKkKat_vN{d&y&s>{vQe+WW@TcYhX6QoRo5Q(A_IiN8!NL2TWU1Gmfy zsP}pZBQrQ5U-81?ds!c0?8;U8tjmnPXXddpInm?6#ZuXVf+ftft`reqE+L5VVp;jF zp6<0a^a8i?cQCIcpy*azZ&~LC+3(KoOl#G`)FPy>whg;N%VI{JuV`p+(H-e<1&^bqPc~JttR?2su zjNDF;`mp#mUvf{RsBC+)jdII~3*@)mImMi^m=u9t?IhzX;!t5^c9*or3L&qvjWv_) zWm+i$Iydh*LMWD*bPut_)+o=Qz)>PdoiU-s$6<_J{Hz*LQPAuj9?RJ((b0YoZR75$ zDr>~vhm2_Hj$(?^wjSVG*~lpKmz7&2$^L=HasgS;!C#yc}1YZ;EU@sl~}! zm@L_POA{4I9yfVEOS{^TNV>o$Wc7HH1Y2u|(YCkryi{YVJw>#uB~dqQomdng!*HUE z>ZFk@M=^(&Q3(L*#u9aJLwWUigPmd}%f(PP!ZJehk%QZCKYcMi|MUl3?k$N{Gd_0W zh`DjN*!>Te%v)qK7g1Sd*OX!2)(_m{$1*td<7lJ9J9dl)wNVocei_cz5WKs)cXrje z^h>;`-h?cS+18yin2uT^1K@9j=)P0P2p5`tWjnft7*}bL#?{nkF>ErK3qakRe7D65 zY%Z9Tmx{ID{qd+0J8r?=89-ianc#myxm=*2#ZiLSEbiSjE{Wo@ygc$+O88}_rhLi4 zsA6b8%^(biUJ=uvYm1+*llSSRPGTs{g<~JP(OBD}#;afNEmX4Z(nEH#TNPt^oFJX& zqjXwYs^F>#jz%gJOX_%utZQ{8VK=`G=?{V~#oAkVkOWNZz%d;^=S7D!0moC&4^C7{ z_a{(k#n_j|^_lVnbUNCx% zeC6i$RVr2R;ThbppC8lMAIsvjR7)o17AF#MTze_Ufa6kdjE$Xqi%NG`nu@sP+X%aV-v@U|7B_o7L8&^A2nuaJ z>lL;*DN{0Ix45l?KjN425#WABsoZ9^J{0evuoC3r|;EG*bI zYxyq!@z{4Q{I#UwTBjU?!dl2>$r)MzlH`ljp7(|n#a@rm2Az!{;`DP8TVacD;K03e zIrVUiLTgNn*o;^i{k&SjtseFu|wHTSo9*97@MS87fz8k3~*Z6}V3&{G)Z zF&GAUkeCLK(KIgb14=QFoEejv~BLB$1IO>eu22 z&EE}AztiQk^)T3%KNhHX=q~eIFW~IV)ru9eNtki{Gy)-~0wRp2JhkrWp^v;V9(l}C z+DXEzxMOcRCT;{qu0|>!dXdu9Ekr&n5PJ;B<=8d5SwA$Ny*5|0L3oTgPQ`WJ`|Sh}VAHbCHWu+fG>g!UFKZr{jo6Gdok;|GQS5)_wv9yQ z7!u>HlsF|X1Ar2;0ZTI1G;eaEFy02PRjeTs0XfN1+g~!SV}F*=vTxy75AHHTEuE1{ zp5xbK_gq!)|1oLmU|pFZI@D%ae}vV%wBE4qd(BDKp`Y=ZY4XzfL#FE*qvZ?9ZxD&I7r`*PAXFUsfW<| z+dKSP^MYrdf{Um2VtMHksyzN_=z05|BK7heCp9(c)RE5X{-5$A+RcyjOh!OziS^$z zua0Q?&-&OLZhpddYtU9m%CrNdw)HCgs|OIBrSo6OR@O@0xRC7W$?Wate1 zA+wmbQRL_E$x1K2cYgB|TH(L{TI4Xu=VN8iR7gr}){SHrFpRHSWlbO9jP(R$q6hVZ zmeR*+Bnj>|*S}yKy=brL%})rF4Z!KYxy77tvxGAmQN5mdk^KEn+A$qmYsb2`=(!1E z0iG4z!q#}flV7GhJrGzDD2kc~TXc=D=axpXurcDi+v@Z+R|21zZaDRb!4Mp8<=ZQt zSp)Rhq5^nNG975a)(b#j_b<5Kz=G8-=dVk8EDGAH0a!lt;r>s=!CwX$4v0{Z4R&_8 z$Uq-YtjLCtO^xiYlgsm#wsIRHbTx*@5VWA92>Sz(s3whsB~Sz%yiD!`=gC+DtVH(r z1(*wYZ)eN5X?UN>;luc=#Pk{Q`|R>+d9;b$yXk3Gm$sq_*W6Nmn%U^#wQRJ#tX#R0 zjh=s-jW*r5zPs#28zm$R0%$#*2>v#StcQN#kYOQUy6TY0MfVJb6>ubx=tx_lqxSIQIw4G^9+MriT)%8jED|<;?4oT|26GkqpLz^Pi|?7ru)}ZU57M7gHwnh7|5{7%5q^ zj_ELDi4S&y*V)>txSC%fgv)Gj$oV=Zy8u$JQw27`A`dS{I1FI0z|aJOd~r1sw?iII zUR=G)@o=5QS*FLvN$RNfoPyJoB)s2PoCwH759?x7MU^eY_VE{&c9FGZfN0xaQ_NM} zbe!i;|MvM|*_VAj9rE5!pFh3nhD`9>XKo1w5&I1BZUocM=-u{)a5W#cxO>VFm1VVz zdrDSeIN!Rb)El4gmDOVLbiljm+t$@*_4LK>Y2n@MvCb|!l2ylRM1Y1rshd;T+H9BuT+T@qoO}8xrui964zXYv!ULt04CEv38wf^tH$T=_^@nv3goob;| z3A1I4++^Sts%8DHYUpV|w}9nI^1B}jfPN)TmT+Ozh{j#D{v{auQU^!qU|7U!UP0JGD4{UQxFi#@5pUr(c8p59LkeuD z(%Y1vB3Y9GPK{Lj>izYr7ozlFq7D+73CX_XI)SGXrYtt4zMsSIoOMNwCo*Es50~CE zqk>`wzyegfTT_SjR6qH4~6C)24e;ox*h(W%TQ~KN6 zfZjo;^%%sMBmUDe;L|Oo(FdxCxcH=H7CwKhvpM}Gfx%(JNaC6FFxPzJ6OMJoa4{op z?!cMLkelutv3xvkAc@=GXKe<=7l~~%01}h0e6%Zy8-^IdED(Ap2G5HW3+VSRShAss z(mWUAL`tbCip`f(Vo#?P*$y^p&0jXtiYz0Nf@{tBD~DmBB+=l!k19Y*s7DAxJimCt zw%REo2-7TVDVrcn6P>}9l5CcIWmqKv`#x?*6lAu)Ok>35t0JgDP^ZvA9tb(!BVYM6 zMegK0twhwl^}Y0l9!)DDs-a(oCStEhr@$QCDT!GbUvwFZDA@A47S?0=Z^+JfPjBBC zw!`Wg)IGi3Z?|1qvuOqLG75?ypiqAq1-7-!RI#nK#h#?$)b-XS{dIzOg6*xdxwA+M zH1x4Dkmc`f54DuuHrBLslv=qB8M}CLG4?2%Q6GnB0s}Z@%J)42NcQsxSJ!h>b<;uAlYo(6h0VNzI1nxZ2jsCGCbzNS~HD zxSk^G%ojL>2GnP`S;5HW< zd7J#Jx(AbN`9jtR_IeM+SdVxq#>v^fY@(SyR)9YBTg{mxWJLStd$=wVXm|@uL`)<*&0jFSfd^Z& zCo!V+Rug!5U*QvVBSgm8dmzkP__YjB}7671$RT-T>4M5o6}O6R>` zlp(j{%w6a7RHfgWOB^w~SbD|S_N2S@FI``&upf5wrI@KA z<3z*ZsCdgTI1oHTEwOqzd=6QXq9pWX8i>hBD{^ypxzYgM{do8VqRIlS(4r(gI@|vD zYhlwq_?V4S=50@}t68w%x9?m;S}`V*Aq3K$sEB)aL5-iCYlkf{4;Ujiy)bYuEZ(H& zhl$#f1?2Q%zr#eGN8%_nr_Z0>#%t$0vVl2l8mr^KNY@-E*O|}BKGxooh3r%QMxvs} zB9Ty%;&|BxPB-mQJJKo~<80=mxkN6?4yxlonYXXfDq-PZVixDLu5z~(ONu@MvTK5C zyZ&v&VXz$7RtF??ru8IIYBDD=2T zW{!Z;z$zUE@D*eJl+G(c4L^Ae3ohkLu6`)FF$61Sde!eEe_P*J<_hwuQ175S6|aT(odIT#s8d%{mT!>_5_f5gH1pPV0;}H(>(phj~!4@98~dy zFHaKMwgBkenUr1^oH7`rk-P|}$4aHA+M%A=%t#(csowCj^Vv@u`$oQRptjPpW%X_N zpl;5{VJTgx^epboWhKB+%ai{n>u70?U88V4b+j;r`zos0ZpVbMzKDAy1={^K1eOj{ z$OKHQfX^==3gkv^@?Uxve~7JgB~{^r94B`f#Z7ltY9On0Mxwn_>ALRFzl`?YhG%uX zW}eaB{ry+qDLq!%h0G!IeE-2%|9z`4FTq^nhx$Wx%>H#um=Eca#-oq_dm$?a!^J}A z%LBFIjluOwQ#ZWecalLAvyMC(H(JiCdBI1~f~uNc@Y|Flv@FQWK#b&Tnx1|-tuG_c zTRn=}@y$D+?8?MyGfLdKxm7bVe?54xyZBu%(~E;OvpHj;%~Gg8q}cmBrQ$ztl&6!` z#rE=rvhEA@yg?<)Xz=_^)Zfjwzn0rkgPV%_FjQV_ME_lCxFa8#$k%Yh$%21~HeN%K z&W+b7#(8>bi8u^*`GOIShUayQa1Z6f{M3?1UVtV>RR_6Y7o=ZZCd85je^IRnz4!%- zsm@32_F4QK-_~?eWiL)&VZO?c%8(#px{(#4NVxsg?F@U_vOqze*q-He&rNyi9#pz} zCvtZhV?duUTkgjL45%~=(}pPv7)XUq3Dtw${1PO36R?Y0^8O1OQQXi;4pw~@KZn8RU zIm(46Xls@TB>xS=6=~sRhOE>X3&sat+&rpjLPw)TC4S;S9PE#O8hU@z1a_=z-h8LZ zW;rgX^p9|jHhDA3YRg|G6-T*Cyrb_;gP$`wymo4Z8t`%NJr8)J?Lk^ zuF}g($M{JtYxhd!m!B0^Ops>Ffp2ITrWqAZNaTJD86ntObQDnrO2%LM_MS%9&@5aa z)X*j{rb10ab6_haPX7A>gmeovr`tutK_VmwrnDxEGHs=Vx`qiLa~SA={6@!Z;vBRY zbH72UmE>`O8R)b+(bZdkqr6|CAVJs6Y!b8AkH15W5Fc_6l<=|k&?jZSVyI(cLz!EJ zNw#Oj=i-R9Uhrzl+J2c47N+T1yI139omBRB>jaO1e`+L|2QaJ0RGR_{Srnv~_0xJN z57z~WLtgs111@P^cYWswE$eM%0Gqp?o>x9iHb}h9`7P%0Ha3{9Y=3=H zoOtJh--Ze00O727@Q#&@EC~kDubp-l1GG&=<#%fb*2;jDV>K6YsJtt}Bn+HD##K}q zLs10q_midQL5QT)imwhPwJq@1Q0M{)*;LKqw;C*Vn5ut_kr5yya{E1bN&>IiJt9FD zvZe?=Ob>Osbq&8}2f=5Anq;76;A^y!i&vm(=AV&tSGQRH17fX2?9b0CJ3%yT-ru~+ zQeMR`*3r~IfVr8!7Z_2?3Tx`R8L)k>%Tz}-y>OOTQ-e{N-G|cx?F=aIvTeEDL1M;x zfBz=YKWYL_I+38#QcXK>nc=H7P7r?0a|Q^4IVh^cM*pwH-_^VzS=|68dt>L@9}#we z7i9GT8_LUcDn{^!4J2L#M<1_8pYlw*MXI{`V}SCVVJ(zyU7xXpbze&612C{{ciAGR|N2DA^IHeXyushfoW1RwW}zqTUi#kb8d^ z5&;=7K3#q;>e#t8Pp82iN;C_--o%vRBJygz!X&DqoCCjm?)|WQDI&;1{ih+3gOi!O zSYsu3;&qn<-b=JuYVq~lKhe-T8u}^y8{Y5l3m@rRTd7n4ptHaZBW%%!LHI*MMR=S|d}j@t3~#{!?8=l`BKMUzqW z&WlbftmdhOpqFy$Y+7MaP5wvdrJtdcH0dmSFSGfd80c+I05r;suEu+Z{=bO#u8Qif z>Q#gb6LelVb>cogUP%9q^7xX4}|B3(!7#YJw8ZQ zb%XTyLhO_PJOF;!m5ns}A+r#ahEGALV*XF5`wcvdCD+WH#F4zWa-QjDs`+isHU?*I zo6qaNDX?J%pQ-H2#5@7`7K4yY0QsMT!}L){nNn#dZ>6W|8{9mw%QM29epW)rjB{w`Oo;;w<;rnFfd=>bsc<3 zjgZEmpuR#T=$qn1J3s_|gQ$pb@w`eJ&3h*h!6UuyeuxugJdCC4(BWYW^%af+s=R zuX#FN%iS~#4~PKpI*W%ZIT?QrnY!ZtF-exp&Gl?X;Uf8x>Riu;d^mZI)BCsinP9A! zEt}ymZBcs-17QE#5*;h?0x5R-^`ot=bmewYxv_ptDwcxBnmLnO^5Ff6hbnFz?3D98f zVB7&$RR@Ed>6B#e+Q|Azsk*W7cAp?H%V4E;vJi_QV(^F^$nt}EeLU9WkjiC6yp zRW#LLRz@nayn0b!l|s|z4!<)&v?rZy38xo4j^@{@MZ;Gx)uKllXX$~8tg~$U51Zvo z=`&-j3GA6ERW@73LKnZ?GXC$QBZ-M?rt<1v5s#2+G_QbKwC&jAw@?2Zr;R!iC6 zs{blTL}zIrR=>Uf4Y-KlbzQsMdN}xlrHCoXAOR3X|6UTAa*zT+U-ayn>#d6^k(_*E zwsGMj!Biuk_dg7LF|BZK{@(zn@Hx=BOQ%tD%JYAvx5}|gESvZu0{;XiLSmc#Z=e{9 zkMe^=)Y$SlA*}jh*^@g&v%}(*U|FpdzTSi}$mzl0p$3 zbY^r7Nq?QysCxZB4OK$=Rh#VoPk`_ZInf*VUX%A)w_K)}f z90=o&A+|*{%oVUp@P8=S#W+Xv%dmE_zB1@H;hi?V(O7)sPWqE?bQ7M{^_p3WG--cD zs-rKECOK60nEmShv*YtTie92;xQr!KHdfP=isE+K2FHWn?f-x~C!yZO$e64oRsJg^ zW2p@nWM-LECAp#v_oX1Pg=e>SYnIz4^WS$VWbwQsYGo`R*<{OHui0mfAvas=&_%6z z#f^3#E?e<`S8DO8{KfNxiXo}81DA=SD)Do4j+}fH8vjaRbx{kJnv9RZ}z=!efog_qvacH80=l z7moP`hiPspCPUwR_$&On-~ZHfIe3r`1z!f@Zb@X!8fAE72~eI=h1DbwP9I46*FDc) zrXzZb#sZ`mT_^gJF&7tsV0atMD@l{Ljrs>V0dMKa)*KQcPmT>jq5 z45>P0=AdX*c{Rz>bfhhzI|Dfv$u*f;92sR&58ox}pOum^4V1_JkiY}`6gO^e1{y}g zddzVu6@5imT8C!niNO0wV_QAVsPBLjUL&;%n>P@gfqCED9hy{IYJD-VtMV14u<>4` z#JS~pn)D;xiM*QsoJODR6bd2L9!@nfxS%l-xfWS#^;#uOm{NO%y7@=Lm*2{^@U{U* z>=VslBYURLfxSfylC#djDbHB-C18LxAi%3U#a@MPA!ro+nyCEMgMndbY(GEv(3jY# z50Z-J_~xH5oaNPKlub`4)XSJvgmCC3YE0`Nb_3FnJK2>JNFfi^5gD7p(!8pdQAOkf zYuhz@AZk<_DLd55ujs8RuA z*C@RMF+m{Stf2l$NPcd~bo*q(%g~1V&y=aL5?DGN<<%cbVAqvM;C|V{x>UzbFN!Wu z8)&Z~paVu#U3$WaVcRu!nBFgNl;m`C5JGeDWzl7s-o5~XFUM;|VbH1P?tlQe3ty5c zQW8pbjx(yNzoL|!zqgj=Tl5nZEL;1D3ZVxQJ~wu~j|6lz;u@7M%k9aU2VyYGJAMF7 z7?h><>PX4<^es}ubz_ChRXf)nOoH&a*}tr!8Ho_ccQYG2vbai>3!&rBRw*?htZOR;6w(jG;fcR8b^|D zDcW2#loKN=RLDz=r<@4*_brX^(6B=7?UmX|YxGxOCe1!ZctMdu50aHUKxC6CHcteU zZ9Zhf=ASM}3%it=lGa7MN8>E<_&UHa6R}a{ZTfs05zaQRZ=ymKudx1p@#tb31RsNf1H_ksGj(kaJZmEN8v-$eh8ZKN(VbrV~b}!JB_R5IZ5(W$DUSLR! zT`hJQ=(u$etXS=PjFQEW!D@5G5D|v3ZEag4I37%vQIpp^f9`MmtGua_AIJj*{ljk1 zf71>6tep<%p#x@Pt|Y_a^$r-xy4KC5Rc!b##pJ9-!`})9jX9iO;|mm3t0-}phZrFv zXU3{9?{ZrFq%Tt&kkw7;&i#CxV>LGmeI8EyTOy74fm!ib%v44-(-N_<1Dd@5fK|2w z$^zhdOld=WlIL$hIS1y8I!^wD#E$a>ETG*9_Juw}=+j#SJBJ9Ub!P~By{^X&@LK+_ z^!{l$bPNI@ftGn=!0b*6(qC{Nf2(+-|7}C-U~TC2-wmy-csF$q>)n-gv<2fMLz*v(m$<3w@33=<0;xTdMH--^YcU`7>U7X5!1g@=#(A4C_SWV zqsci5LV+?yLw@N$zSkAs>cKmzZ@WdhcRTq!lj>&gI>5+i<$#hLs61y=4k*GGYLv2x zn*|Z}(aFkBw+W#tUTrH_3_R9_{`Hh?c#W)YXDgtQg1z#q*|Eb)BJOXFB4@@~cs(nV z`UyJMsBpAKsf*+>uK z5LOHST<5?NmzKb*9#$w{h^5Z)qnH&$ z9{$4SnQ{YO&)aEd4FK`;f3O7n$HT$AUh1#<-Ncg3dv?7Xu)G}F*`oUI9^2B^-;GGY zJM-Qc_7|J6xldI-ZYd#Vew@D=eD`tlpL`tU&J7ay+Ln#91|;e(-pxdS%qtm2wCI(P zZ~X6jqnbWHfvyCJ3_(PC+R`O?O`y~}o=58DAK|N=!1WhWXUk0O(l6kVF>7 zH^!G41_dNC*T6o=O$)@EmU-7gm9b>GOZD=eHIdk?dEQ!^@&|dL^BU3KbjN*IKZ|DY zCq*RO%5P4Bvl_j@WW-nw-yltC2TUzkkB`v;0%^-YBN_r=7gAyf&}Jc9QGwMy!6DRL z<#9-Zk{B7L2XsC_pa~c*Ng=h}DwJIWM@}Nr@CD}~v|JDTy9{CW=;D@0422&!L$Ie~ zOPCrK%Jc?Oa)`HRq0-4jqN;=uR!y6gD8pkQk;vH_%GvPmWl>Qix!?oO?Zp{OY ztokqc|HZT5(u+L^iS$qtbsk~(BNOS>%1cQ@JWn##MlkJ|g^eSPqW5a?Z1Qr!t@LLl zV)m1^myNRLhQGkZ+YaTIhKy`V0jk8MS`~YStz(r40yaI_0DZiIFP)=Yp%dCnsL=* z1J?x1{o;90ZSiE3aK)-3TMpAH5gX?dp^w+EV3kaKCRfZb9=-p1G{fo{R#v#Y4L;a% z*`03!7uqBcH3F7ujGW+7EgIldq)i0uO7R(M043_N*0l@Il&CdW^ChgCX$DMZI)Uh9 zb9rwt3J(ha%%|`gTdM=!4#mhB)V%_Xbj$Qt-{ALQ(Imme-7ZOX-DfFic(Z{xX8OaA zoebCwpOB++lJ7jCVP=YdcDNyj&leMB^o&0H09eRbtg6u>c2x4DE+h-2M|$}cSJbtu ztC(dK-(*JKJmLFJj=6;~j9%d#HdPQd|bB0a^SI;vpYGunpq8Zq@E>3CDc0E^! z)oD+zp4T-I%08^4Id?=-W!F8OuMCK=TV5WEaTau?uu_7Ry*2Vg^%VN1ncpb_fNiRa zXEaVc1Io?=l@=L|W)_UiEyLVw{yzPJN^<%`?1)W2_5m*@gfqiZy}x+$IR)~C*n{*^ zr|;!W^Kb%cIX>v>gALhGI7S2w(np!p5KYr9!a59Wv``F&ikl2fVJdZtm`gPp#T|2{ zBw((do#)v(o}EWLa_$%q1#5`N6+ItcR|VuM0RUBbs;=FghwBAa5Em2T_^d08>UPf) z+0mNA!PV<|xRF7Vce5h>q4$*lLqNR06Msl2Fg26cpU=ZBw}RQg7AqTR{4$!852N&L*48V+R|namB9ICRj&Hq};@^3yAy}@&_ z5+$vR-F)j&(T!JG!ZrQAj-Bn*CgMp2zifSj={FIv@^lKNAywAbH$-+$N?DmuuUpQy zK9=j7Fo(`rQloD*P|m(Lz#CkQd7s7{R13!tDW{pSB_1z*b+*p2wKQipc5DR1{t3fM z#fuJ@K_fTQPhrKm_D;VLi9_i?eM9XX6nvHWmU--O^;CjK4NL=dtQ}K({TTh{bJPG> zB+5--zT1wa_kAni$C=ur9cVBg8EZS1l5;E7MqWQ*~J>g^e zD4h5Zad4G~Bb1YHR@3bLv1Zn8yUyT3Nvk(Jzo_#K$JS|jx|R?yb|pwkUEsj=zuP#` zqtz|xnW(V_P(P!+m+rd@Yr5xvu~IKqN5(R2PcgsZ_OI6(W5U-HcIigjazqc#DxmRvHyzb-o%7pbv5xC8lh&9 zw9-$U?rF8dt;HTS%XRAU|7Y&Ywi8#jWj}~D27ULaOvy6F6vmjs_{}Yy=zG5Yj+_xG zr7*5lXYYINxGz-(q?DA(W;QV+oC&Op3b7ThpLb@k3^r6B5kcwc!Z0ZXYGGq}`jU$*5s|qd!7WwFx5TR!x?zW<<)U8RSFHntM=I=;&J#Hu;U1 zZln4UOGN8uky!E?Wr4JHxT!5!jyA@w*Qh_sD+6X}e1{*MU9LroUBARC36!Q9B# zBRtqI{yg@XRj8r(5<6qNUWa9);;lxHzVMcrY7Z&YW{Ln4mwY9J?!D(2yTuh|8(kZ) z`t2uYE;b+j!jqQN3cM)#be(S=Uk4&*CMRgjQ^)tSMf|L7u451Eq-TrQ5HO=z2l5tlRYCc$v!YPOS@7(p{uvOP;VJpP?FEmkQ8KU%-3FD2?8swYXpoJt zHG(!I%#kUARs^jClkPURRD($qpOi6HSCGA_71E8D!jv`=%K}@67wOz1t`V+B?r;x^ zK0DyNMX*gCOn=x1JKzmgB}1-9%06HzQg(a``uY~4ma=aF2#{KYyvFzuQKLDKBdfE% z+V7YXx~zsM82sMzK<+daHYxviJwGZkf{alyn85joXFnkT*8F;>;e`kzVYhOU0kemh z?Df`5b>&JaWS*-n1EjZW5SY_mD!Q9 zsC?KPf_$R+Rsi<@Xz!qq{N1eMmm@J)#Xr;(VCn z<`XXd{{&v!8yMx!Grw>mYS^-*2EL7Q(Gk9okw z%d0|csbXsKwOp&`4RdbEbCr9CW#XK{D(F!5yGV~0M$c^m3nE(dAYOBC{wu|BS(+00 zDB*MytI05=G)lX3bL?MZtOuRRK5=j-KJge+HA$Z|#I)*05W=3`#rxROU$Ekk@uE>Z zc|oGj0K0K$DjNlUBKNmdHe(4$b?a=RS`Cy72xzwBzUKB;!hFVrHppzU<}?Zm5jJ}( za>X#8$I8p7$Hbk@saqh*z7oCrHF8<)8MwEKema(Df;K(RJIJ$F)doW%^|Oppbp1k= z3DETt0~tkEW-JC9!~wc>z9CaP$2-wQRp`oUF_%%MUsgLIAbdr!x_*o91f*|XrcrnB zgf3ls_X2RR3>;F&57t(4u75VrxyJCVDpXn-p&6&p#^xuyuprLZT34XMX+s2td&LYi zvqLr{sUTWnm_~zgq%T_2b+tQ6fr1xd^9fHG5XD6!`XutdzFjgGHH1|sifQ_pMndTq ztME;>$V~bmToCWaWC1lq%cv@=JR&z<7D}dNfTy7E)EY>{a{KkoiVVy81cP2oxX@CJ32;ZHO;D& z<9^ti4S!OFv865`cyW*h()+Lh)IT6kYDZXJQfPFZ$jW45P7* zC2u^^hauvVxz8&Smh|f)J>KxBl)o3LsFjikj%3ei%vA>9?h0MlyeNJQR$oja33bZs zs(C+GBj&p~unQ~=D)w!c^i7AC!^Cg(+FReXyhHmoXcC4p)utbRAEhvySiwJ`uD(Hv zuON$Jd#jRORQRn`OgkGrLf@N-kV`a&B%;-9@_=^KlF^#|zhHb-D5Oq}^HEeTyT`TPW(D z+4zP;QrDX8bdk!fVKJ%y0{e^@@AHz_b)GrWba!^AzO}x9W%6!zVd1U7i`Y`Pc(;Ht zx$Lm8)?f^4AWXyK^&`01PpK|w$wd=6xV_X&z5NsDb$}}zKEa-L4o?)@ub%!OiQGWS51l{dw4R(sdPZ|B+YKKH63(AAQ7lGu z(~Bu5J&8AVCcv;1a8!R%c4mk5>F0>wcM4?&!K6^L@l`n?b{p~gSy_P+Pe7{JZI+k6 zbq&Fgx!7EJbN;w0DHyJTk~@wZZuc_+B|cJ9N{_IB-pw*w2JmE}#;~$(NNyl-0da-RqZ<$&nJuMS>OG*G zX8d}ODoVXB``nGMyO
)yppn@@Ir3R9m>T=v?6Od_L2`i?)HJC4+pcf2ht=Mq9_ zVOF^Omju<=|h(K@T9cd}@D$P3@1(ENOBKgv@TtSrOw>ebdx z>Mz91oUe!{d3K`uymottii$y&P~ph}v4%00cKO^AsGAAd!R(j61BUE|GlJu^bCJBm zOEnRSRqYwdM6<3hMhLT^s#ia*IVgZ@`c)&E(6b~}`m7eYqH2EvF%@Yc%a}~(aPO^ddE0*;fseB0>q+kv4huFIw8~^q8d>adtJw*Yi(|YyQ8Es zc45!cYFEC%pXq6)*q-4>7D6ok_3~NC@ERv{HQ-*@%TM3vXsZ+0EOt+a6`=p@YZYs}->skR<&*M;(G--@IqsbvRdNSP}W1+XYQ2{=4;PG;*%(S4_)i zK*Mk`3WK^@O!URNG$Zi6c=2veCo;5q$*$jB7&9{ngweKoM)30hy>1LZlQ?v7));Xs zRsElj9E|wRS(pU+HRFUggt_cvge>mC>}dKi{|lJRmHxKz3-^t=|HiF&ZeutMgCp(m zJoCRLab<(KictqGaAVERvR*BeB)r;t{iCnjpbI~jNNcYkebR#;BYwrZ&%gTslXNHI zh&IZIfgns*KseWv0E-@Di@k6gUgkZa@wOBzO|MkF>R(IGBFtCxZS(Dz)xdL{1O3~P zI+v-%^3H1Cbs=8iJZMxD(4P{{i8*|O(r*b}(%3=(XNQP#XDh2vq@ph|sR5Z&Ibcgo zHG%Q|hboI=pS{`x6S}LywPCq(OSG;V)}9-(X8<$p91pPLY#i}btgaWY0-UtAR7?g( zv4NU+HxdKeB=RpTdRg?^GW%M_;Odm)L#(%8!NunDs~3FP&nv7`4|X_pyz0*Xi||HJ zR_i&O`y#arz$wP zI}0JB2<`yx>5W-noRiE)w}#0dX-v`xY<8X58Urn=e1Ez?!nKAB;!nYwr0C~ActR2? zcQ*VVw-szL-~py|lNX1xy6h7vnSPWoTSsu~k9#C@gfYc*$oXoA%uei((e2e9z!Ia^ z%Dp$UX4l$?S;(SkA|02Jsxtws#+HFniVUc6&y{KbD|WW1zK5;MY;6nrEBxb;Qrs!) zNp5~MW+cAqAGdR}9@Ioy4o>$hyVKfPp|zuSu)eV z9ey~cpuEP%=Ew3eLZAP20&xTdeHJMZvEtqF<^cfY3 z&C^Lk+CuI*hdPrUjtUSZ#G#az9JWbr#1*@-)neEb+c3Eo?#A-A-xDnf3H#0zc(OK`)< zmTZ}R6WEKyR&zNK~{7_#cH0Q`9&?-Mf$6kVFh_ z@GGec#NU%pzktGpbCh`Jd%{wAxVeGV;MYvOgMweoSq-&Bn5^S%uSZm_v+v&Xdb(%hr(TVvol1S zO9dPKHP=BJn)y$e>&KfcZZcimlhe)<@i7{NM$R9>oHNY*=>}F0kOGU)Lj|-UpGj;U z&I5Tle{N^X;d^eRpQkvraWF)wPM_Ecakg7t2;|;p!w|4(@vrVT_qnxEEc z@!Dn)b`cOz?db{^Ejm&*a<5khe_y{O|6BNmoOGOhACf!Fo6ejdS4;hRIWSS=h%7)(yH4ijGf0xd{l@XTu6I4W74IBc@yIbLv7ti{~>LSreS z0{b}5Lz`krpwL5xN82-N|$BJ#8>!Jp3)9%Xo0A&5Zi+ ztVe*$v<2Bl@dPNV3R?EX+?U(&S!8sYSXXxMj(m-M35X0g?N9(scPx4epIfFWN!N$Z zfKon#@ch3T7k_bkqGH-&015=KMJNYuIk%YsES$NABdZ8=vcdP35&Jm+mqxj&V`l3| zCz{b9HNQAxi-fwoQ9r56X(9;h_A7S-b5M;3)w##HpJO=@+=sRdgn<`6GaU|#(y!in z0I4}X!d|b`>Iu$5->5`cLqAwQUGg;F*aKI}3mXPA6$T!6&I8E#hboUUcm#1#?lL15 z%y@J7h8qm&2nri!jl{&)6Y|Nf2wpZJ$A+BK@w}%TDkKX~0q|hLta<1P0mlxbly)Oe zf34@YJ4UN{MOd6L=%#9(Hi>5oRyd-~SJM@P>P_NAwwKs9o2#61Yu!)ruBe}O_%NUZ z0SA)TEuoh9tVY<<|2Wdj7zrNZ>I1TvHU&J@T+GS3us>;ca~KcVU@0~E&pqbu(t8H& zh{K65anE-V(NWJ8eJ5a=<*Ks-;Z2O3YIeg!)Wj4yOYh;LL(;u zimqu;GjLkL^p|*Uc+~b`d2^j2Hu?o%^@HQV5#+XPK8v%<{3StC;MhNBSw@6*K0M6L zGXQl3lF^DCNT$LE>dOc6x53I_eU-Nu?oqwm<#H5{V10*jViFsziL+(oNz~87%f+w+ zxInkOAohR7o%CGffF|y~F3x_iS2ZMD!hG8N^|_SV=x34E63RPdEWc74jte!LI*&5#FY5yV`QGbGH(6WhFOF~={EKzMM>LjlISYzg$hfG5bZAN)?*TNSD5Qe=Bu@)OiJ z$h%GYl&N!p$lWWW++4&?WecMrxAXYH!ku`9cjcneRJr#+YIx%QGGx zAyhejMq&uc1`y6_hs?_xW<6bOg8Ty|DiR~7adv1Cc)atSw8{!~jy<@>(FLRSp#{$k zlhtB@W+R#d$BhLxM1WA%kOZ!V|Co0X%!7m2^*#UuZ+mG@Lq(>SN0mc@*KKn7X)sDJ zb2Eti4Hpe->69?^dlTeGi+Tv^%gGb_Qij(Duv(@^^ZzTIas$xmzjn&{6X^{jA!vFf z3U;Yp*`|8s65o8B#w(E5u)0ATvF(G&zjw`n4BF+?keP<;DS5!0boW6_#J2)sXggJ& zYrA`znOJwi*VCM24LbPuSdr)G<$d8Mk;M1sU}C?Y6_NXV&C0$TMD~Y8(U)}BP>rPGCRp2F%;sc< z{`&+!%&q#h~EaSFT=&#Yc+h4o*3UfJLCsz=5q!!?C@w>p6NEF&H4@D_| z=`L|AwkJ1-M1ARP%XfS#`Uv2g!L(K9B1U2kO}tBlS>^d{A^BF%RgvFLGuoEe=`TYZ zC3h=R0(#hyTIX?SiJh^C(%q|>BygBJYvnH9>G?DLh{F+uP-)j8`E^56( zLzSX0ulu}Y87hyj@%#M6_nElQix+)9EZJYm7r%^4z7=cIOEoF6D^lM^{C1ws@$0V{ z<+j-Rg7qhJ+lq)%dj0xB$Entqw}VnBiw~D0S;21ijkGY2tkxw8!4K)!mCW!D_Ig6k zZUGZ7#Xs3J0#-}felFJ@3{)ti)KKK7Y175K9}$ztr0H6A(Q zk-NO&p`{5y*OM}j9V7VsIZwB`^;dcFxs2?gj8lI`7tLmY>dwNrZRWb^`wifrlqrE& z=%#OyKO2MDfGp3ldv&K}0tb%#K9BFm@_ldy8esk5RF#TMtT5N=#$5JZUjll%tP`3e zstWYYfc}jChQh%6mIHUU5a19#d0fh<35PRat8zD@P3=$yyuv#CllyLEzV`3lB9|_LVb7to zk)2j-@}_5k1KqTE;u`Oy-MS)ct&fN_q*W4+z!6y`>`InuTI7>y)=DgINB*&yDWOb0 z%g?b?wt2515P6?m0ktU!U6E2^n^wj}*&bQ0ERJHy^kdHUS^mO=h>ZvCb~9C7L5!D5 zicwqu5_+e(W^tA2pX&avH&D$4T+8b^4Xm*MHuqm{2d)l2N~DCSRzv}ms zBRBA|22Kr>xrUxR$3$D$6WZiCBXoLTuvUr6ZB=hj!T)+j^7v!|C}CMu?V?jM<0`x_ z^RqEqyM$UA5|NsUt=1l?-1S6=hFwGXyrWk1@LO&1R@Yj8Z$ImYm9QAxo)WF)Ph@-6&7r*X?#+62ng4XZgjjEI_N^enk2~YhGHz5_3S$Rh6qA zctQ@Wd|ZCPcLKn3Zq|Ig)ONZrP{PaRw9Lne_{FRY<>LD}zc2>6x!@Xj+1@;ZfLDRlKDQ_(KOWWPFqgc!z48KA4(^v_ zKlOs_yIGa(Iwon(wLJ{?)3{Fx5T;6sf?unpR7*BMKk})re!#PN8$}$-UiPx~sE|6Z z&C;=Vx4pL4n%~%4s~ycm5AW;5HJ!@7NSocCd6T)a|If*Mk>?kMvj0y_d7%%SZMQzg zG^hco-8E%BJp=1DvtX%qOy_6M=4-w7*NoTOPTB!~RE6GY%X98iPxPOMcd0C{N_cxO z$iBUOuW|1j%kFcBQQTgoY}(WJReOMW3Hp8u7r$0E!@6-_w=A1wF>4=Wjh-x0dxtTW zQ0O%<%ZdN8c&61?am6}2n`aYasG2HuJ5$WudZKGDB(QbOYmy3Pdr8{uYz~5 zu3)Ah1Ga$#8DGLojaDx0w*{xB?4=l+ii*<)D?BVE;|@Ga;Gkog^nVJQI_sRxT7Nm{ zDgDN;n+Mq^`s!W4poF$pA}#A~%ph z#D4(6go3VSFuqp%M(%Zfz0T^9XjK`GNWEFxduRE*}saJ_^XwIP{V5zP2J}A?9b{jE= zP{U+UI;jM&4LU6Q2$!c2q&`r!>fYMzpP6BTM${ngmqBy1(b< z91ncY*_{{K-5HiwSEEIGXDF7Fok4r0a$*4)e^HwZly(f=?bS9nM<0wQLKcb^N3f|j z_c0JH!0J}1#bSN>BU<>0<7?S#46gAG3Z%EdM6tG*i&vXlRIiR|hIR?ly}u<-`3?Za z*SWCi>tldCrPtdYlV#}Da5}w$-zw_{ZvyB5HTJt$?^HiyYXpD9dl8%zC#(oXQmCg# zdQVC-pBl3@irhD>b;ARv&BwJWQBE#PvuNAe_3S~FTS={E_VzeKh}ww3+q3iKAqj_7?#i)=J=r_8;$U5R?|!GR!jI0tH@kU zZk^S{DAFLQ{aHm3flWWlIR7+eN0q(2p3uIXz!E8;s^F_ic<*vdgLsVJD|>K!;GLe| zAR?rVM+CZQd^5-WtSpqN_n>pMHs!g^6?7=4Y_f z_U*f}N6#i!Gejzrm&Qg3?-S|y*X5O498mysm%hcrnsjG-_ZEY4e2aE~kcBFJhunsG zc2LHn3HJEwEi&=@V9j@Ys=}b0l0?i7j#dGbASO6#(ydjU-*5s}WmE)y^$ipdS9~k$ zQ5G#skz1_qM%cQ{Lbt82Wxp>=7+F_?%fOQRmbxa*YG)CyJze^pWCrKai~p)6iw zkqsHVOF z8}z$f#A!LU$~lrRtdKwatb&BORm98KJet9iS7X30-^=TSWJ+L;;0n!K9>dQvFHi>B zt16^l!IOZi#{jWDaT4D`q|f(n_$(xWP3aaq}1hTZ?L#W%73KzA9iV*Fd{R0*<{IqZ=h!@}|F?)G>us z9UN|Y-5#F0s*aKiO5|59FJdub@4ilC;OVT2oW$0*}q&4u~>hT z>|t{pF7Mlm=E_p-t4Hw?pI%+RDG0GScI@Z!qB(O`M+nW#nw(p?WzhSpcJB^6(Fi@% zVfSW{_%dtZAnn$RPQy7*orW%TtG_SMC=!M-`8Eaw5ZUQBXiDo?2^{5gCK6FNYB#WC z_J(XV6~Hm{&m93An)_R{q*xw1&PGL2vC>*ziS9@(+%M0*npH(2|H1v5&h4gRQ;CQp zHRg)v|IZ8OP^$Mn?xxD;4B*iaK&w3KMV1XH@4djUl8P$H@@sEy3N0FUbpp65;_OJw zzU4KO`GO6?PX!5(U9fx)NZ$@1zsx#Y=;3vU4pRvp}4Qer1G<0cvfnwlIy(_i?d;z{GO+;x_e!sAbt-6>wt9o{GQ_GsRuc@M&REKsbY3qp3_Cff zaJ-UZmUEH?Dy0n>q%i2B2C%X}0phuLG^^^b_fmk(zk~#9ug#I(vS95{bySsike0oUhR1w^ucC%y2|U=WBfUo!OKSBMINku^wGi z83i=%PlzveNjSZ)f&;HqWu4WQG@Cg0$e$}!aC{=d*9VYNpl9bAqCrDEU|U3asnSXw z9fp279sJZVPOXDGx`lIe8?&o@74wuEWRdzZm#jg1bpq922XCSSxq^`jr1D=43Ot)s#Dv=P%QqpVlBxUn;_7`ri)b{f+i?`my*OO0~JM;N=oluQIt`0Ljti@ zCYG$hnz8se$-D(|+@M%Y#iHA*+qiUDo?mA{b3KgGcRz~Ugjj}Zkk{_fcrnXy>gK3P z5M!@b2|mqh@cCtIQ~_2izqy8@7;daUNV@)LJ?xr9!^)_{4fwZ zKu95(Gf$-jaWcoWl$!~j(O?JkTmII5GJ(z07i-iAh%qT-<4EjD#3r?B#@esqogMc& z#(eiZ{SpeU3#zAu9%QvQJqNczb##j zfv&&BKx;3+!oH*;qAOAPFw5^T9TH6+ZUdy7qXd_aBuBoIGo$U-D{U!ixk9)KBBy5^ zkt!zx{~Zo(D!CSmvk1&_?Pob14mwuER$FND%p zPJX#-HZ9|xvJOxn_d%(o;t+pt4SvyH8DXfR8sgBdn4Hafp>5wFWpa^F(Mv_@t#1y| z2`2gbInBG#n=VzFfTyUbwAMU_6i2aiF2_5&s|AlWBqCn3E7py+uM}VCrJholje^M# zY3h}5iTwXGQ1mzLE zRI*98?rl!Od<6jbBU_)n>(;$_RJ|ALehO4oLkx)u?oxSp?*8HaHXxN+ zO6{Sza`kkix^Tv;MrXC|+*=S+w)v30b+gI~8z@dZ>K@2c4oTf*Kj}eJw>*Vd%nx_S zjQvtG`Q5DVQ}Q-nCw~8wz7JdAS;KvtLC#5mU_L;L0;qlp>sAu^C;f&*MY{UozwXo@3wb-9&LV+xrC9s_i!P<&Ld?tpj|rjq5HQ%N519`l$*$|wM`u9z23ZGOFY@1jr3vP z3)WiJz`>ZUPV8myamcSn_UqY(*cq7`gHT*yFiMhzcn5&ipdn=lXFZaB9o&NZW)9=L z1*P8bB)ej`S96%hA11-u@EUir)p|2kjL? zRq(^lkHY$*=6UY7LIxpBcuy56{nFmGf16kTt-~^D!(Gx3`JQ|nLxt|4cu=BNrv-89 zosDa0KAC@Km|*7PNg;yK^rYr&oAFa+v=J?UY(8B`yO4VJwzA?-R>SFX1E zPlhRLT`w(AQ|CDzQ+cccpZ$O=;OAcAHhQ8rMg8|SW}8&zagMxi!b{CKUp^QG2niTc zjssS;#fp|pn6fu75OG;mumcrgt|rp;28FZN$qZnO&^!`=Bzmj!cF6Uv`FTY(Cu{?O z9kb4CU%ta_z1HC#I?*t84U4Zx62Abyix?W>;~0^H3RZ+Z#KnX2gjw;fLe{9N-nU%3mb+zy zj87?J1Ls9*1W+?&FxpascPn7bk*XsY-(V%_RAa}zbu6t7>M}NR!R-I$1+m3XU;n(r zBTWaQtv?z}&6x;uo5}_WxMcPJ#txs)r(fyc?d_)gc<3XS9R>R?P@!eePdO zAL0^QRz~tq>?O@{{{KPW)Jc>Yb^g9|tVAMlW#ScaYAL8eaF@0!Y^ZsrD8;Kx)8yDgX39_sNOFB01?jDS4Y(w=B9L-AD z8mWq~qTjsAW)sQ&fEE60i!r_t^ZKnIJXmifMr*1JQF<{d2eOb~U~g-l=2zj~A|^be z^|{h99b|C!t+kgv1N-$W3FW)?0?u6-MA;;WZ{x<^Md0biU*APg*4MAUnz_##u6>bW z(>KFSEFvCA6zQ!Rk#n0gMFSJ~G8M5CJpt!>GlwNm)|BRcokqtljB-La*ZXILL;FJa zS0h8YdIMu-7mCLiZQZj)7C_Fo*M@w_z z8Nz;jTNk8yo19-UONG8k4w>8~hX`kU6Y91SuXo!j3TU#kT*j2Z>BbClYykmE9;6@B zKkG{Saw>i;?%Wg15u|I^Z@bs@1w&I`C^tyiSJ~E{Mo&V$SGy4>Bcf0`GBC9aMtwcw zqkhi9@gd$+m@z#ds?A7T0o2RoXL&$JDgRr4dhcJ$can@oz zQDd<8J?-V+DK!q#Be&36R1tDpp45(~7GJ7hx}< z^V=2lKf8;vD{((yVTz2LxFBYQw+;p1S!Z#Ce>C3%&Jww#_2-4k=S^$B*G-+-9NHO-dES8;bzkl)fj{JUcekb|8>xH)tv!R(DyV!%X zW-NK>q)*P>*dr6nao?y~Cg}gcV}kt`{W))7Gd1Y3qrW)$KjfAQ{&gRUi%9qOTP`V> zpwlwKHl#gR)j8i(j2wMB3NYMtP{-5U9GP&UHD-ggCGluQ!SrhwAc%&rgX!ggtm<_k z0C=+BcRl@52QhK0v?7+kFuB!XNDa&r+asDKLH30Y<&}T!`eRv|cmwOTPTfK0KfZ%D zk8rNIlDKu)6}M)F0P_70y<_9L;I9j>_0E5PZ-3|=d;KYTC%oD_fAM~r?j3x5dp{TN zqvJK+a*y_q@Ie+8NwN3q;7D16g|@cyEm~jJ4l~D?SvAdK^g^#LY)+zxlAg16OS{cSw&UE5wpPf&3E$vpa|;9!O{$|+}tD7 z{s>IM=?UPD^pOZ5+#%haKC)sqKz&yY>|_}j!_AB~Kvyxap~+(RDmNf8L#i_S^>6VA zlxlZCQM+VWneZxo)zEG;08niOLnHu29bRUbe*~zLX|pXNfnlAeuCji-O?bMvO`Wvi zNym$mcJ`#b9MJFNpmExQ}6$*`F?=%`aY&SX?bzd%sEL1$070z z#ZTa=&S3DLoZvC=7Ek>8@FwLRlReW=S&3s$lu1X7C3_R`r&?AfR70vHn1lGd1ky;r zzP?N72HU6zN|yb$u|WC$WYK>B+58baZF&mG#$UrgMnt#2{RjiuqSw%{t2aDj+=Wc# zKP`PIKrtJMUiv3o;C)+n6D$m+G;-hx59oc{zk`=--A}UyWj>Hvo~1Ha*0!*lzDekZ zHfjR+ijS1({Q8NsPTRvm%ot=D2lP5PD<`>S6jFlUZESwmTeEh-aCdndMPC+}=JNW9 z)>@bzzTd_+$g5P2E%bsHR#jYILRYDms*9IvC>iGa*{tw4R_!8sb@ih{UIV4a+NC$1v~=?FCs%%C0x#U$us8k?tU`(W^l z@JqW+r5&@3n2^y&1RT?in6%vqmflR@z;v;OBs7EIjuno=P~tzafczFv$_{6#Z0i(# zToi3u8p*e2<_>;!33aLcB4%%MT7Yq;HZvl~Yh;3{N#f)!U#6Z8*RbhOVzpoAF)Igw z24&?0^1(bOtRS`1TS3W1vJs6udmzN=;O~a2=}KRsImIH)Us|M24znXI(^5e~l%uTrg?SQq=;*kVPRQS5df+@TctemV^r}Pz>}c_( z^%{a~km=5+&ATY z@0#|LId_aQp(bFG&>?K*hw>snOHfRj+#zUkXFo~4u+F+AaZ!+(Y8KNc=0V7vYuHaB zsZ&?Be9*AV7#-m~DNapSfP@J>r9J&?I%F79%!XTf zU2V7z_qNaf`sJL&6AsKyq5TN8Fe^08eNxC0_1$`(yvDkL7MJZ-1qeyUqzAfienh^OK#RpgmyvNVZ73P;yvYz9kJnE)y{9|l-&h5>5m z1)&&PVe0#oeTVMQZ&@S{t1Wmqf^hhKVCLO+sqJX6wk;syp=0H9eH$B1jah*^dO?V& zMv^iyFiKOURskz=#)K)F&>d`L-(}gA8_+Km=@c`hMidH!Gtk~_Ai$*TQ<~S@^YlX& zvPv1m?2bj1Jc!reV-52r4EgJ_;>0j|QWJp`AF)`+w^E0GQAgM90qv8n()V)O51-nsr@5(Cj?|ty{Omnk2Y< zpE1dJQC}Q^iT6gOw&rPXR=4m$EY@xrQ98ooa=5XP%F^E$jsp{)ctDc7OmM7i3crR& zH5!w5CoiDNhaZGv@9`MgoENr+|yY(R;1d-{%W>hQy>SJYb8%l2NIPyvfco3 zZO>$bCpPXp3T%a)yu?x9KE!L5%NrZ)RP)NYX@lxF%TOeR%Ql22$U%LN-WZSQ!kVxh zriDIZgBx1TeWP!Wt>y9JB-8yoi8|Y6&b-^RrZRIvq)L9cn%8n)i!Er~L!S!Ge4-3e zzx`_?d~7yS*jTfrVQMmQD=+`r2wtOY#1xx#Z6mJ{8hQTLM({$=NXt6_J3z$0thFQL zFcL04{o-yP8@|{H(%=n#ZQrv51<}^=+1XN}jH90O=cYK0d%_QhrZOAXgo$ulkAKk? zM|xLmaI{rhyE&RU+Isklw(QV#`rL$FnOAL?#MmCaK36{uzl%|{MLT_WC?0Oyl;W%O|i?wzXl-AJU>EtP>T0o;v zVr>-Vlh-;~GRg`NQ7Wq*h%E0lju#2t{N*D;2iXQ281JDANDai8^Ef*3kr^~uJ zh`Acg=Dw?tP@v35j!*9hJB@RCKw^NVcWdd$wRzmU`q!~u*DQ=d;|*nD ze|=D3-Jtl)-PKm|ZZeoihv$Dny=^k~xTBqXjIP)gn{fbH#heeiDD4fr894VSUNfS) z_xQvTe>`8SAd%{p1byybjX(EP7y|5RRxaDRP$2TN>2pv$(IjqT$l0{XVFyF5H3tCHic{hsS-BZ}u98A<(FV)94OpCoLgDoYW(g4MwLQdHuN|Z3H{}-C z!zbw*%t{#LHS)jpOz5?@ruXh&Wk^14WMN3UH@uqJ9H+dTS7_?UcfS)H zLSqpm!!qMVWeuVLQcFU7s~NZ7IUyGM1q-)h(vq z@weqB_Vk&7pf!;khY6|5E0PWneg{wX0q?AbA`kwGG(cy81Zb!58++~p*?$d>D z5oh=cG_A~aA%5Cj!{cDBz)Dt6eN<}}c;PqL60Z?4VMc5qd;N zc*w$uRZ^KOeMMromVA{di? zr8>f9x|G0eKrW{?X(HR>J}^up_iJ6W#)(}ZR>%>oUVzO#qip2eSyamY<)XrKme^um zPkZ)pkzFb{EYm;>L6g(TeL=S04#yapjdkLMNg}Y~?eRj|ZnR*ANA8x-Fz>d%SjiL{ z1*jBsje=sx)LU!_=&UL+rJ8+076okn-LX^=^_B?FHwz{nY*5N#k8e6OS5F(^{RktUP`$A11u&a^h$4+ty@<|rucfaTh>8A{SZaD}L=Y@fLD8pJ-T$zD)WKS2(&3mMyX z;g&z=A;Fm!iHN2MyWTZc5YyLWX`G*#QS7!Bqf~nL;VA&CI>3_7|-^f{tjY*ujg20(lI6a?E+||0m6E2?-Ii;TnItuM?iVk^F;$xIv#^(2bRw~ zGPdmk?i%|>B}bD#>5nf z0$Lg7vskh=#;0ZYNq!x)c)dMM%8Nt0xnHvS8pK9uwS@z-TbO}*#tI2_doL*QYp}iR zwSYF638c`o)LUS-Z%>Y5?XKYLJ79J>k##@I#cZ=>K;JH1ktL%Vt1pndQW|uNUgbJk)Ek=6 z#jU!?cdbnRxa~#STMt}wu7)vNtii6_zN35*$sZVDpkaBPh@OlYMS>YaW~CB2F=bPk zC-kc`MnQ7g^Ku$ubio9LDr~ejpOW`Vcn@(Rx9_R%c~k!^I!?h6K{YO%1q@SJ1cIcs z{;z9;7aqUl?4;17T|h7PqDT;9%Wx5amf|D5kj@Y-D}#Y*qkcilV5ifsWsS^d`)KQp zej|}~HPgaM~-Rc#(aib#Y43xJQUA6b^ zkkm19Lw1!>9j|^|muKPXab&DvXSX=uEBpC9UrZHg>}KuLUF)ovf!^!Wed^U5*f~cj zr1IKx|Kc6#v+kj)zUQ9UOx|2Z$SvAaDy3pNKt5MqnQ@t$`@j%eC(oJN!U~MU%I-wi z>uqwisGPfBq84tg4#<#p3Ox&4^>p#p9mlY?w*WD;DVf$S+?pKT#Mc*g!Vu2kU~*PY zosV_>T_0ay%4wg!XVN&iDk3nKQM6McgJE*b3(S}TdGV?BR{^%eE0QZU z$yV>N3Y6dy_0M@maq>*?BgYJzb_wVT=$8#7o}VRrvVdg9zR8fgK%s{4@V^0DF^l# zQHv-Dn(oPnUP-Aahzzpue;Ye_+C~TiZ$-$~ap6L?GGb)t-({*xZz7@B?makfSm%}f zc^5gE`bh!nlG?I_@DK&0Q#L5EF-~*EbxJf`dTVl|7#m-1JI@GuXQn1_@B(Rq5-l;fmb;z2Zwm(2^=PaP{RHy&#yT?K7;sXI^J@VrfFYo9GZ49r25?? zOy7zP&wIImaP=C>WWm&Sz0pcZN(rsy)Nn;%5OIo)A8P&F5aBUXbv+bfUvmiRA9)>N z)7E&9$`lE>f<0_6z{yVo?=_r-sRMaSp(!ctc?M(Z;zWr(echri199&*9Od|yng(Kl z!sbX{d+^Q5R7n}=E{+8;H# z26?XMV_AZl!YXptEbipnZb|;vFJ+zukn*j3XU;G!M0K=q0{FI%bAzq&5)~H1)8h2z z4$+c6QsdSE7h~T<5s%z+q$CbxC7m8R)EYZ;@+4IvLF~Alu+^l{?AGDbZf}X!)Wl&K z2O>*qxY)%HfoueW46sd0vxf$AmBW*D*BR#GzN8MffQ{~ENn-aUMWqjzLC?1S=kOI< zZN@q;%rG4CGrkG(?5yVj#OQK&e{&l1!rl6v_*#E?R&;;W`u0Mjd9CYz*$TL8dq)81 zCx3a?M6Ufh61z3rB2-C^s?PE^BE1xs6yw#@XSTgxFt#UZE)hgiG~My^;}rDhWh}(! zmy{*mHr7oJnY?~=3|YvMV1)HVF(=%rw}Car>+PK-@E&}{rySd=W?i=csL(;Xlb;3_OreAyPzE z;kCW9vc3{_t{icLKIdjH2cE9aIj*up(nT6GF`T+n3TVnBP26uTUZkEVd%LpNcSd=N zVT&aeoU!(oUy?=8prPLFtGc+c)EhFFJdr6jp|9C~O3$s>gMWSnWw?(lX6xpD%NA9- zzj#>V%S@1#>JM?rs=1IUnn|$I_L3nKAm`3?xO*I-R5PGJclROFT8_m!yUGI z^Bkv_9?XHJ{>==017h4$Lu!hiT~A?UA>=p_lI8c(Z_J^-7u5Y>=q@t!f8>UYIk;76 zbshRU!H~tPH2?VwLPE{FmPASLOYze_odNfb(NzP}Wd^RTZ8J7^Hhti}?_xl7 z3Ip=br>+n12Br%pHZd1lOlS5i%u{gNnp%q*;irkLy1nI)28ctJMQy}5X<=ZPvOMnf zkVCKzj+#ylwJ#tHwz`PxFo`B?;Hkemb=mf*gu?}|JG7!daf~O(N$k|?oN+{OLJ;;V z&(8%!p<4EH4!{2{rapTu_k1`S+L%!B4F>2A!YVj_>rA{d&JI;|bpWJfWh`vpaNJhYi)y`|Isb# zy`Dc@y%|$Q5#LPl`^~hNLbn>>3)61{d1KFw48q=IBz(%wkgQ~MXgJq6cZBUNzaZ!k zVJ*b6DtAzXuHGdQiYAX2{&tT#ltnoD>qr%$2DR2s)bpi$c^njD@1q zvjes9#?kPB=;yK1;;10|%lO`rTHpzr!V_>amtRwW580Un z`Ov*H!>)ant#(l7>a0kw)g3L+*|ixJ=nh$+K+%pdrQ6u1-=h+vZ1&vcLdwm0(>Vjo z&bgtNUAeKiHFo^f(xP|;QbLc&24_k~oz$tExK$psqaHX^Z_W%fyVDYy;Yt8{-5yg_ zq16s^K)QRGr~2`qlJ>le-eEg^&m*pBl;nL+5B(e#mG>+Y>ctH+0t@9e>hLJ)=@>cz z6J<*8h&pxdHNc`yt`$LzbLk!=8v~`Sp3=p3|*V0dn1c z5^^Ua`6DIRV2{mJQL0&c2H-i1^>REE63n`PL~yL=(?%CSgoNzM3Um$PDD|+EHDJii zDO;L>CC(qSawkDn#Wl&M(=sO9qkk_y9Uc&`^;@7K_GX7ATc~WDj!{WD)w(F2O=@&@KXr-Mwb9 zb4T`QGxhtHtHDhFxmxlzSBpS|ymo3LD}pY^mtbpC#`3p|AYB+{cZe@r(Y0f@BHA5- zHEV5=;AbB{+S4ZLOi|Cn!iLG?6reitYA1AVAB*#u-)5?!3t>Qvpqwh&yEf`~@1~G- z!Nd>0&+#SINuVyw=U!*YTVG%mX^+HOYgY;MSqw2C#Lx+fy!xW9?YH4lWk>=t=bS@j zeM^9w!APyJ-3_GLq&rcwfn5I=NJ94{?l6W#1tI)M=ON2_?U;-l6GS@8Wumk&p)u{3 zQ~jkMY)>sjYWwMa|CCO*F9NS0Fau+p*%Z({))M>k@9rW}VjL3aipMuE~j37a$ zZSxl_g#n$5pt2`rJf@PKO9-yH5}W>gCVO7<3ytkmPTcw+67#2VQzf+AE*i0ZZ_|4^ zszt|^JTnndU+BxU1vdprr&*G-AJZ1@!Esh({pVzbSwT8B<}U}GrI7I=OJSR~2~v-q zQ=9|S8Osmi;=sXgyzqU|=3!4IAKB5<^~8+?C-gLWz{++#xOxU{PKOXV0t zd39po+I9)LNPiqUh>~Ewb&L|nN>=8*t(e7j6!|16?~Rt}Z9elPJNLQ+q;WAV8NTQM znS0`d&Vy;ujsS0=mKUagHuQIT?Somwu9ehLlEu7hYUq9E>kRs#lU+!S&RV7S;nIP! zvI80P;py~adOmKP(mYjf?}17am05Db?33?uq=^bCUqj1o9F zLNl!)8#mqBGBHQbT~crDlFF^5w>?V=WTI@xNEvR3mFch!Y{)i_DVNdV7sH`4q%~UQ z`?!R31!o;eTB&)0Ob(a^VEsok(2nUTf?$JD22qq+5l9Tuqs-K|+sR(Nogr#F2jn{= zBEtd~x^}N;(dP#g1Pwh^a0SXTeYNoyPZOWiEI%TEQv&5p`4P!6L%IQ)`(H6GIjIJlK`ajQ%>k>`*7m~KmesuQ8)5T08rQc z8kr4ma1?k??O|fhy?d>F5Fz%|JfTRc4A>CjpofS6=Ex8N~NrO+>P3%ORVywMj(=MYXR=$LCckkK>Ln=CN~X{EiS3#*X>A%fOn!|F3E` z;D)uNIbBP-{d}9hagOhgHh%nb-wU(q1}U?QACD;LQSFFw6E!c?WPzYbpk9ePLL65k zdoOF%MnLy^t4BHQV6To+VJAROeUDzI7{Q)#_~}4a&qV_%c6&N9usIzo9IVw*#LTpp zl`5YWulUQvG|Y&--~|2+e4}tqw!Pq~lD9QCA_R;KTFX4G2`YwbGWcd#%Cv%B)43`< z=0&xTEwWiz`bmOFiXR7O+}2W^GR9lijY%$f_NLc})J6bs&1s)CfC%$r($`;Qd91@h zw}owpJhj$ag^GNp8#*UiNN}d)=!PU#WZBATW|Wgf6#jpIe%6lnrAKOwkW9}|i!_CX z*F{0rr3ge<6@^B7XGmulC5W~cO5DKrYA8GFS^y7>Q-rG&q`6q*;Oy z_vt0&D{H3!I!lVr49i>WXXE0T_*i{Q*n?3AxYip*m*CxK8w`$#p9p#P}d{puCagFdRaFh(miV%#RNk^@HF1N&m zOTk@eOPyMW7sLwdC;^{j1w~cX_G)pjZr5f%2#HEE`}ILxArKo=B5(vCM1RgX=?*Uw zVK%RL9XU+f4TD9y@vJ1#coqCpQ(oY)3?;?&Htoe-lcsu;O0>tg0*#eFsOalK8nA1w z8izX@q=CzmApcZC2)PLKxs`=`xC;O6rJNRkfM11>_qpLx#I>$c#u>1X>RlbXX6yL* zz8b<{`x-Zwu%g+E9PY(=|1%1?=g2eG{Tagf%^b*~JCmV}WBIZ6RbA!rZF98dQwewA z8*gTFR5n=SHLFaNS3pUhSKA}uqBml$)pvNZY2=feU@4*hV4~UFVlD33!*Z>h&tAU- ztWtTwgi7jguYZCP(Q~rl)J|5^lsiu5S?u2|Oq{bQYI?d>B_M8=DR50in`e1e7WEP`H791y2s4B5(o+M+tgD7q`J!! z1-@PdRtQx<+bhhH&*Q>RxCeQ%nXtle7kc6<)^jZ7Uy5I+gGPew2pwq#nk~)Z*Y^zq z*7gW9DtjkPQ+hc}4_3;`zvqyL>er-fu&m1^0bJaJKcb{#r&tI0$)o|m)qcNSUHB}W zIM^^+x*n~BqO67SekJA|STOOUxeKuFRTtW|>208sAdSBaI_t>|3ju~|ze*x*@J5ek z@}o$8tS8ysM=#IOe^|+$qwkMA@w5uWi@ZPci`*(O_`k+|o?kF**v;RVn8r@5w@FYP zU-Xl}AMlotNopOom^g@en<@x$cim#>&Uu09Dll7FP*%}p=O2_8f~U5TZ^jB~6KC5l z55F(hc1^!#V*FwC&iXMGlO9sF%#PiQb$YIAsHW-`P)>f5ZaG4p_|tf^67b1^@(ytO z{xqNf1WP4rV!6DoXR!=4{8#K`!;pOUQpRB5LMCAjxw<@K+l3YI%}dbBbxH(AL>Zww zcxNm@dMzK=vq~%A^&*pa2|p?({1o1nIsFbRtFoO3R1?G4%%+~#__8ymf|2A6)mgCW z;W~D-ofsIMVKXF*F08hPFjC(+uXWnWq3l_>cA$t$MoP?^2`ZfAb3`ulYKFww&7A&! zjZarZqzjqZDuXPOxdz6U_C{u9i5t!|a7YUmdSO}H$UVr=AHd+T35fd?)|T{|WrOd; zxLK2%48KRmh;DjeUX|G!vn40t+(wL+ftk*{=$K7B@JCwTiGyrl?999dZ!&Naw2;%x`R{ z(>Q^jp1zNG3WAscNl{`En*`tY=~>pGDU%I`A8?JQp0kz38rcy9^;|@ZlxiO*ep0HP zRk3_ed-)-rY!2OpN_LF5`How++|lzA6y`%c|BB-odhM4oOnuL|Jr+U1)CMvZJZq9O zZF-BHl3DLQ-3V9tT-LRdv9OXnqzS`J&*mf&HxW1JhNITWaA=YWjoIXyU31mFiu9Ot zF6A~Le=Wmt?h+JO;P!QA1hSnou&O)`zCb1VXL=&De!Zw{_d`R0U#h4pt zy6Dy%9_1^l;Yl#q_^_Lv6%R2vJpz#t1DDOeAWzgOzM^YPRH8HhRq-JC>Ij+)2#y5A zd`fJ*?mO6VS%&qCX&teVqHkB~E4%BV5pSxIFN0zv(Z|jaZ*6&Wvk1UWrGmVjjjT!m zd8y0v|E+?9@pp|5OAeIg-8?vsn$@yO>Z2I0QJZKQcheaOse+j3BE0f9t}z zHHvD=n9AV-MKjYU2Ni{0`7LCITLhpt0%i%f-#c<6W^de)0y7oXySBF}Xb0>&+9C&( zll-k+IP>>c9p7x3*tAYkxp{yuE%A;H8@hOJfn?X0e)-Zo#$84d+-uY|i&$ePvVMcY zC((~Os)&4ZhB|9N`z=!68eKt73_g4jwU>JpbFOND9E<)+|J!QP@){#4(+(x{#WIz# zxYEx_p2awZTNq$Y?#{>(>KST^1u!M9juhU66DIYbdZ6zQFo{;U{I;OukZDH{yyg*B z`y}0{0b}1on_ZwQmYLAz2_YD4v9m3v41bX4i%$!xs%|aDB;nXJu@L+H)dZuNmXbcX z@obAZDL@N+TQ{bYg)&V|FZBl4$z^Sj)&3kWoK7Z}jLXhqFZ2{Gcu*Mtd5YZYv7%9w zrFk5F+cqmTR!L1zExCae(5?a}6`sILDf7K~mh<)8w`bX-c4Ysz>JT-dI%>&ax%I4o zLuoC3K^WAzeY+Pop1iCMI~KS}fjY#f@wRy|V1 zssA4dK1|Qb4VeBc_`oP2BWkB5Y1^iR=`E%j2HtTQ2dKJc*v;>MP;&?_)f`%$0jQQ7 zt5WPW>U}QGT4JR;6|=6jy+cVkZi^7~1@Pp{>#M8E<@h`L37_M6pAPcpR=y~0Y+c8^ zifzLN#ciA!>V9D|-o&QP+pu~?l1biczLa!Z!waj5zsGlJRHp3i`{;1{fe4lfw$=Sr z@y2RC0m?sPRo5P4jO`)AfB39lrqjT3dWVk@86S7=h}KQO2-(WXb_CZ+wz}+bCwKU@u05q0CE+ z&^=)DsNfQ?zV{g+3|(BgmLW1BN$^20!M8q3SF)awbPF@&Ya?W1sBM`{R*7VmrmRj~5A##Gx=cWoGl7Lt&`9HdXEmC44uLYL;%C+Itp^zf~Dg8Zhqeea^Y}elP6?q*AHItjx#= z1e0>&pjW@<0K4~Bavo4m4HRb>MTVRQJP!0bTi zQ{~;?w?)z29>`@mzX}5RvZpTH{hsbwLCEWqx5CM#Z~+K_{nVOp(9DrwGU!EZD*$2} zjxqqyfun!$*xt$n;`zJoN_|p=Pk?C<{mXM*m5H%#0F0F^)HG-?iVs!IVjmb4`SdXc z$<_pK!O>J0CpF=Uov4AqH=aio$2*wI=|1p@0$!k}CnnEXskeTvb^ZsZ>XUa9ji4ET)6Tl?C6x6RyDPh3>PCq(;xXM!DNJYt z&ynBLf$=0%0uqDT3AFadjAhwybVZ1|^}}V4gb@p$w4UG9#cuK9hX=`>o4tZG7MR_z zs3H$Gy1-@>n0@R$iB@d_)9n9TGsi0h^wxVTN0d1H+JIi>At}o++v}LgW0ZVoXPpy& z>+3>12x>ubkd01kX%>#V-64|b1#F;iz`whlIL-Bs{q71%uT1C=vC1#X^>rLxhT+Oh zqz z{dXrJQa*Ww6e@hd>jwxx&-%=5#MV+5zlM6j*+7^0b#Z~O_Y*f2!np{!gCDrNUebxk z7BxFzN7#^HQ%&)1t>il*EFeN!3oj96=-5_g>_R;RiHwVF>{1d@PbMgi({0Zy)y&QQ z-*0^Vz67guA7wAnWzXFBCSx3qiODISU9J=P>qqs?z)s%P{G{>D9^R~Cz_Ns6HVK5Z ziI3T7S%4{;0)01~W=PT499=mQ3DJB&%Tb>hFOpsDOWvPeL@6b=6HP3FzC_JIxpe^| z!_PSy2w#c^cjh|r;~p=&FGcH#o2cLxzv*#<`|yI) zN|H)Kx~x-AwKHR9g``r?HKcq0$#c^gPKx%Pc6J#rWtfw!qBH&p$uP;Ov+2zteKQCA z?OO;uWu%+bWN$C9@3(i|c;D@arSjv|H2353Nj9%|RHsP80{F8X-9u8=$P!B?09AU>ucYNK$#Oxl^wVjb4uQZY93Slv- z?#Y8+5X>k)5eshu9~^x--yeODt$BZ? zDOpQ!_h#IUWF7l(>)~{6lCqRzXmdB4qnv@0?*fu)7!uKUtlo-6 z`%HY~Q^AweJ|a|}x>-vz8&^{4DH;CS!ODL(1t9#j*V)|_m}rYpGM=l5$s_ibEEj3@ zg&a}^`Uc2u&%Q0kgzuB88ObIv`?RG{i-y(5Y@ag8b~s9x-EoA0{@z+An|t?WQYyT@x`EK9A@Y{s}kvnzjg#v z!FW3~1aKx5j?jVJ&Pp?NV*$n2YEfC>vA^*$04Db9bA$^@KydOZ6{C3K!o;mRXrv3% zB8Dwpl~0nTU3h3JWWCteQfG8de6rg$;zElGoKS@<6#!Z>LwyAv&kN1{c>w#qDs(}* z>}G&P`M9(qo+7712?0V|oc<-}UYnG{oeXA?I(k6wEZ@vo0?9K!8NKO$#XR8*=CtPr zO=oB1I@6s*$6UQKb- zU%DB%7+0Yc&)5-flon>=AfBLlL15Qg7QM`{! zICs7&pyM>DueJ-m-$S}`{{GcGv3qkMvUr>9^^FZhMH|ZPtpn?(5ph$-P$`;mtxGRhnTf2+7}glFlTA`|Ih?UXDa&e${UP|T|oZe zLLG`xLYJk&b__6o9rp<^Um(9j!R^{g zNo@Vm&DPhl^cwt7-*Gl>Al7vQ*t2h5VvTgX0c$v*oMa0V7Mhi>7yG5uTI8yd&)K3* z6^RdkVXK|Z#)q3`jT7Givto!`hHi-DoMuQD%Z$q0#jC1_3DrY9c%H+d=9Ip7O>pa> zbmLy^CwT?y)aeDcpS#6#Q*X=XR@In?_5JPV?n*cAg$RnM8X?4TCrY9%=yRVOGxKM&}4xzTfm8PM7kcC z)y;|JlKnS}%&R23zScM&DKapiz)#tm;fv9DLz1NAgD0SQDZACbSr=YkqN3&O%D*)X z{#VJL()E)1T}hanugo7FY)Hqn+_vgmfPF zHLFKh)`om*WMH{Vabub#n>~Ty08yyjCg#CTERZF*3qR0U_C`b8GSP<(>lGg5M17$y z-jPa1A+J7F)vY1}xy$LU;lG1r4c?FP3fzV#z%r!6!v3v7MBy$-_z5Ji4bhdkTSwdI z@!k^`g+gHcF8%9tFFCz+7x&U|9A*I`p6@+$mZ`)K1U%bF&rV;s#1RI_rk_HFs^V_# zfRh*I+MqUO8agbc!CLbC!^C^wTuU_B{^p`Oo-(AfL24Q=&OhE-MW+(~(GpiP5lKtq zsD44cNjb9UD5ofxIiYPgfA`>7a;7se+Z}t(bX2wU#bWZ$Q?%hCL-k%mrI}fwgUuW_ ztI(J^=6OlG(RHuzks2o?MXi;oE%qUaH67$K)9tveDSPHoRXwpw3#sL#0YJ|{v*!9n zv*Q~nI%yiF6krF%q$2Y~>6!XaS|UUS3VF!7Hie-Hrxh)a12D|D9u5(gg1v6Bjjaw` z$+r_LQJ3(f9m+c(P4Nh5nU;EiraW||T?=jLL)ovQ}<} z5+}$a82tnshEhBO{@mV1KO2{+hA0(Pn+{;MLvya=2x7gqQ~*)0e>FI&rONmH=I1Y)7aCsQy~|R*~DI8 z(+i-(IYY83=Tg+nXlx7k?cSlZ&>swe^OmpCh6+;kukOlhIX%oG>(|wc@~ZaWF^ROi zg>)7}dx-bOtZ;*@XG@lKfz~0Pd&a2k7PDU3sRD9de~e|cKV>~^--&5prh6HN*c{ij z=pq=C>f}PY1;&L@iKegu-Z^PI^?;iAjT%bw@aZjGIokXRZ))(NY|N9*Fu?9hirEcJt{vl)X9XFw9=n zp*Fj^gLPP3)uB|d@*qN^dvXKLjh!G^5~r6j2yK7utG_b^g|N|DfX3N%AXq`Ngu@+= zqa()|-ecxp-o@^K$zFR0YVaMT)9=Ep0-I{L<2+Lat^*GSMMYaU3-_chPPamfgN9W` zC(}?xa;l=Pb1{xW0^xj|#2PVfIEq{sOgm{Wga(JBsUoPSLE zWorYe`87^l|E{K!T;kcv-)-G%?X)*^#r8kx3bBJ;uew57)`SH%)s)L}lXO`Q#AT_+ z{fJFVg9uE*O`7BfLS?yr!9f!-1Xa~z#7M>hRzJBDGTx0dCP~XGT9>6#0@(E%W%?7g zNaG@YTjVqAZXQmx`PoHGFMN?~N4J9TY2(CUyzoGtWj?&u?toKa$;&gifx{QLU`4rE z(Oridhkv@IXS4FC&+z}Jp<6LQUF}`|<-vL;%~_xGMon6m= zLX zI!=EWu{&yV{*8dufKOuPUDwt4IA4usiBY66PE7t|(7sB1aeiSz&6i^;L|K6(bAPi) z^8ue+&^Q>Mr?=iQWK;+D%tsEHb06_Ks`6gVUNr+Ga0ED60q%*RG$*xNpjn}L$Joun z4>EU8z&&+#Vu-2>P@f+caG4Aci0<#QbYn4dizlj4Mvgc-3vvT`Y$PaL#K;I1Nr|P$ z7_TOdx-9k;#D8%Rl9fT9r|SEDLc{>=Qk{S88gZT}2mf4k(uZ_U(@_FxQu(qQ#Z9{v z>a?bM#_)(jVd8bRcO%OgxRbq_f<1K<@U*59KC>#yL#D5e9jE~sl^bc*PshQ)wfG7H z#w~_P2kLB?j(aWQYi+*tvrUXV-*L$oU{1ay3)7X{&@6m`Ok^A1+y`0{jZhSneLjrbC-@ z-<^|X<`&nj1MRtBk+kO=kdAaPg+ekZ*+s2rhd$j0?FHCJ=C3%Xj#b($F>M;iUHaVFD05zm-PCpEVdb~^+HkC+P| zWt7xIiMsBt(8JBK59^GY(78ZJ>D0-EZ@J=2Qw0~gZ6y~+=iMa(jyUf{w5sjp38!8z zJiP)lM|V=Y0nQ|UxLjA2wa#*8_!&htb$TJp1HIA<$hXTe-&=skaNfcmcHFT;?J9mo zsHzN)S9=L@)v-HU&`e!OPN6D#mtpE;u^OlET!#!$@W%N<0YGwn=$Nck>PEwm0CKPu zZ(S}#t4M8hahN(l%&u-Vcpy*(Zg}f@0S3dWmp+k{d+8gi2$*b6R#fEDOiRMy3b_8%R>4B%1qB!8X zJje>5_TCCAOPv~Tt@5rKjRUBDs*57^Y4TVUKv@fINV!(?AROdlh zL(X#}jia|m(?dQ;_l+dKf7BqJ%!o(a#hc*@UEr+W<O}A3cpE1ZhAy7coscLR)t(@S7UEvy z#Q>LYfRq<+KIKAaD6o7r7hB?S227Uqgd&@?O_Ti$8QI_-gDO{rFqA3pSBC146DIW_ zS)-i?pGF-Vp!?@&HuoHV;w^TF6XwmsyN~~LoFC1JNCY>=pMQEQd7IO-071MR#@1gy ze(3n2Dhpqez-a8S+b%ghX7%5UyJDIM;rM`^=mGL2W~eQgbs;Qv7;17}(&feQYh7V6~NvJNs|3qj^+>9_@gzk97No z#JLZsv&=pQ{$<}%(!*ka&ObPn=k_Jxdcq3+ zqqzY6WrNu}T`tUFrzgUq$f8Ln^q~4j!Gj!G!n6VSG0of5jI$lyh6}qAp@Nj2G zmU<*xF~k?_b0=&`>XPm`JbX z9ulE?5QB(54dm!3Y2FiWy_Ir5_C*x|?9K7s0`8Z{`?z3=pT)OP5OZUqE-j$_TjKM| zsSuw{;6`Mz(C8;{K#x(Y5dj5_h;owV&kzuemDI<86uw$N*%hpx8A5n}wtl26ztOm| ze%2dmd6v_Q-2MrJ<(^>xipgtuet~0;P+X$awrPSU$1EtuMbWiO%495uv5ur@s9%K&NPA_qJg*>EAj*f;FK;q)r-^qSyUx=6 zq=HDzp0=1Op4(mD9Hed@nM7C@(Dubt7@A%wm?#`MA$@q}T=?kx(^TaKneQqWS$=Bd zOERG?qtjuA@CC!rczM1Z!tN2|+oL+C8P-6jYergEj$*4n&vm_5yRH7ijL}9}*i5hw zU^cdrV6t`>pAswxzYi949qm-fK5x?&L9DV7t^C zzdr9E>KJ6wqK=ib)U$h$bhzm91fK`S#TNAN+Lj)~wBWkwa?hPixrl6`d zH`-jxZWYqYwM7#M)uh4!u$>2Zy8{?qw=jX1VqrrAJFNTror?OxB&m7f9gq&jRbpG+ zOx-e;``%$ezCSXU8~{sR=>>BY6D=%bFHdH@z5%HUJ&~~v%)zC|WMMv{f7(d$;e-9& z^sHzFY}iR=U>K&j>REqzRIDdx9~9{cCZE%Z#0rh2KEFfy|@scwBXnN6$0QknY440K4`Jg{DT*~n@ zGl03%6idRKF~>^^C^8q#6-ZjE2H%~Wztv0j2`cIMvT7NfjN5rOU||{r6Sw>qzZ%g2YR)`e0W7> zUt?7qlJeUCJwU?0)}6H+B>f3Qca1GGJ?+dBmMC&HjW0T799kFp95fm9UE;Ytr?f~? zc~!ajlN=J(15&s-E5AB*+%h4Vh7L@_p-E30iPz?%%yqiKrp(qb1_4N){)i!}ESRi=SL7BRYC9OR1>=I#y-Vw0wcCaS%HP-gS z5ko1Yrj+3@Gcsb{KiaFjI`uDboqT)i9>AV0!8oJg-ZQKES7475UpH_%0S`U-1!G9! zN?`8K&4UgbT|`VK{rFt7{6Q)P%#^kznD3i4A^*b$;MLF5ulQWEU9rW?0cf^UF;yru z%n}t}xzofej$P;I3OTU~TqEMfYR%=4qfjklB)y%#9C(VUl15I=UGTtTsG0w8;4%M~ zIIO>qX<=Tc{o+Ek92BDP^z zE$pFUhp)53rl24GjnSV%<{Z{(WKMCNMCRBjmRx+4xXV@HE|pIuE63yy_#N8n1N{VFn) z(FVN+K}mRZ8jAk-Rfv>YCeF`a#u!owGW6c|~gn}a*G zz3~WgZ_%wOVv*nAjYn^(3zNvGKvI{nXP;nE^7M>ku$8gsl{JVj~_7Hp^egJ5@0*hO1YOm%yTf5dHF`Cl*#vuT@u;1;7=FqK* zjYgbQihQ=#WaB1W>)!*vOdJb`6TrvI7CD|!Zdj@cG1g`xT}^=|#DttKwl3ok`XS-d zJFw8hzs)2<#FAS$57s0aKX&Wp&EA`cbu4ny5kHqXs^V0maF&|5S)36k;}lwk>@pIM zRV$Z$X31P_{%G=|jk~)8EBa3e+Q^!xp2+UmtH)nA9nIj%EXO6qY$|IEoX+Y6;|0E_ z=kk^oYU=BkEXr-y7ipN!6H?xM9KN8-*UK(a6`w~JHBE#CXIJQ+)a3BhstP4|rzSE6 zWjFSmX8=?h1|ZFEpAhHn%n(2E$j{ZGl!~_T$-F>FhOqnMtF@?f#c3jI`WYcT*^Ids z0E%c&3iL5S-nwa+&Aahr+qg?m2QN{*X7(ax^K&&rPr6j2BVI{8OUQ-eeBjSZsn=^2 z!Cr&T)3u)%n{vJeBjrlvm)QRfhz&=#o?gJq4l2886VH;oqb)M{)e5H-f4WNFntznx zpT$!%KkZiN`11wn{x@shx=!DEk#lkzaszrymU&4&6#NKM#&s%Y_Vc>2X@Eh}bd_VW za1G1e)r>Wvq(DuOK>np)3^l;3>6Z(9dCm0*N`IdipL6tQ$Ev?^6f@rgwb{ETDm0{f zwfTI&jQ-f$DxR3ZCCkMok?g+yfEaucVA?jK_{F%FO&GKAc%uooZ#JCZ_%#FygJl-xZ|0sKN?pFPFZ!vj51?6oTi`e)no#6!I9b7n1QM4Zl;5CFsR+J zaP$BI?0|H7qJSjrO{ZRRZJ5MMr{gb6k%v;PJSaP#t13CXzq?-N6T{?CQ}G8JcO9SL z3)cB5i=*qZo2cYd2xy!yU;%YE$CR5gBdKqagBs^zqVQmRqj0BFL-WkUPhxC?r!Nn4 z+Gvo@VgQ6s@H2k2)19B)L=jGt`8=Hv$IYsXSDJ zNqF{p!6mhs!1qRIF)ry}U6P?c0uS-+LzV)@nCQY0dcddO6r2%5d2srhg3YU%v;&2!Qb$GQ%h1JUP zsKs340)%Vnaw=Hrl#b*4%)?4}C}0fZ%TVOz)WZ?7bAtvYqs4=^fv{%p2))p*ko^tc zzu12owtMGPMsn2>xuU)OfmDQp8{@jYZrVklZ+wskU>SQMZ<;i|4)Ye#Ul3}YB*3Kw zfT8=d8flnfqt*;SGfv8$9W^3i?%A$3{Q(k1(>nvBpc_L-)+MeO6fSS&2%^lV_?aL( zK<*iz95t;Kmf++V3%;6Ps_1J2#UJ+h-=kkz=A6;mBqS(nj$~A@bYX zi{Yu8jNEvvJEB52QCyPG$8aU9hng z0V2rdwG5}J$;f-jesL;3EE5+FoWY)6MI&MuIS36R#Ky~?OnrMCJCV@Os){DU+42QT0F2gk0;G!Vdn z?=A2``OiiDHo;_EDal*s76XUR7IM1*!O?pGgemsyhZ&|;?&KWKM@ zJg&$|8DFU*4^QciNi>>dC4SL$(sk? z-k|w<=V{W-yg>Bo7sS!czmL#bqLy2WkVaEhN|9MI7{S!n;8;j5tc|UE&V2>cU2 z>IgUX4**>IzBo!>ka@D&r91^oBKz|~6FpHZtU)CD6l}=pd)Bz8Uo>83e-DzE!jq(z z3XLBI>M-1;_{nlGMfy4OQq8K{O1y5F?ijgJRKtII42GHiW0ZmnaQTS*uf-$S{~kdk zzrx3`BMbPk16p~bj;BRf&}pxW5)b>R%XZqzyXoCDlf!O0{gv8HGkI+t82)=U&xR;y zRKgUrcPCslrv>`*TZTSi#&72ZjZq{NbqjuLyvJtfZ)xZU6KL4El=353slVOOj2CCM z+FKXB)p@Fnu=)x$$0E{(S{6VJ`KMdKWz!2a5!UDNvtjvqx z2&hY*KwP=w7T<4bY3_jaJ4*hQEZC4XnTsca)=~>tEMrIrQuZD~x&560HU>i+C@*Uj zHBpbEl4|0HH8*O}zNG}73HzO`v$^^r4Qk*XEGAQudLrVSFb1?0GfSg+v z;Jp{C+P3W-71)33SCyLv7G5t=O#{7T1-HOeNa{hNX1%J&oT|KQf7l`StGnOW<-BY7 z0@6#l)kMN;t5x*EOUNI!S7G`wSy7NQ^1u9H9kL|*SxVL+I%J-)^Eis*d_t8fpQ0Q% zoM7Fh(|Vld7Ff+uxj+I$->aX|Dl?RNs7OJs3aoRoHza#LtD?LzeS`oE zb@bX82Ii51trb&CKmRjyJZFD$zYN#NMDWcvB2QStARkiCUbFvungZsr$ikO zv%DL{Q+JKX#o#PW(}w_-3fvu%fkvAuq16S5qOD{`0}#*^dklG#uXY7t{fm%PDIJow=eLbv+(=f}NL9zgRv1>5qxh!# z6X68Vz=`@iqx}-am_?pI-NZjl zqP-U0cI?ItqJEjkNQ;SFCTA39cxi~kYa9S%XxDU%`CBf)Z8pZ652~Vc-G$Ftm%ZMt zcQbXc@0K+*=zdw50wadGMq&Wpntt1)qOS~KLKb9L=o+4CIHCVEfM>rQz-k7qq|t^y zuDR6Xw*hn*aBLhxVor19mQZc##J-VSI!5b>&JEP`ssL?ZnAY&YH1^pwQoNz-tcv>I zj#4=$ai~f*qAmnDKO700gVaHP1fmr*Uuz8y;;=!lsxbuh`i)XpYmerm}s7JQT zY$4M)O~+rU8de`^7WMx2ubV;_B~6v{qm@*DHSZG?Q#Kxq2dHNg2w%eq>dQ{Pa35ga zVdvi*u<42aurOvkjuidT1o8=BGeKPw<_X2{RiWOY_QS=VE|qcYK~I>}?I5z0JA&i# zBhQD~@}txs3WJV|uALL==ZUjL;!Yn7Vy25HoTs-4Z`k^~FIga+`GJWAMaeL#dTR=@B!4iqoSM^xsTq7mKL8I}dvSkE_+jGT zXoK7JjvM34k%lXrpzB)M3{Lxg+(Szo+}KC5Gj@bYNhkuMK5Fs@(?|b@E7)`N#$VE| z-^ik5GOf&_zfN?HsbX+zWEg4rf7yx5Pq5`)_vS{=0X*#33aqlgL@e$>piiQ&!Z9f& zYl?!~GVj{+G1n7g8}uD#ETNdZd)j)}zjmQ+ z!~i9M>i4VT#@oR{xp{i)h+|ZE*`%!oTiDMpm#3Qtx)P3tALVCjwOUiVA~J6GMeZa< zscq=^Kl0m@#l6D|_Kh^0Bnxzn$??SkH#y3F63+@Lo%wH0eFOr@xw4R9SC~h5Q3nm0 zw-1?q-m5*6`B&7|Rw;x-Wnsa8W;9M_Obj^5RDE?o;3t6U6QIXi{6xnBc(aY@UgMGq zfPum71dlQ~vF2+Ee&=1pRDGu}4*W-lFK+`vZ>j4yJ6xXw8X@oq!2iN6W^b5pIg3ob zhexHpue@OP@&-3mNupVh4dj{$%wEiJuIWZ^#cSD*^x^Sc(#&4=_Ao#sp(4jGeTm-X zn(fTqaA(8Edg2`@oWPiaa{MBl8x%wl7i5;kQI63#>(4(Qv<;=GnObBKu4b8oP>?(- zbcws;*L%?lSAjc{YS-_C?VwmI>J)`xTDT)bQ%p=R_!qtH|HDn=I+C zkjmGpO?l2mu{~@zOWtl{4GjpxiIlRB6di0#{R@0hmi;kX`t+mU=tUFE6cuVG!HjoQ56X*jP)Vrp_c{g~I_2POxUXlQNwG$3S zadi3Z3L5&uZtF0z)y6%%eK{2DT;o!fv#F=+VtFfxm;Nf^pzA~A;on)iR7n^B_m;)m z`Zj~bT4C4_<}hwg?rhAoXy15iO%*7#XfqkohSX;n7{$vK5JAYZWj zs=0bj;EEbf{^+1G{$Q0s%FFQg!^;^ZKbuD%5K`|Ou?v&b(#SG*<_O>Y03-|_MVWp! z&$r6AJJYVcU_E%Y{8WT@2l7{c+Q`Id4>(MHqat%jZ`@KAJXG1EO1LiYgjp9noLp{` zqtqNU6yVUQCkoo^5!+q{i+ATF3r{p0uPW{||C<>?*ypK+C{lxD!g!4%RsJ49K9!5d zZqKyl;`3&8$jAje-S7}U!1Vb7!2`C5+IZ)6`X#F`H+sQo{!eDvRb8?oG(7?IsYajw zOX}=nHk6)_q5X1l%+rRGz0BPME3iJfvm%WmoOw$RSU?HNv->wjjG zxS1zFz>43mbtB0JG-s}p!3Cy5UgbG8+A4`?zIrK~sR9j-gjU#ueP z-ajoB!c--!rXOWo(5Iw$f3lNv_yxG1F-@g1zyfbEEyj5HUmU}zn0kFmeLm;WOSvwh zj9nO$bCM$C02UrVa)-s=n5iO{i%ns*f!E-GF#VpfBN@+4Cv!*WL$Y@2W&Q}8wibs5 zt@dBilcs;|sZh3v5#%C3)Q;RwLzA7wJ-KpHl89%7$FzQ+_6ZW)KIXup7+WCnc|Yt??4TKKovX8S8983I*4e-ti4 z?{xRO6Lt0hmhwT)s~ zEz{JT5U#XIDp%oZvZY32*YRZtcn*~(TlrElM5TT#xW6Yv0ZKd~1xNAYBLL_ZK_1H5 z_o(W(5jx?A<8vzIVoe&Z5E#xir#(M+?B`QS_#(4v3pK_l`=Ur+B-XSR>ux`{?dM?Z zNwPKaKx`!5TEl_tj;%V*nPwh53R9F}evQFu`#_Gb6c-}#XL_$e_qDc1jdXS}1L*8e zFiTfsL~WB>M27YN+xl42q|aFKUZO_fIMh?2TbWU#c;qfF);?b+S4tkDB`w z{OFr!wI$i5?f7}+q+okOc&jI__(8`m9_L;aA2j09SFo-9BcAeVS`MYR9Gw+wWl$+e zPd)C_#ms7MT+X@k+hVlY#3jL|sQ)^GX&GaxSRRI%gTm@sr7=VwP@)jysMHm>2VS?t zUji8NN^;=gI*g63p)4d3$-?%@4B&x@w!TJaAk^FYi$@m;NS)KVqf3J(U~^(tySrv# zDP@&}+22`7U#TKuA5;AKSZxxUY8_TC0a1XEmJyAwU{qJ}sbrb044ts%VlW&foXAK& zZcTag;Yo5nrL6a?tN~C+4<`ezBeTNza zm>cX`bCMB1GAqSni15Kw)`&-$aA)^`puL%5#=)~~MDzL8;L^yxEmNl_Yf0a69)+~5 zB4=`emN$#c5i_Bf3flie7}M%|1ZDo|Iqmz*9=n7D+4a-xXoDuoWT>=|;l`su{iwMg z3XC{I2vvcC6$LlKb~Kj^KY?`wAf^^n9NI?&tWR(l^u}v}K&`Za9|{Zmt5`uK{_d<% zes_aqZl<=N4(OgSy6c(bbxJx{JEzw~I!#%W3h(R#N-(o#Fqx3>C)NKjw>k)N8a!wXhX~q!goM4gklF-dlJO_ct)OLZ7;k1!v)5w?e5MPEWE=D26=0{mUD=t z>1${I0>{2`)WbHxCp9kvm}6S_X+L2?bI(z~=JN!%Zb<)*+ygt$MC|>C(?=plhT8^d zjYSO1CY8_dE?u5(2U*#T)yiEWv$I87^v(vo{XT|q;s-gGoBl}v9EP76>!fdEpMiL^ z)q^d&PM#6N&gjl@Q1Oerc=64}NC49Uw0C2Qt;5W-AN1oan@FB6)^M~cAw>l?-wB5H z1aZ}FN!oRxb|uDf%qTGeNIWVHA9KZ|4p&fc;{+UVEiv;|(6AC#5#XW<+`@uL5R;Zx zs>WiTA9WsM1c0?x5pm0)`W~mLb#g$Ve274&g1~Z^UP3tZb=k)VTT?D(>Iwt;+0BAR zueE&@yb=AZgh)~$y|oSmB00Epuoj0_8PqVI?^jTN@eWqG45`3DHWsvbb@V2YX}`Hc zG81_)LBc*kUVCRJ?kiPv4Yi9|wDZ8*wo7@;vzc2v{#`7~#ilwoyTH01QX!r`rtrP2@tnUMz`%fm7;dl?vwZU79H*|t4I z)17YSgebN#{o3lXb0MzUT$_lLdYxF6W*^bera=?N%i$iH20vq(=62RNG1MchLGAdD z(6t8htE86PIK4z-PQ z89$t};ms@3FaCuJ%a8xh zM-Fs4dKUFQ4MZ7Lz3eH3v>YPD$EfT_D9NU}s1`_QX>Nf}h4RTLfWq{9ZpXtwV9X&i zikO=N(LC5lBt1`Pt%E%Fqq;y|WZuor7-FF_r-}yu#r8h4|1TvEaIVJ`bAbWH3dNr` z8cIzZnscC}dR-A}wHB{cKX1nGqo_71&775PMgHoi`W6f28oZ!XT_k)46g(_P&(sD5 zw-(@TG{#5MY5p=_^B~scu?YUMk%4SP5^QUn^d1}>6dmzIoMi7FAd9hC=)v-^2e7>^ zA{dr?w4BrWCI4uj*5jdjM`uBqey1$#+KGyDa&jvsI|E>d;G zkD|h%V*|3gfa9b$mcI(SqXH_!BE+D`s&NFIgGG2yhkRsblP5Ld+0cWkybB{Vayi@I z&DuQ>JSM5TukK%-87fhn<+M&_;ucV$d$9DyppRRf1zd7*kNAE~5~+oJuP<%|ac`5S zYs}9TpHo=6q)-%^y?aDZ@9_@zrpTGQf+cD;WdDI@ldX$z)@hsAaP}PByR+ykF( zK2e5Rd2>W0fSzxKtjYAE|1n4(y-+XG7$-J{&GnjtPFu}Da0*c;XHZA6WtSn%If@Nf z>{0|ankz+_Bu&cHRbt!ufC7wQ@l@GeRLMAcpKOs8V(W~3Mz|3T(Og0Ya#hScQG3!$n5c#vBqJgXx)1W%hP{Mu{K zLSa^QhX^jrYUv+2xjH$>@CIKlfIC@eV?%_9P3QTaPt{HbuZ~N&5ay@pKDdFl;7NC+P=TkAQzi*_nfh$DN8!Bq$5je z{!O1}Wq^nsmK-Xb3kq*faoNU=hy@kL-PbA5mZ-~*4;iLtFx9XfAzh`=-KP0XNS42~ zZ8sX&^t5{wc-g@M@8nq{He|OY38IO5t*YKPD@RvOOTUDD^?ApN)hk#umvWo_v63a& z6ZHh=xh9LCx}T6Zc`JYQLoko1>hx26a5WItRmSL6Ih}0m3N6Zw2nH)!ub`r_GvYP2 zT8)S5VwXz#e)F;=sN+RPFDXsn^gGy?8!%BGBFW?^vBPo(^d!wb%D8VtSu9Xk{t&Xo z(WC*gE(Fzxd)%@Uu7(Bu<~Gl;?amGhMyP68IxEN)9qz6^77La*)VR zzN2y1lX%(ePvrZj$+0_HWV|oX76pC~DYB6&GJW3}_u(|~v6ao$Uno#LF#;DYHCk&i)A z>ca010~&<&QyJV(B9W`^)+cg$BMr5=#@}vGiIX7YnC3i91<$YapKh_{K)E3_JZgM( zJr$Fy(huc?u=){HkVkh987BlSI%iB$8JSJ6{uV19*$1NbIn-$~*8zIy?x4EcJ1g#M z!WEjqh=8L(mYJfvlW?AL&f+I`E_J9Z7)6?=gq2XY!mbCV=e#Bus(B`dMTA`S?m|RZ z2lJNwWPA_HBdBR+u%(h;o4>^Xl5_}M6d~+W7y>CE*vKA|jS52oK%|1QyI5R;`6?ta zRyG5_-LjvE%AP^{eJ?HQ08^gR)++*688P2g977MtR=^v(GYX{b0Vru@PBHO`Ade~v zhgNDfy;=ck%CJHxO4iRZ5~_kG^Dkqq02~t{mL_7pD)7>W=*}{ly;TU{hOfj-G71RQ z=7~a9N5og&F$~gQ%6{8i!mTRftX0Gdx7I}v3?1YMtjZ~tnT~A$xyty_L)Vh4OI%br z#}(3tX2Ln@zhr7~BxY;)JkKINvdE&JDm6FJQKWxFNA2tSKWe1;nv64)q7cJ>hnF2L zfLoh08_RtDaQr$}{!Nx#A-s5X@vfU$2TB}&4GL+sjT>3SU#x6nHc@a>e1&(dY}ID6 zw?wv-o-KH|^u774YzrPzp=D_$IP1tO+aYu8&}j9x6CSn7oUd3nfgiQ;s?SKqn%oTU zO^fvCNROF>^2pjUEIIp=%_d z2WCpy5YCD}EEfpE<=yp*Wzo~%!gh?DK_Yiw26R1@yFbs1fCi|39Z7~q`;A?(-{1c) zH{j%5-a4SZ$M)#jw-)3GzupP^wq~u3f`+;2#F;a$Ly>hN3%&nrl1s%%!pwQ!);usn z$;?s@InJzn)*L&ApCD`o^>4vlh0HU=-*y38rAVUs;)XCSu_6*<958tlwbhMQxW)bN~kB-#u?g&ui8#d*U-kwx;N%LDhV1#Aun z;@itRNpW4MgzsW~&pwK_5+W6(%?FNpF;N@)*}P2&fzhp7uci1m+qpYgk1f){i57;B z2+G+>ax!fxM-(8K=EmpY^->=3x{;u~elOr8JsPIhZpmpa9*|P7#cFubS*r$iwbBDB zlfJs@Wndh=_OC8BZ<4-PS78)Y?yRGtWyEst!7<#efkNW74qmvnm09*X+ zb>$T=EZzV1y1A$}t<++Y;JV69EmNg3uyX*CP7n>q6JLZ+KQOKeZkVT>CowgtH_pgO zRqxSjwIrQ%JyrPT+g?-e2U1S_;~Ni#=wLZ3Qtz+pa7pJuz{E&)j^1eVVxP)}htxxz z&Tb(<&e#u4N8dsCs+VQ)q-h8xa`1GUo!arkn^jCE1ts);x>97w$r!_gHa=JY3{r~uJO_n#J^ z_3v(*i}`kSYq{2@mp zeU2YOH_sooICi|^1o-U4OI1*chxWc{tJcDlbc-5BGjgK*n9P_kXT z;po~ud9pAe+CRW(CTJ!^@&{97E({kZhUY#He@w&wuB?wm9?<)Z2MvEc0$hK z3XYXm`+sOlHwPo*CtI=fF)N+kmu9wfb6zqYq!UY@X65$uPNOM1#03BPeRMW8uMHQ{ zM}QLAhbG>(QXqb2QPfGv6iZd@_){1O{X9?$b;Zcc@CV$d`?Osf1t)@PxK+93&IVF47`g_kVX$*fHql|$_) z5911V>4~;tz()*pf`dj?01lg#3CY+eE~IkMcweqB^7;a=&)e%Ko151o_X}0>8CwD2 zZZZS9{C$MJm${)1er5&o_**Ldw9`Pxgob}s$eOEl&t-I(Y@^<2P) z_MepMJNl&%H>PjGd}c8c8?7ntC8Mgvv3C8f0aOW>CI}6=4wWk$oxdWDZwMEfiJ75b zxV0!?VW_tm@Vvb#{#vkVKxSPigbkSVz84p$t`bJ?M}byk8BW71c3;q2bjK4nMWB+F z8#jl5*Ss;NpPka2iE+de=738WmTQqEAVG!$;s=2!JL;;k%jGwm85er(%zXwGsaUf# zC;Ynp2iz}O;iH-YnCj3CmfkJ#^`l7XsFOQMsTo}HX-r%iAxWBsi%{Bvok5*kOYe2Q z!vUp*X*NSY9I0Pn`GpEOH)=##{P{Tq(MvN^NONDvF;Y*v(M2N8c6HHF-cc7_i~%ym zOFh-gvF4_3&JH8ME!>r!q&qarU;!!Vghy)@kofQyXzcT33&2YavIm{mUdGsSUPH#j zcsv>ALyBmY4m1(-_4G+)>J~#mC7l#-IZGXhLk$#+`o9KB-@5@x;z+Y3xO`jgoG)X_Vx~UWfyA)U_4a?M#@>bbOfy+vQ$c zwoIFce3LEn61uk(tfGgjlPcE`^RCTlde$YBC!lxZ+Ns#@t8?QZS9y|VnoN^N&eDi7 z)6z}O3nXh5TVd!#)Uz{fc{9gY+j`}expSEIJpz# z4)pimk#CB98Jtq=dId@;1RGgRs?-GJLykNu8bT9u<}12TR{Z`MlH@QEL+giq6zNnK zlAX~jWnw6=S+DlT6jjqgC+Rjx#3mODXqgN-(cN-XXqNR~ypv^Qm7UBP)I$Y%14*pS z57V5oI|5~lP9CPcP@E#%T7nK-Z*u>A*Q<-FVO-DdZxUQvj@2da!Zy^3c~%1zn&Hjp;RF;cOT7{CFI^Pbd^33}UmFXG*wz~H-%y$Ah{_cF zq*f`iV$M1KeO3Q{K#r2{bNF3#x2*0gRb8AUR1=_JAZe`pr!jaL{G z_=;?l1^hbh#!nhVJaSWe^`;>tSA*s0qkgq(jw^BgkgDoSL8Yvj=x0svoT2yy?@G=M z?^Bj$Zs8?3Yl={a%phx|Jg0kcPfd0x=Ag6MTLZwEx@FV0pH7%!RnIM$gjeKDxW)B$ zEB8fjTu@7WYf)FwzGrtY6ioiYv$pirbTqi5zL|}6pfOv;&!q2hm=j#_p7|&n;fSk9 zqm_{CD#8oR3p zi+3DVO`E8?cbTkd6hZSJ2^|It8EWDX-5uAV%Yg*WdYq_ zbb~e~n4N4!UpI%GjKc^5E|T3;R27h-e(=@WE1AMNa1Uesbv5wI?(FGC=2D@7*nmVM zqt!xv28|nKp<(d9;az4wMO_kMb z=Y2gnpR>Qqh}C7cxVUME=cKyoJCLso+#fix%oz_9B1`w?xyKdUO zSwoieg1IAeFR}=FeryqZ<78b}JK!kRbkVR--0D_BWlyxBuFhwK*yef0;8AD4Ny2GO zU_{?AyAhb^Y&LX{@5pQQhS%;gwZ}LCH#SDY_!C4}zG-<6H>dj0{Bhm9HiPih}Mmr0dJ4z}vu zU%dox>n_qP=>;^&D;Qjxl9HwJG8dl5^Z#iloOdL=Pd+N^(i-|wf0EB$)jR!d54&f8 zJ~&5x(EDHafqm@y4HK_;_uER_5tAO;Cp+MFvZCJab$tBO&ME~(2Vx|eKo!wJdJulp zqejk5kqTxcoV3dPOP(uQ>0}Aic?qA@At1!TM80*^@IPm+FpB45k z8I67;3X)G60+Y5gQ-gl3T`1{{60@?Vi~B1iDDr z$$-X#6re>ILK0sSxFRRM#Me9$2y;l{YXVVdvg`VtPC>V80-08Ud)XzJD3oQQ$nD^a zmjJN8aBUY&vz}zo{ML}uc~zSzy_GE(g&B)Pf~|B9e)yux|>v( z{&&GW|74RR&SUU6-Si&$p}j0KZb-Y{JPPTHyPgsNUcOoBg<8xKG!fiX=6Pg-B$4LD zU7VcKqi;}h2RhEK?%K;$q|7>Y$3GLiOW8Kmad*iS7qxJy7uq8Y>c^?>MG4|M(={D4 zLPi%^mfB43>Et(Q)%Y|wlYy%W8~Huvq}2^>)_~yrXRaJ)tu`_@{Cy(*$%*KW%%XA{ zfp>75WK%Ny%LB*PCFr>iPO=SrjQ3Qz0JrO2O)sQs$#ZfPCJmYh3;fhwi(I;1cp==j z1EV9>a@3o>#U=xxq10y*fhJD+4YPr&WkSU!4Ov2^qgBx@v!FFZkvjrMafLAJuu@m# z>H@TYYq%RWz=#(s=^f;o{$w9NX)R1OmQ+qZ+NY&zVKs?@@>kTK`aA#&m>L^B`v0rZ z0Ew`FdvPK=OLqnjg@0z!qK<3bI(gIAKQ%r3e&Pw%!RZ@-V$)0|C=h=XItVet_wrHd zi;VcpOouno>M)s<`@sFuO}?X_7t5=(lARYJmn0msCvGU}M>F^~Zk7-+lFeiP{J|BS zMDxNx@Bgyvd(^Q)Kw1^x>}NhkG7p^b)U&xa>JKevMdBA(?@L!{2%HI*>vJu^tFP`Y z;vZC#t)-mK{W};{aF)&j#A&i;nM0vl@7zF1$2?{Mkd=D(AcJh`O@wQ@tkc0niGNf0PN+W6Kt4G(vN(acW)&HmVaKutT~`m8Sf8ZuW+D zT}y@!L9N~0vtXl39jFv_3oVXEZVmj6gQPVlG@1u7zXw-VoY34TZ;PBB**oxWIdq5X zx(iI$KO?90b8iYbhc0MQopm#&D?b%TSKfD2L{|=T`e`qFma}apFft*z6~3^RBh%Tk z2^0O-2LK6-;$r3-LFX<_cjKi1k@fcI{h0wgaFeC?9QBX|=b(LB*GP{Jm`?|o4GLF@ zwDACCTo?ZSpOt+q>qO(609tz>UU66$qI0-I<>0N{_AY(!RK!c3o=e5{!zQ}0T zWGLjdEwr)`?B_^wRk!e|F5oL}=Vrimh}5rOyc)S@kWq1T);}y|e9IWsJnKYdE+qyn z#TnbajJ{eU`|~!PIUTs$Q)(C({RvGR6#)s+Ax@~zMRCz`pW7BM-l9HtI=LCe;%xy& zMB&5HSub3ZmtaS>UrE;q&{G8!bETh`3F7n8*0u7e>ZzXNhrZ$TF1XBL7v9jBTMNi^ z+HurN{tkIUW|^5)0R%Q3{4~yZHY?qvoglLS@M1&%6cu3D38jRNqn>A=q>$v)Pg_$t z73*iXmT_GNml^bN*ubzcW{OR=2mJUm;$wX>bRkjAN*EEiy?#nSrHw5W)fu_ug3&w8 z65nTPmSWmejX_!?Ro1lLiB>6#mMwyL@}vp@mK5BR|BHJ7C_P{<@mn|DFYB-4p z42!=QnN@ioSJoiuixRE|1z3g8EO}9mh)X04EA_w*@ z{^^1mOX#Z|Q;yzy5op_#QVrSaW+m|~7r+00CV%-(PRafoJlj}_r?0rKBlV0%Nx*cp zuH(O%0O&1pY{{50w>-+SQgf+yVRitkePPC*=#~#{>up&XX{60qZbIvMxX5?(do#Y| z2WZTEN56IBwtK(@Bd7IwC@ML8A6+!q*j2NfB}-Y0hVcmF0J+9acZLbO0y{$IFl&&n zRLE*K;2U`4&)qeww9d+A;pQlVA%^#w5;Q87`8>@;Mu+_IPG=>>=iNLxS#l=tEQt9H4C&0Pqze+rruC+TT{oIu%GQo!SgoSI&}OvS^pc?Zi~c!6J2 zw7$Wv-sKHs#!)Bte8P*J$IcDJfPTHGO(l8os$9SgvFxHzO%|m8 zGk;_<`4k725nP9HlK*jv3CBdPDb6|PX(Pgf?coBem)wL4Y@2X_<=_X-r|wl~Rgj3b zgNly$?1@?7`(Cve)3I8Xo7qu8H750yApl1}xWC^rr>qrSeq|a}o2vXE!p4%M%oM;f zHK$J-rVaRpP<-cJy(Ktb%XBl;$Si?nL*71^B&{uoD9Uh__>#m5k?MOaT8lwWvqp*o zv0i=SZG9OZ4Tta8T~mqPEL&!<+oi$2-4gSsjd`T9>YJ%tF5rw6GL>_Q#HDsMuc8+p znV`&uz6U!?>;n^gO^TX8m817Xq|XdLRXxO*A%q1-dpbG}TSWZ!@Ozqn)ZzmGjHcsg z2<^K z>e_T=^$woQ&8=0$U$~a6x9K>K7or8k&(O{7zx0^XvUAJf=%J0;i)rJf)q;j?dM*O1 zatbJtEZZD==B!>MEG!X_x);44iwU_BY^C(hoXsFZ&^)&uTOG~WBL*(&HkFHd3w)aQ zBwbaFtrQrX5ZPOZbRzpsa!qk(~(%J>_PE^Q&i=6Eg^tH+xn%JhZ znWw0t^57OmdToi}Lklb3A?~-ro>o3Zqu1_fyrDf?Cj`%g-JoH8?^~;o1S#Nl8JumM z(x)hpVyQXIRjRdSL824GgPYi=_xCqPUa98Mzc&GQNv~XVldoSz!ro<~ctVd{)LD`$ ztwV@A{iD@}Y6ypmt4RMfO{I8dH5k+?TlPPq5=kP&x;EI7C(u*{ET6y_@GfVB)T-}8_ zoKpkZ)j{8ua0Vta&z%_%-jnh^)t#P zAE2%W!owB$Jc?`*TS5B*0o17LLXOjyM--8gSN#y=#u#I}zu}wTd^5O!RH$~WdGLpJ zazr>%ZF#wbTb^3{zwh`Dv$CCf!nAQg169jVGo46)8sbKs66YGUhs+7JHEGy}wjG99 z>)E`PR{k3!`Z$M8OT>&J)IjRGTJH2gs zl8UwmP8mhDcr=iw$IAoxp#4ElU(m%HK*Dlbkr67fAy_qAQw$x*kRA05@9+nx79Bq6 zs?g1nCf?hoebOPxE_+sAd8<3lgj2|g@E<3{>ddo}%w!;mUrr1dT2F?Y`tN-vBSs#1 zN>K@}Gvbf!=AV4xr&Tu}k_Ifuu{hMb{*+~NY9wl>Ch6@yE3u~%fA+-TqHb}@i$*;) zi@blTQdCvXWQU$12}oX2T!#Y2Ru9N~K2_hVqJ}Bv^^pep1zh;f5L$gqZ*VH3%k7ph z2^%#X^y}86mxQA+XZoPQeX!>5b&lGUHH0EtE5}Tj?&3Dcv>wG$iGDbk~v~>0&_*F39QY4?b$lgW++6U6pvG<`Y1ZfQzMXQRvP#-cV+()Y1UL^QX#&35C;%B}5TTFMy zu34i09CjLAEmX!ZE@-54ibkuQ?VsLRxeo4YTXklk>%QtALQef;gR#ug!1-0v2^Z}I zmC2ndt|ZylcVHP(DkA;HBY7|!qu)rhfhO_L`0Ar^RYoBk$A@qd!wM@@X45AMl?K|; zenx3IuUvpJ>QNY@YPn8Keyu(Xf)1GA35FUfd1{QBZ3P_r$wnJaVSpDIc9Cn>(Ayx!P_uj($?+qeYN1#$Q$8sz3l!4-CHe)hN9Eg8; zI~dapTEBygC6ZY4{hlyOyIjsQ);v_^I$xAo$cS&n09D%2XLoQC_bc4NvD1%! zNUvus;413G(*?D}?7W}K0RUkmI>g^%kLGQXtG3pqtV}LB6ioOO;oS2uxjNuG>k>v> z-bjCm;@KsKLx^nRoKqtRQ*_^r8^ zkz(lh-5Wtcq_P&p_I%V>Ii~G!4M!LOonbLz;SwJ!^lbyVi}lbPDVb@p(=i-pKj?A|m8)R--g@iyiJ|^KGe$x^&TtH?+VLxUv`V<7)O9Jg;Ap~vdrvjXp z?JX3ks#^kbYZ4Wc!ocxAY%!vBOV1(w6I5N$C!X0kC}0Vh0iz?uYjaucSwqz#-+dkO zAoR*PXJB}qLn*E*?NZ%y1Ly~26&L10^(a>}8AK0BoNzO<;RLgDRUQdf1KMFD)~nX< z#iE2PNg9tV@57W?7jESCP`~>NGgmiIjWf_r7W9ODmf2rfwKD44k~|S)!GmIqdZf70ubfKV>T}S$ zG+@Khchg&NjeAJtB_I%a5Z$sWprmU5ne%TS8ekU_CgI!`-~GLfY13mB0!7D4Fvk)) zs8$~P^QuOiGFdK8pI*q*%lM~fblH6*6UiUnyM7qS!?5jNg0wt8Wc=in&j-#(6n>Lu zd9+JbtV2qN;K7Q42SYe7b;mG*im?x5EBa3eM{gauA8R1J?_a{RAZ)h=*&1j^V06vi zvAAh7b%S*0%pt5FZjh4p_bD=)E{P(T`9`uGXfq!o;C!geXYL|TP~8yZO6$Qa{Q=0D z;*g_m8o`(bgcMGc(L){pL~QK0>U^E2jkeAL!j2yQ#_GFCF-KvhXuo^e>ij~Tdn3pq zD6Z@;_!q|7xE5qN-vD^t@;`N0@yOm8-M)6XZ+~*1JJj-)-l+0xrzpV$abW9_6_!Wf zNMhom3&B|J;oE7Zve6sBqz_Z)NpAyMTgh7tpHXZpjyM-*R)1o%CwMr$P3KXYy~Jw@ z`$+ZP$$%Hvo{C`Pu4L0^TG(03IQLPqi15Zbho__&HR0J{DM1;oxdnN&d+b2+mC^D= z{TwXE=o+XW$G{ycdjif!;AVpxe-B}9GaHUD!dN%i%Lg zCAhC`)t7Q6nWoOqB!zpV)B;^m|7zH`Lok) z0jJyA5j6#dSH))-1|*QPY|NV`b8+DdPqiUSue8nh5qTnV(YtELmndW^q_rIG6G>Wg zvkhb1uklPmoAQ2*gFq`uV^lN{qvNZSrf_$gm-qHDZDhV#)Dg`b+Xg_^hn%p*G0`Dk zyqWF6V#J!1YP3*|r8Kh+@+KEh(97E7C88yHn{mQRvPbI$J~7pVqo6R95UQ=XBdkzj zLP5`<3tm7dRP%SZ25DKyBv$?Eyn*LR{3#tI>8;@i6f-8a&2U)DV1RR#D5oN}ND=T+HB#KwEmQvK=Q3PWhR{pnQfKz<(C2L4 zK*xbSeG_^0dFfVTspWfVdtkmv-7usXQPa;CU@>AyWm>S(5jWRZBLQtA*AyVZ0%Mrv z@Q{<;GSb>s)%?dK z+N&g2@(-b4F+`@XqFwCbMq;|%SQ?H%QchYwlK3+LlG5*iG;ATQ{enD8_XWW8EbD=b z^Vm;cXP;=3S!V*u`(bgMkn1Y1jde1vn1g{QX>&<4;O{eUWkQC}*)n1|>FGxnuNbA_ zM=kTHlQu@M7^0Lu@Ws;aKGJ7C)U~RQ+i@j)v1$J1bD-6bO7wDuSTWCwnT19xWm%DI z?3A;16m#-86CfmgvZG4qM@;FM->M*{#Qr8s6*ucH&nFRlq~f(zh}aXo};)(^ZoTmj`SDXc&c5+!i4eF5P zD2j*l5-^f4>WQxxnI^o6v+>0nI5U64&yBbL;3#%Z>e48UUm2s#}2s% zL>DuG&-yW_VDCUc^c?URN~CJ!vz)2gMUb0YAGwiD1R3b88rY;qA1*PQ%u#+%4noag z)iZ7Ll;dk;XPooHtVeBf^%69R%Xu9=Ljyai2oH=`D2Go%4`9fRQ~^7Gu>yZBj>1kQ zd=$pM`&%fr!hvlUH_^`~uK{$4|vVszv9+EXkiav)cY~JLb zBR!CZufi`%YC#s3-rs_c1^v^N$|AX`&>T0wo}(DF2~a9YTGH|W;h`IV#@lN@%0Xh4 zfOnXP^%Qg`n#mq=G*0myb1YyJSOm><5_2ep;5Gi6>Ym5SUz?0T13$R_Wx9PPsmMmx zzsSOHvK6Br5kBfJ*5cSsL))PW%y5NF;ankG^4;WNA~tf%ki-UJ2Y6~QjHhqrFdN;) z41{?RuD*eP8$l%_q>~vNmakjDzcr$1(YC$71gjD`-4T3{>q`<8$Z0Mdt&Ip>7oiVR zLqSzL0Fb;MoKeXRNH`tjdU^6$==$dH#D-}}h|N+~9jOC)Y=u<|r$3Ue_Uaj741Uq{ z7m7Z{6i2JHV>*vbvKlR#*Rts z1_p9J>zt~H2^+H07d9m4UBLba-`WjtM5|U?Tn3q)y08cZU4dq(r z!@46@Y3n_{gyK|Wdccrr&I^w3W$^%iZ@`7?Vi8%7C8U!F^NUol3BV5Nxr@?*33lM= zYh+8asxrmB48lL_S^ih|mANp?iG&kaoK?_a=?1y5#vbeCprl*R&!q%&K~P(7age{GpJn^*U}9=XYJx=VP(VIufT;vA&H9cnj7^X&+iw!DI~Nm4 z5Vi7C#QCsfly|RISD4eoxSNejVts|x3FoE2Qy%3c+)<*5xXoug@TgDLrL*!haM*bQkGI%Uz_RrS=?Dc_le#(tN?H9i&#& zy?k<7VQPGIAN^i<1s&AX$_$rn#C3j%4kkA`m{`(=}nxVDmC-PI^Mq8Amk)g;t|;Wk(vrLAV5#C&ugFZl0h zD^n{oF^YCvTN!6Zc-pWaTTAj%1#HWK7GM3w?jUd!J5gUey+AEoBCqL>hX|_0_C`*Wx6a#2(R1WB`L# zK3Z{mBCfE(Y@VocAH#xU9Q0mTE?xoO-?HU&i*9iDj|ga&#qFuRka0#mH4RmAfpFKgL&ih*N(c6RKc_>1hc^#7F<+gmdyeF|39t6eQ zz$KI_e_}cApg&q4R(!j$NyreHhk;p1)6dBRxiQDW$%Zwf<~mVUL7G}ne;CpB51()m zEj1}IL9;*uM>?}UDef8TVV|*F=Q?DHF4fme(ScxlMPd9{AxltamHByyY$x@?E^M|L zA*FT0Uos-gS$QHtLDc+qAiYRN(6cEq)azn! zCnbsN-2ndK-(3RiG_+}Rb9HhC?j@tE2z;$C0-U(yfuJvAet>?UUUuZ{OC&GW3ZWqp zDseCnkM~s89T8z)by<>!io1Csybfhn`cFs+$#e0AEdPg9mm~M^OHI~DYUZ2OY5fOa zk++JnWKJJ~wUQF1)#+tb^D(K=$BY%^)oarSQ@*wbPsW)bRFnpedZNTWec%*QlZTU9 zj3$Q5e(-fGcwzvr699zQr@}&gYk|U=N4(4&R15~{Kx>PGylK@vH|K6tsyjboT_v|O6yQ9?3h zd7EXUr=Ec-n}7;_0=LP!<&dh1sKCyUY~ck5jm~zaK0N5JomB2*UQOo0xJufgiB-a2 z@ek+}|3oj?&shlqsHNVcU!gaK^9?8Ka8ta_boYRm((1sGY1$cIasJxw*}X<+mA=gH1vm?0{-zF)S4?B?sb%Ev<5u|& zS9ePyGZI;R!%ycX`V!WHEnqE}BPvQXMmoF;Zfsli zv%swA(_CfkOYPbsIUhg0XvOp(=$*R|G|XOHu4 zNFj208oj)j2v-C+NGM`zEW$5L4ND61ASbs&)+{X?lC_eogs$blr&tu<&{#Z@xiPz= z+GEKYSDK1nYHuhGo-ak3b{0rSldqq#dp9NC4BJ5JjdgLXSikjSH()ER1h6hrkLk6&G#a^5)HuGV33M21{b6v3@e-1J znV!%~+sGGF&(MVKmm@JY<8Bx)5|5LhIn2h!%9dE!e-k@~q7+5jxBPfQ1@GIJh%xk3 z0#7ARo^t#47l`4^*(=6JC7Gsrju}%FMavDck4m%lnSrKU60Zj+t&CKbhm@XTG=bw5 z9!r~T95>{3B}d%tb=Y+bjKJ!ovt)eesa~YSPS1{M0y(7f%r5y!#R&cx?}Yrv8EWAY z1qorW$GrG9Hrv~T$=d5##h=+!kI>9!^8g&fH<1GYY&Mr?HuB6k`b-JWKwV)Z&zSen z0OYvOa)b+P2sjg8Kg@E?Eds43icb7T>|NpKsZhpO691&wckrC%75MV{6E+p<+d*Vl zGP=_c=i$;$6(wk57>OI)6}73HBm3z*At>h%>2ezWo610HTB{_^u^1gC=U2g>StYf_ z%*w;%7HCo!!7uPIJkk8xh>f>DY0BlK5?)E>wSeY9nNsRO^U8-n4ERo%J|<8R3(#oc zAhFn3Q28)x#Hvq94#MU5b9Cfurb8$6HA5y&zYMOz-^1K$7vD3%_YBk=P1RYC)z`kO z#u?i<`^o8dvEFs$yH+KEt&-O#L@)AaYgm~R-QiMdnIZ2|KHb`u@Q$wjTC48Wxk&sa8 z1JbXiddsldMiq_>d_RKB^-LiMXcR)dYX-WXOQRoVoXAz?jnxEI!)h%UY1H$uy_Oa| zaQD=oMh^-!xlsAg%F>{-SzkP(!_KMGF7~;Nd2Tw?j2`f(lJ9@#f9pY|(a0qE1XQ3N zkiTY=%Be#`telxmak9Y-JYp1V7EV~dYRV2Ph%T8&XLI}4L76wZCWg)wTw(|99^FE4 z)55RoO3hK;Jd|cL^9@LBZY)Iqv&L`{9YdXyL27k!OVliF6)SAim&m5%7OYx@t(Ki3 zFn4J5=>AeBX-KVw(DIZD{{L+i32%o5PbWWnbfRJybo25Fi8fhdlSUX5WF8=> zBketqOgP&-zzns+0smzU_F1)1=ilcwtOljII8OR2ISz+@ck(&~i}o!k%`!?zf)xo^ z$)R;R{r6vFI8^uc@&Tb{S!FnWE(fGntV0NDaP)Teb%;@*yctlGmpNXsoJF(#OeU2O zMo4HgH<4b{&#;mOSKnEyC5Qko=@!EwA3_~rRK)R75g!1-Ms?h=4=b-u^KuU!0Xyzk zlFu3H>C1(F?r(hdacH-ekrEt=DCFFc6fA9%>nd2$4Xkw-h?@aUsrXEO>wM(++FYB( zj15={{y#>NstxwxTv3+0!oQqVfHj0APZ~fOz%a$QB_uZuv<^6!r26WdamT;Brd-rS zaG;4$4f9dyX85RBR|cmI-=sC$J(9wJ0+W?!cK&$hsU#?Abj=>%t^?(+8>mqhn0qnTrKpE%f^pL!c=N^22L@Q*_{ethm4t2% zIN-#*i8TJToh$}0xi{E`L7%xAc?i^9NUaZcklM=-mf1UyTrW=sz4H zI+N++<&|U&8^fb@=$cQLL@<_jl=Pocj~2G1KHLW9&WQmB8+1zuy6&u(Y-a1D+FbJw z3Hf2WLFal6j-;q)xgp#Ho7HWfpM!X2n5uTR0H;DlW1FHAI zjcu!*6+ktgu>%6jA!`Sz8%S`k2~jTRA*}*Y`h8Xfch!S*2DxY4L#Jm{gO394T$P_q z+?u|gK(~q0{yg<7Cf|VjbcB{0Xf*|c4*@XE|BekWZ&CiDln8ASWUi!dT%WC^iurDO# z1R|}sG4H6K)GDttjxqOW2*tjm8Gc7n=R&o*k9kLvI2whdgB141KEgC4gtbScvRV?; z7(oVEA+HG*%Xh=%(IzylE?zp$reN~h)u&H#=%f`eCwzz#S$TnEW;iOfh9EiAC@#5W z?$d#Ce&g7y_yLLaR1ac_b9rjP>M9y8OfS2X46QVCyM)I*t}r_uSDbT6|31ns2mD(< zaxl5~WP)C+mVUBCtBH2RN8G3%L7W&*ZC}`$9zQH471H_7p5@;9nje}&32*uj$jbB} z7)jHz9{8HIP|$U3md4y^5D0naSm~jC1?poGaRYlCp6h+0$=F-9K?|Mz&XYK`r1HGJ zPUAy}Q`17{<&aD~rNojehm{p5wWn*qnA#KwT|I@c|Js_zkV*U*Ixczz5YB7ExdYf- zgaVdgv`!E+$InggeO1o2XgA`nHd3v%5am@YaNlLsPNb$1a2z+cY*aNimGED~2@GrM z8af^TCHJtQPr>mjCIgoR_t)HL=u$Z8V07}D9xp&GAZa>{@_+kvb6B>I{iEz|mljA1 zt=$g-YNOd#40~D`l}!nrB*AAH$;TFS1dGB3O)O4c^8$2&ph5>|D}B`b<_svl@&$77 z)_1P|C9a?SVpI^q7tgm^0xhsU29uROWhi#*QDQal-x6X^o7tIg4;|krlHvGN=P_t4 zc{|jb@8jyu&yQ{PKJimN(AFXS`?Az->CBSh7!*dDY zVRMe}gqyH-&4th42k8j3YyP03k{Chtl6<%JuX4xYYP&yzB#M){2I;ZD&XVpgviYy4 zYAv;%;W|~UHdcXtiVGq2G`?|-^W;zh=MKn?C-f%x%pwavPG;CknmtLf>n~?GesTl2 z{U+~wyA`Bubblm+`1(T?TP>JYrUkY%pC_D0#15szQpf62&qGeNIYm6$1Y3iIc{R4P z3QF4h0eqHQU=Ez_JM$Hm;tb9vIS@|ow<$@ZLx*jXY``4G==~xt;2trUn6%H#$A;{) zFu!JMDlMEwcFr99AVS>V7kn*$=Uy7WW@6d&T@Ho>NGtW?8%}d!tZzq7QRfbf$GcN1 zP-JSX72j+%avsbRw&LG$&Klgo!_37!@A{`YC;B(*oM0$`sP)#r3VQ z5S-rrd~{hyO`oqN9fs(8qzcRv8>u9-GkW&&MBiio%A}2*WY^vIZKiFsL2Z=GB$~hw zWyBWr?W~|pkLmmIm05tiJIWl-=lCV|BC_nChf6paM#~DHE4pQ{^v8zOFtas8A+lIRZ4 z{ptfnR7}-$9!Z(RJ{{+AJ9qqcXVEkXS*946mQZWzRu;#=3-T<4g`{{6-2*z&Rn8G=_rN@U1nX`yuDY+cZ+pGFnhnB?bj8q@X3cFP$WHm|K<7 zI38`R22$y*%+TGErEfh}(VeOxA~-k?RKv0oyaFB7STG_Z2{EL!kh-i#%ahU!2Z#;% zsRXirO#Y$&?j&!o*-4AtfVx#5043c!N%Yt!v>;aJl=8}u3#gUP%VQ(UEj!a;!~-7J zL4GU$TWQ*^QyaYfR^1`B0GxrZl3@ z>o&sNaCMXBgI|r0z1M~iOMooFZ17~)HfcXtLO<-&!h@BImj8sL?sCRRz=&AIDkFY~ zu#b^1kv<#yJI;AGWPOssjd{5hpXT)}L%Zkvrwn;wFZY!gN90j*{z9zcIzU1y=SozXx2>CWS z(a6qdlaE2Vd@9KSh0}_Ry67bdjwUXK50T7qB&UAg%s9 zM`~n~^*b!^z9c&nSV zaK}Z+!-Rd(=EE+95T7VDNkXbqv*}p=+G3?2i(g;yovBKTdPYhjwzeDw+<+MJ>ADof z^e!z#Ygghf+e<`9zopv|!=#szq{*z3kh&73F@`VmLK-#oVZV=F>wyp(r_g9Bal#%8 zZfjV8Z1BD+>^~QM;3`8>IwZ*=j$@JNCxI%{x4fkFSb+62`@vuRn8i1f+7I{TI z{rF}Hx#|K)lS8{(B2y*td@ zHRF}8n7bKt_KH{TqcV$a#9$blpH_Zwe4GvC#2yZ;U|0_CA}=aEZ6m%Sw2~mstre zpoj2-W|Q1ZW>F-mxw$=eAJC7p zpevj#CK6ZETH;^-3`YlUy;WmCIL2ldli*2IS4cUX*<--r8XI_Yg#TzB5=@|(kA6ym zKZW2o!oRgSifWE9NBMnVW_7{E>eoUP`QUSKwX>W?&rclP;{d+%7L6dQ_Y$i*Uy{YY zBtt6vc2^QC)GSxR`*QQY(r{P8aHxcBoT0*=@-hcxyFG2r1w)uGY0)$T8rc~2LHXBf z$#6V=521(p*`SvN(YXQA_|`|Zp9YMd?F$`&x9FMSQN{MyPFiFSh_?-@N@D|K=EWB2 zWjePEB_iQ0Yy&}rebH#R$6<-x8V-b-(x7&Dp&RPx7T@NL1LCtf)r)*Sy@NhqE(`Ud z(U;he6&6BkrpgHFVEd1bsemDzo(sNu@LdJ@I--9(*%TDx(nI-j{>o65LNG2eZ#72GsIg}EFQtG8K zM)S19jGiHCwrO70M-=t)PpfvGTtJ?bcUjGe1leRK5`4^6FOMT6&Q$>wHO0oYCu8Jw zYtgHOLNO>|w!ao;_M)J_s+Z4kLb+{C=&HZ3xoI_p5zw6A-?wV`^w+^^Oyre5>(T4!)f@r(^)eDNr&b(r@xlj{v?_|btXGMP9Q3=s7|D53xDH7G znSehYG0+`F6kPOMYKK( z5bLDxfvl!S`&8&K_l%$eHVB2Cu{_A?mJ>bHl>U`c?C@vF)07UoC*DLur8eBzq69z- zx!^)UHE7+;Q766gdJ{*0){64VIj=ZT1(?oE@rD;_PD24T-|Nx} z^s}8XS0|FeZeqt(y@Wz*2O&7i-6^>{sC?Bo&NH}H=f2^D(d3|`fdaF<66Cz^B5nG9 zi&9ow5vQ{9%dsajWgS;%Jj~aHl1#w7>OpEPst4<&<0r$YTI6+VM^{z>Y|TQFSyw1fPLI_T7E)s`h@^SF zd2?=Uf;u>?Opk3-2GxnysH%&-ilQkO`w9cMw+sck zz1|10kTJ)5?nCi=M&F)5aj2e>d@e;0eqJYAoI>+^li?nJ7xyAh-+Kw`v#l72;S`0IC#Y2| z`R=c|Llq2E9^(rf$7@RiVilBef9oNpK>|@IHG^|)3O-@XTjGC<+4Jw7c%heHurgL? zuX_I(GS*MNPjIL<8IkULJ^#(LmifXp0h;dbVz^)|PuT z_fZNczY+6op*?#>1C5=}NEBAL=zz3}nBbPzx8sbw1ngrLaG%5GPGt2b2Hg-=xfq!S z%6%H+6zfA9;;?OTc8Obu#@Cf2&sH;h>}rW@u4vu64`PWMgKG)nuu9QLb>znJNL*1M zCMt!dTo&8oimy6zox!+``&eo)e4(=sGWFKTNpKNYX<#wvAk@Pw)s68slGK3~Px9Ct zWd)~|x9wvV#S1L})hc-VG3xj2{Qa&>|ie4>; zc*-4Ak9cSA=Fe`dELCu0+p0fc#cd@^_OI5jp3+Gr*#vWtpyV`DM>XA40-J+RzO@|n zy1pe*Ac?kdo+!7G$uDs?jNF&zq1NPM61RQ>2}(v86+AM}fT&a;Mw7nH-pMnbWX&0> z%|;k*L~A-qtr(WN)hMTFIgh(dC5TT+pWM|YdL|LvJWGNc_`a>u2xFnqnD?I{t-Rc( zVnTdK7q#gB*t9&iuz~Xdkul|PLs_BsQpNptst4bYlm|BNeB1IJUs1E1`^5&4^4>2` zA9aJbDfZsIlm3L?vAlUx0KHXEEBx>>-m=E@Q5U>$qJrMR@gZ#oJe(=+oNE*?+J313 z`k6hY$o0s75fzW^8-w*9_D*E@(PntugI=6E|E-pWb%YQob^$nbaH8=;L5a1+>13=T z!~#bL1hNh}aMH4v7&l1cqLgm_x3*;bmt+YpRd7A5ATbjodypn&ZFfn@B>9$#q3Y$h zR^ICxA=)#&NrZI}x9F3W$zOqlKh78#pxT=WDz3g@9qJwj z068J)?}54vKhiv`IhXE{4G+q`WBJ_UDjjuJA}qo_R<5&lnc%7AL$X`!c_|r-l(U)D zrxSE6s~!{#s zuWMNkJVZd{<5PSmy|0{3krLzKX`R_~No{?4LxvfYd3|j%zF5u@K_qn&MeuyZT1Ql_ zs+=CgGq_2MmXR9p0cRaZk~sZ$n8oz}kX>Uj>jDf9{{P8Zc=lb(auzw0N{C~A^w2J# z6}o`rrN3*^-6lx(Wy@A@TL$W$Tg=Jo1s-l5QN0GzN6V6Q8?8AD>hyU{M}=z#ep=t= zr?N--`Cnfrti9(s836uo7RY*_i(nsa%o6t5f{6u%>reS< zt_IGcjTKTp$L<>VLb0LSoH$&*7xuKk9tjS=uc zadm|KF(p@uAXaLHdC*$Kh~PqH=@Lu#RB+LHxfU5Sw!o2L;|pCQ`uKyU5y*GJmsp{M zH^d;b;eRc$e%e>#!SU^d6V!Hll3$1cgcnJXI+C=j5TbjNMS)oodZ>XowqSQkzb&zdG7Ux=OLoOaYwRwj$4ff7suHv1JPok~qyJAw#?3_T$d*($j z)AJ=9-7C7yNsgkU*d?T*X{3pJ>`r zKcsk(cG!!pv%}NZS)q_-6I^NOl*u5l1IQ%{AOFqL7&XhK%#eC~RTT@U!WIVVr>zA4 z?OB|LcL=5g$%6APzJ~yJ{=z=CRAwLB$v#%NxR0?N$U;=yH5EJ9zP8w%YPs_bjQ1x! z)GL#U3hX46#jV~5Sw>>@Qxb zv@_nJk48u7Bf8i>aM!wQ>M)3L{fm~Hc6W5Bfc<+VjF+~h8GiPDO9se>{x9JaX7}+5VXy_)~ub&$RdY0mD@c0olgKNRs=ObEbXwb z_`>}9>9`lqXO&N};8Ce@6@-^62jp0?xH*KSvw?+542)WViO>Wi4(2hr#4V!HSkUf% zA^Gy?jaKN!?%9oE(D0pC5_eAfAtz>f{ za=DZ0p_^|2Ku~lWcPMVHS}hjeY=Wb@6su;0f63ewplHG;{r53`s4Y1hT*Lph!hm@r z$ln8B$(uvwcc4~lrq*@WNEkVQqKl}Z)%Hajyni-iux#yw6*hn*#M@BbN%uDRz(%At z+@(cma0JcphoBLE1BP1#&l1K$3#@#)=;^r@iYwZv?`F;2)!oWl>9oN-@2Ti*P*AA7 zkqwokfIPt(xjTNFH=2VDGg(x)d*sD+ITW#gUE_M54m&T_Eu+rDM=!lpLNyy5ury}p z645!A;4>)4955?-kbv$UCCkDg0qO_6vB{&x?t}PR-LPInONeAWskFH-tG71*sSXv% z8;yLb2-l|wjhcp3pf>xVGu2C}N8~BXb9qclwiN9rF2sq$%Xgt#PIhCV3j=|;x7yD# z$PKL>vw^_f;2lq1)>Cz%VKyX5f>)6@az?1U++R3w)3wLomZqpKZW6_}^Elp1BMt@#=EAbq(Eq%A0!(K-^ zBK@0}R|u3n6=!10vmot^kUL5cK&S8`6G_|ItaG6enk-;X4VC@0p*X(COl5Zqd!=P? zQwwK~GS6fO!GNME)g|zf=T8EerTQ8ZL0bzI?|8|+H<=Gw zNa$5#&?(YSj-ZE2sM8?r?PvmZqWA4HJ6P0K1(_v9n{v7l1!1Oq8Ykwm6D@GN*KHqC3m-W9jIxM~>v6lR=%_$e@PUL3k(| z7B7!y_de1#*f4dFtfOZ2w#JNfEnPbvgI=XQ;BI=>%`1gdH9xJx9xsXlNkcgJb6^AqT8VVM0&kU?N)COlp^A)Vz=HiMQ#lT>Ra%?)wQWahl_tb_i@_4Ks$ zIr}p&u^#8$tb~VPJ0!l_AF#dlmX{3lgA|{t(`uNCJk#kzZMNPUuxXga(w0AdwolJx zpC(q@?<<4+xQ~*4n#V7!f3aTynvx5UdO~P^wf$@KJscPVTEDwX3%b`OD##H)UaJJc z+wwNNaWd`OJ*opdVm(2JO{%>o) z|EOJB;dW^S?E*W7#Sg?@CBvvm@^vOUH&u~ck-<$?NUa*7Vn|d6Rw;movfC^ z<6F2BvJe-3&Gqvf5JqkhuDX7e4U;{A=0mv(p-=1*kMEbZCW?+gePv0P#8;pjKlBUH z7xyWefvf+Jf|vO!+R%$&a5ShXKCDS6S`(`?3XQEU!|V9^Md*56B3)v};sdWw zqowcvwrY87Wu3_~QbIYj`pr1}NPpD|M*ap|t(=_^o2O^QCaJWMoh)$3hh}n}2HwG^ z8^~1Bdz`Tw!)+Xwq-y90yQ#Rj@UJuHb-Dv!nf`*`sx5o=($3AI4=nKjjBWZW`ast9 zPXJv&qQ5O*Jh~S29UInFSZW@5ie8N&;>cG09?AkXKAW<=QMiM6$`Y?grV^HVo!5|8 z${ys5v=`z3l;|_ug-Q%P+9A4V^a#|lc(tlINRp5T@?7s_L>1Xrh6raN6{S_YgCO#9 zDq zem(YiX(DM_@BQ`3#m@Of*uJ<}eLy&y&`M4}iBmJkj%?%)XDVXr9fhy6!RZZ=(MTTM z0?J|v?WJ)dnKJ*^87foM7j|h78{rw3&45Qiq!Vc79qsu7&tTT;-;Mxoq$gnJnm`E* z7A+K~f2FkEb}-3tO;R3;@I6It zfu>E|^qOy@%q+f9N}|)3tkRxlJdQw8XS;L^30L2f41v-5bmTzH@w+O|(kiv0h>?T0 z1?y{ou=VCLE#C2T1#vjfY@!(p8y2_jt7S?A=Rvc-U1TU|#lyS-6YQTo?;1#AmNr%c zoQTb=WHicb4C=ExpzoRxfh264|8nw|M&JMvvQ2iqYc3*{u1s{Vs5UppQpfL0h z??0a(SVMPw1>M}*K}{EobL#sTjM=>oZsTL-{e^99a|V4HaOZ{m2#X4f6L*l=b6xS( z6QyG*D(KP(o>0IpSSUX*f=R6~cBmp}u9XH$TZX7aEB)Ubqmv&UqfQ7QlHV^4rb+x@ zs#^rK4x*7xNOX}LnVzNrUL4D@a3v8r83zNO-tD_h_0)mL;f5CDUB*FV;XWPCULz7h z^`Z`qq#=?vuT>#kF)kFc06La_1&|Gc#g!;^CIo@rDXDTEXB^OCrIh8vI$-^c?O+s5 zR3-SeF05o4yf?_i#(ahjalKe?5aeCx&lIp{UO~k~o~Np&Cza5-6`mDmbsx0PA?x@y zGJ-(%BKN|ceh1(n-8oDNk*#g%8}0w^@4zTpoMmRufWOwBuS3T#z0_E$ssij3gf*Ln zJy{*#-*$F_!xY&qOr_9M8@YL^^XQXDd9oMtB-`*rMQX4rMn2i zqNZt8o+GK1M3XZ$^9KqUkPHPQsnM>4I1j2pAl|K=r&Mz%H z!mf8@ajAB)g@8*iA!j*T6s9T4CmqI74VW8)3C07iA^1wa8_+5abEJ0I`*>{n6)X3Q zCSvV+oBt9X`wet-mJ))6$1AZW2Rg+q*Ep`jxn5=}r}stRtnpuiv)(LMgu4Z-GFXqi zCxTkJOM8CqG_#zLnQwJ`Gryi3tD^}_%?dmqj2}@aTk{~IRGL?XwSSJwOlXnlb zqyrWVrN}si9;yRWhQ++7&vW8DsaaKVs!nnajHRRWU?u~mPF{^yk=G|O@S)JuakKvY z@l8$18~mnzp^+rGL@t9IoV1v^j27^?#jAQMy9q1etTvLxjju`~!1_7*(zDN7-fHZG zbF@UzKQoeQl@km;X z1ew>32P~118N^R=w&}n=>L0}E6oa9o27;kawg3D>VDd~3DwN=KoUP!b%25?~eLW8{ zbjUbygydRdIVU~KR(#=mPX{;=vVx&=#1&Gb#og`e6dtJ=umg7JwFnacTk|BGw3*pU zmZd6<>oG>OGr`fn&Me2@Nj&4s7UI?$DI>Y;Q7Uk1s)b~0DyAKur%SF5ckCpFc$Gvq zReP@tnXDIblz<(x;lsUK=^yOK-6Pz+H+T0IFoK%$T@Suae%0FAF`hkIyBKjuMc1-N z$wcs>R}T+cozsUOsK}!>8^Y1UhQNaHt?P2(&m45_e~*LiY^!a+O*H1bpH`#Kj#%%B z(XV4Q`iyJ24`WD%y;;HHrv;c2UUda0TqZ@0!q$!_CtRYfOD+qaz{oucUVGcLysz3M zugU6B4p3=&i*+zDm*X}wX?0Pwmj)_(a>EW(+rBP?aoH6Tac7H|g`*PoC`BDO970}! zV6X%;bmziApYXqqK$8-wfUI|1dn9L{;t%fhSBbV@c}=DpI@8=o-XChTyYTjK?*5^T z)=zs|MFn%GP8#Gf?dG$AqpnTqz=A_V`P^xgZDK>b@dkWE$q-S`rN||#_lmE- zZRK(yMJfH9wc3B9AE-Jr1bq$ElIyA0x`g*{5UB8bE!NBef8T8p(AM2;!lR33xx-?p zu9eJwRE5Qbp%C{ze>}ACs^i&!fG}WB6{91f?|e8SGU%I^`R;5)6n|_)6fh!QvKSHT zKN=CV17JjC?Q7Iv9UT!_-d_oVhz^P4CqrU!HY64p5;JuLxsTx-_j$q-vB zsgH+TV5~RP%^$gz-@|N2mXjAo}j7LG=Hyqh}Y7%~vf-JMmwQ ze13>cUVR6ftp3B;q#PjkO{nk)c5#hM4n4G5siz?^z;KLS-T%}=h zZHy@AwP8vkXhaRR6_YTP#4?qicb0>enJfU&4ZT;Ie7dB?M5@2W1^}W=iDv^1^`;xMVLburb7WT0SuK`-tq_wH=fkdaO}Y zpB$hCtL9_JSYwjryOcxA&I^uF6tmoY`|NF2y}xHmz3;5{k|NjRY<3PU&m^;&->KkZ zH~83*TFck=u6c7RhIE=ryST5Ln6I0D@#|*h>y~Fl6Ob8U?gcJF8xMRkm5#pce?6ORJ*^{ zT$?i$=dfCABzXc^Yz0XVOti_A>w8sihY4j^yw2m!4OC(VdllTZ6b%xVY3iYwaNBZX zo0*KPKBc8BUv*1At!1UDTl#Ukv4fRhbM2>4do2xYhSAwi)W`11yUrvkMYs5#fO z6NP<CIUZXAX`yclJiGtLC2EY|m3+G!~Clv+4X z;2+H3ZN)6edT5(u!In3MSZ6KWmhQ;WS5(V-G!A{vDyxF8u40kpEZgX9*0f49$HNG;4%EGWJgDF|VF(JEka&eFeY=ni)f#lgjH7D8iV3!TbMON*Lv zrTK|TW*-o^GuT%UsqDx4wbm!El7zM`(FJmY)1m*O?B_2UoxP~B-9==PXBo$TPZ2WG z6IC&9(sHalebs?k>C7$CxdJcH7N)NQKMN01-f54aHK~@u+Q>tk(+zgYCnaYTb4VH_ zdvm^2P7yDA@=H#!K}n?AlV1uPuEH-m`9MLPM(>2f`QlZr;|>h!mn z<_MI_^^2)RPO-QOs|RAtHBE!`@?b8`R6lg(jZgnBoz_Ta>6k_1ZY43;6G0nfc;%lx=33S@ zb3Hr|%i>um@B!ap_Y9PMHN&CawrVy63Qv&zz`PT+>ldPvZ>24p@juVJ zY*qE`g0WirCBDecG&lQ9uWEwlNOD#6tC8JjrTRYPK^y};j_v?hwf5gQA$YHQym*uc zwQT}m#Ajg~_4okrSdtBO%&s#iz%9RA@Od$>mm?4!M%WpfrXNNH1F7NI5n>J#5)sC$ zO)Um0Ni<0}t4)xWY4APUPL1vHY`L>?_naY5GCD_`A&X~ zYgjz~AncWGKVEafYuvl#<8xJWAd?)`DTwx`Mc8zY?7N)U-Zkk(in!P=gwl)4TbYqjmV8$-g4pwXX|5qGFe3J z;;Z8~G>rHZIhHjy7{S;ee`%}8a9PPrI}XC$Zz{pWJO0GP+l3av{l9SDP4X2!b{~Ry z2kDr;J^jMOt45jl!&TJ(V@lsp!pDK42?ekD%MtcUeRMPdnq-j|GiU8-ZFoz_S2kIY zmGTEcA`i@DZV~@xz;@{XD8}3P7?j;(YvZ(Bg7h;AL2uFN8ZLFBNR=^v6}JEsSo&`t zBD!SL>VLDf`kg@^8hcgRBBz%pYnCT#&P-M|U8b0Tpbssp?f|6ZS5tV zx@GCc{2jBlfR5UptR7(cpPQ=Ih^N5b-4$U=PSpP7(GvS54n-3`e?0k}g0s^~NKqqF z+G)WGlD+X-fD?Z-7cqF4f%w1%Pvy)OY6-Q@DI%_TTvm}bL-JDsHHV6ux8jJh@Mk7d zPLaK=gU+s{irihDYq3*lfnLi;{@Ds$z=%ik_u{{2iFRHCxs3^fXVy${u7@fmcC7pU z$1-FX1DqIpIg_Em?_V7_guy|}n-l`k({w`lVdK(XvwVf2*;KG&Kx}Gk z?<*$!-FeKfe%x$}v)D{+b}HM4EDhLFZrVOpztz8??_ybv`T1&8B^IecTE1Zs?y~Uq z7iH^Ofbj6Tg;Hr*F0WD!?Mxo0Yx9ni51b^#FUaa-S#sbKu%w@Z-W@U1qCtDnopoW} zx)f4x8v92ZN#FDCw@<16=>B)QsAQOJ%ACwe5pjFYKd?2HZQ8mLwrpJ_pUis9Ry#2e zXP;+w5FqFIMdcK6){^!;CHV_@gb2f@sKwpQ!i$n~uRPJf9Swv#)}_8sTuE@W5{Mdz zK3j_u?)W!I+LShthkX~sw#TdR%i#gc+m?7}>mt7@$2U&cr|)h86tUKOI006 zjVZHmpVy7f!Rbv{jyV&l+zI8@!X<34Z_bIc17mwPL7r=?mCv7z0MU;do5v=A1aEAg zYtlMJ_r#q>R_+OqSc$w!(k_c;Ia>Em{c*E++Oh1%oh@!p27X7v_f`!p5 zR)XOXY}S4mbxXhF9;b-qr5R0EIbG&l+^mG$Oyuz0>N*lz?N`ROtQ_P~9NbN`V-hSSdjoRp`XLyNHIp5~87pBUm};0Wpnv^puqA9B z5jsK%b#FgL9%U~|M`(%F;Z~w0*zZsP<+Wpr02|#8T&viDXGoG>ST5yjda-obE+CPJ zagEhXmMHvR@Sl@w!Jk5fVHi%2K_sx?(;6=Dc?td!P61|`?kG(MG5`P0rYn81=`Q}q zu!#0_RUsrGYqO3uC`yA zXSwUj7fajlsc=fTKA)_fL_$_YUO}epnga&TT4JounnL@r3`@Pg{z@~Y&+dYz%L~15 z^yv#Pw!QvB+k2PWo(Je`@=0@7DQ5ziEzzphK53iZ7+AA!Jwk*3yU)zdp80Moj_vsN zF=fst8o?xh88-ji3&Br&`BtNNv2EXoedK%*X)xd3-!@iQ|Mf61{PtwUf-?1hu*s&(o$l* zD|4_Vu*%u`xMIuFulsMIjAw-&suZOA7+8k*p84tbKt9sb>!AwRp&7Pjk<7bcm{XSa zyfCLw$U)qAWgCy{)GTBnjR1M3O=rejr4vTnN4tZdZOOaVf`2H(-u#<)ev$z&?6D5_VCU z9GGv+{lLp|GsBD@opj=d&=J{^tA`_=${#sC;Hlg@Z}Q;K39I8RXmA2=*046Yh$dNd zX(Z`FMhZ^V*gW9g?ml#H!_rCZ_j@M|hfy_wq1y0W=}Uc-SP%;cr)RQ}qtT{EZGa7Y zX!kkj-hM?Im2iE4aGQEz5mg zl)@SWf}6D19YnWmYy8^vlSdp3Gl zlpIP$7#$qsDO4eH8c`*PSVjvZ)OGk} zspOYcs6Ksp1t+;|BgthRki(Pc$I>7NRTCD@j62O4P#}ZesNzwYHf*nMSx(e3gp;Ehr7PiI_1PaOq-Vq*9NMkd_@lso z6!8bM^7S&NfRRR$yvQ@#v_zJ0b|~fR+6~m1`EAJa`lE}YbYm_yjWIA#`D^5o2zj4Y zK}skba0;f@o0Cpfe0kto?xWr}`>4)u57syo-r}4#4TJHHuegjaOir zXyZ5Ae`B2tYyXWeG5yV_q1dBe4g<0?ABczDpNI?S1Wj-h^|ptKX={B8d<)%Ej(q6{ zog7*Swm?@F@+puw4l4Nv;P0Hgb=iua zWl$p;aAA!#pM@F^h&CLbBR+5b|C+IlS&7opylZsv-bQbQ{C51dW*_TBV~`f)5tw{3 zQ3>@N6^esuKPkFgiRf$c@2tk*&_tzf7$(Edmy$+<=JE6?sFucpnB$O+%dY1J(cSr^ z@MY+{-wS;(a}VC30cTQ;qFX|}*o|9+x^WYxiwV<n{QyHgeKXg+P9}S^fbQKvznjiTGm=JyVFohJaOp85N<1J#6SBV$`^(#9?=xF8j`my3sV z<>G1|s?f0KhN@KW`XlP&Ds`pMOI7mUE=-g#zRCb;foYU$^&W2Enfj!*^IpjQN#2L- zpG&o6VBZSXg;EMP=I5YprP2)Sy~CyL+^bKVgK^W#U*7th`pU(Bg(8P|P@4 zR{wCEG(Y&vVDTBc9mHe&7f^w+{N&8&`K;+f10`Sofu_fcP1EP4>2qlzBy%G- zPB-Py_~}s7k5#zkH?b{0y!qG6&=0qlZa*>^Yu(^*@kf)ffUzI~NOG}c+S%WAraIVl z_BVg9>u^ZCGDJ-B>X_v`ILQo@Ss(PWa&Y4Jo=|7g`n^^XsB5}A6WiU%t3T}S_ID;) z0>W2~;-?d>myvGpTYMR6@#)QfcApQmbvvf1SFuf{>vZV>!VYPai3oNOP^lVe4Fr`_m#lF zOIYeJ8F)^JRB;t!`SjGu3KsxmUZk1d9p#$@xC*s4y zqZ4>|Y2e`#+u{slWq5cAcz9Yl9Pu6LRCIGBg^>4s2%oz%%4r;ko9VML)f)G?-Qgg_#rOt3y-1%FO}R2zhRo^E zDzdiAVop!cbMCs&ESLLKNixBXFv9X9j-hx+%k@>i;@@9~;;FXFZ{J$pqfUs84i`8K zybvq(fg2*?wwVoFzp}zH(`hH2)1gTc(9TRQ+#z%DuB}VE=L@FO8_8T*m$s9I{^El1 zkxeFM|Fx_fFCTlXA|^CuoYfuXquyVULRK+Dp7{)2|jL>jvD za}CYX!a+MPag_U7LqnFhy=3=<-d36cL=c!+dZ<r;67Xcs5uUj^9TXPFTj;d+gN+!BvzMP6XKY~yjk-4j?V~eXb6LHY{%N$LV z|Mo_@_=lRV5NW!J`nk62GW-|_s!9vTzS^;PIYYi1H0?ZZy z$j=XI-iWw7?d4*Px4dt;2TzB|m=e`t<<)`k-_7qqbYlr8ddBkokB4Y%JJY@rgY z))v#VT-n|FpLdhn+onbJZD}Mb?JQ9e*U-ma<;NDXpKPQ9$HDoHwEuo1aS2vuZ`QDI zBl(#K^-aOF7hR8SqHOVl1H!3m(RhUi%<{W*YKV6ZPp|*0(15RWMHCG<{%g^IT%_^3 zKi7D#k&Pw&owj@B@ta1|rN7;DlmB0^fUmSw1PeI+9azARx5<~b-Djv+NRwp0Gkl(T zkH|8US8xBsE(tOgZ9lV1KKGQ)U4gVW>MuuO2qm~C2lWBICawA^Zm~_pF1G8NKUr*7 ze;3C66hXN2-|6rt1}*XiJ52nm0M_QuHPJvK%nXe6opl1?ON}EIiuJ$tT=-)P$YW&x zDSl@>J@Woj!~*h12OF8MG_tQgM_b#M?WRTSRL=e&+S>lParzKhyUX8cdL{|9%9zTR zk;TnFh*JE_7C(yGlIicv-4Sfb^kOey3F?XqBvKmG7=-yZ<`GeyAdA z+V(pWYluVP))>`^?*mxh!0biVzG~_I^$#9Yex?~`DuS-&zcc9gS?eVq1Fz16{>6GU z+DN`Tj|f8ik1b*3F8GlR6`@fK0F8m){_&>Pt zzZ5Qvy-372H=bi=*lKATs!eaf zDPH#7ZxVC^=p^eCbgP!O&sq5TTp9x;;l#jKuBSTezg>qQFd%)IB&_c~-~?}?GjSxL z_LRrFym8DnMT&fuwzG%J2PaWJ7;vherBlAJI`lr-tV7?rzc7wC?ZLh>`ea|+6+#s% z+doht5uq3iT?yzPV=mPu!$^3_RWVWdk-B{aDkxyjM&R7mPKsjT`n2)pD-rN+A@GP2 zUortXZGXEXOj%`Y`VpG_=G0OS=1KaprL6C)&$jvC^;7#qBj7n`%&faighB^5CH8 zrnpDXzC00&HO}3?cfx$VLH4X5xYQ;6*FXJR!ZgiIdns* zSpJIEv1oIhraB6xMA{9xRh@G^$d09-$I18xB`4?ym~lK2uy7TKCoSDe;z`A*VXDiz zn61R=D3wocT!#de`U(o$lsGHD^FeB>Haw_^bW$=@2zeEbI@TM_>sd&T$(Me0)`jN)#!R)MC%{f4?7qDzZqC zvLrj5%)CBxzO+@W6@>y&018+N7pt>C@e`hiiUQ3sP{RdMps$co15?V$rcxyqarH3d z(8v!X^Mj}xkaAO7?28F;mP1^HAqvvfhZ|dp3PXT=Xeg?$V<@6VvZ>U`PBd8+S_Tdf zfHi6-Dh+9~z_7=yM0V6lv@!@yDVR6faqRD4F)9psoDIwoNfsm9Y`s7fnhh;Rm0`qU zf{g*nl-EJlUjbSQk*P>WO=Vr2GWvdfGCU)*Z*PjfX|=?ucBY~kHFgvnZNAkoHw z1IS`i2ax$D=8#3&b?ryJ!QoIq`&$UXwcg-F+6HfM^67YW3W+#Dt-s_!c!c~k732Cp zX-E#fw#No02wn=wu@3aGZ4i=U@$*9O`R{P}Vi4XTxYl}z6KNZ~#L0iRs2oq5tHf*6 zGmrKB#X!4&L;(VK*aQ=?E%~k<0cbZNgnzmtAfGh#&piPr>NYGO(g$$@NQKa>y~m?i zKTYgvA5&DF6?^1G!|A><84)Iyd%++Eyq8G?r=N2B5nK+0Sw3~0AO3LH!Wc-&w{WtN zZ(&jwfpcN@zr(pOwnp+UoNVM>nAAn!UO4=dUn4u4n7D_>KdBJpM}?rrO^B!85Ca(H zf4Fe{axA5)L|BTo3365yF@#a^uMkE7WM&Nz;p!WOFp9JdLKu~QIIiWsmt0*|B6798 z3F?&;hAxGwh34Qj#{HfcocNySZYXwnelA}u!6qQ0b4=8uXs z#6e*q+rDXSp{ z9LjHdGGD+s_eVtz3NRu{-|Cw{ksOJ5?4ZXVelRO9#tPjiE6i_l65UAbp!|OkR3=fV z6gPp&BoaI5CzeKkIs@!VZTWw3@SuSGN0pl8O|Z_61P`kI{~>r#a0`zqGqW3A;bXyr z2Ce_H;6Z;W>;6*K{iUq?DU@{y?&Ocn=SCx9A_JDfKO^QNyf~(KOlX^|Y8h267E~Fq zO!KBJyR#~*AG~Ae>@IU8Yh9R@JR^T{jXUFO?;*eprs!+QT5r_k%mfEiugk+GRfSk0 zJgp&SmZg-TyyQ&$Y${9NPsH!1OP_DV&$mmTJK|?!>GM^zb?dq?YQ#XN4itCrpSYB< z-QYgoxQaaSb@=fy>o9k6VEA)Cc&4a*(t_s{pPFH5D@2U)THPFlP*i)>wVIq@3?Gt( zY^AuPN}+*ar$)f7RZHn`o~}Vy?90d-2Tuuew5z^SRM@~E zF)AHCuncrg>(0~=T-mJf21)qS<57MzS-YN3*bIU6s{9d@dRb6-vG!r1gjF6wO8qfU zlo9^^RA7?G8A^0Gsg|s^)kttsMz1wl{WuGs*1WgwRX!p0I_Cxgp?V!WRByHG!oX@c ze>GfJC3uUZo|hFql=e~RucU~J4gQ>{Vc++{?0LHLOiOOrN=@OgMPRFKOQH8P0C>CD z3?>CsUX>qDI9bvz0kh@%dNUwnr#U2wC;@lbOgcEJAicCod8%(^^;qRGjsPMo77)M| zA$}ukL3ni{8^0Gv%@7p)WDcs>`N@C>2v=nFBjS;KGGb3Hst*|Ko`PTE%BX zNX!5WnPJm1#tv(=j1s*Xy2yrkUN7i*m6kLtAdT(Iqj=w#P^d7Z{rvi7m> zsWHAdxp;CC=5jx#r}C_`)X%y5bU*vbQa|?|J7v6|506jxGg_XHv$U?oR_hvjs&Jlx zbkCmdXT01`&5y&!x_Yvo`{jQ2eN`alzyC<(QN&7c>g-Qe;wYR_VBi3tyx_( zcxM_t36|&eCUos6K2so7^7vmJB8{~0)i~a^M|49k(`EUzQiaGEYP(3;YtC}?-;+VD zf%@oA!y>BGj_&Edr|-zH{5#f~V8;1JC5tcKkIXUEAz`FUb$qKD9*Cy7KA6$qi1nz#{G{C=A}nJZY_JD`D2!*3fEE?W{%u7TDDk&r+7F^j#GA zsL=id;#yvD9-GTGYjcG}Kq##K4zJ6rOnQRLlKfDEr_b`e@=*lxfPh?JtNAmQs@0h+ z*#Q|Fo({`KmPG9~)-`Fo3p|z|pD$~J^ohEc)8Pp1ib(GlY!--%r9q2uk!imz6qHXL z)PUUNk0KJS-$!xr;FO>hmclxomCP1Jfz@QS%DT9fWjT+#i`7sm2h-m_$5kWwpFYwZy-e)# zWX!@U^eFgQl@&wS9$i*H-XMVMtn}W*XWrL02^;md^?hRQ17r=)!wd#XVIqQh-L6h643= zm8T$?r{)6xi`T_GUV%@BSfn;^mrksERDw?NEVjpFSDd0ly{%GJ`J_s*$?+yr8^Ju~ z4!X??6=0F{t?8=^27`dJDRQgKPA6V9O~k*Bg*W3*I4>Eh))dq`e8L}d)GiLxp^srV z&gg#F_i+MOb+3tL(uR8!CGCo=ol-C30xU;GjiJ_jv^1=UlETg0V$_and1q=kKM!}H z4c6yBQVoEgUj|kGKGNYImr$|RGyhl`hSa8C%ri>B~ z3`YXz{s5)VbBZf+MBh-W%CE*#43i<7N}j9@r=KwEm*UaAeLSG>A@@oZBPghOg^u|H z9U9rg&@vht$*4)K&!cqo*|DpWUW$kX8)493)gcB83y`kj!h?fV#+eyKabos16C=iS zB9g|$IptN>IZ#(HEm{wnxHrRV0ZWE98Ljb@Ur&zVNApH(&JC203=R)0B-SH4TfEvM z`We}pO|B|I`9MMK&=e1mtCst%gwL&EW9b8WeN2?{eluQv%DB`_c~T{IBDZ=j>lvb; zggQ^oh+x;`k9fNokPT7XObselSqEm8z&#|5VX%9SVzZWP+kg>a=XbI!yJ&0ECalqY zwng3+^) zRRgMOV72NXf^VHb-u6Wa#RAHs5vcv%#g5@-WDCPn3)u&?U1o4U_uvMSTR&)VG| zq+0%Ywi-%g9~Y$g4B8|dkA^K|Cp5e2m|W)+#?~}u0s0i~X1=>}GvAdlTG{Pmp}8a# zwm_7alg!NHT#>~A7sbS9+2E9;kb*<9GbuDNNRT>XMxBP9AECp!!bfxg(V94RmQnQ8 zqn8x9HBeFg-M4UblNp4HC0d{3HpSUg%P2M>vSgJZUR+N_Fw3_?JhG~7hIi)PC zb6%nIXUD!;6l6?cN3tG0;4B_zy>cpfnu;GAtVc6p$2=Pw3zAW& zMTH%FH`aCl#cEk$v|zwUA^&_!%b@c$jD5VL1ZbRISh3GKUOI*<9aKB^wL{b5GzFxH za%^tbV5hJcknUvpnmj|E0MZltb%L{*#lCiFHq*52!lpjnIIb44w(X1|Yd)JMfa2O( zXPzvj@MEmEPlVTuF#0j5QSR0m1RR59vMN8kM+n@b%sB~UPF|ZOts62mOd7gg$gM|Qk!&A{ z1Z~!5HBDq0Gi5NM{zoK^_Zhdcm{BcP$Ed2>wIFahWXh`#MBNU=Lxcg|i|nhI%)TDV zS|V#&)I-@6qu#0Hbb4ctqVhEh%~n(x6*nfMm<$U$h2-6hHANTL)&iNpNiO7o-~$A6 zJAW=u>_2J(PvkRyA+Cti0@ete-x}g7F7VQOk+W4g8>CMNSSECcu?ujn$D6Xuf+Dvp zlr1qb<*8?Jm>q#k<_qA}L30LEKtZjHiZSu3K~ZEEw9dh4%E7I_5WmQWZ z7b8;JphErwi%Fm!*9Pi-w9>4iQRGlKQZ@@t>Y=VbtN0jC_oRZV@e_Kf0{(QZfl@yU zb`Pe0Tp?{WP`8hyo`Q>WwH4mIhG;lI7tr4L^e0fMny6CM;C>GQDrK3pk^2gsT}RnQ# zVZ^UH>yl!yj4$yNTbCdYe29;{uaLuyBHa8nStAQUGgLed_Z7O!j_KH!#zc78YXl^N zR)gwafG^WXi^7-G38AtQ;CMP}kneJ!L#dzi(Bp^XtF}rA76_WuVVHpT({U^(r0F;l2`IKx-(HHF%bAx^EGi%#Kpn zq^d0j>kY841SXpjk?&`7)hNZkTAQJQsIE?q))5@;Rd5qv`^xM3d0Gc&ZlXBrs5dy` zJ|)40CnB09Fi<&}xsa43(+T1It}z}w6$_Xxn`RQP1=kmtj|@64xM$C(?)^#Ntxd99 z&1nkz(FgjYJ~BUpQ6G=hoy@iXR#0Z&29Ib0wVS7+2r7^HgZPsXUgfn%p6~W#OsOj_ zY~eRF{RradBYzMh6ayViEDgMmi|ADWx_Q+?GrIZ?ND#o?Dnv-q6#?f-E&qjlG*q~` zj09-e$VVojxe8x`Lm}!~m(SW-4vQdlf5DN>rWqy^h0hn(PVCX8{wZ*(p>13dv(SF%fqJmT+3gV|BO z1HT!0)Sz}rd4i89F8Q1&b&72G!|*p;`?`1;SH)^nEG{TgnzW#SMhof}Z~?aiwny+A z=XNT$CMs8JP6L~EH8wlUPN2@#S2(Lh}EcATu`JmX+b{Qp$glf zD%+t7-yxt_Ohs8|-)fO>OhK6^rR+s6-wcF-fjT@!{CxE21p(xt!|%&DU+(&S(woHG)%2B9=8IAz(&}V4M=V4jpeprPK~|Az7yYK z!)yTg9#5B2p+Cff0nj5-{`^xu67UCj?11IRnxnmAak9WiVdx&9oo7^aq0n)2;MBDLU!7QWTgV(#?N zH2N;8JQeKoxv9|ew4jBibrf^*6O*rj!cCCb3?}T!e z^J$b^Y$TTUW0my~;IQsn(nlV#x1i_n6@9DEg*NRM@2Zr%1d|uz(@%>RKO`4>8x@-` z(aC1TaMegC9wpZ{5=;Back5%b;?a7=E0E%B2`N~ccJdCrU{@(i6GvdCmou&!ffw#+ zU2nyMANF}54A2lNxg!>&;1oojBL2!LfU-3v2j`Ff;%+`r=+qqT@3#daon4ZTlDaU33e5m+or+*Q(gN6 zMfP&yOixiToH(texJqM{0*{!HfLEqNqJ1whqEPr00DcagR^o_c=L&?xPhq~x@^Nw8 z3WY=n9wh=91|KOxYDG5h)sSVaWJj6U2v3(sxXI%JuAst$5@bHik2lQ)NSaSTa;udR zD2VMwDF5RTIs?R&R|jVat{Hiii>A7){@yRda}|{HOBfA3vAnQjCy$mfrR=s2yk z1GFDGKme%U>-$X3hU@1sj&5ujEh~x~H|QP^2F`IdJ~=n+axkO4F1OOo&cnDxy8>%y zCkM_U%D=QX>}8V}`KA1HB2o4HQN-YS4-@snuH- zWl{^Ll{jKLld7&}Qgg;31142m2ehn}e6JJr;2F7R!0aC8QfjgJoYAm@~ULjvAU&ZI&jBcNA|UyW5v7#qp! z?u6Pnfk=tT-iK#mg68>2_^Q}irQ?i%wiY4{gdEjWu1ZwTDHXEa+B6-!b~$Ay>hWua@{o7zC4iZ~8-WX?ZMaK@c>*HF_cn=DsP+_^}bp_#%DA zxou}0?nGiN&*(B9CgD4%;qhRFX#wYaK06{$7#2DTpeF;Vqf+lv$jE1vztc zQ=_Z(>^Q{3>Ph$(z-|CPg(LWYJV<>%sW-zN@lOMd)M{iDPCe!7z8XzhECySHXD(6e z&2mH@LQ}wvtRBnT0sHQ|qIsE4=GAyYUN1B9?g{`rX8^`faYxywB)!-o-1`-I3IgwU zb)cB>u!7f{qP{+NG-1nI*&1$f4b3o%hD*!5pODGtF}BPcvD#aBZ*+!K8LgIAa7)%> zi30qSHL>HV!De2AP9wnfUB09WunnWG=(74jei5j@Ai6xYG$ur0L~6@wz1;L6cmj(! z8n_AvYk{X}o1)E(>|ex({Z{=r(DAfryR#!L zOj!p`R8A4t(!Pknqn1L#7A8Cb^D6Ghl?@D?vy)a*AoaK&IP67ObW9}-9)2|?D){LY zt_g?x(k(Kut65ZFqySe=gI0G2aZ>Ptpl&9tA@lkmm?iLLcM2!t3=Efs-0GTIB3Ln? zC`zOiQH$M(=~hbY$fNzYti-e?uG4x6waN2>f(tX0uk1&R37%hy3BF2*PU?a}f`cPj z>wD%=udT8Cem%1MfwF4-*=BV8CmSz6OEIXb#~7ER^+Xbb)l=V(?%a$)0Y!oHAPn$> z!i;vhxvvQnP7Uf`iPd#kyB>7XFY$0HTqTv7++%nyIj{0q>r2bO!P{IQRqj6uTRA%# zPyi%SfJ|#@;=WFwpGhGyE!@v=TZi}SLSj)toL}Zy{D2TPo7 zvcx0isxc$^!VeOyIPg<$+nttD1cEBtYj~h^J)BIfIUIOVgT61 zCV)L*=EVg8cJ>njHeCS{Xn#zyvg|X5@?wFk6Xm(W)8jzES>_-Ak#s%TCZ4#Z+2e$R zp4;Kcwc(Mm2>%-S&V(l2;baZSvsQ55ATwXF`9Se4&+<7X&TQ2lQw0y`HRt_3Mk*lv zUY)`cT_igKu;6f_a?g4cE|GRCerX9&@StG^o#>QqA$_0!@fhH^a#{0ETqG&N{8{q>NiZ&z*?ROIjR z@h-L>k2xuyKpd$bwZ3$5-b}Xue2-kED`irSlUf9wtM?nAGpU2B6P6w~=CpKAhH-0E zy5MmuO-*^n6l>vFy1cJ+qdKFkauRCThNmIi?ABTewrGax@rKTKdWsD9*s_z!D`r>= zVV&Is)<-4f=(r^;|#Y`Xw8a5>u$ZaXIwxm&wVm*({GzJN6KxVoKB=Y%$pyFs}d ztmK5WE`xiP-}X|NAU-9*WC5@Z_ zYV=TCdusBbn5?I}AFD4!SuQ{p3UI{U1V=9LjkJwY6udj$Kv%D)LU8>|oB=VOR>XD2 z?*^vJpImTZV4XFxR{Z8V|<$a&>v|V2>sQ+g#N#T{vRgvbDX@6pz~Tnzt}Vo`s*>F-*JQIbg4pr_GzI% z91DbgONmSUSIGj-?5C3Y`6AAd&}TQ2`Xg;aso!e-7^$C6=Xcn_>_$?**ff;-hpoS) z{*9%6@l;&djhNJ*OOg5)f0ESCXZMaGV{Ib!i%kQmzx=aG{hk}M2t2N{M%GH6E06b2 zSOm=PY!O(Ntb6Otf5|vd-&p!iV$~P2_C8(OPILR=uZ#2)lkYJz`A*{|U+zDx4cHX9 z8eKM(>&Rpsde_8>Ow_1ee-{(oC-vr^AiMJ&J`Lu~NZ*tlA~-(lzuH+-@W?&;Qo*M; zJf_GO{Op)(oSjHp`QnjsLoS+Avn5K$&Z~gCiHB#^r--0ubkHxM>_+B~6?l?aqS@I-; z@{yIJI06%!wzqFmAitT*!ZNzepeaZqV@O`n8frv_PG$MpzM*sqXL3XKDN*i;X;NVQ zp-Gmok=Z0)jz^aTPo7d>mWLU54Yj(fyBnL7rNCz0IcAfE8ZEjk4spD{0J3!!T?gk= zz>T2@su!5m`)Z$pR*x{3tjZEHK2{sSxjdpc{Ugj4r4E$GKIsGoRiYO;N(%g`Oyw8D zdy0TOp3(OLCViksZ>`AyFXW7G6^atd2eGy1^0EQm1-f(dOL`uK<$L}UZMo~h#eDDF9!ej7PLn7;CX z=3B&+c?*hsO+DRp@n9kEzH0+v$|41NU#0{rkTF=8@~JRo2c~rNff92MT2Cwxhtq(t ztB*|z@;AKV8PL@aqbqcc8DYu;jOZ-OAhJed@j)19MqAZSVsdazR?lyRAb~Ae`!H3) z6dqkMX?si7+F^PRYCTj2K@Ppv$6~D+M(c!ZB!FQs|L(XEJ`L9(X&=SPhE|qR*7zeJ z%rbO^tkq+QQ9iODN*oS2>A%yj;$%&ejGx>JR)r zMCnC2#?FC z$)VG+_z%Qhqb^32)x%T<4zcQygKzsTvK}R0rkB!{D?CS|ibmFo2Brb5vNVK9u}r#P zoh}CIQpEG3GR0Wpt>eN2yFgya+Q(5&`Hh149m&VC{B(o4DxYPQ(PM)zq}8KcgftWmrcM`k@r(fteBTG9pi%bo1q``au;~m0C5T0zVwp~Ifyv_{ z_645s4HDZF6qGnINsdR!^zfo=V6uB(4Jnun$~O7-UZadK!F6>}Be8p4ql<5K*y8V+ z)hcTbh6Jsb)X0nqy@+I{> z!eY>k(A7D`5C;v6Pa20uy2Ahw`t+c1C8YXkFlogoGCH4=HsOvW6_dKilYZi2I8!4{ zju;&*JJGJlTflE3X!ZC&7nwU*s}lGow<((#@O8D^cupod%I!RxD?;98J`v_XJW;r4 zJ8)aez*Jp@NxMTk`k6b|VgwkNt*OW@4IaHDWWV`0l<&FIgliFj$ z>3dXFqK06i%-)mB(L01pj%zq3%IKlVzuaJoB!)fX$e#1-mPyf+PltJAUmw`bYsB1i zEKJ;_e&U;yM;DaS+zB9Po9`A&2ZF&i&;&D6X!AN_yi|0DjaB;xiiSKzz0Muc6|DuS z82NUZ6M@;QRVAcgBxzX_k%EDB9aI9tBY}bq)MW~W)1KZpSCgqwZt9@!cMUSdo1DkU z6fegJc4|FFruf%)K&FQ37G&ylTQcR;s8QC9PKA&}Eh?pIGeU`Y1@7^)JtY$M7LD@5 z|B53F^3!RK&hXtm7ocur^@4+VqinZR5HL~TueQ>2#5qsoh?}dCbhjE&6)!c@9aSxH-v zO^d`D8Bm4g2HHIZn!7nLf0y$<3ogIlu;j_v}2soCnv~YvhOiHy6d#oLehIx zZq@1217!rGEY;>MMFsW58?5?q^bYAxkrkJ0dYa!Sa#R*(G*#r*RwSK-hPv~m=j+m?lccaN|LXE%`3v>wVraz~fzIvWb zn!&sk^jVGd$!hRB{)wznMpN0p7U(q#;sU(rWs_)^@f@<)P)BoDOGxUd)hTKraJPcG{$qt*#d71h?*Tds|pP6m&xD0(7XXG;~ z>#_q5YzW^vYv|A@7YE8ZRJo=I9O-GT&KlYo?uIv_87o}p#gtN%4_TWi{!Jo&p%+*R za-KnywyKw;f;tV98dYVM(j3FMt!xexQ)lOiNJ?uOTqNT-XhW8!#$$@}snwNP$`QGO zd9Q5VlC?*5FiudesiFQbqV`flH6I-NF*p9HkIHZy9$kl%L?~yT7+3O9JItFp7;cg` zb%f`2gS@FO%bUuUjoIlmb_&4IujC`-Q8qE10cx4>oTx>m7^U5&;MhNAeioXrFCx!V8=m-Z&rUTTkakw2kMbMqH5>(M(N=_Co0r zhYj+};AxX`E7B%Kz8s0Uml~-_o(hqKO4<5mS(DcACY~Krq~lpjG)v&T4OC#+@0a>U z=2V{2+n&;tVlG!_Eiuk=dTyr5471-FVNjgMi_q7w+KT7=C}G0qcmSVavAKosbjim~ z4P2x~cbq9^W3LMC)BBWEW}NIGhde%^Gst4}JWvp5^1u*AD@?p9) zNnZXBk3_c0=+dTs;$Hq738(C!_Z6Rcwy9<2oLzcUf~IE)c^FoC_>1wZ<&Kbo=??jf zLq^Y`(sv^pn@ii+?D5NPEM{n?gEF6y)Uc07X{Ih_EMd#6#T0@`XHthL7tX~Qi`m2+ z(f2!hG~9o&84KA_oPprE6r{4&J`NrVTn!GxTU6F82ijaS1+=@DEF69`jrWD|n`(KDJOn zr+L%n#%`Pi!SAm+YVfdStq(IhNRzHzL(+5hPMx`FYD||0h#$Jn!64=|9HfGxr>|7m z^&Hq05H5dTV_T072nJ{@>tVX*(;`u<8$Q|%x};wpEe3Q&dZ1}v!Hh3J+g_$kj(mX4 z8B!Sdi-Of;qA+xizR9;)HmQow-(>?{-QZ;l)!G*%d+~Y$;k`~l@fez>)={maxk(zn zsn&y#(Gq-%rS7N0%6OVKe1=L}*CQ9AK0Q}bkEOdJ@u`Yww1^NFCr>z9w$QS(! zx>Y}_f#-sJjYtj2z2SmOuqv4-Z}*kr3@^A>%u4}Bh257O)KN08$UIvzh{}}vq|8bl ze4dgVZ}$znGSB>g?`iL85mO&A{$9Ca*C@0;p_Gd(_m-|#^b8|ZD%~rSHCH-~uM{O2 z`G_T&po@erbZsi`G`^}+vWS2Zy+M}(%Vo$`!^xh?0bc~D^+`+^EA<&(NXm^GS3B1k zNdtgnna&>n0RRmRL2U34~K?&>dz{6ARQwl^4`dkRJ%T|D4$% zn=GhFW+#G{goT>M%xTZjY8IJN1~B9flqFodiDFfrt>p(iHcCM_)CMKXhjo_D~4BEkGQuPL=pnZBQbY32la6 zpH81erhg}KP!>chZA=fHETtcj57eR3r{l#1h8zkzR;2h=R$CT^!R2aym<05gV}D+%Qt` zHmNIFBH46g9KKIP#%Tl@FMg;daYM8;=?b`nm)4(ymrrC{jZ9J=E3mB~m=I#t=dJY- zGt!5w*GZtsw~`SvsGUXBEN+3Co4%?qygaz@DNz8f>{j3+C0v%kwfJ%1qLjF+LNsjw zpjHH*28(R~gbHVUFkc&=PT}dXyWiX@({BjKAl>i!2_x2_ft4UFNm?qIlSCRg{!e4b z_jdrtCBoxW?7J1wf`v@4aor0&VwhanCb@qbC*vhi-RFxpY)nM)LE@e@%foT9AzM4=X2QK(2C0fic-;32E+A|ATmgF+QvghG`9d|gIW z_xLOo9UD)Dz5-lq)Wwi~EOrNX06Bx85c2`)YKCTOiA_i1F@gpB;`^O|)0N@8)}(Z7 z&mrzhh+`X3I-!Sv(oLSkFi@eW%*=*5(NF2<7UVX3S+aLewz_n(=O&ZAg7P0r_U3o^ zj37?-9)BXThf|c#W<>U^t;k-akAUnIQ#2*4wvS{lt9<|KXywJOqipJV%v>A5DsQ$n zh81=p-{vXgTlv2hRF6?m71s%im(+!PTO71j>EA+7oq`tl1uvz~1nD|C=vJqKjx7;o z?f|0hVsnV9EQupAkF*O^45EyA#J!_NQSYcDep|Mut&P)1--_v=J5ME#?njbM-#k_Q zM67-BRPCE+X6h$ucf{J}%ci|XXAnw0n40_g*4L8v86C!lgd$g?1viJo)9*93FG8jn zCnsR^WW8L@{g*~>cpM(0_iPLF#^>do*}Sz%_+AgYE6Uo~y}p+p--j_gnESl)BptjOGR8w9-jbg~oy@0h#Q@gi3_qv`U3>xK~86a(N* zl$eWFYog4Ct-y(kLY+OH@QG-b6!?WXHL!3e=$hAoxV@sCevU5r7sx*Hf!EnuS@0#PPL&t) zB}sYV1Szuno4jzc6P!nmWVPq5@~JqITSG93RR)-HmUF|sW9IBf-emLORo(<)fuIBePLw1saPJlN&J zv>7f@r7*lVAa*>mjmr^YTwzdxGo3=Rg5V~e6OsV$+`PEGEhNDKkt=?}Km?q+&s#j? zEArP4p(hgJ)}m2d8XaD~DIBZ3IX;@vu7Mym*Ca@-M1pjc8NXMrWflPoPdj?wwoub_ zc2C}DH|*(t-fL1|F?y^iW1WIWbQO2YC*R#FMbMS$5aSbX{ESrX6E;I~&SL@;NH2q7 zPGxPuqRP>Wcqj$lSD=l4q{!gx9cc|&?gU-0T5Pts1Rw?(6&zMDzB6`wH^3#fT#O6l zlMgWV#!?ksJm#9Aj-3+N1-c+0n3`h&G&HE=}6TSCdEM4zFQdg0Ej1IW!WSxfCDz;XR=` z2)_*;(OK=*&In{jvU+Y!XiI1h?y0Zx8Mzr|)K{5To-=hjhWG05^Q*bhp6H#?VK(dO z_QTZpW{&%VX*+w6_1sRjn-?KpPN>}RhYJQe@C*4y5}Y-+qMm-P0l%=0^X zi9X(Tde!2S9nDN*?m=VU7*l&{o2%8fokai2*ZnEYq1tH|R`z2%UE|x>=}s-f%l_Zd z)E!wyw&Pfio9&vOPk$a5-uPhXt?K9i{vReaFszB;di=i!9mh2e{O#I~b$_sJ+m2&d zM#ncDd)pq2h41R#)~$8VwENGPz2mOi7(k5w9O$+=)?v-wLD%T%Q_J_(-M6q4OMh^t z{^mWz*I?SdwfPc!voqRa(q2cmjAtzRxr^=S_H27(aVE5BTVo3nj%`~{-PzVhwCjww zZED)S;Z7V&f6gIw*T=DVQ_tv+4cp&#$Gf_(dxrny=t(Ekai1JDOZFs%e0?02f%b!b`AYmotV#>gR6I+ zw-sJT_kCky?Ct6kAI{8XX9Wp_-q`}}ISX5-)x^^Mp5u;#KMvZuXKdfp>}=THiV2}8A$Xt+X>>X`qX#4kvZ9LNNT)U8~G|%%hHc&LnoX=}-`to^ zGS<6sqfMwP+cS^Oqi?oDI(cQI)PD0x)+BtpQHT}VOO==Zs?CM=p zx883#v~P}$?OJ(;YZ_}3b=R4!$8M&+X|2ha2D-c65kTstLiMM54yTZ9>waf&?m8XA z^PZFsg?7jVE{*oow7SLy?b>>0G@Y~z+i=$qNQH*3;rWhhY&6xURTVFx?dTZQZL}up z)bpM3l>zz!?5Ec28EKqx^LS3 zD}81tQ{Q)N?50wvm!IFw3rwU`HY(d=uhE&hrvHFF<=Um{nupMLMux2|CZ@a2wQ%hz zyv#a^)na|?p3e2Y!JyG8J-e6ZPoq@GZNHc^e*pI$)J>Oj`4{NtC8koX<$7CcrngmS zcMFyJ28!sm-ZrePJGFuD2dWpt8zXOZdQai|+PyjFt~oY+b7s6`m(Ij+{f86d;iWq5 z8a>lCc*oG|*T8fFIvT_F!GdCrCywh&|B_t8?i%iU)AJ?WlfH#NGg8ylQSXHx_>YX_ zOblDGoX!Z#gI^h`;~KheXe7*sHI|Drl52R5H8WI>fo$w(A@A|S?@recy29TX$#)v2 zH?j1GE8jKkK30g8#pV?6NG#4sw&RX<%X~CcOZPmi7A+F0T=@@{5v@W+e@H#o8B1SY z&8EheSHFF+JC5!7(zk(QdcM*9mY3d0|N3G}QU`iGl)k(g8}{_IWqSUXS6}QumRl60 zH`3=XuN+&o%+Bb`tFOydipib&#v-dX|^sS?J21Z8u1%=^^ z^owWs(@9491$28E=@+JS-eZH%-~sjc)^lwCn?5%@XKZ{kJB}^AS>DXuFR!59YgX?y z)cf*k?>FetHT3{50hZ)~4-KYw}UnO&o;yRYE_t(&&t z3aun*$Mjx<*+-vvMtA3sE&RarR8~k8|Mp}$< zSh@#I{>Vt56Ob=lScoVY>GQ4t5#OB}DNqs4raiT+jChK7aSsmwAC7!u>}4d=H^$PN ze{x`K4SPu%84rip-2vV#GQ2!}R}d|sMWi3v4^ZFDjBqpP_Yw3gy?OIS7>KtEw?~rL z@i>%zF=jwd-uyE_+k=5_cP)cN<=wEGJ+{f=me5|T!favI@RKhezQk6~7mH{fj70lW z%fN}IPhXe7%`w88=yn7pikT$>hX?rJ7q%?aWtv0}^U`8#a%q&@r!(5?W0 z|9F*o#fUAl6w(xIeQX>`I}zjm4uTNpbjT+vp#5QpY#_@VN{p%TLe~GGwBzB;c88-G zTXL|jb>yH)Z^dE6 zL88^7WBefi< zscWz;*jpZAZ1@AG8xp!0jb9qX7@Pj?&UDh%ed92M_fAIoTYL**yVn^Qozbb&Hlv$I za;xdl7wJtZTKu-|M0j8E2}A`Blr>haPN4bFD>jIA83k{AQHCYGVI8|hFOWNb6Y=(M zhPB7gDJaiorE3Fjg1T#34~&vazQc!;Y~7!_x&_0)&5`gdI`+ghW(2)Al3^X7NPK|x zep{}1?drB?;tfQo?FXf?CUZRicb6KVFam<@0h8>#-Ka3X7j%)(z4S)fu^rpki9kji zC32i2dW?)$GYud=^NQ=3ecuV+)^b*SuuE^STJamS1HOfwACSbU-f%pEME zwS#Q{nbBY#v()$GS6u z+QOX-{r79;^Uk+#xPT*&E?KBO0!~G zGjg5!GjxRw-5azW-R;6LOwkiY>Tn(5%WEB%dNizW%&8-#E5mxtDy-^*V4B_qeNXKn zLa0)DiPYI%iyBcjrs-6I6>-f6<57XmfS+Z?E7#O-7FG-yK>*>pNpkYF-bP)lU^ogi zY)`4QL|xjd6|-#?#^y}(Fw|19qH9)H5YFHXf$Czjs9iNccF zj_*5TL0$N-B?V0ius70N^1C_cv-|dIXX?M!Ek97`MRb0QK+w4nDunvhsFw9TE>O@F zh}yEyhOsB8ZoeH$`C!FVkpmmHjHn?JHPo|(O?g9M*O%ZBIVqV$B^znTg(B8H%=c#L zg7)RrDov-LeUA4UeBDdX&rxmDyP}I5|FAq0!9)>GBp;bbK4~ILU5C?2P-{lk3tJ!# z3wq<-L@L9~5h=VlG>demu4~w#6tnlFL1$;In|5f-*%56y5kpS$Vgqwd!dh`iSk>NF zuD^Xzsb>QLXDy57OPF7&Om)Uda}tX)TiA!6G?Mc1uZ_jh;6d3+aWO?CUlqQwrCNtfdrZuT1H{pJ`DXnU&Ax9ds*R%yGUDP**Vm`MG81wnf;g~OM4#<3Q zD@f)`o5P{J6&xyCz@fSY9BSLaApsxI3-`5WMD9ZIGn`9qhj^IQCZE!VUj&j{71Bmp z3HL&P7igW&WgvYo zPsFVy-ZTM&sL?7MD%8?iS>R@s)+z;sUej}gG-|$#KvaL_SjBu=t5xeN7SdWx47amF zO;Fq%$&00Jki1yl3dxI==OKBq`Z7pftZj|t#roDrUdnBQ+Hb`D7 zZG+^c@^(mGTBb6j1$&AGl&UEWR~?U1Ev?bY^HHj&ja5B)nw9PCRSG1$;)cdK8OX-cfhOe7ens8VyuL-VcI>ak0Neb@*+;!7> zsIE1MvEg|uU{G5%4a0RE_vu|(@H+2+3HnR3M=V9_TWwXeZyOE zjw{8Ku^AaiYZeud3YnzSNiK4!T`ZF<_EPEz(o!Nah$L6(sS=ZDQ#(vIpfD&eBAWzTW^^p^SLF~RjNtw|xd$=LAq zv?j&X;H#Ei0DRT*li-u)x@((uKdpz#)?ln|4#wKkVEm~)(3kC0EDl7PiHdz*We4IU zJKYk*Ypm*pNJ)Ah+#C1%+O*8E-Z#>Fz|XPvU9L|11~zX{XTDih#_fK2#lFU^SW%7K z?(Q?qTI*Y**7JpqDxiGF*R9up^4|0PqI-tl8KCa{$nH52zv$?vRKMtF*uI|fpe8?p zHWT5%_VRUYn_Fq^8J1Ugx`Q>1z2rr(Hv#H9suBAJ4k!1Wr$_v{`6G@f;UXjY z>zUzt=888R2?oYw+66@V(y$EOGrS1p5>iijfm6-)0nI1wQ4zifmCe(*82J^dVRuC$Uh5F zyn*f-W4eOKFkUrtemxn5cpwaJa|iFf(-&g zdT?(4^~c_UW!Qaik$v+<%1Ljft;DIq^8^ReZaa&Y2dV8ebYBmkxF;QMxw`emlR|lw z^AfungpN|WuM2)MY2cX==x{$Bf)P0x+Uif)?n3J!le~d)?aM(2M9}r z+NKiVd(bRzAubi_FZ$3n`4ncPT~r=sBv#5_dA#65T;B82J5;6)r)RfIZ(dW*-@nqj z!FaQRD_F`CXu;VG)Es@+ncAZ7T;K5V1gOy6uJ|4os6*_%Y-xixvbhArVW3%wfy+H5 zNuRijOBlXk$Au@vzwlpNJZTK| zL*IqRLeKQ)v)F90`~;hYw*xQEV~dslW*%Ftu8&@|XYg3qnjgzxi|Y%vr6iKI7UFS~ z+laN6*1T1dJJt2WB+#yGLP$!5mtw1YxAcDBHTrP(z2@r=*(y!;J8)Ij@qY|cz2=zz z(u}o~q_iODY{vddrSHU7OXWYGuWoQ4)|a?T>r=^6?OE&sH2>bqvkTH}oazvk+1Blj zu`%;40r}+4+$?@1m=Lz)s^#@{2j%>e$5?Q4ScP%u=+H3eh2B$|nB~5c&f6)ZxxiD; zn8G9g%{j9r9fW=oaU4#6B_UX=0vrkZ;coRS2MeAmz*E+d@tR(WzdDrih49nBnKREO z7HT9D(@q9%4j5%Afhmh#AnT)3xfGyN!Xnsn1nHmai*3u>RsKHGaNrNW`{k9iO5K;f zu4S@{Xdw|=WYRYmsp0xi5!g6e9eF9ll)RA@Wj9?D&MBEuKm?u=%BBeq8Fs(Cg7rqF zkTrmtK;2xUJnTj?7k5SdJ{`GaT~&ba^@pe^v1enEt_M) zs|#>d>uh3BP}evarO&V1z8w(JHD7IR5d!VYD-5}v@CI|c^A%fLC_BVn{UyFCgpG^u zum)~jTjS9B_SEw8464SWW9gKG<+bmc7=LVYLseycQKyn$<9HzOB4;C$4B&&%<8E76 zR|;!SC>(6v^SS{DiwV*K4GXk?X1MS;HFc4U8?K@Ug8N=b944+g*4>AVX@P6_?n7`~ z{)FT18eQkbPCL$ilQaIkNHaldW9WBHZ)|!VqQ_>i58<_*$<^_U&1m5>6m^x-X7A$@ z-@FGqj2Q>mGx^}{d*tQ2?@XS}sh0OP{cK4Rb35bQf=x0KUNL;}zjP5zh&vh{N9^e+ zDI{v>Anbz!BvuT$^q=$O|H1BrH;v7Ya2#CH+ZB6m+Wj3muW2B&e<)&69h?mBZD zR{cDjW`IgYX!h}Dl7`PAeEwsxnLR>yX>@){+DiAVGVKYtSSMgT=t~5YXW_Y_^oX?y zW5#rh2~PcB=tY893K9>

ur~ZmdN)1S3Y=5@H*3!}DR|;7r87I#!o|-S(yCdzdK#Bvi3z3E2LYR~{dUtHvJjip; z^vT(FCMdd=oCOJ#nw z$RV$7%lyJcZOHtDhAHHiYW#W3FPzc$Wqy?iwx}GVt&=g z?o^+-I}zqrEpE^Js->Tl`Blp=!2CeJ^YZM^&|S-X1_NB*p{u&i6AA&z*JFT@Q?VHX ztZm5v6X&=c16;Qfgf?G(OU~IR`}s8p-I@LMZ(nTbSLy$brtZjsEb5lyO0(QS@t}ks z2EIS>4zt<5=?|vugN`%KidFxQYv|pvfmL@qdr~1+C`rfD(MXq0rtZkFbo|7gGIpgY zhRyc}hID##Exk88hK=Dyf6ace!%zq4u{C4S3z$plOxl-n2W9EsQV!uanp$o*?<+VB;eel1vaFv_IRj*nrP<6Snm^s7`jD3|v#QZ6GE%H=&8 zG-%x}Ojfnd3a#_GT)egYf~UUPp#(2in}-rSBGsv8n`(BbW|wLjRI>*)!zddAj2-;>;NV~vu3@QuDN?^J)-Na3uSDt#FsOrc8P=;NHLiXAx|aeK zmJTH#34|yCrPZy;KnGf@XQUnyT3z}F?$TSSx2r?1J3BGNWV~`F;AKyG!?7O9-@-{e zlm-Pcn#qi2^cIj(+LwBCDCmzq|Dz3m;H2P4z?`VnAu<`r>f4P{u6H-uw@VE&g#3TI z1JBam{(CTQ|9jxg_P%`C{qn{8b@%h@{R896m+sg7z1_EmU8BGE_Vbr7Ugqn*`00O= z%68u#CKT`f&)(a;x6t>OFMGdaBhc}zg4=J~yMv760dEpx^#Ghb=~pS>U{*%TORtH8 z@k#*6T{|O<@V`Klq^wlT?MeS5OnNN=qw$hwmyt^0%yRLGm2pZ%{5QWm zv3Wa~*gPY(BNKD`ZRt$}_W2Bm6*Pop_>vhA$GNmGwWWVb`H(J3Z=}4GWuJnSM$)fu zSTjj#hd=Nv^&D5)g?72$Bvbl_RQydc_xHo(kp1>&^DDH0?VU@nrS@-;FZ*w#`EN@n zv)_&{dTM-tsE@mDM(Sszc1G%Eq_NHusljqwq!D3R(A(~AAI1fVp$lhfw=exeYD;gW zigd_<{|E1-pV~`XdM&xwiL@^jmgcx1JBxxqLB;sM(GU@83FGh zSIF$Zm9q3*_|nHO{e&-V{L)VNGS)#{2yl?WPdsO1(++Bwc2W(pXCz)JnOek% zMYIn_P_U0V+xi4j7^8%-dCVg7nCⅇN3wCh6Cw;q$2K6k!WYJl3Q*T7ycO1N^cm$ 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.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.adminRequired)return l.A.commit("setAdminLoggedIn",!0),t();if(o.valid&&"admin"===o.authType)return l.A.commit("setAdminLoggedIn",!0),t();const i=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(i&&n.nk.error(s.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()}).catch(()=>{const a=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(a&&n.nk.error(s.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()})},d=(e,a,t)=>{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.userRequired)return l.A.commit("setUserLoggedIn",!0),t();if(o.valid)return l.A.commit("setUserLoggedIn",!0),t();const i=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(i&&n.nk.error(s.Ay.global.t("login.authRequired")),t({name:"login"})):t()}).catch(()=>{const a=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(a&&n.nk.error(s.Ay.global.t("login.authRequired")),t({name:"login"})):t()})},c=[{path:"/",name:"home",component:()=>Promise.all([t.e(740),t.e(600),t.e(428),t.e(365)]).then(t.bind(t,58149)),beforeEnter:d},{path:"/login",name:"login",component:()=>Promise.all([t.e(600),t.e(604)]).then(t.bind(t,61880))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([t.e(740),t.e(309),t.e(428),t.e(454)]).then(t.bind(t,14379)),beforeEnter:r},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([t.e(740),t.e(309),t.e(833),t.e(396)]).then(t.bind(t,59396)),beforeEnter:r},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([t.e(740),t.e(309),t.e(833),t.e(75)]).then(t.bind(t,60075)),beforeEnter:r},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([t.e(600),t.e(728)]).then(t.bind(t,16556))},{path:"/blockimg",name:"blockimg",component:()=>t.e(917).then(t.bind(t,74917))},{path:"/whiteliston",name:"whiteliston",component:()=>t.e(51).then(t.bind(t,31051))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>t.e(718).then(t.bind(t,49718))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>t.e(226).then(t.bind(t,68226))}],u=(0,o.aE)({history:(0,o.LA)("/"),routes:c});a.A=u},25507:function(e,a,t){t(18111),t(61701);var o=t(60782),n=t(457),l=t(55131);a.A=(0,o.y$)({state:{userConfig:null,bingWallPapers:[],adminLoggedIn:!1,userLoggedIn:!1,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:void 0,compressQuality:void 0,compressBar:void 0,serverCompress:void 0,convertToWebp:void 0},storeUploadChannel:"",storeChannelName:null,storeAutoRetry:!0,storeUploadNameType:"",uploadFolder:"",customUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},adminUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},autoReUpload:!0,useDarkMode:null,cusDarkMode:!1},getters:{userConfig:e=>e.userConfig,bingWallPapers:e=>e.bingWallPapers,credentials:e=>e.adminLoggedIn?"__session__":null,adminLoggedIn:e=>e.adminLoggedIn,userLoggedIn:e=>e.userLoggedIn,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeChannelName:e=>e.storeChannelName,storeUploadNameType:e=>e.storeUploadNameType,customUrlSettings:e=>e.customUrlSettings,storeAutoRetry:e=>e.storeAutoRetry,adminUrlSettings:e=>e.adminUrlSettings,storeUploadFolder:e=>e.uploadFolder||localStorage.getItem("uploadFolder")||"",useDarkMode:e=>e.useDarkMode,cusDarkMode:e=>e.cusDarkMode,storeAutoReUpload:e=>e.autoReUpload},mutations:{setUserConfig(e,a){e.userConfig=a},setBingWallPapers(e,a){e.bingWallPapers=a},setCredentials(e,a){e.adminLoggedIn=null!==a&&void 0!==a},setAdminLoggedIn(e,a){e.adminLoggedIn=a},setUserLoggedIn(e,a){e.userLoggedIn=a},setUploadMethod(e,a){e.uploadMethod=a},setUploadCopyUrlForm(e,a){e.uploadCopyUrlForm=a},setCompressConfig(e,{key:a,value:t}){e.compressConfig[a]=t},setStoreUploadChannel(e,a){e.storeUploadChannel=a},setStoreChannelName(e,a){e.storeChannelName=a},setStoreUploadNameType(e,a){e.storeUploadNameType=a},setCustomUrlSettings(e,{key:a,value:t}){e.customUrlSettings[a]=t},setStoreAutoRetry(e,a){e.storeAutoRetry=a},setAdminUrlSettings(e,{key:a,value:t}){e.adminUrlSettings[a]=t},setUseDarkMode(e,a){e.useDarkMode=a},setCusDarkMode(e,a){e.cusDarkMode=a},setStoreUploadFolder(e,a){e.uploadFolder=a,localStorage.setItem("uploadFolder",a)},setStoreAutoReUpload(e,a){e.autoReUpload=a}},actions:{async fetchUserConfig({commit:e}){try{const a=await n.A.get("/api/userConfig");e("setUserConfig",a.data)}catch(a){console.log(a)}},async fetchBingWallPapers({commit:e}){try{const a=await n.A.get("/api/bing/wallpaper"),t=a.data.data,o=t.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(o.map(e=>new Promise((a,t)=>{const o=new Image;o.onload=a,o.onerror=t,o.src=e.url}))),e("setBingWallPapers",o)}catch(a){console.log(a)}}},modules:{},plugins:[(0,l.A)({paths:["userConfig","uploadMethod","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode"]})]})},46638:function(e,a,t){t.d(a,{Ay:function(){return c},xS:function(){return d}});var o=t(85384),n=JSON.parse('{"login":{"title":"登录到 {owner} 图床","adminTitle":"管理端登录","password":"密码","username":"用户名","passwordPlaceholder":"请输入认证码","usernamePlaceholder":"请输入用户名","adminPasswordPlaceholder":"请输入密码","submit":"登录","success":"登录成功","failed":"登录失败,请检查密码是否正确","adminFailed":"用户名或密码错误","serverError":"服务器错误","systemError":"系统错误","authRequired":"请先认证!","authFailed":"认证失败!"},"upload":{"folderPlaceholder":"上传目录","pasteUpload":"粘贴上传","fileUpload":"文件上传","dragUploadText":"拖拽 点击Ctrl + V 粘贴上传","pasteUrlPlaceholder":"粘贴外链上传,多个外链用换行分隔","pasteUploadBtn":"上 传","pasteSave":"转存","pasteExternal":"外链","history":"上传记录","announcement":"查看公告","noAnnouncement":"暂无公告","announcementTitle":"公告","announcementAck":"我已知晓!","settings":"上传设置","linkFormat":"链接格式","manage":"系统管理","logout":"退出登录","logoutSuccess":"已退出登录","viewDocs":"查看文档","switchUploadMethod":"切换上传方式","copyAll":"整体复制","retryFailed":"失败重试","clearList":"清空列表","clearAll":"清空全部","clearUploaded":"清空已上传"},"uploadForm":{"deleted":"{name}已删除","uploadSuccess":"{name}上传成功","uploadFailed":"{name}上传失败","compressFailedCannotUpload":"{name}压缩失败,无法上传!","fileTooLarge":"{name}文件过大,无法上传!","compressedFileTooLarge":"{name}压缩后文件过大,无法上传!","copySuccess":"复制成功","copyFailed":"复制失败","copyAllSuccess":"整体复制成功","fileNotUploaded":"文件未上传成功,无法复制链接","fileListCleared":"文件列表已清空","fileListEmpty":"文件列表为空","successFilesCleared":"成功上传文件已清空","successFilesEmpty":"成功上传文件为空","noFailedFiles":"无上传失败文件","autoRetryOn":"自动重试已开启","autoRetryOff":"自动重试已关闭","autoRetry":"自动重试","maxRetryReached":"{name} 已达到最大重试次数({max}),停止重试","urlRequestFailed":"粘贴板中的URL地址请求失败","chunkMerging":"分块上传完成,正在合并文件,请耐心等待...","fileSizeTooLarge":"文件过大","chunkInitFailed":"初始化分块上传失败","uploadError":"上传过程中发生错误","imageLoadFailed":"图片加载失败"},"uploadSettings":{"title":"上传设置","uploadChannel":"上传渠道","channelType":"渠道类型","channelName":"渠道名称","channelNameTooltip":"选择具体的渠道名称,不选择则使用负载均衡或默认渠道","autoSelect":"自动选择","uploadDirectory":"上传目录","uploadDirectoryPlaceholder":"请输入上传目录路径","autoSwitch":"自动切换","autoSwitchTooltip":"对于非分块上传文件,上传失败自动切换到其他渠道上传","fileNaming":"文件命名方式","namingDefault":"默认","namingIndex":"仅前缀","namingOrigin":"仅原名","namingShort":"短链接","filePreprocess":"文件预处理","filePreprocessTooltip":"上传前在本地进行格式转换和压缩,仅对图片文件生效","convertToWebp":"转换为WebP","convertToWebpTooltip":"上传前将图片转换为WebP格式,可有效减小文件体积。转换失败时保持原格式上传","fileCompress":"文件压缩","compressThreshold":"压缩阈值","compressThresholdTooltip":"设置图片大小阈值,超过此值将自动压缩,单位MB","expectedSize":"期望大小","expectedSizeTooltip":"设置压缩后图片大小期望值,单位MB","serverCompress":"服务端压缩","serverCompressTooltip":"1. 在 Telegram 端进行压缩,仅对上传渠道为 Telegram 的图片文件生效
2. 若图片大小(本地压缩后大小)大于10MB,本设置自动失效
3. 若上传分辨率过大、透明背景等图片,建议关闭服务端压缩,否则可能出现未知问题","enableCompress":"开启压缩","confirm":"确定"},"uploadHistory":{"title":"历史记录","totalRecords":"共 {count} 条","switchView":"切换视图","clearRecords":"清空记录","loading":"加载中...","pullToLoadMore":"下拉加载更多","noMoreRecords":"没有更多记录了","emptyHistory":"暂无上传记录","linkCopied":"链接已复制","copyFailed":"复制失败","clearConfirmTitle":"提示","clearConfirmMessage":"确定要清空所有上传记录吗?","clearConfirmOk":"确定","clearConfirmCancel":"取消","recordsCleared":"记录已清空","deleteConfirmMessage":"确定要删除这条记录吗?","recordDeleted":"记录已删除"},"settings":{"linkFormatTitle":"链接格式设置","defaultCopyLink":"默认复制链接","rawLink":"原始链接","customLink":"自定义链接","customLinkTooltip":"默认链接为https://your.domain/file/xxx.jpg
如果启用自定义链接格式,只保留xxx.jpg部分,其他部分请自行输入","enableCustom":"启用自定义","customPrefix":"自定义前缀","customPrefixPlaceholder":"请输入自定义链接前缀","confirm":"确定","s3Link":"S3链接"},"dashboard":{"searchPlaceholder":"搜索:#标签 -#排除标签","sortByDateDesc":"按时间倒序","sortByNameAsc":"按名称升序","selectPage":"全选此页","copy":"复制","delete":"删除","download":"下载","move":"移动","tagManagement":"标签管理","addToBlacklist":"加入黑名单","addToWhitelist":"加入白名单","linkFormat":"链接格式","listView":"列表视图","cardView":"卡片视图","logout":"退出登录","rootDirectory":"根目录","totalFiles":"共 {count} 个文件","noMatchingFiles":"未找到匹配的文件或文件夹","currentDirEmpty":"当前目录为空","adjustSearchHint":"尝试调整搜索条件或筛选器","uploadHint":"上传文件后将显示在这里","loadMore":"加载更多","totalPages":"共 {count} 页","jumpTo":"跳至","preview":"预览","fileName":"文件名","tags":"标签","channelType":"渠道类型","channelNameCol":"渠道名称","uploadAddress":"上传地址","fileSize":"大小","uploadTime":"上传时间","actions":"操作","externalTag":"外链","unknownTag":"未知","detail":"详情","copyLink":"复制链接","moveFile":"移动","downloadFile":"下载","loadFailed":"加载失败","copySuccess":"复制成功","copyFailed":"复制失败","deleteConfirm":"此操作将永久删除该文件, 是否继续?","deleteConfirmTitle":"提示","deleteConfirmOk":"确定","deleteConfirmCancel":"取消","deleteSuccess":"删除成功","deleteFailed":"删除失败","blockConfirm":"此操作将把该文件加入黑名单, 是否继续?","blockSuccess":"加入黑名单成功","blockFailed":"加入黑名单失败","whiteConfirm":"此操作将把该文件加入白名单, 是否继续?","whiteSuccess":"加入白名单成功","whiteFailed":"加入白名单失败","deleteFolderConfirm":"此操作将永久删除文件夹, 是否继续?","deleteFileConfirm":"此操作将永久删除该文件, 是否继续?","batchDeleteConfirm":"此操作将永久删除选中的文件及文件夹, 是否继续?","batchDeleteSuccess":"批量删除成功","batchDeleteFailed":"批量删除失败","batchBlockConfirm":"此操作将把选中的文件加入黑名单, 是否继续?","batchBlockSuccess":"批量加入黑名单成功","batchBlockFailed":"批量加入黑名单失败","batchWhiteConfirm":"此操作将把选中的文件加入白名单, 是否继续?","batchWhiteSuccess":"批量加入白名单成功","batchWhiteFailed":"批量加入白名单失败","noLinksAvailable":"没有可复制的链接","batchCopySuccess":"批量复制 {count} 个链接成功","batchCopyFailed":"批量复制链接失败,请重试","batchCopyLinksSuccess":"批量复制链接成功","copyFileLinkSuccess":"复制文件链接成功","loadMoreFailed":"加载更多文件失败,请检查网络连接","moveSuccess":"移动成功","moveFailed":"移动失败","moveTargetSameAsCurrent":"目标文件夹不能是当前文件夹","invalidPageNumber":"请输入有效的页码","pageExceedsMax":"页码不能超过 {max}","loadingData":"正在加载数据,请稍候...","loadDataFailed":"加载数据失败,请检查网络连接","fetchFileListFailed":"获取文件列表失败","refreshFailed":"刷新失败,请重试","selectFilesFirst":"请先选择文件","syncDataError":"同步数据时出错,请检查网络连接","fetchingFileList":"正在获取文件列表...","folderEmptyNoLinks":"文件夹为空,没有可复制的链接","copiedFileLinks":"已复制 {count} 个文件链接","copyFolderLinksFailed":"复制文件夹链接失败,请重试"},"dashboardTabs":{"fileManagement":"文件管理","userManagement":"用户管理","systemSettings":"系统设置","fileUpload":"文件上传"},"fileDetail":{"title":"文件详情","download":"下载","tags":"标签","blacklist":"黑名单","whitelist":"白名单","deleteBtn":"删除","edit":"编辑","rename":"重命名","save":"保存","cancel":"取消","originUrl":"原始链接","fileNameLabel":"文件名","fileNamePlaceholder":"请输入文件名","fileType":"文件类型","fileTypePlaceholder":"如 image/jpeg","fileSizeLabel":"文件大小","imageDimensions":"图片尺寸","noDimensions":"无","uploadTimeLabel":"上传时间","channelTypeAndName":"渠道类型/名称","accessStatusAndReview":"访问状态/审查","uploadIP":"上传IP","uploadAddressLabel":"上传地址","fileTags":"文件标签","noTags":"暂无标签","unknown":"未知","accessNormal":"正常","accessNormalWhitelist":"正常(白名单)","accessBlockedBlacklist":"已屏蔽(黑名单)","accessBlockedReview":"已屏蔽(审查不通过)","orientationLandscape":"横","orientationPortrait":"竖","orientationSquare":"方","linkCopied":"链接已复制","metadataSaved":"元数据保存成功","metadataSaveFailed":"保存元数据失败","renameTitle":"重命名 File ID","renameLabel":"新 File ID","renamePlaceholder":"请输入新的 File ID","renameCancel":"取消","renameConfirm":"确认重命名","renameSuccess":"文件重命名成功","renameConflict":"目标文件名已存在","renameFailed":"重命名失败"},"filter":{"accessStatus":"访问状态","normal":"正常","blocked":"已屏蔽","blackWhiteList":"黑白名单","whiteList":"白名单","blackList":"黑名单","notSet":"未设置","reviewResult":"审查结果","teenContent":"12+内容","adultContent":"成人内容","fileType":"文件类型","image":"图片","video":"视频","audio":"音频","other":"其他","channelType":"渠道类型","externalLink":"外链","channelName":"渠道名称","clearFilters":"清除筛选"},"moveFile":{"title":"移动文件","batchTitle":"批量移动文件","targetDirectory":"目标目录","targetPlaceholder":"请输入目标目录路径","hint":"提示:路径以 / 开头表示根目录,如 /photos/2024/","hintMobile":"提示:路径以 / 开头表示根目录","selectDirectory":"选择目录","cancel":"取消","confirm":"确定","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadTreeFailed":"加载目录树失败,请检查网络连接"},"batchTag":{"title":"批量标签管理","addTab":"添加","removeTab":"移除","clearTab":"清空","addDescription":"为选中的 {count} 个文件添加标签","inputPlaceholder":"输入标签名称","pendingTags":"待添加的标签","noPendingTags":"暂无待添加标签","addToAllFiles":"添加到所有文件","removeDescription":"移除选中文件的共有标签","commonTags":"共有标签","noCommonTags":"选中的文件没有共有标签","clearDescription":"清空选中的 {count} 个文件的所有标签","clearWarningTitle":"⚠️警告","clearWarningDesc":"此操作将清空所有选中文件的标签,且不可恢复","confirmClearAll":"确认清空所有标签","tagAlreadyInList":"标签已在列表中","pleaseAddTags":"请先添加要批量添加的标签","addSuccess":"成功为 {count} 个文件添加标签","addFailed":"批量添加标签失败","removeSuccess":"成功从 {count} 个文件中移除标签","removeFailed":"移除标签失败","clearConfirmMessage":"确定要清空选中的 {count} 个文件的所有标签吗?此操作不可恢复。","clearConfirmTitle":"确认清空","clearConfirmOk":"确定","clearConfirmCancel":"取消","clearCancelled":"已取消清空操作","clearSuccess":"成功清空 {count} 个文件的标签","clearFailed":"清空标签失败","loadCommonTagsFailed":"加载共有标签失败"},"tagManagement":{"title":"标签管理","inputPlaceholder":"输入标签名称","currentTags":"当前标签","noTags":"暂无标签","popularTags":"常用标签","loading":"加载中...","noPopularTags":"暂无常用标签","close":"关闭","tagExists":"标签已存在","addSuccess":"标签添加成功","addFailed":"添加标签失败","removeSuccess":"标签删除成功","removeFailed":"删除标签失败","loadFailed":"加载标签失败"},"mobileAction":{"viewDetail":"查看详情","copyLink":"复制链接","downloadFile":"下载文件","moveFile":"移动文件","tagManagement":"标签管理","moveFolder":"移动文件夹","deleteFile":"删除文件","deleteFolder":"删除文件夹"},"mobileDirectory":{"title":"目录导航","rootDirectory":"根目录","goBack":"返回上一级"},"sysConfig":{"logout":"退出登录"},"sysConfigTabs":{"systemStatus":"系统状态","uploadSettings":"上传设置","securitySettings":"安全设置","pageSettings":"网页设置","otherSettings":"其他设置"},"sysStatus":{"totalFiles":"文件总数","clickToRefresh":"点击刷新","indexUpdateTime":"索引更新时间","systemVersion":"系统版本","clickToViewChangelog":"点击查看更新日志","channelDistribution":"上传渠道分布","fileStatusDistribution":"文件状态分布","noData":"暂无数据","totalFilesLabel":"文件总数","statusTypes":"状态类型","systemMaintenance":"系统维护","rebuildIndex":"重建索引","rebuilding":"重建中...","rebuildTooltip":"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复","backupData":"备份数据","backingUp":"备份中...","backupTooltip":"备份所有文件元数据和系统设置到JSON文件","restoreData":"恢复数据","restoring":"恢复中...","restoreTooltip":"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置","cancelOperation":"取消操作","retry":"重试","close":"关闭","records":"条记录","aboutToComplete":"即将完成","seconds":"约 {count} 秒","minutes":"约 {count} 分钟","hoursMinutes":"约 {hours} 小时 {minutes} 分钟","phaseFetching":"正在获取数据","phaseSorting":"正在排序","phaseUploading":"正在上传","phaseFinalizing":"正在完成","phaseBuilding":"正在构建备份","phaseDownloading":"正在生成下载","phaseRestoringFiles":"正在恢复文件","phaseRestoringSettings":"正在恢复设置","phaseCompleted":"已完成","phaseRetrying":"正在重试","rebuildSuccess":"索引重建完成!共处理 {count} 个文件","backupSuccess":"备份完成!共备份 {count} 个文件","backupSuccessWithSettings":"备份完成!共备份 {fileCount} 个文件,{settingsCount} 个设置项","operationInProgress":"已有操作正在进行中","selectJsonFile":"请选择JSON格式的备份文件","restoreConfirmMessage":"恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?","restoreConfirmTitle":"确认恢复","restoreConfirmOk":"确定恢复","restoreConfirmCancel":"取消","invalidBackupFile":"备份文件格式无效,请选择有效的 JSON 文件","restoreSuccess":"恢复完成!已恢复 {files} 个文件和 {settings} 个设置项,正在重建索引...","restoreFailed":"恢复数据失败","fetchIndexFailed":"获取索引信息失败","unknown":"未知","blocked":"已屏蔽","normalStatus":"正常","latestUpload":"最近上传","earliestUpload":"最早上传","daysAgo":"{count}天前","hoursAgo":"{count}小时前","minutesAgo":"{count}分钟前","justNow":"刚刚","cancellingRebuild":"正在取消索引重建..."},"sysUpload":{"title":"上传渠道管理","titleTooltip":"管理所有上传渠道的配置,点击卡片查看详情或编辑","filterPlaceholder":"筛选渠道类型","addChannel":"添加渠道","loadBalance":"负载均衡","unnamedChannel":"未命名渠道","envVariable":"环境变量","noChannels":"暂无 {type} 渠道","detail":"详情","editBtn":"编辑","deleteBtn":"删除","addDialogTitle":"添加新渠道","channelTypeLabel":"渠道类型","channelTypePlaceholder":"请选择渠道类型","channelNameLabel":"渠道名称","channelNamePlaceholder":"请输入渠道名称","botTokenLabel":"Bot Token","botTokenPlaceholder":"请输入 Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"请输入 Chat ID","proxyDomain":"代理域名","proxyDomainPlaceholder":"可选,例如: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"例如: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN 域名","cdnDomainPlaceholder":"如果有 CDN,请配置 CDN 域名,例如:https://cdn.example.com","cdnDomainTip":"可选配置。配置后将优先通过 CDN 读取文件,提高访问速度和降低成本","bucketName":"存储桶名称","bucketNamePlaceholder":"请输入存储桶名称","bucketRegion":"存储桶区域","bucketRegionPlaceholder":"默认填写 auto","accessKeyId":"访问密钥 ID","accessKeyIdPlaceholder":"请输入访问密钥 ID","secretAccessKey":"机密访问密钥","secretAccessKeyPlaceholder":"请输入机密访问密钥","pathStyle":"路径风格","pathStyleTip":"使用 OpenList 等不兼容主机风格服务时需开启","quotaLimit":"容量限制","quotaLimitGB":"容量上限 (GB)","quotaThreshold":"停用阈值 (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"请输入 Channel ID","nitroMember":"Nitro 会员","nitroTip":"会员单文件限制 25MB,否则为 10MB","discordWarning":"Discord 有接口频率限制,不建议将其用作大规模并发场景","repoName":"仓库名","repoNamePlaceholder":"格式: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"请输入 Access Token","privateRepo":"私有仓库","privateRepoTip":"私有仓库限制 100GB","webdavBaseUrl":"WebDAV 基础地址","webdavBaseUrlPlaceholder":"例如: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"用户名","webdavUsernamePlaceholder":"可选用户名","webdavPassword":"密码","webdavPasswordPlaceholder":"可选密码","webdavPublicUrlPlaceholder":"可选公开访问地址,例如: https://cdn.example.com/imgbed/","webdavPublicUrlTip":"可选配置。配置后服务端支持直接从该地址读取文件","webdavHeaders":"自定义请求头","webdavHeadersPlaceholder":"可选 JSON 对象,例如: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"自定义请求头必须是有效的 JSON 对象","webdavCreateDirectory":"自动创建目录","webdavCreateDirectoryTip":"上传文件前自动创建父级目录","cancel":"取消","confirmAdd":"确认添加","detailDialogTitle":"渠道详情 - {name}","channelNameDetail":"渠道名称","channelTypeDetail":"渠道类型","statusLabel":"状态","enabled":"已启用","disabled":"已禁用","configSource":"配置来源","publicUrl":"公开访问链接","notSet":"未设置","isPathStyle":"是","isNotPathStyle":"否","currentUsage":"当前用量","closeBtn":"关闭","editDialogTitle":"编辑渠道 - {name}","enableChannel":"启用渠道","saveChanges":"保存修改","r2ConfigNote":"请按照
配置 R2 渠道 文档说明添加 R2 渠道","reservedName":"该名称为系统保留名称,请使用其他名称","duplicateName":"该类型下已存在同名渠道,请使用其他名称","fixedChannelCannotDelete":"环境变量配置的渠道无法删除","deleteChannelConfirm":"确定要删除该渠道吗?","quotaInitConfirm":"首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?","quotaInitTitle":"初始化容量统计","quotaInitConfirmBtn":"立即统计","quotaInitCancelBtn":"稍后手动统计","quotaInitLater":"您可以稍后点击刷新按钮手动统计","quotaCalculating":"正在统计容量,请稍候...","quotaCalculateSuccess":"容量统计完成","quotaCalculateFailed":"统计失败","quotaCalculateError":"统计失败: "},"sysSecurity":{"authManagement":"认证管理","userAuth":"用户端认证","adminAuth":"管理端认证","uploadPassword":"上传密码","confirmPassword":"确认密码","adminUsername":"用户名","adminPassword":"密码","apiTokenManagement":"API Token 管理","imageReview":"图像审查","imageReviewTooltip":"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道","enableReview":"开启审查","reviewChannel":"审查渠道","reviewChannelPlaceholder":"请选择审查渠道","apiKey":"API Key","apiPath":"API 路径","uploadManagement":"上传管理","accessManagement":"访问管理","domainFilter":"域名过滤","allowedDomains":"放行域名","allowedDomainsTooltip":"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔","whiteListMode":"白名单模式","enableWhiteList":"是否开启","enableWhiteListTooltip":"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问","settingsSaved":"设置已保存","tokenName":"名称","tokenValue":"Token","permissions":"权限","createdAt":"创建时间","status":"状态","expiresAt":"过期时间","operation":"操作","editBtn":"编辑","deleteBtn":"删除","permUpload":"上传","permDelete":"删除","permList":"列出","permManage":"管理","createTokenTitle":"创建新 API Token","tokenNameLabel":"Token 名称","tokenNamePlaceholder":"请输入Token名称","permissionsLabel":"权限","neverExpire":"永不过期","validPeriod":"有效期","autoDeleteOnExpire":"过期自动删除","createBtn":"创建","editTokenTitle":"编辑 API Token","updateBtn":"更新","tokenCreatedTitle":"Token 创建成功","tokenCreatedWarning":"请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token!","fullToken":"完整Token","copyBtn":"复制","savedBtn":"我已保存","tokenCopied":"Token已复制到剪贴板","copyFailed":"复制失败,请手动复制","tokenCreateSuccess":"Token创建成功","tokenCreateFailed":"Token创建失败","tokenUpdateSuccess":"Token更新成功","tokenUpdateFailed":"Token更新失败","tokenDeleteConfirm":"此操作将永久删除该Token,是否继续?","tokenDeleteConfirmTitle":"提示","tokenDeleteConfirmOk":"确定","tokenDeleteConfirmCancel":"取消","tokenDeleteSuccess":"Token删除成功","tokenDeleteFailed":"Token删除失败","tokenListFailed":"获取Token列表失败","passwordUrlReserved":"密码不能包含部分URL保留字符: % & ? # /","confirmUploadPassword":"请再次输入上传密码","confirmAdminPassword":"请再次输入管理密码","passwordMismatch":"两次输入密码不一致","passwordUnchanged":"未修改(留空保持原密码)","adminPasswordChangedRelogin":"管理端密码已修改,即将跳转到登录页","clearPassword":"清除密码","tokenNameRequired":"请输入Token名称","permissionsRequired":"请选择权限","validPeriodRequired":"有效期数值必须大于 0","timeUnitSeconds":"秒","timeUnitMinutes":"分钟","timeUnitHours":"小时","timeUnitDays":"天","timeUnitMonths":"月","timeUnitYears":"年","sessionSecurityPolicy":"会话安全策略","secureMode":"Secure 模式","secureModeTooltip":"开启后,Cookie 仅通过 HTTPS 连接传输,请确保您的站点已启用 HTTPS","userSessionMaxAge":"用户端会话有效期","adminSessionMaxAge":"管理端会话有效期","sessionMaxAgeUnit":"天","sessionMaxAgeInvalid":"会话有效期必须为大于 0 的正整数"},"sysPage":{"settingsSaved":"设置已保存","otherSettings":"其他设置","channelSelectPlaceholder":"请先选择上传渠道"},"sysOthers":{"remoteTelemetry":"远端遥测","remoteTelemetryTooltip":"便于问题查找和定位,建议开启","enable":"启用","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档","zoneId":"区域ID","accountEmail":"账户邮箱","randomImageApi":"随机图像API","randomImageApiTooltip":"API具体用法请查阅文档","directory":"目录","directoryTooltip":"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问","publicBrowse":"访客图库","publicBrowseTooltip":"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)","openDirectory":"开放目录","openDirectoryTooltip":"

允许公开浏览的目录,多个目录用逗号分隔

示例:wallpaper,photos,album

支持子目录:2026/lucky,2026/rich

访问链接:https://你的域名/browse/2026/lucky

","webdav":"WebDAV","webdavTooltip":"启用后,可以通过WebDAV协议访问和管理图片","webdavUsername":"用户名","webdavPassword":"密码","webdavUploadChannel":"上传渠道","webdavDefaultChannel":"默认渠道","webdavChannelName":"指定渠道名","settingsSaved":"设置已保存"},"customerConfig":{"uploadFileList":"上传文件列表","fileNameCol":"文件名","filePreview":"文件预览","uploadTimeCol":"上传时间","ipAddress":"IP地址","address":"地址","uploadCount":"上传次数","allowUpload":"允许上传","allow":"允许","deny":"禁止","loadMore":"加载更多","loadError":"加载更多数据时出错,请检查网络连接","syncError":"同步数据时出错,请检查网络连接"},"publicBrowse":{"searchPlaceholder":"搜索文件名 或 #页码","fileCount":"{count} 个文件","loading":"加载中...","retry":"重试","creditText":"该图库由林酱贡献代码","loadingMore":"加载中...","allLoaded":"已加载全部","creditLink":"林酱贡献","browseDisabled":"公开浏览功能未启用","directoryNotAllowed":"该目录不允许公开访问","accessDenied":"访问被拒绝","loadFailed":"加载失败,请重试","rootDirectory":"根目录","copyLink":"复制链接","copied":"已复制","downloadBtn":"下载","swipeHint":"← 滑动切换 →","rotate90":"旋转90°"},"transformMedia":{"download":"下载","playbackSpeed":"播放速度","normalSpeed":"正常","playMode":"播放模式","stopAfterPlay":"播完停止","sequentialPlay":"顺序播放","loopSingle":"单曲循环","more":"更多"},"directoryTree":{"selectDirectory":"选择目录","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadFailed":"加载目录树失败,请检查网络连接"},"floatingSave":{"saving":"保存中","save":"保存"},"theme":{"lightMode":"浅色模式","darkMode":"深色模式","autoMode":"自动模式"},"common":{"confirm":"确定","cancel":"取消","close":"关闭","save":"保存","delete":"删除","edit":"编辑","copy":"复制","download":"下载","retry":"重试","loading":"加载中...","success":"成功","failed":"失败","warning":"警告","info":"提示","yes":"是","no":"否","all":"全部类型","select":"请选择"},"validation":{"pathMustStartWithSlash":"目标目录必须以 \\"/\\" 开头","pathTraversalNotAllowed":"目标目录不能包含路径穿越字符 \\"..\\"","singleDotNotAllowed":"目标目录不能包含单独的 \\".\\" 路径段","consecutiveSlashNotAllowed":"目标目录不能包含连续的斜杠","invalidCharacters":"目标目录包含非法字符,请使用合法的路径格式","uploadDirReplace":"上传目录"},"language":{"switchTo":"中/En","switchLanguage":"切换语言"},"whitelist":{"title":"白名单模式已启用","description":"抱歉,当前已开启白名单模式,上传的图片需要审核通过后才能展示,请等待审核通过后再进行访问。","goHome":"返回首页","goBack":"返回上页","helpText":"您可以尝试:","uploadImage":"图片上传","refreshPage":"刷新页面"}}'),l=JSON.parse('{"login":{"title":"Login to {owner} ImgHub","adminTitle":"Admin Login","password":"Password","username":"Username","passwordPlaceholder":"Enter auth code","usernamePlaceholder":"Enter username","adminPasswordPlaceholder":"Enter password","submit":"Login","success":"Login successful","failed":"Login failed, please check your password","adminFailed":"Invalid username or password","serverError":"Server error","systemError":"System error","authRequired":"Please authenticate first!","authFailed":"Authentication failed!"},"upload":{"folderPlaceholder":"Upload directory","pasteUpload":"Paste Upload","fileUpload":"File Upload","dragUploadText":"Drag Click or Ctrl + V to paste upload","pasteUrlPlaceholder":"Paste external links, separate multiple links with line breaks","pasteUploadBtn":"Upload","pasteSave":"Save","pasteExternal":"External","history":"Upload History","announcement":"Announcements","noAnnouncement":"No announcements","announcementTitle":"Announcement","announcementAck":"Got it!","settings":"Upload Settings","linkFormat":"Link Format","manage":"Management","logout":"Logout","logoutSuccess":"Logged out","viewDocs":"Documentation","switchUploadMethod":"Switch Upload Method","copyAll":"Copy All","retryFailed":"Retry Failed","clearList":"Clear List","clearAll":"Clear All","clearUploaded":"Clear Uploaded"},"uploadForm":{"deleted":"{name} deleted","uploadSuccess":"{name} uploaded successfully","uploadFailed":"{name} upload failed","compressFailedCannotUpload":"{name} compression failed, cannot upload!","fileTooLarge":"{name} file too large, cannot upload!","compressedFileTooLarge":"{name} still too large after compression, cannot upload!","copySuccess":"Copied successfully","copyFailed":"Copy failed","copyAllSuccess":"All copied successfully","fileNotUploaded":"File not uploaded, cannot copy link","fileListCleared":"File list cleared","fileListEmpty":"File list is empty","successFilesCleared":"Uploaded files cleared","successFilesEmpty":"No uploaded files","noFailedFiles":"No failed files","autoRetryOn":"Auto retry enabled","autoRetryOff":"Auto retry disabled","autoRetry":"Auto Retry","maxRetryReached":"{name} reached max retry limit ({max}), stopping","urlRequestFailed":"URL request from clipboard failed","chunkMerging":"Chunk upload complete, merging file, please wait...","fileSizeTooLarge":"File too large","chunkInitFailed":"Failed to init chunked upload","uploadError":"Upload error occurred","imageLoadFailed":"Image load failed"},"uploadSettings":{"title":"Upload Settings","uploadChannel":"Upload Channel","channelType":"Channel Type","channelName":"Channel Name","channelNameTooltip":"Select a specific channel name. If not selected, load balancing or default channel will be used","autoSelect":"Auto Select","uploadDirectory":"Upload Directory","uploadDirectoryPlaceholder":"Enter upload directory path","autoSwitch":"Auto Switch","autoSwitchTooltip":"For non-chunked uploads, automatically switch to another channel on failure","fileNaming":"File Naming","namingDefault":"Default","namingIndex":"Prefix Only","namingOrigin":"Original Name","namingShort":"Short Link","filePreprocess":"File Preprocessing","filePreprocessTooltip":"Convert format and compress locally before upload, only applies to image files","convertToWebp":"Convert to WebP","convertToWebpTooltip":"Convert images to WebP format before upload to reduce file size. Falls back to original format on failure","fileCompress":"File Compression","compressThreshold":"Compression Threshold","compressThresholdTooltip":"Set image size threshold, files exceeding this will be auto-compressed (MB)","expectedSize":"Expected Size","expectedSizeTooltip":"Set expected image size after compression (MB)","serverCompress":"Server-side Compression","serverCompressTooltip":"1. Compress on Telegram side, only applies to image files uploaded via Telegram channel
2. If image size (after local compression) exceeds 10MB, this setting is ignored
3. For high-resolution, transparent background images, it\'s recommended to disable server compression to avoid issues","enableCompress":"Enable Compression","confirm":"OK"},"uploadHistory":{"title":"History","totalRecords":"{count} records","switchView":"Switch View","clearRecords":"Clear Records","loading":"Loading...","pullToLoadMore":"Pull to load more","noMoreRecords":"No more records","emptyHistory":"No upload history","linkCopied":"Link copied","copyFailed":"Copy failed","clearConfirmTitle":"Notice","clearConfirmMessage":"Are you sure you want to clear all upload records?","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","recordsCleared":"Records cleared","deleteConfirmMessage":"Are you sure you want to delete this record?","recordDeleted":"Record deleted"},"settings":{"linkFormatTitle":"Link Format Settings","defaultCopyLink":"Default Copy Format","rawLink":"Raw Link","customLink":"Custom Link","customLinkTooltip":"Default link is https://your.domain/file/xxx.jpg
If custom link format is enabled, only the xxx.jpg part is kept, please enter the rest manually","enableCustom":"Enable Custom","customPrefix":"Custom Prefix","customPrefixPlaceholder":"Enter custom link prefix","confirm":"OK","s3Link":"S3 Link"},"dashboard":{"searchPlaceholder":"Search: #tag -#exclude","sortByDateDesc":"Sort by date (newest)","sortByNameAsc":"Sort by name (A-Z)","selectPage":"Select all on page","copy":"Copy","delete":"Delete","download":"Download","move":"Move","tagManagement":"Tag Management","addToBlacklist":"Add to Blacklist","addToWhitelist":"Add to Whitelist","linkFormat":"Link Format","listView":"List View","cardView":"Card View","logout":"Logout","rootDirectory":"Root","totalFiles":"{count} files","noMatchingFiles":"No matching files or folders found","currentDirEmpty":"Current directory is empty","adjustSearchHint":"Try adjusting search criteria or filters","uploadHint":"Uploaded files will appear here","loadMore":"Load More","totalPages":"{count} pages","jumpTo":"Go to","preview":"Preview","fileName":"File Name","tags":"Tags","channelType":"Channel Type","channelNameCol":"Channel Name","uploadAddress":"Upload Address","fileSize":"Size","uploadTime":"Upload Time","actions":"Actions","externalTag":"External","unknownTag":"Unknown","detail":"Detail","copyLink":"Copy Link","moveFile":"Move","downloadFile":"Download","loadFailed":"Load failed","copySuccess":"Copied successfully","copyFailed":"Copy failed","deleteConfirm":"This will permanently delete this file. Continue?","deleteConfirmTitle":"Notice","deleteConfirmOk":"OK","deleteConfirmCancel":"Cancel","deleteSuccess":"Deleted successfully","deleteFailed":"Delete failed","blockConfirm":"This will add the file to blacklist. Continue?","blockSuccess":"Added to blacklist successfully","blockFailed":"Failed to add to blacklist","whiteConfirm":"This will add the file to whitelist. Continue?","whiteSuccess":"Added to whitelist successfully","whiteFailed":"Failed to add to whitelist","deleteFolderConfirm":"This will permanently delete this folder. Continue?","deleteFileConfirm":"This will permanently delete this file. Continue?","batchDeleteConfirm":"This will permanently delete selected files and folders. Continue?","batchDeleteSuccess":"Batch delete successful","batchDeleteFailed":"Batch delete failed","batchBlockConfirm":"This will add selected files to blacklist. Continue?","batchBlockSuccess":"Batch blacklist successful","batchBlockFailed":"Batch blacklist failed","batchWhiteConfirm":"This will add selected files to whitelist. Continue?","batchWhiteSuccess":"Batch whitelist successful","batchWhiteFailed":"Batch whitelist failed","noLinksAvailable":"No links to copy","batchCopySuccess":"Copied {count} links successfully","batchCopyFailed":"Batch copy failed, please retry","batchCopyLinksSuccess":"Batch copy successful","copyFileLinkSuccess":"File link copied","loadMoreFailed":"Failed to load more files, please check network","moveSuccess":"Moved successfully","moveFailed":"Move failed","moveTargetSameAsCurrent":"Target folder cannot be the current folder","invalidPageNumber":"Please enter a valid page number","pageExceedsMax":"Page number cannot exceed {max}","loadingData":"Loading data, please wait...","loadDataFailed":"Failed to load data, please check network","fetchFileListFailed":"Failed to fetch file list","refreshFailed":"Refresh failed, please retry","selectFilesFirst":"Please select files first","syncDataError":"Error syncing data, please check network","fetchingFileList":"Fetching file list...","folderEmptyNoLinks":"Folder is empty, no links to copy","copiedFileLinks":"Copied {count} file links","copyFolderLinksFailed":"Failed to copy folder links, please retry"},"dashboardTabs":{"fileManagement":"File Management","userManagement":"User Management","systemSettings":"System Settings","fileUpload":"File Upload"},"fileDetail":{"title":"File Details","download":"Download","tags":"Tags","blacklist":"Blacklist","whitelist":"Whitelist","deleteBtn":"Delete","edit":"Edit","rename":"Rename","save":"Save","cancel":"Cancel","originUrl":"Original Link","fileNameLabel":"File Name","fileNamePlaceholder":"Enter file name","fileType":"File Type","fileTypePlaceholder":"e.g. image/jpeg","fileSizeLabel":"File Size","imageDimensions":"Dimensions","noDimensions":"N/A","uploadTimeLabel":"Upload Time","channelTypeAndName":"Channel Type/Name","accessStatusAndReview":"Access Status/Review","uploadIP":"Upload IP","uploadAddressLabel":"Upload Address","fileTags":"File Tags","noTags":"No tags","unknown":"Unknown","accessNormal":"Normal","accessNormalWhitelist":"Normal (Whitelisted)","accessBlockedBlacklist":"Blocked (Blacklisted)","accessBlockedReview":"Blocked (Review rejected)","orientationLandscape":"Landscape","orientationPortrait":"Portrait","orientationSquare":"Square","linkCopied":"Link copied","metadataSaved":"Metadata saved successfully","metadataSaveFailed":"Failed to save metadata","renameTitle":"Rename File ID","renameLabel":"New File ID","renamePlaceholder":"Enter new File ID","renameCancel":"Cancel","renameConfirm":"Confirm Rename","renameSuccess":"File renamed successfully","renameConflict":"Target file name already exists","renameFailed":"Rename failed"},"filter":{"accessStatus":"Access Status","normal":"Normal","blocked":"Blocked","blackWhiteList":"Black/White List","whiteList":"Whitelist","blackList":"Blacklist","notSet":"Not Set","reviewResult":"Review Result","teenContent":"12+ Content","adultContent":"Adult Content","fileType":"File Type","image":"Image","video":"Video","audio":"Audio","other":"Other","channelType":"Channel Type","externalLink":"External Link","channelName":"Channel Name","clearFilters":"Clear Filters"},"moveFile":{"title":"Move File","batchTitle":"Batch Move Files","targetDirectory":"Target Directory","targetPlaceholder":"Enter target directory path","hint":"Tip: Paths starting with / indicate root directory, e.g. /photos/2024/","hintMobile":"Tip: Paths starting with / indicate root directory","selectDirectory":"Select Directory","cancel":"Cancel","confirm":"OK","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadTreeFailed":"Failed to load directory tree, please check network connection"},"batchTag":{"title":"Batch Tag Management","addTab":"Add","removeTab":"Remove","clearTab":"Clear","addDescription":"Add tags to {count} selected files","inputPlaceholder":"Enter tag name","pendingTags":"Tags to add","noPendingTags":"No tags to add","addToAllFiles":"Add to all files","removeDescription":"Remove common tags from selected files","commonTags":"Common Tags","noCommonTags":"Selected files have no common tags","clearDescription":"Clear all tags from {count} selected files","clearWarningTitle":"⚠️Warning","clearWarningDesc":"This will clear all tags from selected files and cannot be undone","confirmClearAll":"Confirm clear all tags","tagAlreadyInList":"Tag already in list","pleaseAddTags":"Please add tags first","addSuccess":"Tags added to {count} files successfully","addFailed":"Batch tag addition failed","removeSuccess":"Tags removed from {count} files successfully","removeFailed":"Tag removal failed","clearConfirmMessage":"Are you sure you want to clear all tags from {count} selected files? This cannot be undone.","clearConfirmTitle":"Confirm Clear","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","clearCancelled":"Clear operation cancelled","clearSuccess":"Tags cleared from {count} files successfully","clearFailed":"Failed to clear tags","loadCommonTagsFailed":"Failed to load common tags"},"tagManagement":{"title":"Tag Management","inputPlaceholder":"Enter tag name","currentTags":"Current Tags","noTags":"No tags","popularTags":"Popular Tags","loading":"Loading...","noPopularTags":"No popular tags","close":"Close","tagExists":"Tag already exists","addSuccess":"Tag added successfully","addFailed":"Failed to add tag","removeSuccess":"Tag removed successfully","removeFailed":"Failed to remove tag","loadFailed":"Failed to load tags"},"mobileAction":{"viewDetail":"View Details","copyLink":"Copy Link","downloadFile":"Download File","moveFile":"Move File","tagManagement":"Tag Management","moveFolder":"Move Folder","deleteFile":"Delete File","deleteFolder":"Delete Folder"},"mobileDirectory":{"title":"Directory Navigation","rootDirectory":"Root","goBack":"Go Back"},"sysConfig":{"logout":"Logout"},"sysConfigTabs":{"systemStatus":"System Status","uploadSettings":"Upload Settings","securitySettings":"Security Settings","pageSettings":"Page Settings","otherSettings":"Other Settings"},"sysStatus":{"totalFiles":"Total Files","clickToRefresh":"Click to refresh","indexUpdateTime":"Index Update Time","systemVersion":"System Version","clickToViewChangelog":"Click to view changelog","channelDistribution":"Upload Channel Distribution","fileStatusDistribution":"File Status Distribution","noData":"No data","totalFilesLabel":"Total Files","statusTypes":"Status Types","systemMaintenance":"System Maintenance","rebuildIndex":"Rebuild Index","rebuilding":"Rebuilding...","rebuildTooltip":"Rescan all files and update index data, useful for fixing data inconsistencies","backupData":"Backup Data","backingUp":"Backing up...","backupTooltip":"Backup all file metadata and system settings to a JSON file","restoreData":"Restore Data","restoring":"Restoring...","restoreTooltip":"Restore data from a backup file, this will overwrite existing file metadata and system settings","cancelOperation":"Cancel Operation","retry":"Retry","close":"Close","records":"records","aboutToComplete":"Almost done","seconds":"~{count} seconds","minutes":"~{count} minutes","hoursMinutes":"~{hours} hours {minutes} minutes","phaseFetching":"Fetching data","phaseSorting":"Sorting","phaseUploading":"Uploading","phaseFinalizing":"Finalizing","phaseBuilding":"Building backup","phaseDownloading":"Generating download","phaseRestoringFiles":"Restoring files","phaseRestoringSettings":"Restoring settings","phaseCompleted":"Completed","phaseRetrying":"Retrying","rebuildSuccess":"Index rebuild complete! Processed {count} files","backupSuccess":"Backup complete! Backed up {count} files","backupSuccessWithSettings":"Backup complete! Backed up {fileCount} files and {settingsCount} settings","operationInProgress":"An operation is already in progress","selectJsonFile":"Please select a JSON backup file","restoreConfirmMessage":"Restoring will overwrite existing file metadata and system settings. This cannot be undone. Continue?","restoreConfirmTitle":"Confirm Restore","restoreConfirmOk":"Confirm Restore","restoreConfirmCancel":"Cancel","invalidBackupFile":"Invalid backup file format, please select a valid JSON file","restoreSuccess":"Restore complete! Restored {files} files and {settings} settings, rebuilding index...","restoreFailed":"Failed to restore data","fetchIndexFailed":"Failed to fetch index information","unknown":"Unknown","blocked":"Blocked","normalStatus":"Normal","latestUpload":"Latest Upload","earliestUpload":"Earliest Upload","daysAgo":"{count} days ago","hoursAgo":"{count} hours ago","minutesAgo":"{count} minutes ago","justNow":"Just now","cancellingRebuild":"Cancelling index rebuild..."},"sysUpload":{"title":"Upload Channel Management","titleTooltip":"Manage all upload channel configurations. Click a card to view details or edit","filterPlaceholder":"Filter channel type","addChannel":"Add Channel","loadBalance":"Load Balance","unnamedChannel":"Unnamed Channel","envVariable":"Environment Variable","noChannels":"No {type} channels","detail":"Detail","editBtn":"Edit","deleteBtn":"Delete","addDialogTitle":"Add New Channel","channelTypeLabel":"Channel Type","channelTypePlaceholder":"Select channel type","channelNameLabel":"Channel Name","channelNamePlaceholder":"Enter channel name","botTokenLabel":"Bot Token","botTokenPlaceholder":"Enter Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"Enter Chat ID","proxyDomain":"Proxy Domain","proxyDomainPlaceholder":"Optional, e.g.: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"e.g.: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN Domain","cdnDomainPlaceholder":"If using CDN, enter CDN domain, e.g.: https://cdn.example.com","cdnDomainTip":"Optional. When configured, files will be served via CDN for faster access and lower costs","bucketName":"Bucket Name","bucketNamePlaceholder":"Enter bucket name","bucketRegion":"Bucket Region","bucketRegionPlaceholder":"Default: auto","accessKeyId":"Access Key ID","accessKeyIdPlaceholder":"Enter Access Key ID","secretAccessKey":"Secret Access Key","secretAccessKeyPlaceholder":"Enter Secret Access Key","pathStyle":"Path Style","pathStyleTip":"Enable when using services incompatible with host-style like OpenList","quotaLimit":"Quota Limit","quotaLimitGB":"Quota Limit (GB)","quotaThreshold":"Disable Threshold (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"Enter Channel ID","nitroMember":"Nitro Member","nitroTip":"Nitro members: 25MB per file, otherwise 10MB","discordWarning":"Discord has API rate limits, not recommended for high-concurrency scenarios","repoName":"Repository Name","repoNamePlaceholder":"Format: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"Enter Access Token","privateRepo":"Private Repository","privateRepoTip":"Private repository limit: 100GB","webdavBaseUrl":"WebDAV Base URL","webdavBaseUrlPlaceholder":"e.g.: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"Username","webdavUsernamePlaceholder":"Optional username","webdavPassword":"Password","webdavPasswordPlaceholder":"Optional password","webdavPublicUrlPlaceholder":"Optional public URL, e.g.: https://cdn.example.com/imgbed/","webdavPublicUrlTip":"Optional. When configured, the server can read files directly from this URL","webdavHeaders":"Custom Headers","webdavHeadersPlaceholder":"Optional JSON object, e.g.: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"Custom headers must be a valid JSON object","webdavCreateDirectory":"Auto Create Directories","webdavCreateDirectoryTip":"Create parent directories before uploading files","cancel":"Cancel","confirmAdd":"Confirm Add","detailDialogTitle":"Channel Details - {name}","channelNameDetail":"Channel Name","channelTypeDetail":"Channel Type","statusLabel":"Status","enabled":"Enabled","disabled":"Disabled","configSource":"Config Source","publicUrl":"Public Access URL","notSet":"Not Set","isPathStyle":"Yes","isNotPathStyle":"No","currentUsage":"Current Usage","closeBtn":"Close","editDialogTitle":"Edit Channel - {name}","enableChannel":"Enable Channel","saveChanges":"Save Changes","r2ConfigNote":"Please follow the R2 Channel Configuration documentation to add R2 channels","reservedName":"This name is reserved by the system, please use another name","duplicateName":"A channel with this name already exists, please use another name","fixedChannelCannotDelete":"Channels configured via environment variables cannot be deleted","deleteChannelConfirm":"Are you sure you want to delete this channel?","quotaInitConfirm":"First time enabling quota requires calculating existing file sizes, this may take some time. Calculate now?","quotaInitTitle":"Initialize Quota Statistics","quotaInitConfirmBtn":"Calculate Now","quotaInitCancelBtn":"Calculate Later","quotaInitLater":"You can click the refresh button to calculate later","quotaCalculating":"Calculating quota, please wait...","quotaCalculateSuccess":"Quota calculation complete","quotaCalculateFailed":"Calculation failed","quotaCalculateError":"Calculation failed: "},"sysSecurity":{"authManagement":"Authentication Management","userAuth":"User Authentication","adminAuth":"Admin Authentication","uploadPassword":"Upload Password","confirmPassword":"Confirm Password","adminUsername":"Username","adminPassword":"Password","apiTokenManagement":"API Token Management","imageReview":"Image Review","imageReviewTooltip":"Only applies to non-chunked uploads, supports nsfwjs and moderatecontent.com channels","enableReview":"Enable Review","reviewChannel":"Review Channel","reviewChannelPlaceholder":"Select review channel","apiKey":"API Key","apiPath":"API Path","uploadManagement":"Upload Management","accessManagement":"Access Management","domainFilter":"Domain Filter","allowedDomains":"Allowed Domains","allowedDomainsTooltip":"1. Set permissions based on access domain
2. Leave empty to allow all, separate multiple domains with commas","whiteListMode":"Whitelist Mode","enableWhiteList":"Enable","enableWhiteListTooltip":"1. Set permissions based on files
2. When enabled, only whitelisted files can be accessed","settingsSaved":"Settings saved","tokenName":"Name","tokenValue":"Token","permissions":"Permissions","createdAt":"Created At","status":"Status","expiresAt":"Expires At","operation":"Actions","editBtn":"Edit","deleteBtn":"Delete","permUpload":"Upload","permDelete":"Delete","permList":"List","permManage":"Manage","createTokenTitle":"Create New API Token","tokenNameLabel":"Token Name","tokenNamePlaceholder":"Enter token name","permissionsLabel":"Permissions","neverExpire":"Never Expire","validPeriod":"Valid Period","autoDeleteOnExpire":"Auto-delete on expiry","createBtn":"Create","editTokenTitle":"Edit API Token","updateBtn":"Update","tokenCreatedTitle":"Token Created Successfully","tokenCreatedWarning":"Please save the following token. You won\'t be able to view the full token after closing this dialog!","fullToken":"Full Token","copyBtn":"Copy","savedBtn":"I\'ve Saved It","tokenCopied":"Token copied to clipboard","copyFailed":"Copy failed, please copy manually","tokenCreateSuccess":"Token created successfully","tokenCreateFailed":"Failed to create token","tokenUpdateSuccess":"Token updated successfully","tokenUpdateFailed":"Failed to update token","tokenDeleteConfirm":"This will permanently delete this token. Continue?","tokenDeleteConfirmTitle":"Notice","tokenDeleteConfirmOk":"OK","tokenDeleteConfirmCancel":"Cancel","tokenDeleteSuccess":"Token deleted successfully","tokenDeleteFailed":"Failed to delete token","tokenListFailed":"Failed to fetch token list","passwordUrlReserved":"Password cannot contain URL reserved characters: % & ? # /","confirmUploadPassword":"Please re-enter upload password","confirmAdminPassword":"Please re-enter admin password","passwordMismatch":"Passwords do not match","passwordUnchanged":"Unchanged (leave empty to keep current password)","adminPasswordChangedRelogin":"Admin password changed, redirecting to login page","clearPassword":"Clear password","tokenNameRequired":"Please enter token name","permissionsRequired":"Please select permissions","validPeriodRequired":"Valid period must be greater than 0","timeUnitSeconds":"seconds","timeUnitMinutes":"minutes","timeUnitHours":"hours","timeUnitDays":"days","timeUnitMonths":"months","timeUnitYears":"years","sessionSecurityPolicy":"Session Security Policy","secureMode":"Secure Mode","secureModeTooltip":"When enabled, cookies are only transmitted over HTTPS. Make sure your site has HTTPS enabled","userSessionMaxAge":"User Session Max Age","adminSessionMaxAge":"Admin Session Max Age","sessionMaxAgeUnit":"days","sessionMaxAgeInvalid":"Session max age must be a positive integer greater than 0"},"sysPage":{"settingsSaved":"Settings saved","otherSettings":"Other Settings","channelSelectPlaceholder":"Please select upload channel first"},"sysOthers":{"remoteTelemetry":"Remote Telemetry","remoteTelemetryTooltip":"Helps with issue tracking and debugging, recommended to enable","enable":"Enable","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"When set, backend operations like blocking and deleting won\'t be affected by CDN cache
Recommended, see documentation for setup","zoneId":"Zone ID","accountEmail":"Account Email","randomImageApi":"Random Image API","randomImageApiTooltip":"See documentation for API usage details","directory":"Directory","directoryTooltip":"1. Directories with random image access, defaults to root. Separate multiple directories with commas
2. All directories use absolute paths, e.g. /img/cover, meaning files in this directory and all subdirectories can be accessed by the random image API","publicBrowse":"Public Gallery","publicBrowseTooltip":"When enabled, visitors can browse images in specified directories via /browse path (read-only, no delete/move)","openDirectory":"Open Directory","openDirectoryTooltip":"

Directories open for public browsing, separate multiple with commas

Example: wallpaper,photos,album

Supports subdirectories: 2026/lucky,2026/rich

Access URL: https://your.domain/browse/2026/lucky

","webdav":"WebDAV","webdavTooltip":"When enabled, images can be accessed and managed via WebDAV protocol","webdavUsername":"Username","webdavPassword":"Password","webdavUploadChannel":"Upload Channel","webdavDefaultChannel":"Default Channel","webdavChannelName":"Specified Channel","settingsSaved":"Settings saved"},"customerConfig":{"uploadFileList":"Upload File List","fileNameCol":"File Name","filePreview":"File Preview","uploadTimeCol":"Upload Time","ipAddress":"IP Address","address":"Address","uploadCount":"Upload Count","allowUpload":"Allow Upload","allow":"Allow","deny":"Deny","loadMore":"Load More","loadError":"Error loading more data, please check network connection","syncError":"Error syncing data, please check network connection"},"publicBrowse":{"searchPlaceholder":"Search file name or #page","fileCount":"{count} files","loading":"Loading...","retry":"Retry","creditText":"Gallery code contributed by LinJiang","loadingMore":"Loading...","allLoaded":"All loaded","creditLink":"LinJiang","browseDisabled":"Public browsing is not enabled","directoryNotAllowed":"This directory is not open for public access","accessDenied":"Access denied","loadFailed":"Load failed, please retry","rootDirectory":"Root","copyLink":"Copy Link","copied":"Copied","downloadBtn":"Download","swipeHint":"← Swipe to navigate →","rotate90":"Rotate 90°"},"transformMedia":{"download":"Download","playbackSpeed":"Playback Speed","normalSpeed":"Normal","playMode":"Play Mode","stopAfterPlay":"Stop After Play","sequentialPlay":"Sequential Play","loopSingle":"Loop Single","more":"More"},"directoryTree":{"selectDirectory":"Select Directory","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadFailed":"Failed to load directory tree, please check network connection"},"floatingSave":{"saving":"Saving","save":"Save"},"theme":{"lightMode":"Light Mode","darkMode":"Dark Mode","autoMode":"Auto Mode"},"common":{"confirm":"OK","cancel":"Cancel","close":"Close","save":"Save","delete":"Delete","edit":"Edit","copy":"Copy","download":"Download","retry":"Retry","loading":"Loading...","success":"Success","failed":"Failed","warning":"Warning","info":"Notice","yes":"Yes","no":"No","all":"All Types","select":"Select"},"validation":{"pathMustStartWithSlash":"Path must start with \\"/\\"","pathTraversalNotAllowed":"Path cannot contain \\"..\\"","singleDotNotAllowed":"Path cannot contain standalone \\".\\"","consecutiveSlashNotAllowed":"Path cannot contain consecutive slashes","invalidCharacters":"Path contains invalid characters, please use a valid path format","uploadDirReplace":"Upload directory"},"language":{"switchTo":"中/En","switchLanguage":"Switch Language"},"whitelist":{"title":"Whitelist Mode Enabled","description":"Sorry, the whitelist mode is currently enabled. Uploaded images need to be approved before they can be displayed. Please wait for approval.","goHome":"Go Home","goBack":"Go Back","helpText":"You can try:","uploadImage":"Upload Image","refreshPage":"Refresh Page"}}');const i="app-locale";function s(){const e=localStorage.getItem(i);return"zh-CN"===e||"en"===e?e:"zh-CN"}const r=(0,o.hU)({legacy:!0,locale:s(),fallbackLocale:"zh-CN",messages:{"zh-CN":n,en:l}});function d(e){r.global.locale=e,localStorage.setItem(i,e),document.documentElement.lang="zh-CN"===e?"zh-CN":"en"}var c=r},50248:function(e,a,t){t(18111),t(7588);var o=t(45130),n=t(73888),l=t(18642),i=(t(15412),t(30372),t(98950)),s=t(2353),r=t(30292),d=t(97722),c=(t(85331),t(10961),t(56768));function u(e,a,t,o,n,l){const i=(0,c.g2)("router-view"),s=d.H6;return(0,c.uX)(),(0,c.Wv)(s,{locale:l.elementLocale},{default:(0,c.k6)(()=>[(0,c.bF)(i)]),_:1},8,["locale"])}var m=t(60782),p=t(6166),h=t(55186),g=t(54791),f={data(){return{osInstance:null,imageViewerObserver:null}},computed:{...(0,m.L8)(["userConfig","useDarkMode"]),elementLocale(){return"zh-CN"===this.$i18n.locale?h.A:g.A}},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars(),this.setupImageViewerObserver()})},beforeUnmount(){this.imageViewerObserver&&this.imageViewerObserver.disconnect()},watch:{},methods:{initOverlayScrollbars(){try{if(p.ae.valid(document.body))return void(this.osInstance=(0,p.ae)(document.body));this.osInstance=(0,p.ae)(document.body,{scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"scroll",autoHideDelay:600,dragScroll:!0,clickScroll:!0},overflow:{x:"hidden",y:"scroll"}}),console.log("OverlayScrollbars initialized successfully")}catch(e){console.error("Failed to initialize OverlayScrollbars:",e)}},setupImageViewerObserver(){this.imageViewerObserver=new MutationObserver(e=>{const a=document.querySelector(".el-image-viewer__wrapper");a?this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"hidden"}}):this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"scroll"}})}),this.imageViewerObserver.observe(document.body,{childList:!0,subtree:!0})}}},y=t(71241);const b=(0,y.A)(f,[["render",u]]);var C=b,k=t(16915),w=t(25507),T=t(46638),v=t(57477);t(21862),t(50635);i.Yv.add(s.X7I);const S=(0,o.Ef)(C),F=(0,n.Zf)();S.component("font-awesome-icon",r.gc);for(const[U,N]of Object.entries(v))S.component(U,N);const A=()=>{const e=document.documentElement;let a;if(w.A.state.cusDarkMode&&null!==w.A.state.useDarkMode)a=w.A.state.useDarkMode;else{if(a=window.matchMedia("(prefers-color-scheme: dark)").matches,!a){const e=new Date,t=e.getHours();a=t>=22||t<6}w.A.commit("setUseDarkMode",a)}a?e.classList.add("dark"):e.classList.remove("dark")},P=e=>{const a=document.documentElement;e?a.classList.add("dark"):a.classList.remove("dark")},D=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},L=(e,a)=>{const t=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');t.forEach(e=>e.remove());const o=document.createElement("link"),n=document.createElement("link"),l=document.createElement("link");o.rel="icon",n.rel="apple-touch-icon",l.rel="mask-icon",e?(o.href=a?.siteIcon||"/static/media/logo-dark.png",n.href=a?.siteIcon||"/static/media/logo-dark.png",l.href=a?.siteIcon||"/static/media/logo-dark.png"):(o.href=a?.siteIcon||"/static/media/logo.png",n.href=a?.siteIcon||"/static/media/logo.png",l.href=a?.siteIcon||"/static/media/logo.png"),document.head.appendChild(o),document.head.appendChild(n),document.head.appendChild(l)};w.A.dispatch("fetchUserConfig").then(()=>{A(),D(w.A.getters.userConfig),L(w.A.state.useDarkMode,w.A.getters.userConfig),w.A.subscribe((e,a)=>{"setUseDarkMode"===e.type&&w.A.state.cusDarkMode&&(P(a.useDarkMode),L(a.useDarkMode,w.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(A(),L(w.A.state.useDarkMode,w.A.getters.userConfig))}),S.use(w.A).use(k.A).use(l.A).use(T.Ay).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),S.use(w.A).use(k.A).use(l.A).use(T.Ay).use(F).mount("#app")})}},a={};function t(o){var n=a[o];if(void 0!==n)return n.exports;var l=a[o]={exports:{}};return e[o].call(l.exports,l,l.exports,t),l.exports}t.m=e,function(){var e=[];t.O=function(a,o,n,l){if(!o){var i=1/0;for(c=0;c=l)&&Object.keys(t.O).every(function(e){return t.O[e](o[r])})?o.splice(r--,1):(s=!1,l0&&e[c-1][2]>l;c--)e[c]=e[c-1];e[c]=[o,n,l]}}(),function(){t.n=function(e){var a=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(a,{a:a}),a}}(),function(){t.d=function(e,a){for(var o in a)t.o(a,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:a[o]})}}(),function(){t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce(function(a,o){return t.f[o](e,a),a},[]))}}(),function(){t.u=function(e){return"js/"+e+"."+{51:"6e7bf298",75:"75dccc00",226:"ec43855c",309:"b7dca603",365:"ae007b9b",396:"226339af",454:"54701290",600:"08192622",604:"7ad54f22",718:"27080555",728:"42caee39",917:"b77a6783"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{51:"1dd65d6c",75:"eb4ff77d",226:"6548e7b4",365:"953080b6",396:"3a3d9729",428:"8044ed41",454:"1a1814c6",604:"7c4f56c5",718:"d0974d1c",728:"7c4f56c5",740:"a94dbb46",833:"95983fa6",917:"8529ad1e"}[e]+".css"}}(),function(){t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)}}(),function(){var e={},a="sanyue_imghub:";t.l=function(o,n,l,i){if(e[o])e[o].push(n);else{var s,r;if(void 0!==l)for(var d=document.getElementsByTagName("script"),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 M1LCv35wOz$01(JIumAu6 diff --git a/frontend-dist/js/app.5a29ed6b.js b/frontend-dist/js/app.5a29ed6b.js new file mode 100644 index 00000000..3594d1f8 --- /dev/null +++ b/frontend-dist/js/app.5a29ed6b.js @@ -0,0 +1,2 @@ +(function(){"use strict";var e={457:function(e,a,t){var o=t(94373);const n=o.A.create({baseURL:"/",withCredentials:!0});a.A=n},16915:function(e,a,t){var o=t(48512),n=t(51219),l=t(25507),i=t(457),r=t(46638);const s=(e,a,t)=>{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.adminRequired)return l.A.commit("setAdminLoggedIn",!0),t();if(o.valid&&"admin"===o.authType)return l.A.commit("setAdminLoggedIn",!0),t();const i=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()}).catch(()=>{const a=l.A.state.adminLoggedIn;l.A.commit("setAdminLoggedIn",!1),"adminLogin"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"adminLogin"})):t()})},d=(e,a,t)=>{i.A.get("/api/auth/sessionCheck",{withCredentials:!0}).then(a=>{const o=a.data||{};if(!o.userRequired)return l.A.commit("setUserLoggedIn",!0),t();if(o.valid)return l.A.commit("setUserLoggedIn",!0),t();const i=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(i&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()}).catch(()=>{const a=l.A.state.userLoggedIn;l.A.commit("setUserLoggedIn",!1),"login"!==e.name?(a&&n.nk.error(r.Ay.global.t("login.authRequired")),t({name:"login"})):t()})},c=[{path:"/",name:"home",component:()=>Promise.all([t.e(740),t.e(600),t.e(428),t.e(731)]).then(t.bind(t,29319)),beforeEnter:d},{path:"/login",name:"login",component:()=>Promise.all([t.e(600),t.e(604)]).then(t.bind(t,61880))},{path:"/dashboard",name:"dashboard",component:()=>Promise.all([t.e(740),t.e(309),t.e(428),t.e(454)]).then(t.bind(t,14379)),beforeEnter:s},{path:"/customerConfig",name:"customerConfig",component:()=>Promise.all([t.e(740),t.e(309),t.e(833),t.e(396)]).then(t.bind(t,59396)),beforeEnter:s},{path:"/systemConfig",name:"systemConfig",component:()=>Promise.all([t.e(740),t.e(309),t.e(833),t.e(369)]).then(t.bind(t,8369)),beforeEnter:s},{path:"/adminLogin",name:"adminLogin",component:()=>Promise.all([t.e(600),t.e(728)]).then(t.bind(t,16556))},{path:"/blockimg",name:"blockimg",component:()=>t.e(917).then(t.bind(t,74917))},{path:"/whiteliston",name:"whiteliston",component:()=>t.e(51).then(t.bind(t,31051))},{path:"/browse/:dir*",name:"publicBrowse",component:()=>t.e(718).then(t.bind(t,49718))},{path:"/:pathMatch(.*)*",name:"notFound",component:()=>t.e(226).then(t.bind(t,68226))}],u=(0,o.aE)({history:(0,o.LA)("/"),routes:c});a.A=u},25507:function(e,a,t){t(18111),t(61701);var o=t(60782),n=t(457),l=t(55131);a.A=(0,o.y$)({state:{userConfig:null,bingWallPapers:[],adminLoggedIn:!1,userLoggedIn:!1,uploadMethod:"default",uploadCopyUrlForm:"",compressConfig:{customerCompress:void 0,compressQuality:void 0,compressBar:void 0,serverCompress:void 0,convertToWebp:void 0},storeUploadChannel:"",storeChannelName:null,storeAutoRetry:!0,storeUploadNameType:"",uploadFolder:"",customUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},adminUrlSettings:{useCustomUrl:"false",customUrlPrefix:""},autoReUpload:!0,useDarkMode:null,cusDarkMode:!1},getters:{userConfig:e=>e.userConfig,bingWallPapers:e=>e.bingWallPapers,credentials:e=>e.adminLoggedIn?"__session__":null,adminLoggedIn:e=>e.adminLoggedIn,userLoggedIn:e=>e.userLoggedIn,storeUploadMethod:e=>e.uploadMethod,uploadCopyUrlForm:e=>e.uploadCopyUrlForm,compressConfig:e=>e.compressConfig,storeUploadChannel:e=>e.storeUploadChannel,storeChannelName:e=>e.storeChannelName,storeUploadNameType:e=>e.storeUploadNameType,customUrlSettings:e=>e.customUrlSettings,storeAutoRetry:e=>e.storeAutoRetry,adminUrlSettings:e=>e.adminUrlSettings,storeUploadFolder:e=>e.uploadFolder||localStorage.getItem("uploadFolder")||"",useDarkMode:e=>e.useDarkMode,cusDarkMode:e=>e.cusDarkMode,storeAutoReUpload:e=>e.autoReUpload},mutations:{setUserConfig(e,a){e.userConfig=a},setBingWallPapers(e,a){e.bingWallPapers=a},setCredentials(e,a){e.adminLoggedIn=null!==a&&void 0!==a},setAdminLoggedIn(e,a){e.adminLoggedIn=a},setUserLoggedIn(e,a){e.userLoggedIn=a},setUploadMethod(e,a){e.uploadMethod=a},setUploadCopyUrlForm(e,a){e.uploadCopyUrlForm=a},setCompressConfig(e,{key:a,value:t}){e.compressConfig[a]=t},setStoreUploadChannel(e,a){e.storeUploadChannel=a},setStoreChannelName(e,a){e.storeChannelName=a},setStoreUploadNameType(e,a){e.storeUploadNameType=a},setCustomUrlSettings(e,{key:a,value:t}){e.customUrlSettings[a]=t},setStoreAutoRetry(e,a){e.storeAutoRetry=a},setAdminUrlSettings(e,{key:a,value:t}){e.adminUrlSettings[a]=t},setUseDarkMode(e,a){e.useDarkMode=a},setCusDarkMode(e,a){e.cusDarkMode=a},setStoreUploadFolder(e,a){e.uploadFolder=a,localStorage.setItem("uploadFolder",a)},setStoreAutoReUpload(e,a){e.autoReUpload=a}},actions:{async fetchUserConfig({commit:e}){try{const a=await n.A.get("/api/userConfig");e("setUserConfig",a.data)}catch(a){console.log(a)}},async fetchBingWallPapers({commit:e}){try{const a=await n.A.get("/api/bing/wallpaper"),t=a.data.data,o=t.map(e=>({url:"https://www.bing.com"+e.url}));await Promise.all(o.map(e=>new Promise((a,t)=>{const o=new Image;o.onload=a,o.onerror=t,o.src=e.url}))),e("setBingWallPapers",o)}catch(a){console.log(a)}}},modules:{},plugins:[(0,l.A)({paths:["userConfig","uploadMethod","uploadCopyUrlForm","compressConfig","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode"]})]})},46638:function(e,a,t){t.d(a,{Ay:function(){return c},xS:function(){return d}});var o=t(85384),n=JSON.parse('{"login":{"title":"登录到 {owner} 图床","adminTitle":"管理端登录","password":"密码","username":"用户名","passwordPlaceholder":"请输入认证码","usernamePlaceholder":"请输入用户名","adminPasswordPlaceholder":"请输入密码","submit":"登录","success":"登录成功","failed":"登录失败,请检查密码是否正确","adminFailed":"用户名或密码错误","serverError":"服务器错误","systemError":"系统错误","authRequired":"请先认证!","authFailed":"认证失败!"},"upload":{"folderPlaceholder":"上传目录","pasteUpload":"粘贴上传","fileUpload":"文件上传","dragUploadText":"拖拽 点击Ctrl + V 粘贴上传","pasteUrlPlaceholder":"粘贴外链上传,多个外链用换行分隔","pasteUploadBtn":"上 传","pasteSave":"转存","pasteExternal":"外链","history":"上传记录","announcement":"查看公告","noAnnouncement":"暂无公告","announcementTitle":"公告","announcementAck":"我已知晓!","settings":"上传设置","linkFormat":"链接格式","manage":"系统管理","logout":"退出登录","logoutSuccess":"已退出登录","viewDocs":"查看文档","switchUploadMethod":"切换上传方式","copyAll":"整体复制","retryFailed":"失败重试","clearList":"清空列表","clearAll":"清空全部","clearUploaded":"清空已上传"},"uploadForm":{"deleted":"{name}已删除","uploadSuccess":"{name}上传成功","uploadFailed":"{name}上传失败","compressFailedCannotUpload":"{name}压缩失败,无法上传!","fileTooLarge":"{name}文件过大,无法上传!","compressedFileTooLarge":"{name}压缩后文件过大,无法上传!","copySuccess":"复制成功","copyFailed":"复制失败","copyAllSuccess":"整体复制成功","fileNotUploaded":"文件未上传成功,无法复制链接","fileListCleared":"文件列表已清空","fileListEmpty":"文件列表为空","successFilesCleared":"成功上传文件已清空","successFilesEmpty":"成功上传文件为空","noFailedFiles":"无上传失败文件","autoRetryOn":"自动重试已开启","autoRetryOff":"自动重试已关闭","autoRetry":"自动重试","maxRetryReached":"{name} 已达到最大重试次数({max}),停止重试","urlRequestFailed":"粘贴板中的URL地址请求失败","chunkMerging":"分块上传完成,正在合并文件,请耐心等待...","fileSizeTooLarge":"文件过大","chunkInitFailed":"初始化分块上传失败","uploadError":"上传过程中发生错误","imageLoadFailed":"图片加载失败"},"uploadSettings":{"title":"上传设置","uploadChannel":"上传渠道","channelType":"渠道类型","channelName":"渠道名称","channelNameTooltip":"选择具体的渠道名称,不选择则使用负载均衡或默认渠道","autoSelect":"自动选择","uploadDirectory":"上传目录","uploadDirectoryPlaceholder":"请输入上传目录路径","autoSwitch":"自动切换","autoSwitchTooltip":"对于非分块上传文件,上传失败自动切换到其他渠道上传","fileNaming":"文件命名方式","namingDefault":"默认","namingIndex":"仅前缀","namingOrigin":"仅原名","namingShort":"短链接","filePreprocess":"文件预处理","filePreprocessTooltip":"上传前在本地进行格式转换和压缩,仅对图片文件生效","convertToWebp":"转换为WebP","convertToWebpTooltip":"上传前将图片转换为WebP格式,可有效减小文件体积。转换失败时保持原格式上传","fileCompress":"文件压缩","compressThreshold":"压缩阈值","compressThresholdTooltip":"设置图片大小阈值,超过此值将自动压缩,单位MB","expectedSize":"期望大小","expectedSizeTooltip":"设置压缩后图片大小期望值,单位MB","serverCompress":"服务端压缩","serverCompressTooltip":"1. 在 Telegram 端进行压缩,仅对上传渠道为 Telegram 的图片文件生效
2. 若图片大小(本地压缩后大小)大于10MB,本设置自动失效
3. 若上传分辨率过大、透明背景等图片,建议关闭服务端压缩,否则可能出现未知问题","enableCompress":"开启压缩","confirm":"确定"},"uploadHistory":{"title":"历史记录","totalRecords":"共 {count} 条","switchView":"切换视图","clearRecords":"清空记录","loading":"加载中...","pullToLoadMore":"下拉加载更多","noMoreRecords":"没有更多记录了","emptyHistory":"暂无上传记录","linkCopied":"链接已复制","copyFailed":"复制失败","clearConfirmTitle":"提示","clearConfirmMessage":"确定要清空所有上传记录吗?","clearConfirmOk":"确定","clearConfirmCancel":"取消","recordsCleared":"记录已清空","deleteConfirmMessage":"确定要删除这条记录吗?","recordDeleted":"记录已删除"},"settings":{"linkFormatTitle":"链接格式设置","defaultCopyLink":"默认复制链接","rawLink":"原始链接","customLink":"自定义链接","customLinkTooltip":"默认链接为https://your.domain/file/xxx.jpg
如果启用自定义链接格式,只保留xxx.jpg部分,其他部分请自行输入","enableCustom":"启用自定义","customPrefix":"自定义前缀","customPrefixPlaceholder":"请输入自定义链接前缀","confirm":"确定","s3Link":"S3链接"},"dashboard":{"searchPlaceholder":"搜索:#标签 -#排除标签","sortByDateDesc":"按时间倒序","sortByNameAsc":"按名称升序","selectPage":"全选此页","copy":"复制","delete":"删除","download":"下载","move":"移动","tagManagement":"标签管理","addToBlacklist":"加入黑名单","addToWhitelist":"加入白名单","linkFormat":"链接格式","listView":"列表视图","cardView":"卡片视图","logout":"退出登录","rootDirectory":"根目录","totalFiles":"共 {count} 个文件","noMatchingFiles":"未找到匹配的文件或文件夹","currentDirEmpty":"当前目录为空","adjustSearchHint":"尝试调整搜索条件或筛选器","uploadHint":"上传文件后将显示在这里","loadMore":"加载更多","totalPages":"共 {count} 页","jumpTo":"跳至","preview":"预览","fileName":"文件名","tags":"标签","channelType":"渠道类型","channelNameCol":"渠道名称","uploadAddress":"上传地址","fileSize":"大小","uploadTime":"上传时间","actions":"操作","externalTag":"外链","unknownTag":"未知","detail":"详情","copyLink":"复制链接","moveFile":"移动","downloadFile":"下载","loadFailed":"加载失败","copySuccess":"复制成功","copyFailed":"复制失败","deleteConfirm":"此操作将永久删除该文件, 是否继续?","deleteConfirmTitle":"提示","deleteConfirmOk":"确定","deleteConfirmCancel":"取消","deleteSuccess":"删除成功","deleteFailed":"删除失败","blockConfirm":"此操作将把该文件加入黑名单, 是否继续?","blockSuccess":"加入黑名单成功","blockFailed":"加入黑名单失败","whiteConfirm":"此操作将把该文件加入白名单, 是否继续?","whiteSuccess":"加入白名单成功","whiteFailed":"加入白名单失败","deleteFolderConfirm":"此操作将永久删除文件夹, 是否继续?","deleteFileConfirm":"此操作将永久删除该文件, 是否继续?","batchDeleteConfirm":"此操作将永久删除选中的文件及文件夹, 是否继续?","batchDeleteSuccess":"批量删除成功","batchDeleteFailed":"批量删除失败","batchBlockConfirm":"此操作将把选中的文件加入黑名单, 是否继续?","batchBlockSuccess":"批量加入黑名单成功","batchBlockFailed":"批量加入黑名单失败","batchWhiteConfirm":"此操作将把选中的文件加入白名单, 是否继续?","batchWhiteSuccess":"批量加入白名单成功","batchWhiteFailed":"批量加入白名单失败","noLinksAvailable":"没有可复制的链接","batchCopySuccess":"批量复制 {count} 个链接成功","batchCopyFailed":"批量复制链接失败,请重试","batchCopyLinksSuccess":"批量复制链接成功","copyFileLinkSuccess":"复制文件链接成功","loadMoreFailed":"加载更多文件失败,请检查网络连接","moveSuccess":"移动成功","moveFailed":"移动失败","moveTargetSameAsCurrent":"目标文件夹不能是当前文件夹","invalidPageNumber":"请输入有效的页码","pageExceedsMax":"页码不能超过 {max}","loadingData":"正在加载数据,请稍候...","loadDataFailed":"加载数据失败,请检查网络连接","fetchFileListFailed":"获取文件列表失败","refreshFailed":"刷新失败,请重试","selectFilesFirst":"请先选择文件","syncDataError":"同步数据时出错,请检查网络连接","fetchingFileList":"正在获取文件列表...","folderEmptyNoLinks":"文件夹为空,没有可复制的链接","copiedFileLinks":"已复制 {count} 个文件链接","copyFolderLinksFailed":"复制文件夹链接失败,请重试"},"dashboardTabs":{"fileManagement":"文件管理","userManagement":"用户管理","systemSettings":"系统设置","fileUpload":"文件上传"},"fileDetail":{"title":"文件详情","download":"下载","tags":"标签","blacklist":"黑名单","whitelist":"白名单","deleteBtn":"删除","edit":"编辑","rename":"重命名","save":"保存","cancel":"取消","originUrl":"原始链接","fileNameLabel":"文件名","fileNamePlaceholder":"请输入文件名","fileType":"文件类型","fileTypePlaceholder":"如 image/jpeg","fileSizeLabel":"文件大小","imageDimensions":"图片尺寸","noDimensions":"无","uploadTimeLabel":"上传时间","channelTypeAndName":"渠道类型/名称","accessStatusAndReview":"访问状态/审查","uploadIP":"上传IP","uploadAddressLabel":"上传地址","fileTags":"文件标签","noTags":"暂无标签","unknown":"未知","accessNormal":"正常","accessNormalWhitelist":"正常(白名单)","accessBlockedBlacklist":"已屏蔽(黑名单)","accessBlockedReview":"已屏蔽(审查不通过)","orientationLandscape":"横","orientationPortrait":"竖","orientationSquare":"方","linkCopied":"链接已复制","metadataSaved":"元数据保存成功","metadataSaveFailed":"保存元数据失败","renameTitle":"重命名 File ID","renameLabel":"新 File ID","renamePlaceholder":"请输入新的 File ID","renameCancel":"取消","renameConfirm":"确认重命名","renameSuccess":"文件重命名成功","renameConflict":"目标文件名已存在","renameFailed":"重命名失败"},"filter":{"accessStatus":"访问状态","normal":"正常","blocked":"已屏蔽","blackWhiteList":"黑白名单","whiteList":"白名单","blackList":"黑名单","notSet":"未设置","reviewResult":"审查结果","teenContent":"12+内容","adultContent":"成人内容","fileType":"文件类型","image":"图片","video":"视频","audio":"音频","other":"其他","channelType":"渠道类型","externalLink":"外链","channelName":"渠道名称","clearFilters":"清除筛选"},"moveFile":{"title":"移动文件","batchTitle":"批量移动文件","targetDirectory":"目标目录","targetPlaceholder":"请输入目标目录路径","hint":"提示:路径以 / 开头表示根目录,如 /photos/2024/","hintMobile":"提示:路径以 / 开头表示根目录","selectDirectory":"选择目录","cancel":"取消","confirm":"确定","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadTreeFailed":"加载目录树失败,请检查网络连接"},"batchTag":{"title":"批量标签管理","addTab":"添加","removeTab":"移除","clearTab":"清空","addDescription":"为选中的 {count} 个文件添加标签","inputPlaceholder":"输入标签名称","pendingTags":"待添加的标签","noPendingTags":"暂无待添加标签","addToAllFiles":"添加到所有文件","removeDescription":"移除选中文件的共有标签","commonTags":"共有标签","noCommonTags":"选中的文件没有共有标签","clearDescription":"清空选中的 {count} 个文件的所有标签","clearWarningTitle":"⚠️警告","clearWarningDesc":"此操作将清空所有选中文件的标签,且不可恢复","confirmClearAll":"确认清空所有标签","tagAlreadyInList":"标签已在列表中","pleaseAddTags":"请先添加要批量添加的标签","addSuccess":"成功为 {count} 个文件添加标签","addFailed":"批量添加标签失败","removeSuccess":"成功从 {count} 个文件中移除标签","removeFailed":"移除标签失败","clearConfirmMessage":"确定要清空选中的 {count} 个文件的所有标签吗?此操作不可恢复。","clearConfirmTitle":"确认清空","clearConfirmOk":"确定","clearConfirmCancel":"取消","clearCancelled":"已取消清空操作","clearSuccess":"成功清空 {count} 个文件的标签","clearFailed":"清空标签失败","loadCommonTagsFailed":"加载共有标签失败"},"tagManagement":{"title":"标签管理","inputPlaceholder":"输入标签名称","currentTags":"当前标签","noTags":"暂无标签","popularTags":"常用标签","loading":"加载中...","noPopularTags":"暂无常用标签","close":"关闭","tagExists":"标签已存在","addSuccess":"标签添加成功","addFailed":"添加标签失败","removeSuccess":"标签删除成功","removeFailed":"删除标签失败","loadFailed":"加载标签失败"},"mobileAction":{"viewDetail":"查看详情","copyLink":"复制链接","downloadFile":"下载文件","moveFile":"移动文件","tagManagement":"标签管理","moveFolder":"移动文件夹","deleteFile":"删除文件","deleteFolder":"删除文件夹"},"mobileDirectory":{"title":"目录导航","rootDirectory":"根目录","goBack":"返回上一级"},"sysConfig":{"logout":"退出登录"},"sysConfigTabs":{"systemStatus":"系统状态","uploadSettings":"上传设置","securitySettings":"安全设置","pageSettings":"网页设置","otherSettings":"其他设置"},"dateRangeCalendar":{"previousMonth":"上个月","nextMonth":"下个月","startDate":"起始日期","endDate":"结束日期","rangeSeparator":"至","monthTitle":"{year}-{month}","weekdaySun":"日","weekdayMon":"一","weekdayTue":"二","weekdayWed":"三","weekdayThu":"四","weekdayFri":"五","weekdaySat":"六"},"sysStatus":{"totalFiles":"文件总数","clickToRefresh":"点击刷新","indexUpdateTime":"索引更新时间","systemVersion":"系统版本","clickToViewChangelog":"点击查看更新日志","channelDistribution":"上传渠道分布","fileStatusDistribution":"文件状态分布","uploadTrend":"上传趋势","uploadTrendGroupBy":"上传趋势分组方式","totalUploads":"上传总数","byChannelType":"渠道类型","byChannelName":"渠道名称","selectDateRange":"选择日期范围","otherChannels":"其他","uploadsUnit":"次","noData":"暂无数据","totalFilesLabel":"文件总数","statusTypes":"状态类型","systemMaintenance":"系统维护","rebuildIndex":"重建索引","rebuilding":"重建中...","rebuildTooltip":"重新扫描所有文件并更新索引数据,适用于数据不一致时的修复","backupData":"备份数据","backingUp":"备份中...","backupTooltip":"备份所有文件元数据和系统设置到JSON文件","restoreData":"恢复数据","restoring":"恢复中...","restoreTooltip":"从备份文件恢复数据,将覆盖现有的文件元数据和系统设置","cancelOperation":"取消操作","retry":"重试","close":"关闭","records":"条记录","aboutToComplete":"即将完成","seconds":"约 {count} 秒","minutes":"约 {count} 分钟","hoursMinutes":"约 {hours} 小时 {minutes} 分钟","phaseFetching":"正在获取数据","phaseSorting":"正在排序","phaseUploading":"正在上传","phaseFinalizing":"正在完成","phaseBuilding":"正在构建备份","phaseDownloading":"正在生成下载","phaseRestoringFiles":"正在恢复文件","phaseRestoringSettings":"正在恢复设置","phaseCompleted":"已完成","phaseRetrying":"正在重试","rebuildSuccess":"索引重建完成!共处理 {count} 个文件","backupSuccess":"备份完成!共备份 {count} 个文件","backupSuccessWithSettings":"备份完成!共备份 {fileCount} 个文件,{settingsCount} 个设置项","operationInProgress":"已有操作正在进行中","selectJsonFile":"请选择JSON格式的备份文件","restoreConfirmMessage":"恢复操作将覆盖现有的文件元数据和系统设置,此操作不可逆。确定要继续吗?","restoreConfirmTitle":"确认恢复","restoreConfirmOk":"确定恢复","restoreConfirmCancel":"取消","invalidBackupFile":"备份文件格式无效,请选择有效的 JSON 文件","restoreSuccess":"恢复完成!已恢复 {files} 个文件和 {settings} 个设置项,正在重建索引...","restoreFailed":"恢复数据失败","fetchIndexFailed":"获取索引信息失败","unknown":"未知","blocked":"已屏蔽","normalStatus":"正常","latestUpload":"最近上传","earliestUpload":"最早上传","daysAgo":"{count}天前","hoursAgo":"{count}小时前","minutesAgo":"{count}分钟前","justNow":"刚刚","cancellingRebuild":"正在取消索引重建..."},"sysUpload":{"title":"上传渠道管理","titleTooltip":"管理所有上传渠道的配置,点击卡片查看详情或编辑","filterPlaceholder":"筛选渠道类型","addChannel":"添加渠道","loadBalance":"负载均衡","unnamedChannel":"未命名渠道","envVariable":"环境变量","noChannels":"暂无 {type} 渠道","detail":"详情","editBtn":"编辑","deleteBtn":"删除","addDialogTitle":"添加新渠道","channelTypeLabel":"渠道类型","channelTypePlaceholder":"请选择渠道类型","channelNameLabel":"渠道名称","channelNamePlaceholder":"请输入渠道名称","botTokenLabel":"Bot Token","botTokenPlaceholder":"请输入 Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"请输入 Chat ID","proxyDomain":"代理域名","proxyDomainPlaceholder":"可选,例如: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"例如: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN 域名","cdnDomainPlaceholder":"如果有 CDN,请配置 CDN 域名,例如:https://cdn.example.com","cdnDomainTip":"可选配置。配置后将优先通过 CDN 读取文件,提高访问速度和降低成本","bucketName":"存储桶名称","bucketNamePlaceholder":"请输入存储桶名称","bucketRegion":"存储桶区域","bucketRegionPlaceholder":"默认填写 auto","accessKeyId":"访问密钥 ID","accessKeyIdPlaceholder":"请输入访问密钥 ID","secretAccessKey":"机密访问密钥","secretAccessKeyPlaceholder":"请输入机密访问密钥","pathStyle":"路径风格","pathStyleTip":"使用 OpenList 等不兼容主机风格服务时需开启","quotaLimit":"容量限制","quotaLimitGB":"容量上限 (GB)","quotaThreshold":"停用阈值 (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"请输入 Channel ID","nitroMember":"Nitro 会员","nitroTip":"会员单文件限制 25MB,否则为 10MB","discordWarning":"Discord 有接口频率限制,不建议将其用作大规模并发场景","repoName":"仓库名","repoNamePlaceholder":"格式: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"请输入 Access Token","privateRepo":"私有仓库","privateRepoTip":"私有仓库限制 100GB","webdavBaseUrl":"WebDAV 基础地址","webdavBaseUrlPlaceholder":"例如: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"用户名","webdavUsernamePlaceholder":"可选用户名","webdavPassword":"密码","webdavPasswordPlaceholder":"可选密码","webdavPublicUrlPlaceholder":"可选公开访问地址,例如: https://cdn.example.com/imgbed/","webdavPublicUrlTip":"可选配置。配置后服务端支持直接从该地址读取文件","webdavHeaders":"自定义请求头","webdavHeadersPlaceholder":"可选 JSON 对象,例如: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"自定义请求头必须是有效的 JSON 对象","webdavCreateDirectory":"自动创建目录","webdavCreateDirectoryTip":"上传文件前自动创建父级目录","cancel":"取消","confirmAdd":"确认添加","detailDialogTitle":"渠道详情 - {name}","channelNameDetail":"渠道名称","channelTypeDetail":"渠道类型","statusLabel":"状态","enabled":"已启用","disabled":"已禁用","configSource":"配置来源","publicUrl":"公开访问链接","notSet":"未设置","isPathStyle":"是","isNotPathStyle":"否","currentUsage":"当前用量","closeBtn":"关闭","editDialogTitle":"编辑渠道 - {name}","enableChannel":"启用渠道","saveChanges":"保存修改","r2ConfigNote":"请按照 配置 R2 渠道 文档说明添加 R2 渠道","reservedName":"该名称为系统保留名称,请使用其他名称","duplicateName":"该类型下已存在同名渠道,请使用其他名称","fixedChannelCannotDelete":"环境变量配置的渠道无法删除","deleteChannelConfirm":"确定要删除该渠道吗?","quotaInitConfirm":"首次启用容量限制需要统计现有文件容量,这可能需要一些时间。是否立即统计?","quotaInitTitle":"初始化容量统计","quotaInitConfirmBtn":"立即统计","quotaInitCancelBtn":"稍后手动统计","quotaInitLater":"您可以稍后点击刷新按钮手动统计","quotaCalculating":"正在统计容量,请稍候...","quotaCalculateSuccess":"容量统计完成","quotaCalculateFailed":"统计失败","quotaCalculateError":"统计失败: "},"sysSecurity":{"authManagement":"认证管理","userAuth":"用户端认证","adminAuth":"管理端认证","uploadPassword":"上传密码","confirmPassword":"确认密码","adminUsername":"用户名","adminPassword":"密码","apiTokenManagement":"API Token 管理","imageReview":"图像审查","imageReviewTooltip":"仅对非分块上传文件生效,支持 nsfwjs 和 moderatecontent.com 渠道","enableReview":"开启审查","reviewChannel":"审查渠道","reviewChannelPlaceholder":"请选择审查渠道","apiKey":"API Key","apiPath":"API 路径","uploadManagement":"上传管理","accessManagement":"访问管理","domainFilter":"域名过滤","allowedDomains":"放行域名","allowedDomainsTooltip":"1.针对访问域名设置权限
2.留空默认全部放行,多个域名请用英文逗号分隔","whiteListMode":"白名单模式","enableWhiteList":"是否开启","enableWhiteListTooltip":"1.针对文件设置权限
2.开启后,仅被加入白名单的文件可被访问","settingsSaved":"设置已保存","tokenName":"名称","tokenValue":"Token","permissions":"权限","createdAt":"创建时间","status":"状态","expiresAt":"过期时间","operation":"操作","editBtn":"编辑","deleteBtn":"删除","permUpload":"上传","permDelete":"删除","permList":"列出","permManage":"管理","createTokenTitle":"创建新 API Token","tokenNameLabel":"Token 名称","tokenNamePlaceholder":"请输入Token名称","permissionsLabel":"权限","neverExpire":"永不过期","validPeriod":"有效期","autoDeleteOnExpire":"过期自动删除","createBtn":"创建","editTokenTitle":"编辑 API Token","updateBtn":"更新","tokenCreatedTitle":"Token 创建成功","tokenCreatedWarning":"请妥善保存以下Token,关闭此窗口后将无法再次查看完整Token!","fullToken":"完整Token","copyBtn":"复制","savedBtn":"我已保存","tokenCopied":"Token已复制到剪贴板","copyFailed":"复制失败,请手动复制","tokenCreateSuccess":"Token创建成功","tokenCreateFailed":"Token创建失败","tokenUpdateSuccess":"Token更新成功","tokenUpdateFailed":"Token更新失败","tokenDeleteConfirm":"此操作将永久删除该Token,是否继续?","tokenDeleteConfirmTitle":"提示","tokenDeleteConfirmOk":"确定","tokenDeleteConfirmCancel":"取消","tokenDeleteSuccess":"Token删除成功","tokenDeleteFailed":"Token删除失败","tokenListFailed":"获取Token列表失败","passwordUrlReserved":"密码不能包含部分URL保留字符: % & ? # /","confirmUploadPassword":"请再次输入上传密码","confirmAdminPassword":"请再次输入管理密码","passwordMismatch":"两次输入密码不一致","passwordUnchanged":"未修改(留空保持原密码)","adminPasswordChangedRelogin":"管理端密码已修改,即将跳转到登录页","clearPassword":"清除密码","tokenNameRequired":"请输入Token名称","permissionsRequired":"请选择权限","validPeriodRequired":"有效期数值必须大于 0","timeUnitSeconds":"秒","timeUnitMinutes":"分钟","timeUnitHours":"小时","timeUnitDays":"天","timeUnitMonths":"月","timeUnitYears":"年","sessionSecurityPolicy":"会话安全策略","secureMode":"Secure 模式","secureModeTooltip":"开启后,Cookie 仅通过 HTTPS 连接传输,请确保您的站点已启用 HTTPS","userSessionMaxAge":"用户端会话有效期","adminSessionMaxAge":"管理端会话有效期","sessionMaxAgeUnit":"天","sessionMaxAgeInvalid":"会话有效期必须为大于 0 的正整数"},"sysPage":{"settingsSaved":"设置已保存","otherSettings":"其他设置","channelSelectPlaceholder":"请先选择上传渠道"},"sysOthers":{"remoteTelemetry":"远端遥测","remoteTelemetryTooltip":"便于问题查找和定位,建议开启","enable":"启用","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"设置后可以使后端拉黑、删除等操作不受CDN缓存限制
建议设置,设置方式请查阅文档","zoneId":"区域ID","accountEmail":"账户邮箱","randomImageApi":"随机图像API","randomImageApiTooltip":"API具体用法请查阅文档","directory":"目录","directoryTooltip":"1. 开放随机图权限的目录,默认为根目录,多个目录用逗号分隔
2. 目录均采用绝对路径,例如/img/cover,表示该目录及其所有子目录的文件可被随机图API访问","publicBrowse":"访客图库","publicBrowseTooltip":"启用后,访客可通过 /browse 路径浏览指定目录的图片(只读,无法删除/移动)","openDirectory":"开放目录","openDirectoryTooltip":"

允许公开浏览的目录,多个目录用逗号分隔

示例:wallpaper,photos,album

支持子目录:2026/lucky,2026/rich

访问链接:https://你的域名/browse/2026/lucky

","webdav":"WebDAV","webdavTooltip":"启用后,可以通过WebDAV协议访问和管理图片","webdavUsername":"用户名","webdavPassword":"密码","webdavUploadChannel":"上传渠道","webdavDefaultChannel":"默认渠道","webdavChannelName":"指定渠道名","settingsSaved":"设置已保存"},"customerConfig":{"uploadFileList":"上传文件列表","fileNameCol":"文件名","filePreview":"文件预览","uploadTimeCol":"上传时间","ipAddress":"IP地址","address":"地址","uploadCount":"上传次数","allowUpload":"允许上传","allow":"允许","deny":"禁止","loadMore":"加载更多","loadError":"加载更多数据时出错,请检查网络连接","syncError":"同步数据时出错,请检查网络连接"},"publicBrowse":{"searchPlaceholder":"搜索文件名 或 #页码","fileCount":"{count} 个文件","loading":"加载中...","retry":"重试","creditText":"该图库由林酱贡献代码","loadingMore":"加载中...","allLoaded":"已加载全部","creditLink":"林酱贡献","browseDisabled":"公开浏览功能未启用","directoryNotAllowed":"该目录不允许公开访问","accessDenied":"访问被拒绝","loadFailed":"加载失败,请重试","rootDirectory":"根目录","copyLink":"复制链接","copied":"已复制","downloadBtn":"下载","swipeHint":"← 滑动切换 →","rotate90":"旋转90°"},"transformMedia":{"download":"下载","playbackSpeed":"播放速度","normalSpeed":"正常","playMode":"播放模式","stopAfterPlay":"播完停止","sequentialPlay":"顺序播放","loopSingle":"单曲循环","more":"更多"},"directoryTree":{"selectDirectory":"选择目录","retry":"重试","authFailed":"认证失败,请重新登录","serverError":"服务器错误,请稍后重试","loadFailed":"加载目录树失败,请检查网络连接"},"floatingSave":{"saving":"保存中","save":"保存"},"theme":{"lightMode":"浅色模式","darkMode":"深色模式","autoMode":"自动模式"},"common":{"confirm":"确定","cancel":"取消","close":"关闭","save":"保存","delete":"删除","edit":"编辑","copy":"复制","download":"下载","retry":"重试","loading":"加载中...","success":"成功","failed":"失败","warning":"警告","info":"提示","yes":"是","no":"否","all":"全部类型","select":"请选择"},"validation":{"pathMustStartWithSlash":"目标目录必须以 \\"/\\" 开头","pathTraversalNotAllowed":"目标目录不能包含路径穿越字符 \\"..\\"","singleDotNotAllowed":"目标目录不能包含单独的 \\".\\" 路径段","consecutiveSlashNotAllowed":"目标目录不能包含连续的斜杠","invalidCharacters":"目标目录包含非法字符,请使用合法的路径格式","uploadDirReplace":"上传目录"},"language":{"switchTo":"中/En","switchLanguage":"切换语言"},"whitelist":{"title":"白名单模式已启用","description":"抱歉,当前已开启白名单模式,上传的图片需要审核通过后才能展示,请等待审核通过后再进行访问。","goHome":"返回首页","goBack":"返回上页","helpText":"您可以尝试:","uploadImage":"图片上传","refreshPage":"刷新页面"}}'),l=JSON.parse('{"login":{"title":"Login to {owner} ImgHub","adminTitle":"Admin Login","password":"Password","username":"Username","passwordPlaceholder":"Enter auth code","usernamePlaceholder":"Enter username","adminPasswordPlaceholder":"Enter password","submit":"Login","success":"Login successful","failed":"Login failed, please check your password","adminFailed":"Invalid username or password","serverError":"Server error","systemError":"System error","authRequired":"Please authenticate first!","authFailed":"Authentication failed!"},"upload":{"folderPlaceholder":"Upload directory","pasteUpload":"Paste Upload","fileUpload":"File Upload","dragUploadText":"Drag Click or Ctrl + V to paste upload","pasteUrlPlaceholder":"Paste external links, separate multiple links with line breaks","pasteUploadBtn":"Upload","pasteSave":"Save","pasteExternal":"External","history":"Upload History","announcement":"Announcements","noAnnouncement":"No announcements","announcementTitle":"Announcement","announcementAck":"Got it!","settings":"Upload Settings","linkFormat":"Link Format","manage":"Management","logout":"Logout","logoutSuccess":"Logged out","viewDocs":"Documentation","switchUploadMethod":"Switch Upload Method","copyAll":"Copy All","retryFailed":"Retry Failed","clearList":"Clear List","clearAll":"Clear All","clearUploaded":"Clear Uploaded"},"uploadForm":{"deleted":"{name} deleted","uploadSuccess":"{name} uploaded successfully","uploadFailed":"{name} upload failed","compressFailedCannotUpload":"{name} compression failed, cannot upload!","fileTooLarge":"{name} file too large, cannot upload!","compressedFileTooLarge":"{name} still too large after compression, cannot upload!","copySuccess":"Copied successfully","copyFailed":"Copy failed","copyAllSuccess":"All copied successfully","fileNotUploaded":"File not uploaded, cannot copy link","fileListCleared":"File list cleared","fileListEmpty":"File list is empty","successFilesCleared":"Uploaded files cleared","successFilesEmpty":"No uploaded files","noFailedFiles":"No failed files","autoRetryOn":"Auto retry enabled","autoRetryOff":"Auto retry disabled","autoRetry":"Auto Retry","maxRetryReached":"{name} reached max retry limit ({max}), stopping","urlRequestFailed":"URL request from clipboard failed","chunkMerging":"Chunk upload complete, merging file, please wait...","fileSizeTooLarge":"File too large","chunkInitFailed":"Failed to init chunked upload","uploadError":"Upload error occurred","imageLoadFailed":"Image load failed"},"uploadSettings":{"title":"Upload Settings","uploadChannel":"Upload Channel","channelType":"Channel Type","channelName":"Channel Name","channelNameTooltip":"Select a specific channel name. If not selected, load balancing or default channel will be used","autoSelect":"Auto Select","uploadDirectory":"Upload Directory","uploadDirectoryPlaceholder":"Enter upload directory path","autoSwitch":"Auto Switch","autoSwitchTooltip":"For non-chunked uploads, automatically switch to another channel on failure","fileNaming":"File Naming","namingDefault":"Default","namingIndex":"Prefix Only","namingOrigin":"Original Name","namingShort":"Short Link","filePreprocess":"File Preprocessing","filePreprocessTooltip":"Convert format and compress locally before upload, only applies to image files","convertToWebp":"Convert to WebP","convertToWebpTooltip":"Convert images to WebP format before upload to reduce file size. Falls back to original format on failure","fileCompress":"File Compression","compressThreshold":"Compression Threshold","compressThresholdTooltip":"Set image size threshold, files exceeding this will be auto-compressed (MB)","expectedSize":"Expected Size","expectedSizeTooltip":"Set expected image size after compression (MB)","serverCompress":"Server-side Compression","serverCompressTooltip":"1. Compress on Telegram side, only applies to image files uploaded via Telegram channel
2. If image size (after local compression) exceeds 10MB, this setting is ignored
3. For high-resolution, transparent background images, it\'s recommended to disable server compression to avoid issues","enableCompress":"Enable Compression","confirm":"OK"},"uploadHistory":{"title":"History","totalRecords":"{count} records","switchView":"Switch View","clearRecords":"Clear Records","loading":"Loading...","pullToLoadMore":"Pull to load more","noMoreRecords":"No more records","emptyHistory":"No upload history","linkCopied":"Link copied","copyFailed":"Copy failed","clearConfirmTitle":"Notice","clearConfirmMessage":"Are you sure you want to clear all upload records?","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","recordsCleared":"Records cleared","deleteConfirmMessage":"Are you sure you want to delete this record?","recordDeleted":"Record deleted"},"settings":{"linkFormatTitle":"Link Format Settings","defaultCopyLink":"Default Copy Format","rawLink":"Raw Link","customLink":"Custom Link","customLinkTooltip":"Default link is https://your.domain/file/xxx.jpg
If custom link format is enabled, only the xxx.jpg part is kept, please enter the rest manually","enableCustom":"Enable Custom","customPrefix":"Custom Prefix","customPrefixPlaceholder":"Enter custom link prefix","confirm":"OK","s3Link":"S3 Link"},"dashboard":{"searchPlaceholder":"Search: #tag -#exclude","sortByDateDesc":"Sort by date (newest)","sortByNameAsc":"Sort by name (A-Z)","selectPage":"Select all on page","copy":"Copy","delete":"Delete","download":"Download","move":"Move","tagManagement":"Tag Management","addToBlacklist":"Add to Blacklist","addToWhitelist":"Add to Whitelist","linkFormat":"Link Format","listView":"List View","cardView":"Card View","logout":"Logout","rootDirectory":"Root","totalFiles":"{count} files","noMatchingFiles":"No matching files or folders found","currentDirEmpty":"Current directory is empty","adjustSearchHint":"Try adjusting search criteria or filters","uploadHint":"Uploaded files will appear here","loadMore":"Load More","totalPages":"{count} pages","jumpTo":"Go to","preview":"Preview","fileName":"File Name","tags":"Tags","channelType":"Channel Type","channelNameCol":"Channel Name","uploadAddress":"Upload Address","fileSize":"Size","uploadTime":"Upload Time","actions":"Actions","externalTag":"External","unknownTag":"Unknown","detail":"Detail","copyLink":"Copy Link","moveFile":"Move","downloadFile":"Download","loadFailed":"Load failed","copySuccess":"Copied successfully","copyFailed":"Copy failed","deleteConfirm":"This will permanently delete this file. Continue?","deleteConfirmTitle":"Notice","deleteConfirmOk":"OK","deleteConfirmCancel":"Cancel","deleteSuccess":"Deleted successfully","deleteFailed":"Delete failed","blockConfirm":"This will add the file to blacklist. Continue?","blockSuccess":"Added to blacklist successfully","blockFailed":"Failed to add to blacklist","whiteConfirm":"This will add the file to whitelist. Continue?","whiteSuccess":"Added to whitelist successfully","whiteFailed":"Failed to add to whitelist","deleteFolderConfirm":"This will permanently delete this folder. Continue?","deleteFileConfirm":"This will permanently delete this file. Continue?","batchDeleteConfirm":"This will permanently delete selected files and folders. Continue?","batchDeleteSuccess":"Batch delete successful","batchDeleteFailed":"Batch delete failed","batchBlockConfirm":"This will add selected files to blacklist. Continue?","batchBlockSuccess":"Batch blacklist successful","batchBlockFailed":"Batch blacklist failed","batchWhiteConfirm":"This will add selected files to whitelist. Continue?","batchWhiteSuccess":"Batch whitelist successful","batchWhiteFailed":"Batch whitelist failed","noLinksAvailable":"No links to copy","batchCopySuccess":"Copied {count} links successfully","batchCopyFailed":"Batch copy failed, please retry","batchCopyLinksSuccess":"Batch copy successful","copyFileLinkSuccess":"File link copied","loadMoreFailed":"Failed to load more files, please check network","moveSuccess":"Moved successfully","moveFailed":"Move failed","moveTargetSameAsCurrent":"Target folder cannot be the current folder","invalidPageNumber":"Please enter a valid page number","pageExceedsMax":"Page number cannot exceed {max}","loadingData":"Loading data, please wait...","loadDataFailed":"Failed to load data, please check network","fetchFileListFailed":"Failed to fetch file list","refreshFailed":"Refresh failed, please retry","selectFilesFirst":"Please select files first","syncDataError":"Error syncing data, please check network","fetchingFileList":"Fetching file list...","folderEmptyNoLinks":"Folder is empty, no links to copy","copiedFileLinks":"Copied {count} file links","copyFolderLinksFailed":"Failed to copy folder links, please retry"},"dashboardTabs":{"fileManagement":"File Management","userManagement":"User Management","systemSettings":"System Settings","fileUpload":"File Upload"},"fileDetail":{"title":"File Details","download":"Download","tags":"Tags","blacklist":"Blacklist","whitelist":"Whitelist","deleteBtn":"Delete","edit":"Edit","rename":"Rename","save":"Save","cancel":"Cancel","originUrl":"Original Link","fileNameLabel":"File Name","fileNamePlaceholder":"Enter file name","fileType":"File Type","fileTypePlaceholder":"e.g. image/jpeg","fileSizeLabel":"File Size","imageDimensions":"Dimensions","noDimensions":"N/A","uploadTimeLabel":"Upload Time","channelTypeAndName":"Channel Type/Name","accessStatusAndReview":"Access Status/Review","uploadIP":"Upload IP","uploadAddressLabel":"Upload Address","fileTags":"File Tags","noTags":"No tags","unknown":"Unknown","accessNormal":"Normal","accessNormalWhitelist":"Normal (Whitelisted)","accessBlockedBlacklist":"Blocked (Blacklisted)","accessBlockedReview":"Blocked (Review rejected)","orientationLandscape":"Landscape","orientationPortrait":"Portrait","orientationSquare":"Square","linkCopied":"Link copied","metadataSaved":"Metadata saved successfully","metadataSaveFailed":"Failed to save metadata","renameTitle":"Rename File ID","renameLabel":"New File ID","renamePlaceholder":"Enter new File ID","renameCancel":"Cancel","renameConfirm":"Confirm Rename","renameSuccess":"File renamed successfully","renameConflict":"Target file name already exists","renameFailed":"Rename failed"},"filter":{"accessStatus":"Access Status","normal":"Normal","blocked":"Blocked","blackWhiteList":"Black/White List","whiteList":"Whitelist","blackList":"Blacklist","notSet":"Not Set","reviewResult":"Review Result","teenContent":"12+ Content","adultContent":"Adult Content","fileType":"File Type","image":"Image","video":"Video","audio":"Audio","other":"Other","channelType":"Channel Type","externalLink":"External Link","channelName":"Channel Name","clearFilters":"Clear Filters"},"moveFile":{"title":"Move File","batchTitle":"Batch Move Files","targetDirectory":"Target Directory","targetPlaceholder":"Enter target directory path","hint":"Tip: Paths starting with / indicate root directory, e.g. /photos/2024/","hintMobile":"Tip: Paths starting with / indicate root directory","selectDirectory":"Select Directory","cancel":"Cancel","confirm":"OK","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadTreeFailed":"Failed to load directory tree, please check network connection"},"batchTag":{"title":"Batch Tag Management","addTab":"Add","removeTab":"Remove","clearTab":"Clear","addDescription":"Add tags to {count} selected files","inputPlaceholder":"Enter tag name","pendingTags":"Tags to add","noPendingTags":"No tags to add","addToAllFiles":"Add to all files","removeDescription":"Remove common tags from selected files","commonTags":"Common Tags","noCommonTags":"Selected files have no common tags","clearDescription":"Clear all tags from {count} selected files","clearWarningTitle":"⚠️Warning","clearWarningDesc":"This will clear all tags from selected files and cannot be undone","confirmClearAll":"Confirm clear all tags","tagAlreadyInList":"Tag already in list","pleaseAddTags":"Please add tags first","addSuccess":"Tags added to {count} files successfully","addFailed":"Batch tag addition failed","removeSuccess":"Tags removed from {count} files successfully","removeFailed":"Tag removal failed","clearConfirmMessage":"Are you sure you want to clear all tags from {count} selected files? This cannot be undone.","clearConfirmTitle":"Confirm Clear","clearConfirmOk":"OK","clearConfirmCancel":"Cancel","clearCancelled":"Clear operation cancelled","clearSuccess":"Tags cleared from {count} files successfully","clearFailed":"Failed to clear tags","loadCommonTagsFailed":"Failed to load common tags"},"tagManagement":{"title":"Tag Management","inputPlaceholder":"Enter tag name","currentTags":"Current Tags","noTags":"No tags","popularTags":"Popular Tags","loading":"Loading...","noPopularTags":"No popular tags","close":"Close","tagExists":"Tag already exists","addSuccess":"Tag added successfully","addFailed":"Failed to add tag","removeSuccess":"Tag removed successfully","removeFailed":"Failed to remove tag","loadFailed":"Failed to load tags"},"mobileAction":{"viewDetail":"View Details","copyLink":"Copy Link","downloadFile":"Download File","moveFile":"Move File","tagManagement":"Tag Management","moveFolder":"Move Folder","deleteFile":"Delete File","deleteFolder":"Delete Folder"},"mobileDirectory":{"title":"Directory Navigation","rootDirectory":"Root","goBack":"Go Back"},"sysConfig":{"logout":"Logout"},"sysConfigTabs":{"systemStatus":"System Status","uploadSettings":"Upload Settings","securitySettings":"Security Settings","pageSettings":"Page Settings","otherSettings":"Other Settings"},"dateRangeCalendar":{"previousMonth":"Previous month","nextMonth":"Next month","startDate":"Start date","endDate":"End date","rangeSeparator":"to","monthTitle":"{year}-{month}","weekdaySun":"Sun","weekdayMon":"Mon","weekdayTue":"Tue","weekdayWed":"Wed","weekdayThu":"Thu","weekdayFri":"Fri","weekdaySat":"Sat"},"sysStatus":{"totalFiles":"Total Files","clickToRefresh":"Click to refresh","indexUpdateTime":"Index Update Time","systemVersion":"System Version","clickToViewChangelog":"Click to view changelog","channelDistribution":"Upload Channel Distribution","fileStatusDistribution":"File Status Distribution","uploadTrend":"Upload Trend","uploadTrendGroupBy":"Upload trend group by","totalUploads":"Total Uploads","byChannelType":"Channel Type","byChannelName":"Channel Name","selectDateRange":"Select date range","otherChannels":"Other","uploadsUnit":"uploads","noData":"No data","totalFilesLabel":"Total Files","statusTypes":"Status Types","systemMaintenance":"System Maintenance","rebuildIndex":"Rebuild Index","rebuilding":"Rebuilding...","rebuildTooltip":"Rescan all files and update index data, useful for fixing data inconsistencies","backupData":"Backup Data","backingUp":"Backing up...","backupTooltip":"Backup all file metadata and system settings to a JSON file","restoreData":"Restore Data","restoring":"Restoring...","restoreTooltip":"Restore data from a backup file, this will overwrite existing file metadata and system settings","cancelOperation":"Cancel Operation","retry":"Retry","close":"Close","records":"records","aboutToComplete":"Almost done","seconds":"~{count} seconds","minutes":"~{count} minutes","hoursMinutes":"~{hours} hours {minutes} minutes","phaseFetching":"Fetching data","phaseSorting":"Sorting","phaseUploading":"Uploading","phaseFinalizing":"Finalizing","phaseBuilding":"Building backup","phaseDownloading":"Generating download","phaseRestoringFiles":"Restoring files","phaseRestoringSettings":"Restoring settings","phaseCompleted":"Completed","phaseRetrying":"Retrying","rebuildSuccess":"Index rebuild complete! Processed {count} files","backupSuccess":"Backup complete! Backed up {count} files","backupSuccessWithSettings":"Backup complete! Backed up {fileCount} files and {settingsCount} settings","operationInProgress":"An operation is already in progress","selectJsonFile":"Please select a JSON backup file","restoreConfirmMessage":"Restoring will overwrite existing file metadata and system settings. This cannot be undone. Continue?","restoreConfirmTitle":"Confirm Restore","restoreConfirmOk":"Confirm Restore","restoreConfirmCancel":"Cancel","invalidBackupFile":"Invalid backup file format, please select a valid JSON file","restoreSuccess":"Restore complete! Restored {files} files and {settings} settings, rebuilding index...","restoreFailed":"Failed to restore data","fetchIndexFailed":"Failed to fetch index information","unknown":"Unknown","blocked":"Blocked","normalStatus":"Normal","latestUpload":"Latest Upload","earliestUpload":"Earliest Upload","daysAgo":"{count} days ago","hoursAgo":"{count} hours ago","minutesAgo":"{count} minutes ago","justNow":"Just now","cancellingRebuild":"Cancelling index rebuild..."},"sysUpload":{"title":"Upload Channel Management","titleTooltip":"Manage all upload channel configurations. Click a card to view details or edit","filterPlaceholder":"Filter channel type","addChannel":"Add Channel","loadBalance":"Load Balance","unnamedChannel":"Unnamed Channel","envVariable":"Environment Variable","noChannels":"No {type} channels","detail":"Detail","editBtn":"Edit","deleteBtn":"Delete","addDialogTitle":"Add New Channel","channelTypeLabel":"Channel Type","channelTypePlaceholder":"Select channel type","channelNameLabel":"Channel Name","channelNamePlaceholder":"Enter channel name","botTokenLabel":"Bot Token","botTokenPlaceholder":"Enter Bot Token","chatIdLabel":"Chat ID","chatIdPlaceholder":"Enter Chat ID","proxyDomain":"Proxy Domain","proxyDomainPlaceholder":"Optional, e.g.: your-proxy.example.com","endpointLabel":"Endpoint","endpointPlaceholder":"e.g.: https://s3.us-east-005.backblazeb2.com","cdnDomain":"CDN Domain","cdnDomainPlaceholder":"If using CDN, enter CDN domain, e.g.: https://cdn.example.com","cdnDomainTip":"Optional. When configured, files will be served via CDN for faster access and lower costs","bucketName":"Bucket Name","bucketNamePlaceholder":"Enter bucket name","bucketRegion":"Bucket Region","bucketRegionPlaceholder":"Default: auto","accessKeyId":"Access Key ID","accessKeyIdPlaceholder":"Enter Access Key ID","secretAccessKey":"Secret Access Key","secretAccessKeyPlaceholder":"Enter Secret Access Key","pathStyle":"Path Style","pathStyleTip":"Enable when using services incompatible with host-style like OpenList","quotaLimit":"Quota Limit","quotaLimitGB":"Quota Limit (GB)","quotaThreshold":"Disable Threshold (%)","channelIdLabel":"Channel ID","channelIdPlaceholder":"Enter Channel ID","nitroMember":"Nitro Member","nitroTip":"Nitro members: 25MB per file, otherwise 10MB","discordWarning":"Discord has API rate limits, not recommended for high-concurrency scenarios","repoName":"Repository Name","repoNamePlaceholder":"Format: username/repo-name","accessToken":"Access Token","accessTokenPlaceholder":"Enter Access Token","privateRepo":"Private Repository","privateRepoTip":"Private repository limit: 100GB","webdavBaseUrl":"WebDAV Base URL","webdavBaseUrlPlaceholder":"e.g.: https://dav.example.com/remote.php/dav/files/user/imgbed/","webdavUsername":"Username","webdavUsernamePlaceholder":"Optional username","webdavPassword":"Password","webdavPasswordPlaceholder":"Optional password","webdavPublicUrlPlaceholder":"Optional public URL, e.g.: https://cdn.example.com/imgbed/","webdavPublicUrlTip":"Optional. When configured, the server can read files directly from this URL","webdavHeaders":"Custom Headers","webdavHeadersPlaceholder":"Optional JSON object, e.g.: {\'{\\"X-Api-Key\\":\\"value\\"}\'}","webdavHeadersInvalid":"Custom headers must be a valid JSON object","webdavCreateDirectory":"Auto Create Directories","webdavCreateDirectoryTip":"Create parent directories before uploading files","cancel":"Cancel","confirmAdd":"Confirm Add","detailDialogTitle":"Channel Details - {name}","channelNameDetail":"Channel Name","channelTypeDetail":"Channel Type","statusLabel":"Status","enabled":"Enabled","disabled":"Disabled","configSource":"Config Source","publicUrl":"Public Access URL","notSet":"Not Set","isPathStyle":"Yes","isNotPathStyle":"No","currentUsage":"Current Usage","closeBtn":"Close","editDialogTitle":"Edit Channel - {name}","enableChannel":"Enable Channel","saveChanges":"Save Changes","r2ConfigNote":"Please follow the R2 Channel Configuration documentation to add R2 channels","reservedName":"This name is reserved by the system, please use another name","duplicateName":"A channel with this name already exists, please use another name","fixedChannelCannotDelete":"Channels configured via environment variables cannot be deleted","deleteChannelConfirm":"Are you sure you want to delete this channel?","quotaInitConfirm":"First time enabling quota requires calculating existing file sizes, this may take some time. Calculate now?","quotaInitTitle":"Initialize Quota Statistics","quotaInitConfirmBtn":"Calculate Now","quotaInitCancelBtn":"Calculate Later","quotaInitLater":"You can click the refresh button to calculate later","quotaCalculating":"Calculating quota, please wait...","quotaCalculateSuccess":"Quota calculation complete","quotaCalculateFailed":"Calculation failed","quotaCalculateError":"Calculation failed: "},"sysSecurity":{"authManagement":"Authentication Management","userAuth":"User Authentication","adminAuth":"Admin Authentication","uploadPassword":"Upload Password","confirmPassword":"Confirm Password","adminUsername":"Username","adminPassword":"Password","apiTokenManagement":"API Token Management","imageReview":"Image Review","imageReviewTooltip":"Only applies to non-chunked uploads, supports nsfwjs and moderatecontent.com channels","enableReview":"Enable Review","reviewChannel":"Review Channel","reviewChannelPlaceholder":"Select review channel","apiKey":"API Key","apiPath":"API Path","uploadManagement":"Upload Management","accessManagement":"Access Management","domainFilter":"Domain Filter","allowedDomains":"Allowed Domains","allowedDomainsTooltip":"1. Set permissions based on access domain
2. Leave empty to allow all, separate multiple domains with commas","whiteListMode":"Whitelist Mode","enableWhiteList":"Enable","enableWhiteListTooltip":"1. Set permissions based on files
2. When enabled, only whitelisted files can be accessed","settingsSaved":"Settings saved","tokenName":"Name","tokenValue":"Token","permissions":"Permissions","createdAt":"Created At","status":"Status","expiresAt":"Expires At","operation":"Actions","editBtn":"Edit","deleteBtn":"Delete","permUpload":"Upload","permDelete":"Delete","permList":"List","permManage":"Manage","createTokenTitle":"Create New API Token","tokenNameLabel":"Token Name","tokenNamePlaceholder":"Enter token name","permissionsLabel":"Permissions","neverExpire":"Never Expire","validPeriod":"Valid Period","autoDeleteOnExpire":"Auto-delete on expiry","createBtn":"Create","editTokenTitle":"Edit API Token","updateBtn":"Update","tokenCreatedTitle":"Token Created Successfully","tokenCreatedWarning":"Please save the following token. You won\'t be able to view the full token after closing this dialog!","fullToken":"Full Token","copyBtn":"Copy","savedBtn":"I\'ve Saved It","tokenCopied":"Token copied to clipboard","copyFailed":"Copy failed, please copy manually","tokenCreateSuccess":"Token created successfully","tokenCreateFailed":"Failed to create token","tokenUpdateSuccess":"Token updated successfully","tokenUpdateFailed":"Failed to update token","tokenDeleteConfirm":"This will permanently delete this token. Continue?","tokenDeleteConfirmTitle":"Notice","tokenDeleteConfirmOk":"OK","tokenDeleteConfirmCancel":"Cancel","tokenDeleteSuccess":"Token deleted successfully","tokenDeleteFailed":"Failed to delete token","tokenListFailed":"Failed to fetch token list","passwordUrlReserved":"Password cannot contain URL reserved characters: % & ? # /","confirmUploadPassword":"Please re-enter upload password","confirmAdminPassword":"Please re-enter admin password","passwordMismatch":"Passwords do not match","passwordUnchanged":"Unchanged (leave empty to keep current password)","adminPasswordChangedRelogin":"Admin password changed, redirecting to login page","clearPassword":"Clear password","tokenNameRequired":"Please enter token name","permissionsRequired":"Please select permissions","validPeriodRequired":"Valid period must be greater than 0","timeUnitSeconds":"seconds","timeUnitMinutes":"minutes","timeUnitHours":"hours","timeUnitDays":"days","timeUnitMonths":"months","timeUnitYears":"years","sessionSecurityPolicy":"Session Security Policy","secureMode":"Secure Mode","secureModeTooltip":"When enabled, cookies are only transmitted over HTTPS. Make sure your site has HTTPS enabled","userSessionMaxAge":"User Session Max Age","adminSessionMaxAge":"Admin Session Max Age","sessionMaxAgeUnit":"days","sessionMaxAgeInvalid":"Session max age must be a positive integer greater than 0"},"sysPage":{"settingsSaved":"Settings saved","otherSettings":"Other Settings","channelSelectPlaceholder":"Please select upload channel first"},"sysOthers":{"remoteTelemetry":"Remote Telemetry","remoteTelemetryTooltip":"Helps with issue tracking and debugging, recommended to enable","enable":"Enable","cloudflareApiToken":"CloudFlare API Token","cloudflareApiTokenTooltip":"When set, backend operations like blocking and deleting won\'t be affected by CDN cache
Recommended, see documentation for setup","zoneId":"Zone ID","accountEmail":"Account Email","randomImageApi":"Random Image API","randomImageApiTooltip":"See documentation for API usage details","directory":"Directory","directoryTooltip":"1. Directories with random image access, defaults to root. Separate multiple directories with commas
2. All directories use absolute paths, e.g. /img/cover, meaning files in this directory and all subdirectories can be accessed by the random image API","publicBrowse":"Public Gallery","publicBrowseTooltip":"When enabled, visitors can browse images in specified directories via /browse path (read-only, no delete/move)","openDirectory":"Open Directory","openDirectoryTooltip":"

Directories open for public browsing, separate multiple with commas

Example: wallpaper,photos,album

Supports subdirectories: 2026/lucky,2026/rich

Access URL: https://your.domain/browse/2026/lucky

","webdav":"WebDAV","webdavTooltip":"When enabled, images can be accessed and managed via WebDAV protocol","webdavUsername":"Username","webdavPassword":"Password","webdavUploadChannel":"Upload Channel","webdavDefaultChannel":"Default Channel","webdavChannelName":"Specified Channel","settingsSaved":"Settings saved"},"customerConfig":{"uploadFileList":"Upload File List","fileNameCol":"File Name","filePreview":"File Preview","uploadTimeCol":"Upload Time","ipAddress":"IP Address","address":"Address","uploadCount":"Upload Count","allowUpload":"Allow Upload","allow":"Allow","deny":"Deny","loadMore":"Load More","loadError":"Error loading more data, please check network connection","syncError":"Error syncing data, please check network connection"},"publicBrowse":{"searchPlaceholder":"Search file name or #page","fileCount":"{count} files","loading":"Loading...","retry":"Retry","creditText":"Gallery code contributed by LinJiang","loadingMore":"Loading...","allLoaded":"All loaded","creditLink":"LinJiang","browseDisabled":"Public browsing is not enabled","directoryNotAllowed":"This directory is not open for public access","accessDenied":"Access denied","loadFailed":"Load failed, please retry","rootDirectory":"Root","copyLink":"Copy Link","copied":"Copied","downloadBtn":"Download","swipeHint":"← Swipe to navigate →","rotate90":"Rotate 90°"},"transformMedia":{"download":"Download","playbackSpeed":"Playback Speed","normalSpeed":"Normal","playMode":"Play Mode","stopAfterPlay":"Stop After Play","sequentialPlay":"Sequential Play","loopSingle":"Loop Single","more":"More"},"directoryTree":{"selectDirectory":"Select Directory","retry":"Retry","authFailed":"Authentication failed, please log in again","serverError":"Server error, please try again later","loadFailed":"Failed to load directory tree, please check network connection"},"floatingSave":{"saving":"Saving","save":"Save"},"theme":{"lightMode":"Light Mode","darkMode":"Dark Mode","autoMode":"Auto Mode"},"common":{"confirm":"OK","cancel":"Cancel","close":"Close","save":"Save","delete":"Delete","edit":"Edit","copy":"Copy","download":"Download","retry":"Retry","loading":"Loading...","success":"Success","failed":"Failed","warning":"Warning","info":"Notice","yes":"Yes","no":"No","all":"All Types","select":"Select"},"validation":{"pathMustStartWithSlash":"Path must start with \\"/\\"","pathTraversalNotAllowed":"Path cannot contain \\"..\\"","singleDotNotAllowed":"Path cannot contain standalone \\".\\"","consecutiveSlashNotAllowed":"Path cannot contain consecutive slashes","invalidCharacters":"Path contains invalid characters, please use a valid path format","uploadDirReplace":"Upload directory"},"language":{"switchTo":"中/En","switchLanguage":"Switch Language"},"whitelist":{"title":"Whitelist Mode Enabled","description":"Sorry, the whitelist mode is currently enabled. Uploaded images need to be approved before they can be displayed. Please wait for approval.","goHome":"Go Home","goBack":"Go Back","helpText":"You can try:","uploadImage":"Upload Image","refreshPage":"Refresh Page"}}');const i="app-locale";function r(){const e=localStorage.getItem(i);return"zh-CN"===e||"en"===e?e:"zh-CN"}const s=(0,o.hU)({legacy:!0,locale:r(),fallbackLocale:"zh-CN",messages:{"zh-CN":n,en:l}});function d(e){s.global.locale=e,localStorage.setItem(i,e),document.documentElement.lang="zh-CN"===e?"zh-CN":"en"}var c=s},50248:function(e,a,t){t(18111),t(7588);var o=t(45130),n=t(73888),l=t(18642),i=(t(15412),t(30372),t(98950)),r=t(2353),s=t(30292),d=t(97722),c=(t(85331),t(10961),t(56768));function u(e,a,t,o,n,l){const i=(0,c.g2)("router-view"),r=d.H6;return(0,c.uX)(),(0,c.Wv)(r,{locale:l.elementLocale},{default:(0,c.k6)(()=>[(0,c.bF)(i)]),_:1},8,["locale"])}var m=t(60782),p=t(6166),h=t(55186),g=t(54791),f={data(){return{osInstance:null,imageViewerObserver:null}},computed:{...(0,m.L8)(["userConfig","useDarkMode"]),elementLocale(){return"zh-CN"===this.$i18n.locale?h.A:g.A}},mounted(){this.$nextTick(()=>{this.initOverlayScrollbars(),this.setupImageViewerObserver()})},beforeUnmount(){this.imageViewerObserver&&this.imageViewerObserver.disconnect()},watch:{},methods:{initOverlayScrollbars(){try{if(p.ae.valid(document.body))return void(this.osInstance=(0,p.ae)(document.body));this.osInstance=(0,p.ae)(document.body,{scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"scroll",autoHideDelay:600,dragScroll:!0,clickScroll:!0},overflow:{x:"hidden",y:"scroll"}}),console.log("OverlayScrollbars initialized successfully")}catch(e){console.error("Failed to initialize OverlayScrollbars:",e)}},setupImageViewerObserver(){this.imageViewerObserver=new MutationObserver(e=>{const a=document.querySelector(".el-image-viewer__wrapper");a?this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"hidden"}}):this.osInstance&&this.osInstance.options({overflow:{x:"hidden",y:"scroll"}})}),this.imageViewerObserver.observe(document.body,{childList:!0,subtree:!0})}}},y=t(71241);const b=(0,y.A)(f,[["render",u]]);var C=b,k=t(16915),w=t(25507),T=t(46638),v=t(57477);t(21862),t(50635);i.Yv.add(r.X7I);const S=(0,o.Ef)(C),F=(0,n.Zf)();S.component("font-awesome-icon",s.gc);for(const[U,M]of Object.entries(v))S.component(U,M);const A=()=>{const e=document.documentElement;let a;if(w.A.state.cusDarkMode&&null!==w.A.state.useDarkMode)a=w.A.state.useDarkMode;else{if(a=window.matchMedia("(prefers-color-scheme: dark)").matches,!a){const e=new Date,t=e.getHours();a=t>=22||t<6}w.A.commit("setUseDarkMode",a)}a?e.classList.add("dark"):e.classList.remove("dark")},P=e=>{const a=document.documentElement;e?a.classList.add("dark"):a.classList.remove("dark")},D=e=>{document.title=e?.siteTitle||"Sanyue ImgHub"},L=(e,a)=>{const t=document.querySelectorAll('link[rel="icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]');t.forEach(e=>e.remove());const o=document.createElement("link"),n=document.createElement("link"),l=document.createElement("link");o.rel="icon",n.rel="apple-touch-icon",l.rel="mask-icon",e?(o.href=a?.siteIcon||"/static/media/logo-dark.png",n.href=a?.siteIcon||"/static/media/logo-dark.png",l.href=a?.siteIcon||"/static/media/logo-dark.png"):(o.href=a?.siteIcon||"/static/media/logo.png",n.href=a?.siteIcon||"/static/media/logo.png",l.href=a?.siteIcon||"/static/media/logo.png"),document.head.appendChild(o),document.head.appendChild(n),document.head.appendChild(l)};w.A.dispatch("fetchUserConfig").then(()=>{A(),D(w.A.getters.userConfig),L(w.A.state.useDarkMode,w.A.getters.userConfig),w.A.subscribe((e,a)=>{"setUseDarkMode"===e.type&&w.A.state.cusDarkMode&&(P(a.useDarkMode),L(a.useDarkMode,w.A.getters.userConfig)),"setCusDarkMode"!==e.type||e.payload||(A(),L(w.A.state.useDarkMode,w.A.getters.userConfig))}),S.use(w.A).use(k.A).use(l.A).use(T.Ay).mount("#app")}).catch(e=>{console.error("Failed to load user configuration:",e),S.use(w.A).use(k.A).use(l.A).use(T.Ay).use(F).mount("#app")})}},a={};function t(o){var n=a[o];if(void 0!==n)return n.exports;var l=a[o]={exports:{}};return e[o].call(l.exports,l,l.exports,t),l.exports}t.m=e,function(){var e=[];t.O=function(a,o,n,l){if(!o){var i=1/0;for(c=0;c=l)&&Object.keys(t.O).every(function(e){return t.O[e](o[s])})?o.splice(s--,1):(r=!1,l0&&e[c-1][2]>l;c--)e[c]=e[c-1];e[c]=[o,n,l]}}(),function(){t.n=function(e){var a=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(a,{a:a}),a}}(),function(){t.d=function(e,a){for(var o in a)t.o(a,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:a[o]})}}(),function(){t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce(function(a,o){return t.f[o](e,a),a},[]))}}(),function(){t.u=function(e){return"js/"+e+"."+{51:"6e7bf298",226:"ec43855c",309:"b7dca603",369:"df3ca2df",396:"226339af",454:"54701290",600:"08192622",604:"7ad54f22",718:"27080555",728:"42caee39",731:"90070be6",917:"b77a6783"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{51:"1dd65d6c",226:"6548e7b4",369:"149afd90",396:"3a3d9729",428:"8044ed41",454:"1a1814c6",604:"7c4f56c5",718:"d0974d1c",728:"7c4f56c5",731:"953080b6",740:"a94dbb46",833:"95983fa6",917:"8529ad1e"}[e]+".css"}}(),function(){t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)}}(),function(){var e={},a="sanyue_imghub:";t.l=function(o,n,l,i){if(e[o])e[o].push(n);else{var r,s;if(void 0!==l)for(var d=document.getElementsByTagName("script"),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 {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要管理端认证,直接放行\r\n if (!data.adminRequired) {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效的 admin session\r\n if (data.valid && data.authType === 'admin') {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要用户端认证,直接放行\r\n if (!data.userRequired) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效 session(user 或 admin 都可以)\r\n if (data.valid) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\nconst routes = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: () => import('../views/UploadHome.vue'),\r\n beforeEnter: userAuthGuard\r\n },\r\n {\r\n path: '/login',\r\n name: 'login',\r\n component: () => import('../views/Login.vue')\r\n },\r\n {\r\n path: '/dashboard',\r\n name: 'dashboard',\r\n component: () => import('../views/AdminDashBoard.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/customerConfig',\r\n name: 'customerConfig',\r\n component: () => import('../views/CustomerConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/systemConfig',\r\n name: 'systemConfig',\r\n component: () => import('../views/SystemConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/adminLogin',\r\n name: 'adminLogin',\r\n component: () => import('../views/AdminLogin.vue'),\r\n },\r\n {\r\n path: '/blockimg',\r\n name: 'blockimg',\r\n component: () => import('../views/BlockImage.vue'),\r\n },\r\n {\r\n path: '/whiteliston',\r\n name: 'whiteliston',\r\n component: () => import('../views/WhiteListOn.vue'),\r\n },\r\n {\r\n path: '/browse/:dir*',\r\n name: 'publicBrowse',\r\n component: () => import('../views/PublicBrowse.vue'),\r\n },\r\n {\r\n path: '/:pathMatch(.*)*',\r\n name: 'notFound',\r\n component: () => import('../views/NotFound.vue'),\r\n },\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","import { createStore } from 'vuex'\r\nimport axios from '@/utils/axios';\r\nimport createPersistedState from 'vuex-persistedstate';\r\n\r\nexport default createStore({\r\n state: {\r\n userConfig: null,\r\n bingWallPapers: [],\r\n // 会话状态标记(不存储密码,实际认证通过 HttpOnly Cookie)\r\n adminLoggedIn: false,\r\n userLoggedIn: false,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: undefined,\r\n compressQuality: undefined,\r\n compressBar: undefined,\r\n serverCompress: undefined,\r\n convertToWebp: undefined,\r\n },\r\n storeUploadChannel: '',\r\n storeChannelName: null, // 指定的渠道名称,null表示从未选择,''表示用户主动清空\r\n storeAutoRetry: true,\r\n storeUploadNameType: '',\r\n uploadFolder: '',\r\n customUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n adminUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n autoReUpload: true,\r\n // 深色模式\r\n useDarkMode: null,\r\n cusDarkMode: false,\r\n },\r\n getters: {\r\n userConfig: state => state.userConfig,\r\n bingWallPapers: state => state.bingWallPapers,\r\n // 保留 credentials getter 以兼容 fetchWithAuth.js 等现有代码\r\n credentials: state => state.adminLoggedIn ? '__session__' : null,\r\n adminLoggedIn: state => state.adminLoggedIn,\r\n userLoggedIn: state => state.userLoggedIn,\r\n storeUploadMethod: state => state.uploadMethod,\r\n uploadCopyUrlForm: state => state.uploadCopyUrlForm,\r\n compressConfig: state => state.compressConfig,\r\n storeUploadChannel: state => state.storeUploadChannel,\r\n storeChannelName: state => state.storeChannelName,\r\n storeUploadNameType: state => state.storeUploadNameType,\r\n customUrlSettings: state => state.customUrlSettings,\r\n storeAutoRetry: state => state.storeAutoRetry,\r\n adminUrlSettings: state => state.adminUrlSettings,\r\n storeUploadFolder: (state) => {\r\n return state.uploadFolder || localStorage.getItem('uploadFolder') || ''\r\n },\r\n useDarkMode: state => state.useDarkMode,\r\n cusDarkMode: state => state.cusDarkMode,\r\n storeAutoReUpload: state => state.autoReUpload,\r\n },\r\n mutations: {\r\n setUserConfig(state, userConfig) {\r\n state.userConfig = userConfig;\r\n },\r\n setBingWallPapers(state, bingWallPapers) {\r\n state.bingWallPapers = bingWallPapers;\r\n },\r\n // 兼容旧代码:setCredentials 映射到 adminLoggedIn\r\n setCredentials(state, credentials) {\r\n state.adminLoggedIn = credentials !== null && credentials !== undefined;\r\n },\r\n setAdminLoggedIn(state, loggedIn) {\r\n state.adminLoggedIn = loggedIn;\r\n },\r\n setUserLoggedIn(state, loggedIn) {\r\n state.userLoggedIn = loggedIn;\r\n },\r\n setUploadMethod(state, uploadMethod) {\r\n state.uploadMethod = uploadMethod;\r\n },\r\n setUploadCopyUrlForm(state, uploadCopyUrlForm) {\r\n state.uploadCopyUrlForm = uploadCopyUrlForm;\r\n },\r\n setCompressConfig(state, { key, value }) {\r\n state.compressConfig[key] = value;\r\n },\r\n setStoreUploadChannel(state, uploadChannel) {\r\n state.storeUploadChannel = uploadChannel;\r\n },\r\n setStoreChannelName(state, channelName) {\r\n state.storeChannelName = channelName;\r\n },\r\n setStoreUploadNameType(state, storeUploadNameType) {\r\n state.storeUploadNameType = storeUploadNameType;\r\n },\r\n setCustomUrlSettings(state, { key, value }) {\r\n state.customUrlSettings[key] = value;\r\n },\r\n setStoreAutoRetry(state, storeAutoRetry) {\r\n state.storeAutoRetry = storeAutoRetry;\r\n },\r\n setAdminUrlSettings(state, { key, value }) {\r\n state.adminUrlSettings[key] = value;\r\n },\r\n setUseDarkMode(state, useDarkMode) {\r\n state.useDarkMode = useDarkMode;\r\n },\r\n setCusDarkMode(state, cusDarkMode) {\r\n state.cusDarkMode = cusDarkMode;\r\n },\r\n setStoreUploadFolder(state, folder) {\r\n state.uploadFolder = folder\r\n localStorage.setItem('uploadFolder', folder)\r\n },\r\n setStoreAutoReUpload(state, autoReUpload) {\r\n state.autoReUpload = autoReUpload;\r\n }\r\n },\r\n actions: {\r\n async fetchUserConfig({ commit }) {\r\n try {\r\n const response = await axios.get('/api/userConfig');\r\n commit('setUserConfig', response.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n async fetchBingWallPapers({ commit }) {\r\n try {\r\n const response = await axios.get('/api/bing/wallpaper');\r\n const wallpapers = response.data.data;\r\n const bingWallPapers = wallpapers.map(wallpaper => {\r\n return {\r\n url: 'https://www.bing.com' + wallpaper.url,\r\n };\r\n }\r\n );\r\n\r\n //预加载图片,阻塞直到图片加载完成\r\n await Promise.all(bingWallPapers.map(wallpaper => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = resolve;\r\n img.onerror = reject;\r\n img.src = wallpaper.url;\r\n });\r\n }));\r\n commit('setBingWallPapers', bingWallPapers);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n },\r\n modules: {\r\n },\r\n plugins: [createPersistedState({\r\n // 只持久化非敏感数据,不持久化认证状态\r\n paths: [\r\n 'userConfig',\r\n 'uploadMethod',\r\n 'uploadCopyUrlForm',\r\n 'compressConfig',\r\n 'storeUploadChannel',\r\n 'storeChannelName',\r\n 'storeAutoRetry',\r\n 'storeUploadNameType',\r\n 'uploadFolder',\r\n 'customUrlSettings',\r\n 'adminUrlSettings',\r\n 'autoReUpload',\r\n 'useDarkMode',\r\n 'cusDarkMode',\r\n ]\r\n })]\r\n})\r\n","import { createI18n } from 'vue-i18n'\r\nimport zhCN from './zh-CN.json'\r\nimport en from './en.json'\r\n\r\nconst LOCALE_KEY = 'app-locale'\r\n\r\nfunction getStoredLocale() {\r\n const stored = localStorage.getItem(LOCALE_KEY)\r\n if (stored === 'zh-CN' || stored === 'en') return stored\r\n return 'zh-CN'\r\n}\r\n\r\nconst i18n = createI18n({\r\n legacy: true,\r\n locale: getStoredLocale(),\r\n fallbackLocale: 'zh-CN',\r\n messages: { 'zh-CN': zhCN, en }\r\n})\r\n\r\nexport function setLocale(locale) {\r\n i18n.global.locale = locale\r\n localStorage.setItem(LOCALE_KEY, locale)\r\n document.documentElement.lang = locale === 'zh-CN' ? 'zh-CN' : 'en'\r\n}\r\n\r\nexport { LOCALE_KEY, getStoredLocale }\r\nexport default i18n\r\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_router_view = _resolveComponent(\"router-view\");\n const _component_el_config_provider = _resolveComponent(\"el-config-provider\");\n return _openBlock(), _createBlock(_component_el_config_provider, {\n locale: $options.elementLocale\n }, {\n default: _withCtx(() => [_createVNode(_component_router_view)]),\n _: 1\n }, 8, [\"locale\"]);\n}","import { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nimport zhCnLocale from 'element-plus/es/locale/lang/zh-cn';\nimport enLocale from 'element-plus/es/locale/lang/en';\nexport default {\n data() {\n return {\n osInstance: null,\n imageViewerObserver: null\n };\n },\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode']),\n elementLocale() {\n return this.$i18n.locale === 'zh-CN' ? zhCnLocale : enLocale;\n }\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n this.setupImageViewerObserver();\n });\n },\n beforeUnmount() {\n // 清理 MutationObserver\n if (this.imageViewerObserver) {\n this.imageViewerObserver.disconnect();\n }\n },\n watch: {},\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n this.osInstance = OverlayScrollbars(document.body);\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n this.osInstance = OverlayScrollbars(document.body, {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: 'auto',\n autoHide: 'scroll',\n autoHideDelay: 600,\n dragScroll: true,\n clickScroll: true\n },\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n console.log('OverlayScrollbars initialized successfully');\n } catch (error) {\n console.error('Failed to initialize OverlayScrollbars:', error);\n }\n },\n setupImageViewerObserver() {\n // 监听图片预览器的打开/关闭,动态控制 OverlayScrollbars\n this.imageViewerObserver = new MutationObserver(mutations => {\n const imageViewer = document.querySelector('.el-image-viewer__wrapper');\n if (imageViewer) {\n // 图片预览器打开,禁用滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'hidden'\n }\n });\n }\n } else {\n // 图片预览器关闭,恢复滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n }\n }\n });\n this.imageViewerObserver.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=6633a13d\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\r\nimport { createHead } from '@vueuse/head'; // 导入 createHead\r\nimport ElementPlus from 'element-plus'\r\nimport 'element-plus/es/components/message/style/css'\r\nimport 'element-plus/es/components/message-box/style/css'\r\n\r\nimport { library } from '@fortawesome/fontawesome-svg-core';\r\nimport { fas } from '@fortawesome/free-solid-svg-icons'; // 引入所有 solid 图标\r\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\nimport i18n from './locales'\r\n\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport 'element-plus/theme-chalk/dark/css-vars.css'\r\nimport './styles/global.css'\r\n\r\n// OverlayScrollbars 悬浮滚动条\r\nimport 'overlayscrollbars/overlayscrollbars.css'\r\n\r\n\r\nlibrary.add(fas);\r\n\r\nconst app = createApp(App);\r\nconst head = createHead(); // 创建 head 对象\r\n\r\napp.component('font-awesome-icon', FontAwesomeIcon);\r\nfor (const [key, component] of Object.entries(ElementPlusIconsVue)) {\r\n app.component(key, component)\r\n}\r\n\r\n// 根据 useDarkMode 的值添加或移除 dark 类\r\nconst initDarkModeClass = () => {\r\n const htmlElement = document.documentElement;\r\n let isDarkMode;\r\n\r\n // 判断用户是否是自定义模式\r\n if (store.state.cusDarkMode && store.state.useDarkMode !== null) {\r\n // 用户手动设置了暗色模式\r\n isDarkMode = store.state.useDarkMode;\r\n } else {\r\n // 跟随系统模式或时间\r\n isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n if (!isDarkMode) {\r\n const now = new Date();\r\n const hour = now.getHours();\r\n isDarkMode = hour >= 22 || hour < 6;\r\n }\r\n // 更新 useDarkMode 的值\r\n store.commit('setUseDarkMode', isDarkMode);\r\n }\r\n\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\nconst applyDarkModeClass = (isDarkMode) => {\r\n const htmlElement = document.documentElement;\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\n// 预设网站标题的函数\r\nconst presetSiteTitle = (userConfig) => {\r\n document.title = userConfig?.siteTitle || 'Sanyue ImgHub';\r\n};\r\n\r\n// 预设和更新网站图标的函数\r\nconst presetSiteIcon = (isDarkMode, userConfig) => {\r\n // 同时更改 icon apple-touch-icon 和 mask-icon\r\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\r\n existingIcons.forEach(icon => icon.remove());\r\n\r\n const iconLink = document.createElement('link');\r\n const appleIconLink = document.createElement('link');\r\n const maskIconLink = document.createElement('link');\r\n iconLink.rel = 'icon';\r\n appleIconLink.rel = 'apple-touch-icon';\r\n maskIconLink.rel = 'mask-icon';\r\n\r\n if (isDarkMode) {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n }\r\n\r\n document.head.appendChild(iconLink);\r\n document.head.appendChild(appleIconLink);\r\n document.head.appendChild(maskIconLink);\r\n};\r\n\r\nstore.dispatch('fetchUserConfig').then(() => {\r\n // 初始化时应用 dark 模式\r\n initDarkModeClass();\r\n\r\n // 预设网站标题和图标\r\n presetSiteTitle(store.getters.userConfig);\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n\r\n // 监听 useDarkMode 和 cusDarkMode 的变化\r\n store.subscribe((mutation, state) => {\r\n if (mutation.type === 'setUseDarkMode' && store.state.cusDarkMode) {\r\n applyDarkModeClass(state.useDarkMode);\r\n // 同时更新网站图标\r\n presetSiteIcon(state.useDarkMode, store.getters.userConfig);\r\n }\r\n\r\n // 监听 cusDarkMode 变化,当设置为 false 时重新初始化\r\n if (mutation.type === 'setCusDarkMode' && !mutation.payload) {\r\n // 切换到跟随系统模式,重新初始化\r\n initDarkModeClass();\r\n // 同时更新网站图标\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n }\r\n });\r\n\r\n app.use(store).use(router).use(ElementPlus).use(i18n).mount('#app');\r\n}).catch(error => {\r\n console.error('Failed to load user configuration:', error);\r\n app.use(store).use(router).use(ElementPlus).use(i18n).use(head).mount('#app');\r\n})\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"51\":\"6e7bf298\",\"75\":\"75dccc00\",\"226\":\"ec43855c\",\"309\":\"b7dca603\",\"365\":\"ae007b9b\",\"396\":\"226339af\",\"454\":\"54701290\",\"600\":\"08192622\",\"604\":\"7ad54f22\",\"718\":\"27080555\",\"728\":\"42caee39\",\"917\":\"b77a6783\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + {\"51\":\"1dd65d6c\",\"75\":\"eb4ff77d\",\"226\":\"6548e7b4\",\"365\":\"953080b6\",\"396\":\"3a3d9729\",\"428\":\"8044ed41\",\"454\":\"1a1814c6\",\"604\":\"7c4f56c5\",\"718\":\"d0974d1c\",\"728\":\"7c4f56c5\",\"740\":\"a94dbb46\",\"833\":\"95983fa6\",\"917\":\"8529ad1e\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"sanyue_imghub:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"51\":1,\"75\":1,\"226\":1,\"365\":1,\"396\":1,\"428\":1,\"454\":1,\"604\":1,\"718\":1,\"728\":1,\"740\":1,\"833\":1,\"917\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(428|740|833)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunksanyue_imghub\"] = self[\"webpackChunksanyue_imghub\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(50248); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","withCredentials","adminAuthGuard","to","from","next","get","then","res","data","adminRequired","store","commit","valid","authType","wasLoggedIn","state","adminLoggedIn","name","ElMessage","error","i18n","global","t","catch","userAuthGuard","userRequired","userLoggedIn","routes","path","component","beforeEnter","router","createRouter","history","createWebHistory","process","createStore","userConfig","bingWallPapers","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","undefined","compressQuality","compressBar","serverCompress","convertToWebp","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode","getters","credentials","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setCredentials","setAdminLoggedIn","loggedIn","setUserLoggedIn","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","key","value","setStoreUploadChannel","uploadChannel","setStoreChannelName","channelName","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","response","console","log","fetchBingWallPapers","wallpapers","map","wallpaper","url","Promise","all","resolve","reject","img","Image","onload","onerror","src","modules","plugins","createPersistedState","paths","LOCALE_KEY","getStoredLocale","stored","createI18n","legacy","locale","fallbackLocale","messages","zhCN","en","setLocale","document","documentElement","lang","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","_component_el_config_provider","elementLocale","default","_","osInstance","imageViewerObserver","computed","this","$i18n","mounted","$nextTick","initOverlayScrollbars","setupImageViewerObserver","beforeUnmount","disconnect","watch","methods","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","MutationObserver","imageViewer","querySelector","options","observe","childList","subtree","__exports__","library","add","fas","app","createApp","App","head","createHead","FontAwesomeIcon","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","isDarkMode","window","matchMedia","matches","now","Date","hour","getHours","classList","remove","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","existingIcons","querySelectorAll","forEach","icon","iconLink","createElement","appleIconLink","maskIconLink","rel","href","siteIcon","appendChild","dispatch","subscribe","mutation","type","payload","use","ElementPlus","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","push","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","event","clearTimeout","timeout","doneFns","parentNode","removeChild","setTimeout","bind","target","Symbol","toStringTag","p","createStylesheet","fullhref","oldTag","linkTag","nonce","onLinkComplete","errorType","realHref","err","Error","code","request","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","test","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","id","chunkLoadingGlobal","self","__webpack_exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/app.5a29ed6b.js","mappings":"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","sources":["webpack://sanyue_imghub/./src/utils/axios.js","webpack://sanyue_imghub/./src/router/index.js","webpack://sanyue_imghub/./src/store/index.js","webpack://sanyue_imghub/./src/locales/index.js","webpack://sanyue_imghub/./src/App.vue?83ca","webpack://sanyue_imghub/./src/App.vue","webpack://sanyue_imghub/./src/App.vue?a135","webpack://sanyue_imghub/./src/main.js","webpack://sanyue_imghub/webpack/bootstrap","webpack://sanyue_imghub/webpack/runtime/chunk loaded","webpack://sanyue_imghub/webpack/runtime/compat get default export","webpack://sanyue_imghub/webpack/runtime/define property getters","webpack://sanyue_imghub/webpack/runtime/ensure chunk","webpack://sanyue_imghub/webpack/runtime/get javascript chunk filename","webpack://sanyue_imghub/webpack/runtime/get mini-css chunk filename","webpack://sanyue_imghub/webpack/runtime/global","webpack://sanyue_imghub/webpack/runtime/hasOwnProperty shorthand","webpack://sanyue_imghub/webpack/runtime/load script","webpack://sanyue_imghub/webpack/runtime/make namespace object","webpack://sanyue_imghub/webpack/runtime/publicPath","webpack://sanyue_imghub/webpack/runtime/css loading","webpack://sanyue_imghub/webpack/runtime/jsonp chunk loading","webpack://sanyue_imghub/webpack/startup"],"sourcesContent":["import axios from 'axios';\r\n\r\n// 创建axios实例\r\nconst instance = axios.create({\r\n baseURL: process.env.NODE_ENV === 'production' ? '/' : '/api',\r\n withCredentials: true, // 始终携带 Cookie(HttpOnly session cookie)\r\n});\r\n\r\nexport default instance;\r\n","import { createRouter, createWebHistory } from 'vue-router'\r\nimport { ElMessage } from 'element-plus'\r\nimport store from '../store'\r\nimport axios from '@/utils/axios'\r\nimport i18n from '@/locales'\r\n\r\n// 通用的管理员认证守卫\r\nconst adminAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要管理端认证,直接放行\r\n if (!data.adminRequired) {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效的 admin session\r\n if (data.valid && data.authType === 'admin') {\r\n store.commit('setAdminLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.adminLoggedIn\r\n store.commit('setAdminLoggedIn', false)\r\n if (to.name !== 'adminLogin') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'adminLogin' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\n// 通用的用户认证守卫\r\nconst userAuthGuard = (to, from, next) => {\r\n axios.get('/api/auth/sessionCheck', {\r\n withCredentials: true\r\n }).then(res => {\r\n const data = res.data || {}\r\n\r\n // 不需要用户端认证,直接放行\r\n if (!data.userRequired) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证,检查是否有有效 session(user 或 admin 都可以)\r\n if (data.valid) {\r\n store.commit('setUserLoggedIn', true)\r\n return next()\r\n }\r\n\r\n // 需要认证但没有有效 session,跳转登录\r\n // 只有之前已登录(session 过期)才提示错误,首次未登录静默跳转\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n }).catch(() => {\r\n const wasLoggedIn = store.state.userLoggedIn\r\n store.commit('setUserLoggedIn', false)\r\n if (to.name !== 'login') {\r\n if (wasLoggedIn) {\r\n ElMessage.error(i18n.global.t('login.authRequired'))\r\n }\r\n next({ name: 'login' })\r\n } else {\r\n next()\r\n }\r\n })\r\n}\r\n\r\nconst routes = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: () => import('../views/UploadHome.vue'),\r\n beforeEnter: userAuthGuard\r\n },\r\n {\r\n path: '/login',\r\n name: 'login',\r\n component: () => import('../views/Login.vue')\r\n },\r\n {\r\n path: '/dashboard',\r\n name: 'dashboard',\r\n component: () => import('../views/AdminDashBoard.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/customerConfig',\r\n name: 'customerConfig',\r\n component: () => import('../views/CustomerConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/systemConfig',\r\n name: 'systemConfig',\r\n component: () => import('../views/SystemConfig.vue'),\r\n beforeEnter: adminAuthGuard\r\n },\r\n {\r\n path: '/adminLogin',\r\n name: 'adminLogin',\r\n component: () => import('../views/AdminLogin.vue'),\r\n },\r\n {\r\n path: '/blockimg',\r\n name: 'blockimg',\r\n component: () => import('../views/BlockImage.vue'),\r\n },\r\n {\r\n path: '/whiteliston',\r\n name: 'whiteliston',\r\n component: () => import('../views/WhiteListOn.vue'),\r\n },\r\n {\r\n path: '/browse/:dir*',\r\n name: 'publicBrowse',\r\n component: () => import('../views/PublicBrowse.vue'),\r\n },\r\n {\r\n path: '/:pathMatch(.*)*',\r\n name: 'notFound',\r\n component: () => import('../views/NotFound.vue'),\r\n },\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","import { createStore } from 'vuex'\r\nimport axios from '@/utils/axios';\r\nimport createPersistedState from 'vuex-persistedstate';\r\n\r\nexport default createStore({\r\n state: {\r\n userConfig: null,\r\n bingWallPapers: [],\r\n // 会话状态标记(不存储密码,实际认证通过 HttpOnly Cookie)\r\n adminLoggedIn: false,\r\n userLoggedIn: false,\r\n uploadMethod: 'default',\r\n uploadCopyUrlForm: '',\r\n compressConfig: {\r\n customerCompress: undefined,\r\n compressQuality: undefined,\r\n compressBar: undefined,\r\n serverCompress: undefined,\r\n convertToWebp: undefined,\r\n },\r\n storeUploadChannel: '',\r\n storeChannelName: null, // 指定的渠道名称,null表示从未选择,''表示用户主动清空\r\n storeAutoRetry: true,\r\n storeUploadNameType: '',\r\n uploadFolder: '',\r\n customUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n adminUrlSettings: {\r\n useCustomUrl: 'false',\r\n customUrlPrefix: '',\r\n },\r\n autoReUpload: true,\r\n // 深色模式\r\n useDarkMode: null,\r\n cusDarkMode: false,\r\n },\r\n getters: {\r\n userConfig: state => state.userConfig,\r\n bingWallPapers: state => state.bingWallPapers,\r\n // 保留 credentials getter 以兼容 fetchWithAuth.js 等现有代码\r\n credentials: state => state.adminLoggedIn ? '__session__' : null,\r\n adminLoggedIn: state => state.adminLoggedIn,\r\n userLoggedIn: state => state.userLoggedIn,\r\n storeUploadMethod: state => state.uploadMethod,\r\n uploadCopyUrlForm: state => state.uploadCopyUrlForm,\r\n compressConfig: state => state.compressConfig,\r\n storeUploadChannel: state => state.storeUploadChannel,\r\n storeChannelName: state => state.storeChannelName,\r\n storeUploadNameType: state => state.storeUploadNameType,\r\n customUrlSettings: state => state.customUrlSettings,\r\n storeAutoRetry: state => state.storeAutoRetry,\r\n adminUrlSettings: state => state.adminUrlSettings,\r\n storeUploadFolder: (state) => {\r\n return state.uploadFolder || localStorage.getItem('uploadFolder') || ''\r\n },\r\n useDarkMode: state => state.useDarkMode,\r\n cusDarkMode: state => state.cusDarkMode,\r\n storeAutoReUpload: state => state.autoReUpload,\r\n },\r\n mutations: {\r\n setUserConfig(state, userConfig) {\r\n state.userConfig = userConfig;\r\n },\r\n setBingWallPapers(state, bingWallPapers) {\r\n state.bingWallPapers = bingWallPapers;\r\n },\r\n // 兼容旧代码:setCredentials 映射到 adminLoggedIn\r\n setCredentials(state, credentials) {\r\n state.adminLoggedIn = credentials !== null && credentials !== undefined;\r\n },\r\n setAdminLoggedIn(state, loggedIn) {\r\n state.adminLoggedIn = loggedIn;\r\n },\r\n setUserLoggedIn(state, loggedIn) {\r\n state.userLoggedIn = loggedIn;\r\n },\r\n setUploadMethod(state, uploadMethod) {\r\n state.uploadMethod = uploadMethod;\r\n },\r\n setUploadCopyUrlForm(state, uploadCopyUrlForm) {\r\n state.uploadCopyUrlForm = uploadCopyUrlForm;\r\n },\r\n setCompressConfig(state, { key, value }) {\r\n state.compressConfig[key] = value;\r\n },\r\n setStoreUploadChannel(state, uploadChannel) {\r\n state.storeUploadChannel = uploadChannel;\r\n },\r\n setStoreChannelName(state, channelName) {\r\n state.storeChannelName = channelName;\r\n },\r\n setStoreUploadNameType(state, storeUploadNameType) {\r\n state.storeUploadNameType = storeUploadNameType;\r\n },\r\n setCustomUrlSettings(state, { key, value }) {\r\n state.customUrlSettings[key] = value;\r\n },\r\n setStoreAutoRetry(state, storeAutoRetry) {\r\n state.storeAutoRetry = storeAutoRetry;\r\n },\r\n setAdminUrlSettings(state, { key, value }) {\r\n state.adminUrlSettings[key] = value;\r\n },\r\n setUseDarkMode(state, useDarkMode) {\r\n state.useDarkMode = useDarkMode;\r\n },\r\n setCusDarkMode(state, cusDarkMode) {\r\n state.cusDarkMode = cusDarkMode;\r\n },\r\n setStoreUploadFolder(state, folder) {\r\n state.uploadFolder = folder\r\n localStorage.setItem('uploadFolder', folder)\r\n },\r\n setStoreAutoReUpload(state, autoReUpload) {\r\n state.autoReUpload = autoReUpload;\r\n }\r\n },\r\n actions: {\r\n async fetchUserConfig({ commit }) {\r\n try {\r\n const response = await axios.get('/api/userConfig');\r\n commit('setUserConfig', response.data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n },\r\n async fetchBingWallPapers({ commit }) {\r\n try {\r\n const response = await axios.get('/api/bing/wallpaper');\r\n const wallpapers = response.data.data;\r\n const bingWallPapers = wallpapers.map(wallpaper => {\r\n return {\r\n url: 'https://www.bing.com' + wallpaper.url,\r\n };\r\n }\r\n );\r\n\r\n //预加载图片,阻塞直到图片加载完成\r\n await Promise.all(bingWallPapers.map(wallpaper => {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = resolve;\r\n img.onerror = reject;\r\n img.src = wallpaper.url;\r\n });\r\n }));\r\n commit('setBingWallPapers', bingWallPapers);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n },\r\n modules: {\r\n },\r\n plugins: [createPersistedState({\r\n // 只持久化非敏感数据,不持久化认证状态\r\n paths: [\r\n 'userConfig',\r\n 'uploadMethod',\r\n 'uploadCopyUrlForm',\r\n 'compressConfig',\r\n 'storeUploadChannel',\r\n 'storeChannelName',\r\n 'storeAutoRetry',\r\n 'storeUploadNameType',\r\n 'uploadFolder',\r\n 'customUrlSettings',\r\n 'adminUrlSettings',\r\n 'autoReUpload',\r\n 'useDarkMode',\r\n 'cusDarkMode',\r\n ]\r\n })]\r\n})\r\n","import { createI18n } from 'vue-i18n'\r\nimport zhCN from './zh-CN.json'\r\nimport en from './en.json'\r\n\r\nconst LOCALE_KEY = 'app-locale'\r\n\r\nfunction getStoredLocale() {\r\n const stored = localStorage.getItem(LOCALE_KEY)\r\n if (stored === 'zh-CN' || stored === 'en') return stored\r\n return 'zh-CN'\r\n}\r\n\r\nconst i18n = createI18n({\r\n legacy: true,\r\n locale: getStoredLocale(),\r\n fallbackLocale: 'zh-CN',\r\n messages: { 'zh-CN': zhCN, en }\r\n})\r\n\r\nexport function setLocale(locale) {\r\n i18n.global.locale = locale\r\n localStorage.setItem(LOCALE_KEY, locale)\r\n document.documentElement.lang = locale === 'zh-CN' ? 'zh-CN' : 'en'\r\n}\r\n\r\nexport { LOCALE_KEY, getStoredLocale }\r\nexport default i18n\r\n","import { resolveComponent as _resolveComponent, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\";\nexport function render(_ctx, _cache, $props, $setup, $data, $options) {\n const _component_router_view = _resolveComponent(\"router-view\");\n const _component_el_config_provider = _resolveComponent(\"el-config-provider\");\n return _openBlock(), _createBlock(_component_el_config_provider, {\n locale: $options.elementLocale\n }, {\n default: _withCtx(() => [_createVNode(_component_router_view)]),\n _: 1\n }, 8, [\"locale\"]);\n}","import { mapGetters } from 'vuex';\nimport { OverlayScrollbars } from 'overlayscrollbars';\nimport zhCnLocale from 'element-plus/es/locale/lang/zh-cn';\nimport enLocale from 'element-plus/es/locale/lang/en';\nexport default {\n data() {\n return {\n osInstance: null,\n imageViewerObserver: null\n };\n },\n computed: {\n ...mapGetters(['userConfig', 'useDarkMode']),\n elementLocale() {\n return this.$i18n.locale === 'zh-CN' ? zhCnLocale : enLocale;\n }\n },\n mounted() {\n // 初始化 OverlayScrollbars 悬浮滚动条\n this.$nextTick(() => {\n this.initOverlayScrollbars();\n this.setupImageViewerObserver();\n });\n },\n beforeUnmount() {\n // 清理 MutationObserver\n if (this.imageViewerObserver) {\n this.imageViewerObserver.disconnect();\n }\n },\n watch: {},\n methods: {\n initOverlayScrollbars() {\n try {\n // 检查是否已经初始化\n if (OverlayScrollbars.valid(document.body)) {\n this.osInstance = OverlayScrollbars(document.body);\n return;\n }\n\n // 应用到 body 实现全局悬浮滚动条\n this.osInstance = OverlayScrollbars(document.body, {\n scrollbars: {\n theme: 'os-theme-dark',\n visibility: 'auto',\n autoHide: 'scroll',\n autoHideDelay: 600,\n dragScroll: true,\n clickScroll: true\n },\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n console.log('OverlayScrollbars initialized successfully');\n } catch (error) {\n console.error('Failed to initialize OverlayScrollbars:', error);\n }\n },\n setupImageViewerObserver() {\n // 监听图片预览器的打开/关闭,动态控制 OverlayScrollbars\n this.imageViewerObserver = new MutationObserver(mutations => {\n const imageViewer = document.querySelector('.el-image-viewer__wrapper');\n if (imageViewer) {\n // 图片预览器打开,禁用滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'hidden'\n }\n });\n }\n } else {\n // 图片预览器关闭,恢复滚动\n if (this.osInstance) {\n this.osInstance.options({\n overflow: {\n x: 'hidden',\n y: 'scroll'\n }\n });\n }\n }\n });\n this.imageViewerObserver.observe(document.body, {\n childList: true,\n subtree: true\n });\n }\n }\n};","/* unplugin-vue-components disabled */import { render } from \"./App.vue?vue&type=template&id=6633a13d\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\r\nimport { createHead } from '@vueuse/head'; // 导入 createHead\r\nimport ElementPlus from 'element-plus'\r\nimport 'element-plus/es/components/message/style/css'\r\nimport 'element-plus/es/components/message-box/style/css'\r\n\r\nimport { library } from '@fortawesome/fontawesome-svg-core';\r\nimport { fas } from '@fortawesome/free-solid-svg-icons'; // 引入所有 solid 图标\r\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\r\n\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\nimport i18n from './locales'\r\n\r\nimport * as ElementPlusIconsVue from '@element-plus/icons-vue'\r\nimport 'element-plus/theme-chalk/dark/css-vars.css'\r\nimport './styles/global.css'\r\n\r\n// OverlayScrollbars 悬浮滚动条\r\nimport 'overlayscrollbars/overlayscrollbars.css'\r\n\r\n\r\nlibrary.add(fas);\r\n\r\nconst app = createApp(App);\r\nconst head = createHead(); // 创建 head 对象\r\n\r\napp.component('font-awesome-icon', FontAwesomeIcon);\r\nfor (const [key, component] of Object.entries(ElementPlusIconsVue)) {\r\n app.component(key, component)\r\n}\r\n\r\n// 根据 useDarkMode 的值添加或移除 dark 类\r\nconst initDarkModeClass = () => {\r\n const htmlElement = document.documentElement;\r\n let isDarkMode;\r\n\r\n // 判断用户是否是自定义模式\r\n if (store.state.cusDarkMode && store.state.useDarkMode !== null) {\r\n // 用户手动设置了暗色模式\r\n isDarkMode = store.state.useDarkMode;\r\n } else {\r\n // 跟随系统模式或时间\r\n isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n if (!isDarkMode) {\r\n const now = new Date();\r\n const hour = now.getHours();\r\n isDarkMode = hour >= 22 || hour < 6;\r\n }\r\n // 更新 useDarkMode 的值\r\n store.commit('setUseDarkMode', isDarkMode);\r\n }\r\n\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\nconst applyDarkModeClass = (isDarkMode) => {\r\n const htmlElement = document.documentElement;\r\n if (isDarkMode) {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n};\r\n\r\n// 预设网站标题的函数\r\nconst presetSiteTitle = (userConfig) => {\r\n document.title = userConfig?.siteTitle || 'Sanyue ImgHub';\r\n};\r\n\r\n// 预设和更新网站图标的函数\r\nconst presetSiteIcon = (isDarkMode, userConfig) => {\r\n // 同时更改 icon apple-touch-icon 和 mask-icon\r\n const existingIcons = document.querySelectorAll('link[rel=\"icon\"], link[rel=\"apple-touch-icon\"], link[rel=\"mask-icon\"]');\r\n existingIcons.forEach(icon => icon.remove());\r\n\r\n const iconLink = document.createElement('link');\r\n const appleIconLink = document.createElement('link');\r\n const maskIconLink = document.createElement('link');\r\n iconLink.rel = 'icon';\r\n appleIconLink.rel = 'apple-touch-icon';\r\n maskIconLink.rel = 'mask-icon';\r\n\r\n if (isDarkMode) {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo-dark.png';\r\n } else {\r\n iconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n appleIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n maskIconLink.href = userConfig?.siteIcon || '/static/media/logo.png';\r\n }\r\n\r\n document.head.appendChild(iconLink);\r\n document.head.appendChild(appleIconLink);\r\n document.head.appendChild(maskIconLink);\r\n};\r\n\r\nstore.dispatch('fetchUserConfig').then(() => {\r\n // 初始化时应用 dark 模式\r\n initDarkModeClass();\r\n\r\n // 预设网站标题和图标\r\n presetSiteTitle(store.getters.userConfig);\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n\r\n // 监听 useDarkMode 和 cusDarkMode 的变化\r\n store.subscribe((mutation, state) => {\r\n if (mutation.type === 'setUseDarkMode' && store.state.cusDarkMode) {\r\n applyDarkModeClass(state.useDarkMode);\r\n // 同时更新网站图标\r\n presetSiteIcon(state.useDarkMode, store.getters.userConfig);\r\n }\r\n\r\n // 监听 cusDarkMode 变化,当设置为 false 时重新初始化\r\n if (mutation.type === 'setCusDarkMode' && !mutation.payload) {\r\n // 切换到跟随系统模式,重新初始化\r\n initDarkModeClass();\r\n // 同时更新网站图标\r\n presetSiteIcon(store.state.useDarkMode, store.getters.userConfig);\r\n }\r\n });\r\n\r\n app.use(store).use(router).use(ElementPlus).use(i18n).mount('#app');\r\n}).catch(error => {\r\n console.error('Failed to load user configuration:', error);\r\n app.use(store).use(router).use(ElementPlus).use(i18n).use(head).mount('#app');\r\n})\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + chunkId + \".\" + {\"51\":\"6e7bf298\",\"226\":\"ec43855c\",\"309\":\"b7dca603\",\"369\":\"df3ca2df\",\"396\":\"226339af\",\"454\":\"54701290\",\"600\":\"08192622\",\"604\":\"7ad54f22\",\"718\":\"27080555\",\"728\":\"42caee39\",\"731\":\"90070be6\",\"917\":\"b77a6783\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"css/\" + chunkId + \".\" + {\"51\":\"1dd65d6c\",\"226\":\"6548e7b4\",\"369\":\"149afd90\",\"396\":\"3a3d9729\",\"428\":\"8044ed41\",\"454\":\"1a1814c6\",\"604\":\"7c4f56c5\",\"718\":\"d0974d1c\",\"728\":\"7c4f56c5\",\"731\":\"953080b6\",\"740\":\"a94dbb46\",\"833\":\"95983fa6\",\"917\":\"8529ad1e\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"sanyue_imghub:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = function(chunkId, fullhref, oldTag, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"51\":1,\"226\":1,\"369\":1,\"396\":1,\"428\":1,\"454\":1,\"604\":1,\"718\":1,\"728\":1,\"731\":1,\"740\":1,\"833\":1,\"917\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(428|740|833)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunksanyue_imghub\"] = self[\"webpackChunksanyue_imghub\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(50248); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["instance","axios","create","baseURL","withCredentials","adminAuthGuard","to","from","next","get","then","res","data","adminRequired","store","commit","valid","authType","wasLoggedIn","state","adminLoggedIn","name","ElMessage","error","i18n","global","t","catch","userAuthGuard","userRequired","userLoggedIn","routes","path","component","beforeEnter","router","createRouter","history","createWebHistory","process","createStore","userConfig","bingWallPapers","uploadMethod","uploadCopyUrlForm","compressConfig","customerCompress","undefined","compressQuality","compressBar","serverCompress","convertToWebp","storeUploadChannel","storeChannelName","storeAutoRetry","storeUploadNameType","uploadFolder","customUrlSettings","useCustomUrl","customUrlPrefix","adminUrlSettings","autoReUpload","useDarkMode","cusDarkMode","getters","credentials","storeUploadMethod","storeUploadFolder","localStorage","getItem","storeAutoReUpload","mutations","setUserConfig","setBingWallPapers","setCredentials","setAdminLoggedIn","loggedIn","setUserLoggedIn","setUploadMethod","setUploadCopyUrlForm","setCompressConfig","key","value","setStoreUploadChannel","uploadChannel","setStoreChannelName","channelName","setStoreUploadNameType","setCustomUrlSettings","setStoreAutoRetry","setAdminUrlSettings","setUseDarkMode","setCusDarkMode","setStoreUploadFolder","folder","setItem","setStoreAutoReUpload","actions","fetchUserConfig","response","console","log","fetchBingWallPapers","wallpapers","map","wallpaper","url","Promise","all","resolve","reject","img","Image","onload","onerror","src","modules","plugins","createPersistedState","paths","LOCALE_KEY","getStoredLocale","stored","createI18n","legacy","locale","fallbackLocale","messages","zhCN","en","setLocale","document","documentElement","lang","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_view","_component_el_config_provider","elementLocale","default","_","osInstance","imageViewerObserver","computed","this","$i18n","mounted","$nextTick","initOverlayScrollbars","setupImageViewerObserver","beforeUnmount","disconnect","watch","methods","body","scrollbars","theme","visibility","autoHide","autoHideDelay","dragScroll","clickScroll","overflow","x","y","MutationObserver","imageViewer","querySelector","options","observe","childList","subtree","__exports__","library","add","fas","app","createApp","App","head","createHead","FontAwesomeIcon","Object","entries","ElementPlusIconsVue","initDarkModeClass","htmlElement","isDarkMode","window","matchMedia","matches","now","Date","hour","getHours","classList","remove","applyDarkModeClass","presetSiteTitle","title","siteTitle","presetSiteIcon","existingIcons","querySelectorAll","forEach","icon","iconLink","createElement","appleIconLink","maskIconLink","rel","href","siteIcon","appendChild","dispatch","subscribe","mutation","type","payload","use","ElementPlus","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","reduce","promises","u","miniCssF","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","inProgress","dataWebpackPrefix","l","done","push","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","event","clearTimeout","timeout","doneFns","parentNode","removeChild","setTimeout","bind","target","Symbol","toStringTag","p","createStylesheet","fullhref","oldTag","linkTag","nonce","onLinkComplete","errorType","realHref","err","Error","code","request","insertBefore","nextSibling","findStylesheet","existingLinkTags","tag","dataHref","existingStyleTags","loadStylesheet","installedCssChunks","miniCss","cssChunks","installedChunks","installedChunkData","test","promise","loadingEnded","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","id","chunkLoadingGlobal","self","__webpack_exports__"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend-dist/js/app.5a29ed6b.js.map.gz b/frontend-dist/js/app.5a29ed6b.js.map.gz new file mode 100644 index 0000000000000000000000000000000000000000..3e5ac69a03181c4edc314d71207f889903fd05ff GIT binary patch literal 16631 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