diff --git a/dist/css/index.4e2a66fa.css b/dist/css/index.4e2a66fa.css
deleted file mode 100644
index c11e187..0000000
--- a/dist/css/index.4e2a66fa.css
+++ /dev/null
@@ -1 +0,0 @@
-:root{--bg-color:#282a36;--accent:#353744;--current-line:#44475a;--comment:#6272a4;--foreground:#f8f8f2;--orange:#ffb86c;--cyan:#8be9fd;--green:#50fa7b;--pink:#ff79c6;--purple:#bd93f9;--red:#f55;--yellow:#f1fa8c}body{background:var(--bg-color);margin:0}#app{height:100vh;width:100vw;font-family:Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--foreground);display:grid;grid-template-areas:"header header" "filters body " "stats body " "footer body ";grid-template-columns:1fr 5fr;grid-template-rows:auto 1fr auto auto}@media only screen and (max-width:922px){#app{grid-template-areas:"header header" "filters filters" "body body ";grid-template-rows:auto auto 1fr}}@media only screen and (max-width:600px){.github-link{display:none}}header{grid-area:header;height:64px;background:var(--bg-color);color:var(--foreground)}nav{display:flex;flex-direction:row;text-align:center;vertical-align:middle}nav a{font-weight:700;color:var(--foreground)}nav a.router-link-exact-active{color:var(--orange)}.navbar-logo img{height:48px;padding:8px 24px}.navbar-element{text-align:center;line-height:16px;padding:24px 32px}.navbar-element:hover,.navbar-logo:hover{background:var(--current-line)}.spacer{width:100%}.vlist[data-v-4b7b1630]{overflow-y:auto}.vlist[data-v-4b7b1630],.vscroll[data-v-4b7b1630]{height:calc(100% - 3em)}.inactive[data-v-12531736],.offline[data-v-12531736]{color:var(--comment)}.serverView[data-v-12531736]{margin:0 1rem 1rem 1rem;overflow:auto}.serverList[data-v-12531736]{overflow-y:auto;height:100%}.serverHeaders[data-v-12531736],.serverRow[data-v-12531736]{box-sizing:border-box;display:grid;grid-template-columns:4ch 178px 20ch 8ch 8ch 8ch 1fr;background:var(--bg-color);text-align:left;cursor:pointer;margin:0;transition:border .25s;height:100px}.serverHeaders[data-v-12531736]{height:3em;background:var(--current-line)}.serverHeaders>span[data-v-12531736]{padding:.5em .8em 0 .25em}.serverRow.odd[data-v-12531736]{background:var(--accent)}.serverRow.uneven[data-v-12531736]{background:var(--bg-color)}.serverRow[data-v-12531736]:hover{background:var(--current-line)}.serverRow>div[data-v-12531736]{padding:.5em .8em 0 .25em}.serverRow>div[data-v-12531736]:not(:last-child){border-right:solid var(--bg-color) 2px}img[data-v-12531736]{-o-object-fit:contain;object-fit:contain;height:100%}.playerTable *{box-sizing:border-box}.playerTable{grid-area:list;margin-right:1rem;height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none}.playerHeaders,.playerRow{box-sizing:border-box;display:grid;grid-template-columns:5ch 20ch 6ch 6ch 6ch 10ch 1fr;background:var(--bg-color);text-align:left;cursor:pointer;margin:0;transition:border .25s;height:2em}.playerRow.odd{background:var(--accent)}.playerRow.uneven{background:var(--bg-color)}.playerRow:hover{background:var(--current-line)}.playerRow>div:not(:last-child){border-right:solid var(--bg-color) 2px}.playerRow>div{padding:.5em .8em 0 .25em;overflow:hidden}.playerHeaders{position:sticky;top:0;height:3em}.playerHeaders>span{padding:.5em .8em 0 .25em}.playerHeaders{background:var(--current-line)}.playerHeaders div:hover{background:var(--bg-color)}.playerHeaders>div:not(:last-child){border-right:solid var(--bg-color) 2px}.playerHeaders>span:last-child{width:100%}@media only screen and (max-width:600px){.playerHeaders>span:nth-child(6),.playerHeaders>span:nth-child(7),.playerRow>div:nth-child(6),.playerRow>div:nth-child(7){display:none}.playerHeaders,.playerRow{grid-template-columns:5ch 20ch 6ch 6ch 1fr}}.player span{pointer-events:none}.selected{background:var(--comment)!important}canvas[data-v-77326078]{background:var(--accent)}.playerChart[data-v-77326078]{position:relative}#refreshChart[data-v-77326078]{position:absolute;top:0;left:0}@media only screen and (max-width:922px){canvas[data-v-77326078]{display:none!important}}.weaponChart[data-v-54a2c8e6]{width:calc(min(50vw, 50vh) - 3em);height:calc(min(50vw, 50vh) - 3em)}@media only screen and (max-width:922px){canvas[data-v-54a2c8e6]{display:none!important}}fieldset[disabled] .multiselect{pointer-events:none}.multiselect__spinner{position:absolute;right:1px;top:1px;width:40px;height:38px;background:#fff;display:block}.multiselect__spinner:after,.multiselect__spinner:before{position:absolute;content:"";top:50%;left:50%;margin:-8px 0 0 -8px;width:16px;height:16px;border-radius:100%;border-color:#41b883 transparent transparent;border-style:solid;border-width:2px;box-shadow:0 0 0 1px transparent}.multiselect__spinner:before{animation:spinning 2.4s cubic-bezier(.41,.26,.2,.62);animation-iteration-count:infinite}.multiselect__spinner:after{animation:spinning 2.4s cubic-bezier(.51,.09,.21,.8);animation-iteration-count:infinite}.multiselect__loading-enter-active,.multiselect__loading-leave-active{transition:opacity .4s ease-in-out;opacity:1}.multiselect__loading-enter,.multiselect__loading-leave-active{opacity:0}.multiselect,.multiselect__input,.multiselect__single{font-family:inherit;font-size:16px;touch-action:manipulation}.multiselect{box-sizing:content-box;display:block;position:relative;width:100%;min-height:40px;text-align:left;color:#35495e}.multiselect *{box-sizing:border-box}.multiselect:focus{outline:none}.multiselect--disabled{background:#ededed;pointer-events:none;opacity:.6}.multiselect--active{z-index:50}.multiselect--active:not(.multiselect--above) .multiselect__current,.multiselect--active:not(.multiselect--above) .multiselect__input,.multiselect--active:not(.multiselect--above) .multiselect__tags{border-bottom-left-radius:0;border-bottom-right-radius:0}.multiselect--active .multiselect__select{transform:rotate(180deg)}.multiselect--above.multiselect--active .multiselect__current,.multiselect--above.multiselect--active .multiselect__input,.multiselect--above.multiselect--active .multiselect__tags{border-top-left-radius:0;border-top-right-radius:0}.multiselect__input,.multiselect__single{position:relative;display:inline-block;min-height:20px;line-height:20px;border:none;border-radius:5px;background:#fff;padding:0 0 0 5px;width:100%;transition:border .1s ease;box-sizing:border-box;margin-bottom:8px;vertical-align:top}.multiselect__input::-moz-placeholder{color:#35495e}.multiselect__input::placeholder{color:#35495e}.multiselect__tag~.multiselect__input,.multiselect__tag~.multiselect__single{width:auto}.multiselect__input:hover,.multiselect__single:hover{border-color:#cfcfcf}.multiselect__input:focus,.multiselect__single:focus{border-color:#a8a8a8;outline:none}.multiselect__single{padding-left:5px;margin-bottom:8px}.multiselect__tags-wrap{display:inline}.multiselect__tags{min-height:40px;display:block;padding:8px 40px 0 8px;border-radius:5px;border:1px solid #e8e8e8;background:#fff;font-size:14px}.multiselect__tag{position:relative;display:inline-block;padding:4px 26px 4px 10px;border-radius:5px;margin-right:10px;color:#fff;line-height:1;background:#41b883;margin-bottom:5px;white-space:nowrap;overflow:hidden;max-width:100%;text-overflow:ellipsis}.multiselect__tag-icon{cursor:pointer;margin-left:7px;position:absolute;right:0;top:0;bottom:0;font-weight:700;font-style:normal;width:22px;text-align:center;line-height:22px;transition:all .2s ease;border-radius:5px}.multiselect__tag-icon:after{content:"×";color:#266d4d;font-size:14px}.multiselect__tag-icon:focus:after,.multiselect__tag-icon:hover:after{color:#fff}.multiselect__current{min-height:40px;overflow:hidden;padding:8px 12px 0;padding-right:30px;white-space:nowrap;border-radius:5px;border:1px solid #e8e8e8}.multiselect__current,.multiselect__select{line-height:16px;box-sizing:border-box;display:block;margin:0;text-decoration:none;cursor:pointer}.multiselect__select{position:absolute;width:40px;height:38px;right:1px;top:1px;padding:4px 8px;text-align:center;transition:transform .2s ease}.multiselect__select:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:5px 5px 0 5px;border-color:#999 transparent transparent transparent;content:""}.multiselect__placeholder{color:#adadad;display:inline-block;margin-bottom:10px;padding-top:2px}.multiselect--active .multiselect__placeholder{display:none}.multiselect__content-wrapper{position:absolute;display:block;background:#fff;width:100%;max-height:240px;overflow:auto;border:1px solid #e8e8e8;border-top:none;border-bottom-left-radius:5px;border-bottom-right-radius:5px;z-index:50;-webkit-overflow-scrolling:touch}.multiselect__content{list-style:none;display:inline-block;padding:0;margin:0;min-width:100%;vertical-align:top}.multiselect--above .multiselect__content-wrapper{bottom:100%;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom:none;border-top:1px solid #e8e8e8}.multiselect__content::-webkit-scrollbar{display:none}.multiselect__element{display:block}.multiselect__option{display:block;padding:12px;min-height:40px;line-height:16px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer;white-space:nowrap}.multiselect__option:after{top:0;right:0;position:absolute;line-height:40px;padding-right:12px;padding-left:20px;font-size:13px}.multiselect__option--highlight{background:#41b883;outline:none;color:#fff}.multiselect__option--highlight:after{content:attr(data-select);background:#41b883;color:#fff}.multiselect__option--selected{background:#f3f3f3;color:#35495e;font-weight:700}.multiselect__option--selected:after{content:attr(data-selected);color:silver;background:inherit}.multiselect__option--selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect--disabled .multiselect__current,.multiselect--disabled .multiselect__select{background:#ededed;color:#a6a6a6}.multiselect__option--disabled{background:#ededed!important;color:#a6a6a6!important;cursor:text;pointer-events:none}.multiselect__option--group{background:#ededed;color:#35495e}.multiselect__option--group.multiselect__option--highlight{background:#35495e;color:#fff}.multiselect__option--group.multiselect__option--highlight:after{background:#35495e}.multiselect__option--disabled.multiselect__option--highlight{background:#dedede}.multiselect__option--group-selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--group-selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect-enter-active,.multiselect-leave-active{transition:all .15s ease}.multiselect-enter,.multiselect-leave-active{opacity:0}.multiselect__strong{margin-bottom:8px;line-height:20px;display:inline-block;vertical-align:top}[dir=rtl] .multiselect{text-align:right}[dir=rtl] .multiselect__select{right:auto;left:1px}[dir=rtl] .multiselect__tags{padding:8px 8px 0 40px}[dir=rtl] .multiselect__content{text-align:right}[dir=rtl] .multiselect__option:after{right:auto;left:0}[dir=rtl] .multiselect__clear{right:auto;left:12px}[dir=rtl] .multiselect__spinner{right:auto;left:1px}@keyframes spinning{0%{transform:rotate(0)}to{transform:rotate(2turn)}}.multiselect[data-v-24065b86]{margin:0 .5em 1em .5em}.multiselect-wrapper[data-v-24065b86]{display:flex}.multiselect-wrapper button[data-v-24065b86]{margin:0 0 1em 0;font-size:16px}#playerView[data-v-24065b86]{margin:0 1rem 1rem 1rem;display:grid;overflow:auto;grid-template-areas:"list chart" "list info";grid-template-columns:50% 50%;grid-template-rows:50% 50%}@media only screen and (max-width:922px){#playerView[data-v-24065b86]{margin:0 1rem 1rem 1rem;display:grid;overflow:auto;grid-template-areas:"list list";grid-template-columns:100%;grid-template-rows:100%;width:calc(100vw - 1em);margin:0 0 1rem 1rem}.multiselect-wrapper button[data-v-24065b86]{margin:0 .5em 1em 0}.multiselect[data-v-24065b86]{width:calc(100% - 1em)}.playerChart[data-v-24065b86],.weaponChart[data-v-24065b86]{display:none}}#filters[data-v-24065b86]{grid-area:filters}
\ No newline at end of file
diff --git a/dist/css/index.72ebf3d2.css b/dist/css/index.72ebf3d2.css
new file mode 100644
index 0000000..e235a56
--- /dev/null
+++ b/dist/css/index.72ebf3d2.css
@@ -0,0 +1 @@
+:root{--bg-color:#282a36;--accent:#353744;--current-line:#44475a;--comment:#6272a4;--foreground:#f8f8f2;--orange:#ffb86c;--cyan:#8be9fd;--green:#50fa7b;--pink:#ff79c6;--purple:#bd93f9;--red:#f55;--yellow:#f1fa8c}body{background:var(--bg-color);margin:0}#app{height:100vh;width:100vw;font-family:Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--foreground);display:grid;grid-template-areas:"header header" "filters body " "stats body " "footer body ";grid-template-columns:1fr 5fr;grid-template-rows:auto 1fr auto auto}@media only screen and (max-width:922px){#app{grid-template-areas:"header header" "filters filters" "body body ";grid-template-rows:auto auto 1fr}}@media only screen and (max-width:600px){.github-link{display:none}}header{grid-area:header;height:64px;background:var(--bg-color);color:var(--foreground)}nav{display:flex;flex-direction:row;text-align:center;vertical-align:middle}nav a{font-weight:700;color:var(--foreground)}nav a.router-link-exact-active{color:var(--orange)}.navbar-logo img{height:48px;padding:8px 24px}.navbar-element{text-align:center;line-height:16px;padding:24px 32px}.navbar-element:hover,.navbar-logo:hover{background:var(--current-line)}.spacer{width:100%}.vlist[data-v-d1645486]{overflow-y:auto}.vlist[data-v-d1645486],.vscroll[data-v-d1645486]{height:calc(100% - 3em)}.inactive[data-v-12531736],.offline[data-v-12531736]{color:var(--comment)}.serverView[data-v-12531736]{margin:0 1rem 1rem 1rem;overflow:auto}.serverList[data-v-12531736]{overflow-y:auto;height:100%}.serverHeaders[data-v-12531736],.serverRow[data-v-12531736]{box-sizing:border-box;display:grid;grid-template-columns:4ch 178px 20ch 8ch 8ch 8ch 1fr;background:var(--bg-color);text-align:left;cursor:pointer;margin:0;transition:border .25s;height:100px}.serverHeaders[data-v-12531736]{height:3em;background:var(--current-line)}.serverHeaders>span[data-v-12531736]{padding:.5em .8em 0 .25em}.serverRow.odd[data-v-12531736]{background:var(--accent)}.serverRow.uneven[data-v-12531736]{background:var(--bg-color)}.serverRow[data-v-12531736]:hover{background:var(--current-line)}.serverRow>div[data-v-12531736]{padding:.5em .8em 0 .25em}.serverRow>div[data-v-12531736]:not(:last-child){border-right:solid var(--bg-color) 2px}img[data-v-12531736]{-o-object-fit:contain;object-fit:contain;height:100%}.loadingComponent[data-v-eeb48308]{display:flex;align-items:center;justify-content:center;height:calc(100% - 3em)}.playerTable *{box-sizing:border-box}.playerTable{grid-area:list;margin-right:1rem;height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none}.playerHeaders,.playerRow{box-sizing:border-box;display:grid;grid-template-columns:5ch 20ch 6ch 6ch 6ch 10ch 1fr;background:var(--bg-color);text-align:left;cursor:pointer;margin:0;transition:border .25s;height:2em}.playerRow.odd{background:var(--accent)}.playerRow.uneven{background:var(--bg-color)}.playerRow:hover{background:var(--current-line)}.playerRow>div:not(:last-child){border-right:solid var(--bg-color) 2px}.playerRow>div{padding:.5em .8em 0 .25em;overflow:hidden}.playerHeaders{position:sticky;top:0;height:3em}.playerHeaders>span{padding:.5em .8em 0 .25em}.playerHeaders{background:var(--current-line)}.playerHeaders div:hover{background:var(--bg-color)}.playerHeaders>div:not(:last-child){border-right:solid var(--bg-color) 2px}.playerHeaders>span:last-child{width:100%}@media only screen and (max-width:600px){.playerHeaders>span:nth-child(6),.playerHeaders>span:nth-child(7),.playerRow>div:nth-child(6),.playerRow>div:nth-child(7){display:none}.playerHeaders,.playerRow{grid-template-columns:5ch 20ch 6ch 6ch 1fr}}.player span{pointer-events:none}.selected{background:var(--comment)!important}canvas[data-v-558358e6]{background:var(--accent)}.playerChart[data-v-558358e6]{position:relative}#refreshChart[data-v-558358e6]{position:absolute;top:0;left:0}@media only screen and (max-width:922px){canvas[data-v-558358e6]{display:none!important}}.weaponChart[data-v-1cb3cdfe]{width:calc(min(50vw, 50vh) - 3em);height:calc(min(50vw, 50vh) - 3em)}@media only screen and (max-width:922px){canvas[data-v-1cb3cdfe]{display:none!important}}fieldset[disabled] .multiselect{pointer-events:none}.multiselect__spinner{position:absolute;right:1px;top:1px;width:40px;height:38px;background:#fff;display:block}.multiselect__spinner:after,.multiselect__spinner:before{position:absolute;content:"";top:50%;left:50%;margin:-8px 0 0 -8px;width:16px;height:16px;border-radius:100%;border-color:#41b883 transparent transparent;border-style:solid;border-width:2px;box-shadow:0 0 0 1px transparent}.multiselect__spinner:before{animation:spinning 2.4s cubic-bezier(.41,.26,.2,.62);animation-iteration-count:infinite}.multiselect__spinner:after{animation:spinning 2.4s cubic-bezier(.51,.09,.21,.8);animation-iteration-count:infinite}.multiselect__loading-enter-active,.multiselect__loading-leave-active{transition:opacity .4s ease-in-out;opacity:1}.multiselect__loading-enter,.multiselect__loading-leave-active{opacity:0}.multiselect,.multiselect__input,.multiselect__single{font-family:inherit;font-size:16px;touch-action:manipulation}.multiselect{box-sizing:content-box;display:block;position:relative;width:100%;min-height:40px;text-align:left;color:#35495e}.multiselect *{box-sizing:border-box}.multiselect:focus{outline:none}.multiselect--disabled{background:#ededed;pointer-events:none;opacity:.6}.multiselect--active{z-index:50}.multiselect--active:not(.multiselect--above) .multiselect__current,.multiselect--active:not(.multiselect--above) .multiselect__input,.multiselect--active:not(.multiselect--above) .multiselect__tags{border-bottom-left-radius:0;border-bottom-right-radius:0}.multiselect--active .multiselect__select{transform:rotate(180deg)}.multiselect--above.multiselect--active .multiselect__current,.multiselect--above.multiselect--active .multiselect__input,.multiselect--above.multiselect--active .multiselect__tags{border-top-left-radius:0;border-top-right-radius:0}.multiselect__input,.multiselect__single{position:relative;display:inline-block;min-height:20px;line-height:20px;border:none;border-radius:5px;background:#fff;padding:0 0 0 5px;width:100%;transition:border .1s ease;box-sizing:border-box;margin-bottom:8px;vertical-align:top}.multiselect__input::-moz-placeholder{color:#35495e}.multiselect__input::placeholder{color:#35495e}.multiselect__tag~.multiselect__input,.multiselect__tag~.multiselect__single{width:auto}.multiselect__input:hover,.multiselect__single:hover{border-color:#cfcfcf}.multiselect__input:focus,.multiselect__single:focus{border-color:#a8a8a8;outline:none}.multiselect__single{padding-left:5px;margin-bottom:8px}.multiselect__tags-wrap{display:inline}.multiselect__tags{min-height:40px;display:block;padding:8px 40px 0 8px;border-radius:5px;border:1px solid #e8e8e8;background:#fff;font-size:14px}.multiselect__tag{position:relative;display:inline-block;padding:4px 26px 4px 10px;border-radius:5px;margin-right:10px;color:#fff;line-height:1;background:#41b883;margin-bottom:5px;white-space:nowrap;overflow:hidden;max-width:100%;text-overflow:ellipsis}.multiselect__tag-icon{cursor:pointer;margin-left:7px;position:absolute;right:0;top:0;bottom:0;font-weight:700;font-style:normal;width:22px;text-align:center;line-height:22px;transition:all .2s ease;border-radius:5px}.multiselect__tag-icon:after{content:"×";color:#266d4d;font-size:14px}.multiselect__tag-icon:focus:after,.multiselect__tag-icon:hover:after{color:#fff}.multiselect__current{min-height:40px;overflow:hidden;padding:8px 12px 0;padding-right:30px;white-space:nowrap;border-radius:5px;border:1px solid #e8e8e8}.multiselect__current,.multiselect__select{line-height:16px;box-sizing:border-box;display:block;margin:0;text-decoration:none;cursor:pointer}.multiselect__select{position:absolute;width:40px;height:38px;right:1px;top:1px;padding:4px 8px;text-align:center;transition:transform .2s ease}.multiselect__select:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:5px 5px 0 5px;border-color:#999 transparent transparent transparent;content:""}.multiselect__placeholder{color:#adadad;display:inline-block;margin-bottom:10px;padding-top:2px}.multiselect--active .multiselect__placeholder{display:none}.multiselect__content-wrapper{position:absolute;display:block;background:#fff;width:100%;max-height:240px;overflow:auto;border:1px solid #e8e8e8;border-top:none;border-bottom-left-radius:5px;border-bottom-right-radius:5px;z-index:50;-webkit-overflow-scrolling:touch}.multiselect__content{list-style:none;display:inline-block;padding:0;margin:0;min-width:100%;vertical-align:top}.multiselect--above .multiselect__content-wrapper{bottom:100%;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom:none;border-top:1px solid #e8e8e8}.multiselect__content::-webkit-scrollbar{display:none}.multiselect__element{display:block}.multiselect__option{display:block;padding:12px;min-height:40px;line-height:16px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer;white-space:nowrap}.multiselect__option:after{top:0;right:0;position:absolute;line-height:40px;padding-right:12px;padding-left:20px;font-size:13px}.multiselect__option--highlight{background:#41b883;outline:none;color:#fff}.multiselect__option--highlight:after{content:attr(data-select);background:#41b883;color:#fff}.multiselect__option--selected{background:#f3f3f3;color:#35495e;font-weight:700}.multiselect__option--selected:after{content:attr(data-selected);color:silver;background:inherit}.multiselect__option--selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect--disabled .multiselect__current,.multiselect--disabled .multiselect__select{background:#ededed;color:#a6a6a6}.multiselect__option--disabled{background:#ededed!important;color:#a6a6a6!important;cursor:text;pointer-events:none}.multiselect__option--group{background:#ededed;color:#35495e}.multiselect__option--group.multiselect__option--highlight{background:#35495e;color:#fff}.multiselect__option--group.multiselect__option--highlight:after{background:#35495e}.multiselect__option--disabled.multiselect__option--highlight{background:#dedede}.multiselect__option--group-selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--group-selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect-enter-active,.multiselect-leave-active{transition:all .15s ease}.multiselect-enter,.multiselect-leave-active{opacity:0}.multiselect__strong{margin-bottom:8px;line-height:20px;display:inline-block;vertical-align:top}[dir=rtl] .multiselect{text-align:right}[dir=rtl] .multiselect__select{right:auto;left:1px}[dir=rtl] .multiselect__tags{padding:8px 8px 0 40px}[dir=rtl] .multiselect__content{text-align:right}[dir=rtl] .multiselect__option:after{right:auto;left:0}[dir=rtl] .multiselect__clear{right:auto;left:12px}[dir=rtl] .multiselect__spinner{right:auto;left:1px}@keyframes spinning{0%{transform:rotate(0)}to{transform:rotate(2turn)}}.multiselect[data-v-24065b86]{margin:0 .5em 1em .5em}.multiselect-wrapper[data-v-24065b86]{display:flex}.multiselect-wrapper button[data-v-24065b86]{margin:0 0 1em 0;font-size:16px}#playerView[data-v-24065b86]{margin:0 1rem 1rem 1rem;display:grid;overflow:auto;grid-template-areas:"list chart" "list info";grid-template-columns:50% 50%;grid-template-rows:50% 50%}@media only screen and (max-width:922px){#playerView[data-v-24065b86]{margin:0 1rem 1rem 1rem;display:grid;overflow:auto;grid-template-areas:"list list";grid-template-columns:100%;grid-template-rows:100%;width:calc(100vw - 1em);margin:0 0 1rem 1rem}.multiselect-wrapper button[data-v-24065b86]{margin:0 .5em 1em 0}.multiselect[data-v-24065b86]{width:calc(100% - 1em)}.playerChart[data-v-24065b86],.weaponChart[data-v-24065b86]{display:none}}#filters[data-v-24065b86]{grid-area:filters}
\ No newline at end of file
diff --git a/dist/css/server.4e2a66fa.css b/dist/css/server.4e2a66fa.css
deleted file mode 100644
index c11e187..0000000
--- a/dist/css/server.4e2a66fa.css
+++ /dev/null
@@ -1 +0,0 @@
-:root{--bg-color:#282a36;--accent:#353744;--current-line:#44475a;--comment:#6272a4;--foreground:#f8f8f2;--orange:#ffb86c;--cyan:#8be9fd;--green:#50fa7b;--pink:#ff79c6;--purple:#bd93f9;--red:#f55;--yellow:#f1fa8c}body{background:var(--bg-color);margin:0}#app{height:100vh;width:100vw;font-family:Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--foreground);display:grid;grid-template-areas:"header header" "filters body " "stats body " "footer body ";grid-template-columns:1fr 5fr;grid-template-rows:auto 1fr auto auto}@media only screen and (max-width:922px){#app{grid-template-areas:"header header" "filters filters" "body body ";grid-template-rows:auto auto 1fr}}@media only screen and (max-width:600px){.github-link{display:none}}header{grid-area:header;height:64px;background:var(--bg-color);color:var(--foreground)}nav{display:flex;flex-direction:row;text-align:center;vertical-align:middle}nav a{font-weight:700;color:var(--foreground)}nav a.router-link-exact-active{color:var(--orange)}.navbar-logo img{height:48px;padding:8px 24px}.navbar-element{text-align:center;line-height:16px;padding:24px 32px}.navbar-element:hover,.navbar-logo:hover{background:var(--current-line)}.spacer{width:100%}.vlist[data-v-4b7b1630]{overflow-y:auto}.vlist[data-v-4b7b1630],.vscroll[data-v-4b7b1630]{height:calc(100% - 3em)}.inactive[data-v-12531736],.offline[data-v-12531736]{color:var(--comment)}.serverView[data-v-12531736]{margin:0 1rem 1rem 1rem;overflow:auto}.serverList[data-v-12531736]{overflow-y:auto;height:100%}.serverHeaders[data-v-12531736],.serverRow[data-v-12531736]{box-sizing:border-box;display:grid;grid-template-columns:4ch 178px 20ch 8ch 8ch 8ch 1fr;background:var(--bg-color);text-align:left;cursor:pointer;margin:0;transition:border .25s;height:100px}.serverHeaders[data-v-12531736]{height:3em;background:var(--current-line)}.serverHeaders>span[data-v-12531736]{padding:.5em .8em 0 .25em}.serverRow.odd[data-v-12531736]{background:var(--accent)}.serverRow.uneven[data-v-12531736]{background:var(--bg-color)}.serverRow[data-v-12531736]:hover{background:var(--current-line)}.serverRow>div[data-v-12531736]{padding:.5em .8em 0 .25em}.serverRow>div[data-v-12531736]:not(:last-child){border-right:solid var(--bg-color) 2px}img[data-v-12531736]{-o-object-fit:contain;object-fit:contain;height:100%}.playerTable *{box-sizing:border-box}.playerTable{grid-area:list;margin-right:1rem;height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none}.playerHeaders,.playerRow{box-sizing:border-box;display:grid;grid-template-columns:5ch 20ch 6ch 6ch 6ch 10ch 1fr;background:var(--bg-color);text-align:left;cursor:pointer;margin:0;transition:border .25s;height:2em}.playerRow.odd{background:var(--accent)}.playerRow.uneven{background:var(--bg-color)}.playerRow:hover{background:var(--current-line)}.playerRow>div:not(:last-child){border-right:solid var(--bg-color) 2px}.playerRow>div{padding:.5em .8em 0 .25em;overflow:hidden}.playerHeaders{position:sticky;top:0;height:3em}.playerHeaders>span{padding:.5em .8em 0 .25em}.playerHeaders{background:var(--current-line)}.playerHeaders div:hover{background:var(--bg-color)}.playerHeaders>div:not(:last-child){border-right:solid var(--bg-color) 2px}.playerHeaders>span:last-child{width:100%}@media only screen and (max-width:600px){.playerHeaders>span:nth-child(6),.playerHeaders>span:nth-child(7),.playerRow>div:nth-child(6),.playerRow>div:nth-child(7){display:none}.playerHeaders,.playerRow{grid-template-columns:5ch 20ch 6ch 6ch 1fr}}.player span{pointer-events:none}.selected{background:var(--comment)!important}canvas[data-v-77326078]{background:var(--accent)}.playerChart[data-v-77326078]{position:relative}#refreshChart[data-v-77326078]{position:absolute;top:0;left:0}@media only screen and (max-width:922px){canvas[data-v-77326078]{display:none!important}}.weaponChart[data-v-54a2c8e6]{width:calc(min(50vw, 50vh) - 3em);height:calc(min(50vw, 50vh) - 3em)}@media only screen and (max-width:922px){canvas[data-v-54a2c8e6]{display:none!important}}fieldset[disabled] .multiselect{pointer-events:none}.multiselect__spinner{position:absolute;right:1px;top:1px;width:40px;height:38px;background:#fff;display:block}.multiselect__spinner:after,.multiselect__spinner:before{position:absolute;content:"";top:50%;left:50%;margin:-8px 0 0 -8px;width:16px;height:16px;border-radius:100%;border-color:#41b883 transparent transparent;border-style:solid;border-width:2px;box-shadow:0 0 0 1px transparent}.multiselect__spinner:before{animation:spinning 2.4s cubic-bezier(.41,.26,.2,.62);animation-iteration-count:infinite}.multiselect__spinner:after{animation:spinning 2.4s cubic-bezier(.51,.09,.21,.8);animation-iteration-count:infinite}.multiselect__loading-enter-active,.multiselect__loading-leave-active{transition:opacity .4s ease-in-out;opacity:1}.multiselect__loading-enter,.multiselect__loading-leave-active{opacity:0}.multiselect,.multiselect__input,.multiselect__single{font-family:inherit;font-size:16px;touch-action:manipulation}.multiselect{box-sizing:content-box;display:block;position:relative;width:100%;min-height:40px;text-align:left;color:#35495e}.multiselect *{box-sizing:border-box}.multiselect:focus{outline:none}.multiselect--disabled{background:#ededed;pointer-events:none;opacity:.6}.multiselect--active{z-index:50}.multiselect--active:not(.multiselect--above) .multiselect__current,.multiselect--active:not(.multiselect--above) .multiselect__input,.multiselect--active:not(.multiselect--above) .multiselect__tags{border-bottom-left-radius:0;border-bottom-right-radius:0}.multiselect--active .multiselect__select{transform:rotate(180deg)}.multiselect--above.multiselect--active .multiselect__current,.multiselect--above.multiselect--active .multiselect__input,.multiselect--above.multiselect--active .multiselect__tags{border-top-left-radius:0;border-top-right-radius:0}.multiselect__input,.multiselect__single{position:relative;display:inline-block;min-height:20px;line-height:20px;border:none;border-radius:5px;background:#fff;padding:0 0 0 5px;width:100%;transition:border .1s ease;box-sizing:border-box;margin-bottom:8px;vertical-align:top}.multiselect__input::-moz-placeholder{color:#35495e}.multiselect__input::placeholder{color:#35495e}.multiselect__tag~.multiselect__input,.multiselect__tag~.multiselect__single{width:auto}.multiselect__input:hover,.multiselect__single:hover{border-color:#cfcfcf}.multiselect__input:focus,.multiselect__single:focus{border-color:#a8a8a8;outline:none}.multiselect__single{padding-left:5px;margin-bottom:8px}.multiselect__tags-wrap{display:inline}.multiselect__tags{min-height:40px;display:block;padding:8px 40px 0 8px;border-radius:5px;border:1px solid #e8e8e8;background:#fff;font-size:14px}.multiselect__tag{position:relative;display:inline-block;padding:4px 26px 4px 10px;border-radius:5px;margin-right:10px;color:#fff;line-height:1;background:#41b883;margin-bottom:5px;white-space:nowrap;overflow:hidden;max-width:100%;text-overflow:ellipsis}.multiselect__tag-icon{cursor:pointer;margin-left:7px;position:absolute;right:0;top:0;bottom:0;font-weight:700;font-style:normal;width:22px;text-align:center;line-height:22px;transition:all .2s ease;border-radius:5px}.multiselect__tag-icon:after{content:"×";color:#266d4d;font-size:14px}.multiselect__tag-icon:focus:after,.multiselect__tag-icon:hover:after{color:#fff}.multiselect__current{min-height:40px;overflow:hidden;padding:8px 12px 0;padding-right:30px;white-space:nowrap;border-radius:5px;border:1px solid #e8e8e8}.multiselect__current,.multiselect__select{line-height:16px;box-sizing:border-box;display:block;margin:0;text-decoration:none;cursor:pointer}.multiselect__select{position:absolute;width:40px;height:38px;right:1px;top:1px;padding:4px 8px;text-align:center;transition:transform .2s ease}.multiselect__select:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:5px 5px 0 5px;border-color:#999 transparent transparent transparent;content:""}.multiselect__placeholder{color:#adadad;display:inline-block;margin-bottom:10px;padding-top:2px}.multiselect--active .multiselect__placeholder{display:none}.multiselect__content-wrapper{position:absolute;display:block;background:#fff;width:100%;max-height:240px;overflow:auto;border:1px solid #e8e8e8;border-top:none;border-bottom-left-radius:5px;border-bottom-right-radius:5px;z-index:50;-webkit-overflow-scrolling:touch}.multiselect__content{list-style:none;display:inline-block;padding:0;margin:0;min-width:100%;vertical-align:top}.multiselect--above .multiselect__content-wrapper{bottom:100%;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom:none;border-top:1px solid #e8e8e8}.multiselect__content::-webkit-scrollbar{display:none}.multiselect__element{display:block}.multiselect__option{display:block;padding:12px;min-height:40px;line-height:16px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer;white-space:nowrap}.multiselect__option:after{top:0;right:0;position:absolute;line-height:40px;padding-right:12px;padding-left:20px;font-size:13px}.multiselect__option--highlight{background:#41b883;outline:none;color:#fff}.multiselect__option--highlight:after{content:attr(data-select);background:#41b883;color:#fff}.multiselect__option--selected{background:#f3f3f3;color:#35495e;font-weight:700}.multiselect__option--selected:after{content:attr(data-selected);color:silver;background:inherit}.multiselect__option--selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect--disabled .multiselect__current,.multiselect--disabled .multiselect__select{background:#ededed;color:#a6a6a6}.multiselect__option--disabled{background:#ededed!important;color:#a6a6a6!important;cursor:text;pointer-events:none}.multiselect__option--group{background:#ededed;color:#35495e}.multiselect__option--group.multiselect__option--highlight{background:#35495e;color:#fff}.multiselect__option--group.multiselect__option--highlight:after{background:#35495e}.multiselect__option--disabled.multiselect__option--highlight{background:#dedede}.multiselect__option--group-selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--group-selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect-enter-active,.multiselect-leave-active{transition:all .15s ease}.multiselect-enter,.multiselect-leave-active{opacity:0}.multiselect__strong{margin-bottom:8px;line-height:20px;display:inline-block;vertical-align:top}[dir=rtl] .multiselect{text-align:right}[dir=rtl] .multiselect__select{right:auto;left:1px}[dir=rtl] .multiselect__tags{padding:8px 8px 0 40px}[dir=rtl] .multiselect__content{text-align:right}[dir=rtl] .multiselect__option:after{right:auto;left:0}[dir=rtl] .multiselect__clear{right:auto;left:12px}[dir=rtl] .multiselect__spinner{right:auto;left:1px}@keyframes spinning{0%{transform:rotate(0)}to{transform:rotate(2turn)}}.multiselect[data-v-24065b86]{margin:0 .5em 1em .5em}.multiselect-wrapper[data-v-24065b86]{display:flex}.multiselect-wrapper button[data-v-24065b86]{margin:0 0 1em 0;font-size:16px}#playerView[data-v-24065b86]{margin:0 1rem 1rem 1rem;display:grid;overflow:auto;grid-template-areas:"list chart" "list info";grid-template-columns:50% 50%;grid-template-rows:50% 50%}@media only screen and (max-width:922px){#playerView[data-v-24065b86]{margin:0 1rem 1rem 1rem;display:grid;overflow:auto;grid-template-areas:"list list";grid-template-columns:100%;grid-template-rows:100%;width:calc(100vw - 1em);margin:0 0 1rem 1rem}.multiselect-wrapper button[data-v-24065b86]{margin:0 .5em 1em 0}.multiselect[data-v-24065b86]{width:calc(100% - 1em)}.playerChart[data-v-24065b86],.weaponChart[data-v-24065b86]{display:none}}#filters[data-v-24065b86]{grid-area:filters}
\ No newline at end of file
diff --git a/dist/css/server.72ebf3d2.css b/dist/css/server.72ebf3d2.css
new file mode 100644
index 0000000..e235a56
--- /dev/null
+++ b/dist/css/server.72ebf3d2.css
@@ -0,0 +1 @@
+:root{--bg-color:#282a36;--accent:#353744;--current-line:#44475a;--comment:#6272a4;--foreground:#f8f8f2;--orange:#ffb86c;--cyan:#8be9fd;--green:#50fa7b;--pink:#ff79c6;--purple:#bd93f9;--red:#f55;--yellow:#f1fa8c}body{background:var(--bg-color);margin:0}#app{height:100vh;width:100vw;font-family:Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--foreground);display:grid;grid-template-areas:"header header" "filters body " "stats body " "footer body ";grid-template-columns:1fr 5fr;grid-template-rows:auto 1fr auto auto}@media only screen and (max-width:922px){#app{grid-template-areas:"header header" "filters filters" "body body ";grid-template-rows:auto auto 1fr}}@media only screen and (max-width:600px){.github-link{display:none}}header{grid-area:header;height:64px;background:var(--bg-color);color:var(--foreground)}nav{display:flex;flex-direction:row;text-align:center;vertical-align:middle}nav a{font-weight:700;color:var(--foreground)}nav a.router-link-exact-active{color:var(--orange)}.navbar-logo img{height:48px;padding:8px 24px}.navbar-element{text-align:center;line-height:16px;padding:24px 32px}.navbar-element:hover,.navbar-logo:hover{background:var(--current-line)}.spacer{width:100%}.vlist[data-v-d1645486]{overflow-y:auto}.vlist[data-v-d1645486],.vscroll[data-v-d1645486]{height:calc(100% - 3em)}.inactive[data-v-12531736],.offline[data-v-12531736]{color:var(--comment)}.serverView[data-v-12531736]{margin:0 1rem 1rem 1rem;overflow:auto}.serverList[data-v-12531736]{overflow-y:auto;height:100%}.serverHeaders[data-v-12531736],.serverRow[data-v-12531736]{box-sizing:border-box;display:grid;grid-template-columns:4ch 178px 20ch 8ch 8ch 8ch 1fr;background:var(--bg-color);text-align:left;cursor:pointer;margin:0;transition:border .25s;height:100px}.serverHeaders[data-v-12531736]{height:3em;background:var(--current-line)}.serverHeaders>span[data-v-12531736]{padding:.5em .8em 0 .25em}.serverRow.odd[data-v-12531736]{background:var(--accent)}.serverRow.uneven[data-v-12531736]{background:var(--bg-color)}.serverRow[data-v-12531736]:hover{background:var(--current-line)}.serverRow>div[data-v-12531736]{padding:.5em .8em 0 .25em}.serverRow>div[data-v-12531736]:not(:last-child){border-right:solid var(--bg-color) 2px}img[data-v-12531736]{-o-object-fit:contain;object-fit:contain;height:100%}.loadingComponent[data-v-eeb48308]{display:flex;align-items:center;justify-content:center;height:calc(100% - 3em)}.playerTable *{box-sizing:border-box}.playerTable{grid-area:list;margin-right:1rem;height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none}.playerHeaders,.playerRow{box-sizing:border-box;display:grid;grid-template-columns:5ch 20ch 6ch 6ch 6ch 10ch 1fr;background:var(--bg-color);text-align:left;cursor:pointer;margin:0;transition:border .25s;height:2em}.playerRow.odd{background:var(--accent)}.playerRow.uneven{background:var(--bg-color)}.playerRow:hover{background:var(--current-line)}.playerRow>div:not(:last-child){border-right:solid var(--bg-color) 2px}.playerRow>div{padding:.5em .8em 0 .25em;overflow:hidden}.playerHeaders{position:sticky;top:0;height:3em}.playerHeaders>span{padding:.5em .8em 0 .25em}.playerHeaders{background:var(--current-line)}.playerHeaders div:hover{background:var(--bg-color)}.playerHeaders>div:not(:last-child){border-right:solid var(--bg-color) 2px}.playerHeaders>span:last-child{width:100%}@media only screen and (max-width:600px){.playerHeaders>span:nth-child(6),.playerHeaders>span:nth-child(7),.playerRow>div:nth-child(6),.playerRow>div:nth-child(7){display:none}.playerHeaders,.playerRow{grid-template-columns:5ch 20ch 6ch 6ch 1fr}}.player span{pointer-events:none}.selected{background:var(--comment)!important}canvas[data-v-558358e6]{background:var(--accent)}.playerChart[data-v-558358e6]{position:relative}#refreshChart[data-v-558358e6]{position:absolute;top:0;left:0}@media only screen and (max-width:922px){canvas[data-v-558358e6]{display:none!important}}.weaponChart[data-v-1cb3cdfe]{width:calc(min(50vw, 50vh) - 3em);height:calc(min(50vw, 50vh) - 3em)}@media only screen and (max-width:922px){canvas[data-v-1cb3cdfe]{display:none!important}}fieldset[disabled] .multiselect{pointer-events:none}.multiselect__spinner{position:absolute;right:1px;top:1px;width:40px;height:38px;background:#fff;display:block}.multiselect__spinner:after,.multiselect__spinner:before{position:absolute;content:"";top:50%;left:50%;margin:-8px 0 0 -8px;width:16px;height:16px;border-radius:100%;border-color:#41b883 transparent transparent;border-style:solid;border-width:2px;box-shadow:0 0 0 1px transparent}.multiselect__spinner:before{animation:spinning 2.4s cubic-bezier(.41,.26,.2,.62);animation-iteration-count:infinite}.multiselect__spinner:after{animation:spinning 2.4s cubic-bezier(.51,.09,.21,.8);animation-iteration-count:infinite}.multiselect__loading-enter-active,.multiselect__loading-leave-active{transition:opacity .4s ease-in-out;opacity:1}.multiselect__loading-enter,.multiselect__loading-leave-active{opacity:0}.multiselect,.multiselect__input,.multiselect__single{font-family:inherit;font-size:16px;touch-action:manipulation}.multiselect{box-sizing:content-box;display:block;position:relative;width:100%;min-height:40px;text-align:left;color:#35495e}.multiselect *{box-sizing:border-box}.multiselect:focus{outline:none}.multiselect--disabled{background:#ededed;pointer-events:none;opacity:.6}.multiselect--active{z-index:50}.multiselect--active:not(.multiselect--above) .multiselect__current,.multiselect--active:not(.multiselect--above) .multiselect__input,.multiselect--active:not(.multiselect--above) .multiselect__tags{border-bottom-left-radius:0;border-bottom-right-radius:0}.multiselect--active .multiselect__select{transform:rotate(180deg)}.multiselect--above.multiselect--active .multiselect__current,.multiselect--above.multiselect--active .multiselect__input,.multiselect--above.multiselect--active .multiselect__tags{border-top-left-radius:0;border-top-right-radius:0}.multiselect__input,.multiselect__single{position:relative;display:inline-block;min-height:20px;line-height:20px;border:none;border-radius:5px;background:#fff;padding:0 0 0 5px;width:100%;transition:border .1s ease;box-sizing:border-box;margin-bottom:8px;vertical-align:top}.multiselect__input::-moz-placeholder{color:#35495e}.multiselect__input::placeholder{color:#35495e}.multiselect__tag~.multiselect__input,.multiselect__tag~.multiselect__single{width:auto}.multiselect__input:hover,.multiselect__single:hover{border-color:#cfcfcf}.multiselect__input:focus,.multiselect__single:focus{border-color:#a8a8a8;outline:none}.multiselect__single{padding-left:5px;margin-bottom:8px}.multiselect__tags-wrap{display:inline}.multiselect__tags{min-height:40px;display:block;padding:8px 40px 0 8px;border-radius:5px;border:1px solid #e8e8e8;background:#fff;font-size:14px}.multiselect__tag{position:relative;display:inline-block;padding:4px 26px 4px 10px;border-radius:5px;margin-right:10px;color:#fff;line-height:1;background:#41b883;margin-bottom:5px;white-space:nowrap;overflow:hidden;max-width:100%;text-overflow:ellipsis}.multiselect__tag-icon{cursor:pointer;margin-left:7px;position:absolute;right:0;top:0;bottom:0;font-weight:700;font-style:normal;width:22px;text-align:center;line-height:22px;transition:all .2s ease;border-radius:5px}.multiselect__tag-icon:after{content:"×";color:#266d4d;font-size:14px}.multiselect__tag-icon:focus:after,.multiselect__tag-icon:hover:after{color:#fff}.multiselect__current{min-height:40px;overflow:hidden;padding:8px 12px 0;padding-right:30px;white-space:nowrap;border-radius:5px;border:1px solid #e8e8e8}.multiselect__current,.multiselect__select{line-height:16px;box-sizing:border-box;display:block;margin:0;text-decoration:none;cursor:pointer}.multiselect__select{position:absolute;width:40px;height:38px;right:1px;top:1px;padding:4px 8px;text-align:center;transition:transform .2s ease}.multiselect__select:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:5px 5px 0 5px;border-color:#999 transparent transparent transparent;content:""}.multiselect__placeholder{color:#adadad;display:inline-block;margin-bottom:10px;padding-top:2px}.multiselect--active .multiselect__placeholder{display:none}.multiselect__content-wrapper{position:absolute;display:block;background:#fff;width:100%;max-height:240px;overflow:auto;border:1px solid #e8e8e8;border-top:none;border-bottom-left-radius:5px;border-bottom-right-radius:5px;z-index:50;-webkit-overflow-scrolling:touch}.multiselect__content{list-style:none;display:inline-block;padding:0;margin:0;min-width:100%;vertical-align:top}.multiselect--above .multiselect__content-wrapper{bottom:100%;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom:none;border-top:1px solid #e8e8e8}.multiselect__content::-webkit-scrollbar{display:none}.multiselect__element{display:block}.multiselect__option{display:block;padding:12px;min-height:40px;line-height:16px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer;white-space:nowrap}.multiselect__option:after{top:0;right:0;position:absolute;line-height:40px;padding-right:12px;padding-left:20px;font-size:13px}.multiselect__option--highlight{background:#41b883;outline:none;color:#fff}.multiselect__option--highlight:after{content:attr(data-select);background:#41b883;color:#fff}.multiselect__option--selected{background:#f3f3f3;color:#35495e;font-weight:700}.multiselect__option--selected:after{content:attr(data-selected);color:silver;background:inherit}.multiselect__option--selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect--disabled .multiselect__current,.multiselect--disabled .multiselect__select{background:#ededed;color:#a6a6a6}.multiselect__option--disabled{background:#ededed!important;color:#a6a6a6!important;cursor:text;pointer-events:none}.multiselect__option--group{background:#ededed;color:#35495e}.multiselect__option--group.multiselect__option--highlight{background:#35495e;color:#fff}.multiselect__option--group.multiselect__option--highlight:after{background:#35495e}.multiselect__option--disabled.multiselect__option--highlight{background:#dedede}.multiselect__option--group-selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--group-selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect-enter-active,.multiselect-leave-active{transition:all .15s ease}.multiselect-enter,.multiselect-leave-active{opacity:0}.multiselect__strong{margin-bottom:8px;line-height:20px;display:inline-block;vertical-align:top}[dir=rtl] .multiselect{text-align:right}[dir=rtl] .multiselect__select{right:auto;left:1px}[dir=rtl] .multiselect__tags{padding:8px 8px 0 40px}[dir=rtl] .multiselect__content{text-align:right}[dir=rtl] .multiselect__option:after{right:auto;left:0}[dir=rtl] .multiselect__clear{right:auto;left:12px}[dir=rtl] .multiselect__spinner{right:auto;left:1px}@keyframes spinning{0%{transform:rotate(0)}to{transform:rotate(2turn)}}.multiselect[data-v-24065b86]{margin:0 .5em 1em .5em}.multiselect-wrapper[data-v-24065b86]{display:flex}.multiselect-wrapper button[data-v-24065b86]{margin:0 0 1em 0;font-size:16px}#playerView[data-v-24065b86]{margin:0 1rem 1rem 1rem;display:grid;overflow:auto;grid-template-areas:"list chart" "list info";grid-template-columns:50% 50%;grid-template-rows:50% 50%}@media only screen and (max-width:922px){#playerView[data-v-24065b86]{margin:0 1rem 1rem 1rem;display:grid;overflow:auto;grid-template-areas:"list list";grid-template-columns:100%;grid-template-rows:100%;width:calc(100vw - 1em);margin:0 0 1rem 1rem}.multiselect-wrapper button[data-v-24065b86]{margin:0 .5em 1em 0}.multiselect[data-v-24065b86]{width:calc(100% - 1em)}.playerChart[data-v-24065b86],.weaponChart[data-v-24065b86]{display:none}}#filters[data-v-24065b86]{grid-area:filters}
\ No newline at end of file
diff --git a/dist/index.html b/dist/index.html
index 5ea5148..43af69e 100644
--- a/dist/index.html
+++ b/dist/index.html
@@ -1 +1 @@
-
Players : Tone API
\ No newline at end of file
+Players : Tone API
\ No newline at end of file
diff --git a/dist/js/chunk-common.261b3edd.js b/dist/js/chunk-common.261b3edd.js
new file mode 100644
index 0000000..1c14bdb
--- /dev/null
+++ b/dist/js/chunk-common.261b3edd.js
@@ -0,0 +1,2 @@
+"use strict";(self["webpackChunktoneapi_webclient"]=self["webpackChunktoneapi_webclient"]||[]).push([[64],{6370:function(e,t,a){var r=a(3862),s=a(4870),i=a(3396);const l={class:"navbar-logo"},n={href:"https://github.com/ToneAPI",target:"_blank"},o=["src"],d=(0,i._)("div",{class:"spacer"},null,-1);function p(e,t,a,r,s,p){const h=(0,i.up)("router-link"),u=(0,i.up)("router-view");return(0,i.wg)(),(0,i.iD)(i.HY,null,[(0,i._)("header",null,[(0,i._)("nav",null,[(0,i._)("div",l,[(0,i._)("a",n,[(0,i._)("img",{src:`${e.publicPath}tone_icon.png`},null,8,o)])]),d,(0,i.Wm)(h,{to:"/servers",class:"navbar-element"},{default:(0,i.w5)((()=>[(0,i.Uk)("Servers (Beta)")])),_:1}),(0,i.Wm)(h,{to:"/",class:"navbar-element"},{default:(0,i.w5)((()=>[(0,i.Uk)("Players")])),_:1})])]),(0,i.Wm)(u)],64)}var h=(0,i.aZ)({data(){return{publicPath:"/ToneAPI_webclient/"}}}),u=a(89);const c=(0,u.Z)(h,[["render",p]]);var g=c,m=a(2483),_=a(7139);const v=e=>((0,i.dD)("data-v-12531736"),e=e(),(0,i.Cn)(),e),y=v((()=>(0,i._)("div",{id:"filters"},null,-1))),f={class:"serverView"},w={class:"serverList"},b=v((()=>(0,i._)("div",{class:"serverHeaders"},[(0,i._)("span"),(0,i._)("span",null,"Map"),(0,i._)("span",null,"Server name"),(0,i._)("span",null,"Players"),(0,i._)("span",null,"Kills"),(0,i._)("span",null,"Max distance"),(0,i._)("span",null,"Average distance")],-1))),S=["src"],k={key:1};function L(e,t,a,r,s,l){const n=(0,i.up)("VirtualList");return(0,i.wg)(),(0,i.iD)(i.HY,null,[y,(0,i._)("div",f,[(0,i._)("div",w,[b,(0,i.Wm)(n,{list:e.serverList,"row-height":100},{default:(0,i.w5)((t=>[(0,i._)("div",{class:(0,_.C_)("serverRow "+(e.nsServersByName[t.data.name]?"":"offline ")+(e.nsServersByName[t.data.name]?.playerCount?"":"inactive ")+((t.index+1)%2?"odd ":"uneven "))},[(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(t.index+1),1)]),e.nsServersByName[t.data.name]?((0,i.wg)(),(0,i.iD)("img",{key:0,src:`${e.publicPath}maps/${e.nsServersByName[t.data.name].map}_lobby.png`},null,8,S)):(0,i.kq)("",!0),e.nsServersByName[t.data.name]?(0,i.kq)("",!0):((0,i.wg)(),(0,i.iD)("div",k)),(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(t.data.name+(e.nsServersByName[t.data.name]?"":" (offline)")),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(e.nsServersByName[t.data.name]?e.nsServersByName[t.data.name]?.playerCount+"/"+e.nsServersByName[t.data.name]?.maxPlayers:""),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(t.data._value.deaths),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(t.data._value.max_distance),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(Math.round(100*(t.data._value.total_distance/t.data._value.kills||0))/100),1)])],2)])),_:1},8,["list"])])])],64)}a(7658);var x=a(1020),P=a(5130);function H(e){return Object.fromEntries(Object.entries(e).filter((e=>void 0!==e[1]&&null!==e[1])))}function C(e,t){try{return e=H(e),t=H(t),P.deepStrictEqual(e,t),!0}catch{return!1}}function $(e,t){return fetch(e).then((e=>{if(!e.ok)throw Error(e.status+" "+e.statusText);if(!e.body)throw Error("ReadableStream not yet supported in this browser.");const a=e.headers.get("Content-Encoding"),r=e.headers.get(a?"X-File-Size":"content-length");if(null===r)throw Error("Response size header unavailable");const s=parseInt(r,10);let i=0;return new Response(new ReadableStream({start(a){const r=e.body.getReader();function l(){r.read().then((({done:e,value:r})=>{e?a.close():(r&&(i+=r.byteLength,t(i/s),a.enqueue(r)),l())})).catch((e=>{console.error(e),a.error(e)}))}l()}}))})).catch((e=>{console.error(e)}))}let V;const U=(0,x.Q_)("kill",{state:()=>({servers:[],players:[],weapons:[],maps:[],gamemodes:[],hosts:{},nsServers:void 0}),getters:{getPlayerList:e=>t=>e.players.find((e=>C((0,s.SU)(e).filter,t))),getWeaponList:e=>t=>e.weapons.find((e=>C((0,s.SU)(e).filter,t))),getServerList:e=>t=>e.servers.find((e=>C((0,s.SU)(e).filter,t))),getNSServers:e=>e.nsServers},actions:{fetchPlayers(e){e=H(e);let t=this.players.find((t=>C((0,s.SU)(t).filter,e)));return void 0===t&&(t=(0,s.XI)({filter:e,data:{}}),this.players.push(t)),$("https://tone.sleepycat.date/v2/client/players?"+new URLSearchParams(e),(e=>{t&&((0,s.SU)(t).progress=e,1!==e&&(0,s.oR)(t))})).then((async e=>{t&&((0,s.SU)(t).data=Object.fromEntries(Object.entries(await(e?.json())).map((e=>[e[0],(0,s.iH)(e[1])]))),(0,s.oR)(t))})),t},fetchWeapons(e){e=H(e);let t=this.weapons.find((t=>C((0,s.SU)(t).filter,e)));return t||(t=(0,s.XI)({filter:e,data:{}}),this.weapons.push(t)),$("https://tone.sleepycat.date/v2/client/weapons?"+new URLSearchParams(e),(e=>{t&&((0,s.SU)(t).progress=e,1!==e&&(0,s.oR)(t))})).then((async e=>{t&&((0,s.SU)(t).data=Object.fromEntries(Object.entries(await(e?.json())).map((e=>[e[0],(0,s.iH)(e[1])]))),(0,s.oR)(t))})),t},fetchServers(e){e=H(e);let t=this.servers.find((t=>C((0,s.SU)(t).filter,e)));return t||(t=(0,s.XI)({filter:e,data:{}}),this.servers.push(t)),$("https://tone.sleepycat.date/v2/client/servers?"+new URLSearchParams(e),(e=>{t&&((0,s.SU)(t).progress=e,1!==e&&(0,s.oR)(t))})).then((async e=>{t&&((0,s.SU)(t).data=Object.fromEntries(Object.entries(await(e?.json())).map((e=>[e[0],(0,s.iH)(e[1])]))),(0,s.oR)(t))})),t},fetchNSServers(){return fetch("https://northstar.tf/client/servers").then((async e=>{this.nsServers=await e.json()})),clearInterval(V),V=setInterval((()=>this.fetchNSServers()),6e4),this.nsServers||[]}}}),I={ref:"vscroll",class:"vscroll"};function D(e,t,a,r,s,l){return(0,i.wg)(),(0,i.iD)("div",{ref:"vlist",class:"vlist",onScroll:t[0]||(t[0]=(...t)=>e.scroll&&e.scroll(...t))},[(0,i._)("div",I,[(0,i._)("div",{style:(0,_.j5)(`padding: ${e.interval[0]*e.$props.rowHeight}px 0px ${Math.max(0,e.list.length*e.$props.rowHeight-e.interval[1]*e.$props.rowHeight)}px;`)},[((0,i.wg)(!0),(0,i.iD)(i.HY,null,(0,i.Ko)(e.visibleList,((t,a)=>(0,i.WI)(e.$slots,"default",{data:t,index:a+e.interval[0]},void 0,!0))),256))],4)],512)],544)}var R=(0,i.aZ)({data(){return{toLoad:10,vlistHeight:10,vIndex:0}},props:{list:{type:Array,default:()=>[]},rowHeight:{type:Number,default:()=>32},highlighted:String},mounted(){this.$props.list&&(this.vlistHeight=this.$refs.vlist?.getBoundingClientRect().height||0,this.toLoad=3*this.visibleCount,this.$props.highlighted&&setTimeout((()=>this.$refs.vlist?.scrollBy({top:this.list.findIndex((e=>e.id===this.$props.highlighted))*this.rowHeight-this.$refs.vlist?.scrollTop-(this.vlistHeight/2-this.$props.rowHeight),behavior:"smooth"})),1))},computed:{interval(){return[Math.max(Math.min(this.list.length-this.toLoad,this.vIndex),0),Math.min(this.vIndex+this.toLoad,this.list.length)]},visibleList(){return this.list.slice(this.interval[0],this.interval[1])},visibleCount(){return Math.ceil(this.vlistHeight/this.$props.rowHeight)}},watch:{list(){this.vlistHeight=this.$refs.vlist?.getBoundingClientRect().height||0},highlighted(e){e&&setTimeout((()=>this.$refs.vlist?.scrollBy({top:this.list.findIndex((t=>t.id===e))*this.rowHeight-this.$refs.vlist?.scrollTop-(this.vlistHeight/2-this.$props.rowHeight),behavior:"smooth"})),1)}},methods:{scroll(e){const t=e.target?.scrollTop,a=Math.floor(t/this.$props.rowHeight),r=athis.vIndex+this.visibleCount;if(r?this.vIndex=Math.max(a-this.visibleCount,0):s&&(this.vIndex=Math.min(a,this.list.length-this.toLoad)),s||r){}}}});const W=(0,u.Z)(R,[["render",D],["__scopeId","data-v-d1645486"]]);var M=W,O=(0,i.aZ)({name:"ServerView",components:{VirtualList:M},data(){return{store:U(),publicPath:"/ToneAPI_webclient/"}},computed:{servers(){const e=this.store.getServerList({})?.value.data;return e||(0,s.SU)(this.store.fetchServers({})).data},serverList(){const e=Object.entries(this.servers).map((e=>({...e[1],name:e[0]})));return e.sort(((e,t)=>{const a=this.nsServersByName[e.name]?this.nsServersByName[e.name].playerCount?1:0:-1,r=this.nsServersByName[t.name]?this.nsServersByName[t.name].playerCount?1:0:-1;return r-a})),e},nsServers(){const e=this.store.getNSServers;return e||this.store.fetchNSServers()},nsServersByName(){return Object.fromEntries(this.nsServers.map((e=>[e.name,e])))}}});const j=(0,u.Z)(O,[["render",L],["__scopeId","data-v-12531736"]]);var B=j;const q={id:"filters"},N={class:"multiselect-wrapper"},A=["disabled"],E={class:"multiselect-wrapper"},T=["disabled"],Z={class:"multiselect-wrapper"},z=["disabled"],F={id:"playerView"};function K(e,t,a,r,s,l){const n=(0,i.up)("VueMultiselect"),o=(0,i.up)("PlayerList"),d=(0,i.up)("PlayerChart"),p=(0,i.up)("WeaponChart");return(0,i.wg)(),(0,i.iD)(i.HY,null,[(0,i._)("div",q,[(0,i._)("span",N,[(0,i.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Select server",modelValue:e.model.server,"onUpdate:modelValue":t[0]||(t[0]=t=>e.model.server=t),options:e.sortedServerList,"allow-empty":!0},null,8,["modelValue","options"]),(0,i._)("button",{onClick:t[1]||(t[1]=t=>e.model.server=void 0),disabled:!e.model.server},"X",8,A)]),(0,i._)("span",E,[(0,i.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Select weapon",modelValue:e.model.weapon,"onUpdate:modelValue":t[2]||(t[2]=t=>e.model.weapon=t),"custom-label":t=>e.weaponLocale[t]||t,options:e.sortedWeaponList,"allow-empty":!0},null,8,["modelValue","custom-label","options"]),(0,i._)("button",{onClick:t[3]||(t[3]=t=>e.model.weapon=void 0),disabled:!e.model.weapon},"X",8,T)]),(0,i._)("span",Z,[(0,i.Wm)(n,{"options-limit":20,selectLabel:"",deselectLabel:"remove",placeholder:"Search player",modelValue:e.playerHighlighted,"onUpdate:modelValue":t[4]||(t[4]=t=>e.playerHighlighted=t),options:e.sortedPlayerList,"allow-empty":!0,"custom-label":e=>e?.username},null,8,["modelValue","options","custom-label"]),(0,i._)("button",{onClick:t[5]||(t[5]=t=>e.playerHighlighted=void 0),disabled:!e.playerHighlighted},"X",8,z)])]),(0,i._)("div",F,[(0,i.Wm)(o,{filters:e.filters,onHighlightPlayer:e.highlight_player,playerHighlighted:e.playerHighlighted?.id},null,8,["filters","onHighlightPlayer","playerHighlighted"]),(0,i.Wm)(d,{filters:e.filters,onHighlightPlayer:e.highlight_player,playerHighlighted:e.playerHighlighted?.id},null,8,["filters","onHighlightPlayer","playerHighlighted"]),(0,i.Wm)(p,{filters:{player:e.playerHighlighted?.id,...e.filters},playerHighlighted:e.playerHighlighted?.id},null,8,["filters","playerHighlighted"])])],64)}const X={class:"playerHeaders"},G=(0,i._)("span",null,null,-1),Y=["onClick"];function J(e,t,a,r,s,l){const n=(0,i.up)("LoadingBar"),o=(0,i.up)("VirtualList");return(0,i.wg)(),(0,i.iD)("div",{class:"playerTable",onKeydown:t[6]||(t[6]=(...t)=>e.selectNextPlayer&&e.selectNextPlayer(...t)),tabindex:"0"},[(0,i._)("div",X,[G,(0,i._)("span",{onClick:t[0]||(t[0]=t=>e.updateSort("username")),class:(0,_.C_)("username"==e.sortingData.argument?"selected":"")},"Username",2),(0,i._)("span",{onClick:t[1]||(t[1]=t=>e.updateSort("kills")),class:(0,_.C_)("kills"==e.sortingData.argument?"selected":"")},"K",2),(0,i._)("span",{onClick:t[2]||(t[2]=t=>e.updateSort("deaths")),class:(0,_.C_)("deaths"==e.sortingData.argument?"selected":"")},"D",2),(0,i._)("span",{onClick:t[3]||(t[3]=t=>e.updateSort("k/d")),class:(0,_.C_)("k/d"==e.sortingData.argument?"selected":"")},"K/D",2),(0,i._)("span",{onClick:t[4]||(t[4]=t=>e.updateSort("max_distance")),class:(0,_.C_)("max_distance"==e.sortingData.argument?"selected":"")},"Max distance",2),(0,i._)("span",{onClick:t[5]||(t[5]=t=>e.updateSort("avg_distance")),class:(0,_.C_)("avg_distance"==e.sortingData.argument?"selected":"")},"Average distance",2)]),1!==e.progress?((0,i.wg)(),(0,i.j4)(n,{key:0,value:e.progress},null,8,["value"])):(0,i.kq)("",!0),1===e.progress?((0,i.wg)(),(0,i.j4)(o,{key:1,list:e.playerList,"row-height":32,highlighted:e.playerHighlighted},{default:(0,i.w5)((t=>[(0,i._)("div",{class:(0,_.C_)("playerRow "+(t.data.id===e.playerHighlighted?"selected ":"")+((t.index+1)%2?"odd ":"uneven ")),onClick:a=>e.$emit("highlightPlayer",t.data.id)},[(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(t.index+1),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(t.data.value.username),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(t.data.value.kills),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(t.data.value.deaths),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(Math.round(t.data.value.kills/Math.max(1,t.data.value.deaths)*100)/100),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(t.data.value.max_distance),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,_.zw)(Math.round(100*(t.data.value.total_distance/t.data.value.kills||0))/100),1)])],10,Y)])),_:1},8,["list","highlighted"])):(0,i.kq)("",!0)],32)}const Q={class:"loadingComponent"},ee=["value"];function te(e,t,a,r,s,l){return(0,i.wg)(),(0,i.iD)("div",Q,[(0,i._)("progress",{class:"loadingBar",max:"1",value:e.value},null,8,ee)])}var ae=(0,i.aZ)({props:{value:Number}});const re=(0,u.Z)(ae,[["render",te],["__scopeId","data-v-eeb48308"]]);var se=re,ie=(0,i.aZ)({components:{VirtualList:M,LoadingBar:se},props:{filters:{type:Object,default:()=>({})},playerHighlighted:String},emits:["highlightPlayer"],data(){return{sortingData:{direction:-1,argument:"kills"},store:U()}},computed:{progress(){const{player:e,...t}=this.filters;return this.store.getPlayerList(t)?.value.progress},players(){const{player:e,...t}=this.filters,a=this.store.getPlayerList(t)?.value.data;return a||this.store.fetchPlayers(t).value.data},playerList(){if(!this.players)return[];const e=Object.entries(this.players).map((e=>{const t={},a=new Proxy(e[1],t);return a.id=e[0],a}));if("username"===this.sortingData.argument){const t=new Intl.Collator("en",{numeric:!0,sensitivity:"base"});e.sort(((e,a)=>{const r=e._rawValue,s=a._rawValue;return t.compare(r.username,s.username)}))}else if("k/d"===this.sortingData.argument)e.sort(((e,t)=>{const a=e._rawValue,r=t._rawValue;return a.kills/Math.max(1,a.deaths)-r.kills/Math.max(1,r.deaths)}));else if("avg_distance"===this.sortingData.argument)e.sort(((e,t)=>{const a=e._rawValue,r=t._rawValue;return(a.total_distance/a.kills||0)-(r.total_distance/r.kills||0)}));else{const t=this.sortingData.argument;e.sort(((e,a)=>{const r=e._rawValue,s=a._rawValue;return r[t]-s[t]}))}return this.sortingData.direction<0&&e.reverse(),e}},watch:{playerHighlighted(e){this.scrollToPlayer(e)},playerList(){this.playerHighlighted&&this.scrollToPlayer(this.playerHighlighted)}},methods:{selectNextPlayer(e){const t={Home:-1/0,End:1/0,PageDown:100,PageUp:-100,ArrowUp:-1,ArrowDown:1,ArrowRight:10,ArrowLeft:-10};if(!this.$props.playerHighlighted)return;if(!Object.keys(t).includes(e.key))return;e.preventDefault();const a=this.playerList.findIndex((e=>e.id===this.$props.playerHighlighted));let r=a+t[e.key];r>=this.playerList.length&&(r=this.playerList.length-1),r<0&&(r=0),this.$emit("highlightPlayer",this.playerList[r].id)},updateSort(e){this.sortingData.argument===e?this.sortingData.direction*=-1:this.sortingData.direction=-1,this.sortingData.argument=e},scrollToPlayer(e){const t=this.$refs["player:"+e];setTimeout((function(){t&&t[0]&&t[0].scrollIntoView({behavior:"smooth",block:"center"})}),10)}}});const le=(0,u.Z)(ie,[["render",J]]);var ne=le;const oe={class:"playerChart",ref:"container"};function de(e,t,a,r,s,l){const n=(0,i.up)("LoadingBar"),o=(0,i.up)("Scatter");return(0,i.wg)(),(0,i.iD)("div",oe,[1!==e.progress?((0,i.wg)(),(0,i.j4)(n,{key:0,value:e.progress},null,8,["value"])):(0,i.kq)("",!0),1===e.progress?((0,i.wg)(),(0,i.j4)(o,{key:1,data:e.chart,options:e.chartOptions},null,8,["data","options"])):(0,i.kq)("",!0)],512)}var pe=a(3254),he=a(9152),ue=a(1131),ce=a(5866);pe.kL.register(pe.f$,pe.od,pe.jn,pe.u,pe.De,he.Z,ue.Z);var ge=(0,i.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},data:()=>({store:U(),refreshColors:0,playerData:[]}),emits:["highlightPlayer"],components:{Scatter:ce.bp,LoadingBar:se},mounted(){this.refreshColors++},computed:{progress(){if(this.filters){const{player:e,...t}=this.filters;return this.store.getPlayerList(t)?.value.progress}return 0},playerList(){const e=this.store.getPlayerList(this.filters||{})?.value.data;if(!e)return Object.entries(this.store.fetchPlayers(this.filters||{}).value.data).map((e=>({id:e[0],...(0,s.IU)(e[1].value)})));const t=Object.entries(e).map((e=>({id:e[0],...(0,s.IU)(e[1].value)})));return t.sort(((e,t)=>t.kills-e.kills)),t.slice(0,200)},colors(){this.refreshColors;const e={};if(this.$refs?.container){const t=getComputedStyle(this.$refs.container);e.fg=t.getPropertyValue("--foreground"),e.bg=t.getPropertyValue("--bg-color"),e.orange=t.getPropertyValue("--orange"),e.cyan=t.getPropertyValue("--cyan"),e.currentLine=t.getPropertyValue("--current-line")}else e.fg="#ffffff";return e},chart(){const e=this.playerList.findIndex((e=>e.id===this.$props.playerHighlighted)),t=this.colors.cyan,a=new Array(this.playerList.length).fill(t);a[e]=this.colors.orange;const r=a,s=new Array(this.playerList.length).fill(1);s[e]=20;const i=new Array(this.playerList.length).fill(4);i[e]=30;const l=new Array(this.playerList.length).fill("circle");return l[e]="crossRot",{datasets:[{label:"Players",labels:this.playerList.map((e=>e.id))||[],borderColor:a,backgroundColor:r,pointRadius:s,pointStyle:l,hoverRadius:i,data:this.playerList.map((e=>({y:e.kills,x:e.deaths})))}]}},chartStaticOptions(){return{responsive:!0,maintainAspectRatio:!1,animation:{duration:500},layout:{autoPadding:!1},scales:{y:{title:{text:"Kills",display:!0,color:this.colors.fg},ticks:{color:this.colors.fg}},x:{title:{text:"Deaths",display:!0,color:this.colors.fg},ticks:{color:this.colors.fg}}},onClick:(e,t)=>{this.$emit("highlightPlayer",t.length>0?this.playerList[t[0].index].id:void 0),void 0!==this.store.getPlayerList(this.filters||{})&&(0,s.oR)(this.store.getPlayerList(this.filters||{}))},onHover:(e,t)=>{e.native.target&&(e.native.target.style.cursor=t[0]?"pointer":"default")}}},chartStaticPlugins(){let e=0,t=0;if(this.playerList){const a=Math.max(...this.playerList.map((e=>e.deaths))),r=Math.max(...this.playerList.map((e=>e.kills)));r>a?(e=a,t=a/r*r):(t=r,e=r/a*a)}return{tooltip:{callbacks:{label:e=>{let t;return t=this.playerList?this.playerList[e.dataIndex].username:e.dataset.labels[e.dataIndex],t+=" ("+e.parsed.y+" kills "+e.parsed.x+" deaths)",t}}},annotation:{annotations:{line:{type:"line",yMin:0,xMin:0,yMax:t,xMax:e,borderWidth:2,borderColor:this.colors.orange,borderDash:[1,5]}}},legend:{display:!1}}},chartOptions(){return this.$props.playerHighlighted,{...this.chartStaticOptions,plugins:{...this.chartStaticPlugins,datalabels:{formatter:(e,t)=>this.playerList[t.dataIndex].username,backgroundColor:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?this.colors.orange:null,borderColor:this.colors.fg,borderWidth:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?1:0,borderRadius:5,display:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?"true":"auto",align:-45,anchor:"end",clamp:!0,color:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?this.colors.bg:this.colors.fg}}}}}});const me=(0,u.Z)(ge,[["render",de],["__scopeId","data-v-558358e6"]]);var _e=me;const ve={class:"weaponChart",ref:"container"};function ye(e,t,a,r,s,l){const n=(0,i.up)("LoadingBar"),o=(0,i.up)("Doughnut");return(0,i.wg)(),(0,i.iD)("div",ve,[1!==e.progress?((0,i.wg)(),(0,i.j4)(n,{key:0,value:e.progress},null,8,["value"])):(0,i.kq)("",!0),1===e.progress?((0,i.wg)(),(0,i.j4)(o,{key:1,data:e.chart,options:e.chartOptions},null,8,["data","options"])):(0,i.kq)("",!0)],512)}var fe=JSON.parse('{"rodeo_battery_removal":"Rodeo Battery Removal","human_execution":"Human Execution","melee_pilot_kunai":"Kunai Melee","execution":"Execution","mp_weapon_car":"CAR","mp_weapon_defender":"Charge Rifle","mp_weapon_doubletake":"Double Take","mp_weapon_epg":"EPG-1","mp_weapon_hemlok_smg":"Volt","mp_weapon_lstar":"L-STAR","mp_weapon_r97":"R-97","mp_weapon_rspn101":"R-201","mp_weapon_smart_pistol":"Smart Pistol","mp_weapon_sniper":"Kraber","mp_weapon_vinson":"Flatline","mp_weapon_autopistol":"RE-45 auto","mp_weapon_alternator_smg":"Alternator","mp_weapon_frag_grenade":"Frag Grenade","mp_weapon_g2":"G2","mp_weapon_lmg":"Spitfire","mp_weapon_smr":"Sidewinder SMR","mp_weapon_softball":"Softball","mp_weapon_thermite_grenade":"Firestar","pilot_emptyhanded":"Melee","mp_weapon_mastiff":"Mastiff","mp_weapon_mgl":"MGL","mp_weapon_rspn101_og":"R-101","mp_weapon_wingman":"Wingman","invalid":"invalid","mp_weapon_arc_launcher":"Thunderbolt","mp_weapon_dmr":"DMR","mp_weapon_grenade_electric_smoke":"Electric Smoke","mp_weapon_pulse_lmg":"Cold War","mp_weapon_satchel":"Satchel","mp_weapon_shotgun":"EVA-8 Auto","mp_weapon_shotgun_pistol":"Mozambique","mp_weapon_wingman_n":"Wingman Elite","mp_weapon_grenade_gravity":"Gravity Star","mp_weapon_grenade_sonar":"Pulse Blade","mp_weapon_rocket_launcher":"Archer","outOfBounds":"OutOfBounds","mind_crime":"Mind Crime","mp_weapon_esaw":"Devotion","fall":"Fall","mp_weapon_semipistol":"P2016","mp_weapon_grenade_emp":"Arc Grenade","mp_weapon_hemlok":"Hemlok","melee_pilot_emptyhanded":"Melee","phase_shift":"Phase Shift","damagedef_suicide":"Suicide","damagedef_titan_hotdrop":"Crushed by Titanfall","mp_titanweapon_arc_cannon":"Arc Cannon","mp_weapon_peacekraber":"Peacekraber","damagedef_crush":"Crushed","mp_titanweapon_brute4_quad_rocket":"Quad Rocket Launcher","mp_weapon_turretplasma":"Antititan Turret","mp_titanweapon_xo16_vanguard":"XO-16","mp_titanweapon_sticky_40mm":"40mm Cannon","mp_titanweapon_predator_cannon":"Predator Cannon","mp_titanweapon_leadwall":"Leadwall","mp_titanweapon_sniper":"Plasma Railgun","titan_execution":"Titan Execution","titan_explosion":"Titan Explosion","auto_titan_melee":"Autotitan Melee","mp_titanweapon_vortex_shield_ion":"Vortex Shield","mp_titanweapon_heat_shield":"Heat shield","bubble_shield":"Bubble Shield","mp_titancore_salvo_core":"Salvo Core","mp_titancore_flame_wave":"Flame Wave","mp_titanweapon_flightcore_rockets":"Flight Core","mp_titancore_laser_cannon":"Laser Cannon","mp_titancore_flame_wave_secondary":"Scorched Earth","mp_titanweapon_flame_wall":"Flame Wall","mp_titanweapon_arc_wave":"Arc Wave"}');pe.kL.register(pe.qi,pe.u,pe.De,ue.Z);var we=(0,i.aZ)({name:"WeaponChart",props:{filters:Object,playerHighlighted:String},emits:["highlightPlayer"],components:{Doughnut:ce.$I,LoadingBar:se},mounted(){this.refreshColors++},data:()=>({store:U(),refreshColors:0}),computed:{progress(){const{weapon:e,...t}=this.filters||{};return this.store.getWeaponList(t)?.value.progress},colors(){this.refreshColors;const e={};if(this.$refs.container){const t=getComputedStyle(this.$refs.container);e.fg=t.getPropertyValue("--foreground"),e.bg=t.getPropertyValue("--bg-color"),e.orange=t.getPropertyValue("--orange"),e.cyan=t.getPropertyValue("--cyan"),e.yellow=t.getPropertyValue("--yellow"),e.green=t.getPropertyValue("--green"),e.purple=t.getPropertyValue("--purple"),e.red=t.getPropertyValue("--red"),e.pink=t.getPropertyValue("--pink"),e.currentLine=t.getPropertyValue("--current-line")}else e.fg="#ffffff";return e},chart(){const e=["cyan","green","orange","pink","purple","red","yellow"],t={datasets:[{label:"Weapons",labels:this.sortedWeaponList||[],borderColor:()=>this.colors.fg,backgroundColor:t=>this.colors[e[3*t.dataIndex%e.length]],data:[]}]};return this.sortedWeaponList?(t.datasets[0].data=this.sortedWeaponList.map((e=>this.weapons?this.weapons[e].value.kills:0)),t):t},chartOptions(){this.$props.playerHighlighted;const e={responsive:!0,maintainAspectRatio:!0,animation:{duration:500},layout:{autoPadding:!1},plugins:{datalabels:{formatter:(e,t)=>{const a=this.sortedWeaponList[t.dataIndex];return fe[a]||a},backgroundColor:e=>e.dataset.backgroundColor(e),borderColor:this.colors.fg,borderRadius:25,borderWidth:2,color:this.colors.bg,display:e=>e.dataIndex===e.dataset.labels.length-1||"auto",padding:6},tooltip:{callbacks:{label:e=>{let t;return t=this.sortedWeaponList?this.sortedWeaponList[e.dataIndex]:e.dataset.labels[e.dataIndex],t+=" ("+this.weapons[t].value.kills+" kills)",t}}}}};return e},weapons(){const{weapon:e,...t}=this.filters||{},a=this.store.getWeaponList(t)?.value.data;return a||this.store.fetchWeapons(t).value.data},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons).filter((e=>this.weapons[e].value.kills>0));return e.sort(((e,t)=>Number(this.weapons[e].value.kills)Number(this.weapons[t].value.kills)?1:0)),e}}});const be=(0,u.Z)(we,[["render",ye],["__scopeId","data-v-1cb3cdfe"]]);var Se=be,ke=a(6368),Le=(0,i.aZ)({name:"PlayerView",components:{VueMultiselect:ke.ZP,PlayerList:ne,PlayerChart:_e,WeaponChart:Se},data(){return{model:{server:void 0,weapon:void 0},filters:{},store:U(),playerHighlighted:void 0,weaponLocale:fe}},beforeCreate(){let e;this.$route.query.server&&(e=this.$route.query.server?.toString()),this.model={server:e,weapon:this.$route.query.weapon?.toString()}},computed:{servers(){const{server:e,player:t,...a}=this.filters,r=this.store.getServerList(a)?.value.data;return r||(0,s.SU)(this.store.fetchServers(a)).data},groupedServers(){const e=[];return Object.entries(this.servers).forEach((t=>{const a=(0,s.SU)(t[1]);e.find((e=>e.id===a.host))||e.push({id:a.host,servers:[]}),e.find((e=>e.id===a.host))?.servers.push({name:t[0],...a})})),e},weapons(){const{weapon:e,player:t,...a}=this.filters,r=this.store.getWeaponList(a)?.value.data;return r||this.store.fetchWeapons(a).value.data},players(){const{player:e,...t}=this.filters,a=this.store.getPlayerList(t)?.value.data;return a||this.store.fetchPlayers(t).value.data},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons);return e.sort()},sortedServerList(){if(!this.servers)return[];const e=Object.keys(this.servers);return e.sort()},sortedPlayerList(){if(!this.players)return[];const e=Object.entries(this.players).map((e=>({id:e[0],...e[1]._rawValue})));return e.sort(((e,t)=>e.usernamet.username?1:0))}},watch:{players(){const e=this.$route.query.player?.toString();e&&this.playerHighlighted?.id!==e&&this.highlight_player(e)},model:{handler(e){this.filters.server=e.server,this.filters.weapon=e.weapon},deep:!0},filters:{handler(e){const{server:t,weapon:a,...r}=this.$route.query;$e.push({query:{...e,...r}})},deep:!0},playerHighlighted(e,t){if(e?.id===t?.id)return;const{player:a,...r}=this.$route.query;$e.push({query:{player:e?.id,...r}})},$route:{handler:function(){this.applyRouteFilters()},immediate:!0}},methods:{highlight_player(e){const t=this.players[e];this.playerHighlighted=t?{id:e,...(0,s.SU)(t)}:void 0},applyRouteFilters(){if(this.playerHighlighted?.id!==this.$route.query.player){const e=this.$route.query.player?.toString();e&&this.highlight_player(e)}this.filters.weapon!==this.$route.query.weapon&&(this.model.weapon=this.$route.query.weapon?.toString()),this.filters.server!==this.$route.query.server&&(this.$route.query.server?this.model.server=this.$route.query.server?.toString():this.model.server=void 0)}}});const xe=(0,u.Z)(Le,[["render",K],["__scopeId","data-v-24065b86"]]);var Pe=xe;const He=[{path:"/",name:"home",component:Pe},{path:"/servers",name:"servers",component:B}],Ce=(0,m.p7)({history:(0,m.PO)("/ToneAPI_webclient/"),routes:He});var $e=Ce;const Ve=(0,x.WB)();(0,r.ri)(g).use(Ve).use($e).mount("#app");const Ue=U(),Ie=new WebSocket("wss://tone.sleepycat.date/v2/client/websocket");function De(e){Ue.$state.players.filter((t=>(!t.value.filter.server||t.value.filter.server===e.servername)&&(!t.value.filter.weapon||t.value.filter.weapon===e.cause_of_death))).forEach((t=>{t.value.data[e.attacker_id]||(t.value.data[e.attacker_id]=(0,s.iH)({deaths:0,kills:0,max_distance:0,total_distance:0,username:e.attacker_name})),t.value.data[e.victim_id]||(t.value.data[e.victim_id]=(0,s.iH)({deaths:0,kills:0,max_distance:0,total_distance:0,username:e.victim_name})),(0,s.SU)(t.value.data[e.victim_id]).deaths++,(0,s.SU)(t.value.data[e.victim_id]).username=e.victim_name,(0,s.SU)(t.value.data[e.attacker_id]).username=e.attacker_name,e.attacker_id!==e.victim_id&&((0,s.SU)(t.value.data[e.attacker_id]).kills++,(0,s.SU)(t.value.data[e.attacker_id]).total_distance+=e.distance,(0,s.SU)(t.value.data[e.attacker_id]).max_distance=Math.max(e.distance,(0,s.SU)(t.value.data[e.attacker_id]).max_distance))})),Ue.$state.weapons.filter((t=>(!t.value.filter.server||t.value.filter.server===e.servername)&&(!t.value.filter.player||t.value.filter.player===e.attacker_id))).forEach((t=>{t.value.data[e.cause_of_death]||(t.value.data[e.cause_of_death]=(0,s.iH)({deaths:0,kills:0,max_distance:0,total_distance:0,deaths_while_equipped:0})),e.attacker_id!==e.victim_id&&((0,s.SU)(t.value.data[e.cause_of_death]).kills++,(0,s.SU)(t.value.data[e.cause_of_death]).total_distance+=e.distance,(0,s.SU)(t.value.data[e.cause_of_death]).max_distance=Math.max(e.distance,(0,s.SU)(t.value.data[e.cause_of_death]).max_distance)),(0,s.SU)(t.value.data[e.cause_of_death]).deaths++})),Ue.$state.servers.filter((t=>!t.value.filter.server||t.value.filter.server===e.servername)).forEach((t=>{t.value.data[e.servername]||(t.value.data[e.servername]=(0,s.iH)({deaths:0,kills:0,max_distance:0,total_distance:0,deaths_while_equipped:0,host:e.host})),e.attacker_id!==e.victim_id&&((0,s.SU)(t.value.data[e.servername]).kills++,(0,s.SU)(t.value.data[e.servername]).total_distance+=e.distance,(0,s.SU)(t.value.data[e.servername]).max_distance=Math.max(e.distance,(0,s.SU)(t.value.data[e.servername]).max_distance)),(0,s.SU)(t.value.data[e.servername]).deaths++}))}Ie.onmessage=function(e){if("ping"===e.data)return Ie.send("pong");const t=JSON.parse(e.data);De(t)}}}]);
+//# sourceMappingURL=chunk-common.261b3edd.js.map
\ No newline at end of file
diff --git a/dist/js/chunk-common.261b3edd.js.map b/dist/js/chunk-common.261b3edd.js.map
new file mode 100644
index 0000000..f8ed280
--- /dev/null
+++ b/dist/js/chunk-common.261b3edd.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"js/chunk-common.261b3edd.js","mappings":"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","sources":["webpack://toneapi_webclient/./src/App.vue?3bba","webpack://toneapi_webclient/./src/App.vue?847a","webpack://toneapi_webclient/./src/App.vue","webpack://toneapi_webclient/./src/views/ServerView.vue?d58e","webpack://toneapi_webclient/./src/stores/kill.ts","webpack://toneapi_webclient/./src/components/List/VirtualList.vue?e43d","webpack://toneapi_webclient/./src/components/List/VirtualList.vue?49a5","webpack://toneapi_webclient/./src/components/List/VirtualList.vue","webpack://toneapi_webclient/./src/views/ServerView.vue?0473","webpack://toneapi_webclient/./src/views/ServerView.vue","webpack://toneapi_webclient/./src/views/PlayerView.vue?7aca","webpack://toneapi_webclient/./src/components/PlayerList.vue?c22d","webpack://toneapi_webclient/./src/components/LoadingBar.vue?9473","webpack://toneapi_webclient/./src/components/LoadingBar.vue?0d8b","webpack://toneapi_webclient/./src/components/LoadingBar.vue","webpack://toneapi_webclient/./src/components/PlayerList.vue?f30b","webpack://toneapi_webclient/./src/components/PlayerList.vue","webpack://toneapi_webclient/./src/components/PlayerChart.vue?93f1","webpack://toneapi_webclient/./src/components/PlayerChart.vue?ec59","webpack://toneapi_webclient/./src/components/PlayerChart.vue","webpack://toneapi_webclient/./src/components/WeaponChart.vue?1e91","webpack://toneapi_webclient/./src/components/WeaponChart.vue?1a04","webpack://toneapi_webclient/./src/components/WeaponChart.vue","webpack://toneapi_webclient/./src/views/PlayerView.vue?6941","webpack://toneapi_webclient/./src/views/PlayerView.vue","webpack://toneapi_webclient/./src/router/index.ts","webpack://toneapi_webclient/./src/main.ts"],"sourcesContent":["import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"navbar-logo\" }\nconst _hoisted_2 = {\n href: \"https://github.com/ToneAPI\",\n target: \"_blank\"\n}\nconst _hoisted_3 = [\"src\"]\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"spacer\" }, null, -1)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_router_link = _resolveComponent(\"router-link\")!\n const _component_router_view = _resolveComponent(\"router-view\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"header\", null, [\n _createElementVNode(\"nav\", null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"a\", _hoisted_2, [\n _createElementVNode(\"img\", {\n src: `${_ctx.publicPath}tone_icon.png`\n }, null, 8, _hoisted_3)\n ])\n ]),\n _hoisted_4,\n _createVNode(_component_router_link, {\n to: \"/servers\",\n class: \"navbar-element\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Servers (Beta)\")\n ]),\n _: 1\n }),\n _createVNode(_component_router_link, {\n to: \"/\",\n class: \"navbar-element\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Players\")\n ]),\n _: 1\n })\n ])\n ]),\n _createVNode(_component_router_view)\n ], 64))\n}","\r\n\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n data () {\r\n return {\r\n publicPath: process.env.BASE_URL\r\n }\r\n }\r\n})\r\n","import { render } from \"./App.vue?vue&type=template&id=5925bcb7&ts=true\"\nimport script from \"./App.vue?vue&type=script&lang=ts\"\nexport * from \"./App.vue?vue&type=script&lang=ts\"\n\nimport \"./App.vue?vue&type=style&index=0&id=5925bcb7&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, Fragment as _Fragment, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-12531736\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { id: \"filters\" }, null, -1))\nconst _hoisted_2 = { class: \"serverView\" }\nconst _hoisted_3 = { class: \"serverList\" }\nconst _hoisted_4 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { class: \"serverHeaders\" }, [\n /*#__PURE__*/_createElementVNode(\"span\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Map\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Server name\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Players\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Kills\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Max distance\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Average distance\")\n], -1))\nconst _hoisted_5 = [\"src\"]\nconst _hoisted_6 = { key: 1 }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_VirtualList = _resolveComponent(\"VirtualList\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _hoisted_1,\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"div\", _hoisted_3, [\n _hoisted_4,\n _createVNode(_component_VirtualList, {\n list: _ctx.serverList,\n \"row-height\": 100\n }, {\n default: _withCtx((slotProps) => [\n _createElementVNode(\"div\", {\n class: _normalizeClass('serverRow ' + (!_ctx.nsServersByName[slotProps.data.name] ? 'offline ' : '') + (!_ctx.nsServersByName[slotProps.data.name]?.playerCount ? 'inactive ' : '') + ((slotProps.index + 1) % 2 ? 'odd ' : 'uneven '))\n }, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.index + 1), 1)\n ]),\n (_ctx.nsServersByName[slotProps.data.name])\n ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: `${_ctx.publicPath}maps/${_ctx.nsServersByName[slotProps.data.name].map}_lobby.png`\n }, null, 8, _hoisted_5))\n : _createCommentVNode(\"\", true),\n (!_ctx.nsServersByName[slotProps.data.name])\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data.name + (!_ctx.nsServersByName[slotProps.data.name] ? ' (offline)' : '')), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.nsServersByName[slotProps.data.name] ? _ctx.nsServersByName[slotProps.data.name]?.playerCount\r\n + '/' + _ctx.nsServersByName[slotProps.data.name]?.maxPlayers : ''), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data._value.deaths), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data._value.max_distance), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(((slotProps.data._value.total_distance / slotProps.data._value.kills) || 0) * 100) /\r\n 100), 1)\n ])\n ], 2)\n ]),\n _: 1\n }, 8, [\"list\"])\n ])\n ])\n ], 64))\n}","import { defineStore } from 'pinia'\r\nimport * as assert from 'assert'\r\nimport { Ref, reactive, ref, shallowRef, triggerRef, unref } from 'vue'\r\n\r\nexport interface Filters {\r\n server?: string;\r\n player?: string;\r\n weapon?: string;\r\n host?: string;\r\n map?: string;\r\n gamemode?: string;\r\n}\r\n\r\nfunction removeNullEntries (a: Filters) {\r\n return Object.fromEntries(\r\n Object.entries(a).filter((e) => e[1] !== undefined && e[1] !== null)\r\n )\r\n}\r\nfunction objectEqual (a: Filters, b: Filters) {\r\n try {\r\n a = removeNullEntries(a)\r\n b = removeNullEntries(b)\r\n assert.deepStrictEqual(a, b)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nfunction fetchWithLoading (url: string, progress: (percentage: number) => void) {\r\n return fetch(url).then(response => {\r\n if (!response.ok) {\r\n throw Error(response.status + ' ' + response.statusText)\r\n }\r\n\r\n if (!response.body) {\r\n throw Error('ReadableStream not yet supported in this browser.')\r\n }\r\n\r\n // to access headers, server must send CORS header \"Access-Control-Expose-Headers: content-encoding, content-length x-file-size\"\r\n // server must send custom x-file-size header if gzip or other content-encoding is used\r\n const contentEncoding = response.headers.get('Content-Encoding')\r\n const contentLength = response.headers.get(contentEncoding ? 'X-File-Size' : 'content-length')\r\n if (contentLength === null) {\r\n throw Error('Response size header unavailable')\r\n }\r\n\r\n const total = parseInt(contentLength, 10)\r\n let loaded = 0\r\n\r\n return new Response(\r\n new ReadableStream({\r\n start (controller) {\r\n const reader = response.body!.getReader()\r\n\r\n read()\r\n function read () {\r\n reader.read().then(({ done, value }) => {\r\n if (done) {\r\n controller.close()\r\n return\r\n }\r\n if (value) {\r\n loaded += value.byteLength\r\n progress(loaded / total)\r\n controller.enqueue(value)\r\n }\r\n read()\r\n }).catch(error => {\r\n console.error(error)\r\n controller.error(error)\r\n })\r\n }\r\n }\r\n })\r\n )\r\n })\r\n .catch(error => {\r\n console.error(error)\r\n })\r\n}\r\n\r\nexport interface Kill {\r\n deaths: number;\r\n kills: number;\r\n // eslint-disable-next-line camelcase\r\n max_distance: number;\r\n // eslint-disable-next-line camelcase\r\n total_distance: number;\r\n}\r\nexport interface KillData {\r\n filter: Filters;\r\n data: { [key: string]: Ref };\r\n progress?: number;\r\n}\r\n\r\nexport interface Player extends Kill {\r\n username: string;\r\n // eslint-disable-next-line camelcase\r\n // deaths_while_equipped?: number;\r\n}\r\n\r\nexport interface Weapon extends Kill {\r\n // eslint-disable-next-line camelcase\r\n deaths_while_equipped: number;\r\n}\r\n\r\nexport interface Server extends Kill {\r\n host: number;\r\n}\r\n\r\nexport interface NSServer {\r\n name: string;\r\n region: string;\r\n description: string;\r\n playerCount: number;\r\n maxPlayers: number;\r\n map: string;\r\n playlist: string;\r\n hasPassword: boolean;\r\n modInfo: { Mods: [] }\r\n}\r\n// define your typings for the store state\r\nexport interface State {\r\n servers: Ref>[];\r\n players: Ref>[];\r\n weapons: Ref>[];\r\n maps: Ref>[];\r\n gamemodes: Ref>[];\r\n hosts: { [key: number]: string };\r\n nsServers: NSServer[] | undefined\r\n}\r\n\r\nlet serverInterval: number\r\nexport const useKillStore = defineStore('kill', {\r\n state: (): State => ({\r\n servers: [],\r\n players: [],\r\n weapons: [],\r\n maps: [],\r\n gamemodes: [],\r\n hosts: {},\r\n nsServers: undefined\r\n }),\r\n getters: {\r\n getPlayerList: (state) => (filters: Filters) => {\r\n return state.players.find((e) => objectEqual(unref(e).filter, filters))\r\n },\r\n getWeaponList: (state) => (filters: Filters) =>\r\n state.weapons.find((e) => objectEqual(unref(e).filter, filters)),\r\n getServerList: (state) => (filters: Filters) =>\r\n state.servers.find((e) => objectEqual(unref(e).filter, filters)),\r\n getNSServers: (state) => state.nsServers\r\n },\r\n actions: {\r\n fetchPlayers (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.players.find((e) => objectEqual(unref(e).filter, filter))\r\n if (entry === undefined) {\r\n entry = shallowRef({ filter, data: {} })\r\n this.players.push(entry)\r\n }\r\n fetchWithLoading(\r\n 'https://tone.sleepycat.date/v2/client/players?' +\r\n new URLSearchParams(filter as Record),\r\n (progress) => {\r\n if (entry) {\r\n unref(entry).progress = progress\r\n if (progress !== 1) triggerRef(entry)\r\n }\r\n }\r\n ).then(async response => {\r\n if (entry) {\r\n unref(entry).data = Object.fromEntries(Object.entries(await response?.json()).map(e => [e[0], ref(e[1] as Player)]))\r\n triggerRef(entry)\r\n }\r\n })\r\n return entry\r\n },\r\n fetchWeapons (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.weapons.find((e) => objectEqual(unref(e).filter, filter))\r\n if (!entry) {\r\n entry = shallowRef({ filter, data: {} })\r\n this.weapons.push(entry)\r\n }\r\n\r\n fetchWithLoading(\r\n 'https://tone.sleepycat.date/v2/client/weapons?' +\r\n new URLSearchParams(filter as Record),\r\n (progress) => {\r\n if (entry) {\r\n unref(entry).progress = progress\r\n if (progress !== 1) triggerRef(entry)\r\n }\r\n }\r\n ).then(async response => {\r\n if (entry) {\r\n unref(entry).data = Object.fromEntries(Object.entries(await response?.json()).map(e => [e[0], ref(e[1] as Weapon)]))\r\n triggerRef(entry)\r\n }\r\n })\r\n return entry\r\n },\r\n fetchServers (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.servers.find((e) => objectEqual(unref(e).filter, filter))\r\n if (!entry) {\r\n entry = shallowRef({ filter, data: {} })\r\n this.servers.push(entry)\r\n }\r\n fetchWithLoading(\r\n 'https://tone.sleepycat.date/v2/client/servers?' +\r\n new URLSearchParams(filter as Record),\r\n (progress) => {\r\n if (entry) {\r\n unref(entry).progress = progress\r\n if (progress !== 1) triggerRef(entry)\r\n }\r\n }\r\n ).then(async response => {\r\n if (entry) {\r\n unref(entry).data = Object.fromEntries(Object.entries(await response?.json()).map(e => [e[0], ref(e[1] as Server)]))\r\n triggerRef(entry)\r\n }\r\n })\r\n return entry\r\n },\r\n fetchNSServers () {\r\n fetch(\r\n 'https://northstar.tf/client/servers').then(async response => {\r\n this.nsServers = await response.json()\r\n })\r\n clearInterval(serverInterval)\r\n serverInterval = setInterval(() => this.fetchNSServers(), 60000)\r\n return this.nsServers || []\r\n }\r\n }\r\n})\r\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, renderSlot as _renderSlot, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-d1645486\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n ref: \"vscroll\",\n class: \"vscroll\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", {\n ref: \"vlist\",\n class: \"vlist\",\n onScroll: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.scroll && _ctx.scroll(...args)))\n }, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", {\n style: _normalizeStyle(`padding: ${(_ctx.interval[0]*_ctx.$props.rowHeight!)}px 0px ${Math.max(0,(((_ctx.list.length)*_ctx.$props.rowHeight!)-(_ctx.interval[1])*_ctx.$props.rowHeight!))}px;`)\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.visibleList, (data, index) => {\n return _renderSlot(_ctx.$slots, \"default\", {\n data: data,\n index: index+_ctx.interval[0]\n }, undefined, true)\n }), 256))\n ], 4)\n ], 512)\n ], 544))\n}","\r\nimport { defineComponent, PropType } from 'vue'\r\n\r\nexport default defineComponent({\r\n data () {\r\n return {\r\n toLoad: 10,\r\n vlistHeight: 10,\r\n vIndex: 0\r\n }\r\n },\r\n props: {\r\n list: { type: Array as PropType, default: () => [] },\r\n rowHeight: { type: Number, default: () => 32 },\r\n highlighted: String\r\n },\r\n mounted () {\r\n if (this.$props.list) {\r\n this.vlistHeight = (this.$refs.vlist as HTMLElement)?.getBoundingClientRect().height || 0\r\n this.toLoad = this.visibleCount * 3\r\n if (this.$props.highlighted) {\r\n setTimeout(() => (this.$refs.vlist as HTMLElement)?.scrollBy({ top: ((this.list.findIndex(e => e.id === this.$props.highlighted)) * this.rowHeight) - ((this.$refs.vlist as HTMLElement))?.scrollTop - (this.vlistHeight / 2 - this.$props.rowHeight), behavior: 'smooth' }), 1)\r\n }\r\n }\r\n },\r\n computed: {\r\n interval () {\r\n // console.log(this.list.length, this.vIndex + this.toLoad)\r\n return [Math.max(Math.min(this.list.length - this.toLoad, this.vIndex), 0), Math.min(this.vIndex + this.toLoad, this.list.length)]\r\n },\r\n visibleList () {\r\n return this.list.slice(this.interval[0], this.interval[1])\r\n },\r\n visibleCount () {\r\n return Math.ceil(this.vlistHeight / this.$props.rowHeight)\r\n }\r\n },\r\n watch: {\r\n list () {\r\n this.vlistHeight = (this.$refs.vlist as HTMLElement)?.getBoundingClientRect().height || 0\r\n },\r\n highlighted (newVal) {\r\n if (newVal) setTimeout(() => (this.$refs.vlist as HTMLElement)?.scrollBy({ top: ((this.list.findIndex(e => e.id === newVal)) * this.rowHeight) - ((this.$refs.vlist as HTMLElement))?.scrollTop - (this.vlistHeight / 2 - this.$props.rowHeight), behavior: 'smooth' }), 1)\r\n }\r\n },\r\n methods: {\r\n scroll (e:Event) {\r\n const scrollTop = (e.target as HTMLElement)?.scrollTop\r\n const scrollIndex = Math.floor(scrollTop / this.$props.rowHeight)\r\n\r\n const mustScrollUp = scrollIndex < this.vIndex\r\n const mustScrollDown = scrollIndex > this.vIndex + this.visibleCount\r\n // console.log(this.vIndex + this.visibleCount, scrollIndex + this.visibleCount)\r\n if (mustScrollUp) {\r\n this.vIndex = Math.max(scrollIndex - this.visibleCount, 0)\r\n } else if (mustScrollDown) {\r\n this.vIndex = Math.min(scrollIndex, this.list.length - this.toLoad)\r\n }\r\n if (mustScrollDown || mustScrollUp) {\r\n const msg = (mustScrollDown ? 'down ' : '') + (mustScrollUp ? 'up ' : '')\r\n // console.log(this.toLoad)\r\n // console.log((this.list.length * this.$props.rowHeight) - (this.vIndex * this.$props.rowHeight) - (this.visibleCount * this.$props.rowHeight))\r\n }\r\n }\r\n }\r\n\r\n})\r\n","import { render } from \"./VirtualList.vue?vue&type=template&id=d1645486&scoped=true&ts=true\"\nimport script from \"./VirtualList.vue?vue&type=script&lang=ts\"\nexport * from \"./VirtualList.vue?vue&type=script&lang=ts\"\n\nimport \"./VirtualList.vue?vue&type=style&index=0&id=d1645486&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-d1645486\"]])\n\nexport default __exports__","\r\nimport { NSServer, Server, useKillStore } from '@/stores/kill'\r\nimport VirtualList from '@/components/List/VirtualList.vue'\r\nimport { Ref, defineComponent, unref } from 'vue'\r\n\r\nexport default defineComponent({\r\n name: 'ServerView',\r\n components: {\r\n VirtualList\r\n },\r\n data () {\r\n return {\r\n store: useKillStore(),\r\n publicPath: process.env.BASE_URL\r\n }\r\n },\r\n computed: {\r\n servers (): { [key: string]: Ref } {\r\n const data = this.store.getServerList({})?.value.data\r\n if (!data) return unref(this.store.fetchServers({})).data\r\n return data\r\n },\r\n serverList (): (Ref & { name: string })[] {\r\n const data = Object.entries(this.servers).map(e => ({ ...e[1], name: e[0] }))\r\n data.sort((server1, server2) => {\r\n const a = !this.nsServersByName[server1.name] ? -1 : this.nsServersByName[server1.name].playerCount ? 1 : 0\r\n const b = !this.nsServersByName[server2.name] ? -1 : this.nsServersByName[server2.name].playerCount ? 1 : 0\r\n return b - a\r\n })\r\n return data\r\n },\r\n nsServers (): NSServer[] {\r\n const data = this.store.getNSServers\r\n if (!data) {\r\n return this.store.fetchNSServers()\r\n }\r\n return data\r\n },\r\n nsServersByName (): { [key: string]: NSServer } {\r\n return Object.fromEntries(this.nsServers.map(e => [e.name, e]))\r\n }\r\n }\r\n\r\n})\r\n","import { render } from \"./ServerView.vue?vue&type=template&id=12531736&scoped=true&ts=true\"\nimport script from \"./ServerView.vue?vue&type=script&lang=ts\"\nexport * from \"./ServerView.vue?vue&type=script&lang=ts\"\n\nimport \"./ServerView.vue?vue&type=style&index=0&id=12531736&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-12531736\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-24065b86\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { id: \"filters\" }\nconst _hoisted_2 = { class: \"multiselect-wrapper\" }\nconst _hoisted_3 = [\"disabled\"]\nconst _hoisted_4 = { class: \"multiselect-wrapper\" }\nconst _hoisted_5 = [\"disabled\"]\nconst _hoisted_6 = { class: \"multiselect-wrapper\" }\nconst _hoisted_7 = [\"disabled\"]\nconst _hoisted_8 = { id: \"playerView\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_VueMultiselect = _resolveComponent(\"VueMultiselect\")!\n const _component_PlayerList = _resolveComponent(\"PlayerList\")!\n const _component_PlayerChart = _resolveComponent(\"PlayerChart\")!\n const _component_WeaponChart = _resolveComponent(\"WeaponChart\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"span\", _hoisted_2, [\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select server\",\n modelValue: _ctx.model.server,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.model.server) = $event)),\n options: _ctx.sortedServerList,\n \"allow-empty\": true\n }, null, 8, [\"modelValue\", \"options\"]),\n _createElementVNode(\"button\", {\n onClick: _cache[1] || (_cache[1] = ($event: any) => (_ctx.model.server = undefined)),\n disabled: !_ctx.model.server\n }, \"X\", 8, _hoisted_3)\n ]),\n _createElementVNode(\"span\", _hoisted_4, [\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select weapon\",\n modelValue: _ctx.model.weapon,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((_ctx.model.weapon) = $event)),\n \"custom-label\": ((e) => _ctx.weaponLocale[e] || e),\n options: _ctx.sortedWeaponList,\n \"allow-empty\": true\n }, null, 8, [\"modelValue\", \"custom-label\", \"options\"]),\n _createElementVNode(\"button\", {\n onClick: _cache[3] || (_cache[3] = ($event: any) => (_ctx.model.weapon = undefined)),\n disabled: !_ctx.model.weapon\n }, \"X\", 8, _hoisted_5)\n ]),\n _createElementVNode(\"span\", _hoisted_6, [\n _createVNode(_component_VueMultiselect, {\n \"options-limit\": 20,\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Search player\",\n modelValue: _ctx.playerHighlighted,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = ($event: any) => ((_ctx.playerHighlighted) = $event)),\n options: _ctx.sortedPlayerList,\n \"allow-empty\": true,\n \"custom-label\": ((e) => e?.username)\n }, null, 8, [\"modelValue\", \"options\", \"custom-label\"]),\n _createElementVNode(\"button\", {\n onClick: _cache[5] || (_cache[5] = ($event: any) => (_ctx.playerHighlighted = undefined)),\n disabled: !_ctx.playerHighlighted\n }, \"X\", 8, _hoisted_7)\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_8, [\n _createVNode(_component_PlayerList, {\n filters: _ctx.filters,\n onHighlightPlayer: _ctx.highlight_player,\n playerHighlighted: _ctx.playerHighlighted?.id\n }, null, 8, [\"filters\", \"onHighlightPlayer\", \"playerHighlighted\"]),\n _createVNode(_component_PlayerChart, {\n filters: _ctx.filters,\n onHighlightPlayer: _ctx.highlight_player,\n playerHighlighted: _ctx.playerHighlighted?.id\n }, null, 8, [\"filters\", \"onHighlightPlayer\", \"playerHighlighted\"]),\n _createVNode(_component_WeaponChart, {\n filters: { player: _ctx.playerHighlighted?.id, ..._ctx.filters },\n playerHighlighted: _ctx.playerHighlighted?.id\n }, null, 8, [\"filters\", \"playerHighlighted\"])\n ])\n ], 64))\n}","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, withCtx as _withCtx, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"playerHeaders\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"span\", null, null, -1)\nconst _hoisted_3 = [\"onClick\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_LoadingBar = _resolveComponent(\"LoadingBar\")!\n const _component_VirtualList = _resolveComponent(\"VirtualList\")!\n\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"playerTable\",\n onKeydown: _cache[6] || (_cache[6] = \n//@ts-ignore\n(...args) => (_ctx.selectNextPlayer && _ctx.selectNextPlayer(...args))),\n tabindex: \"0\"\n }, [\n _createElementVNode(\"div\", _hoisted_1, [\n _hoisted_2,\n _createElementVNode(\"span\", {\n onClick: _cache[0] || (_cache[0] = ($event: any) => (_ctx.updateSort('username'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'username' ? 'selected' : '')\n }, \"Username\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[1] || (_cache[1] = ($event: any) => (_ctx.updateSort('kills'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'kills' ? 'selected' : '')\n }, \"K\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[2] || (_cache[2] = ($event: any) => (_ctx.updateSort('deaths'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'deaths' ? 'selected' : '')\n }, \"D\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[3] || (_cache[3] = ($event: any) => (_ctx.updateSort('k/d'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'k/d' ? 'selected' : '')\n }, \"K/D\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[4] || (_cache[4] = ($event: any) => (_ctx.updateSort('max_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'max_distance' ? 'selected' : '')\n }, \"Max distance\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[5] || (_cache[5] = ($event: any) => (_ctx.updateSort('avg_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'avg_distance' ? 'selected' : '')\n }, \"Average distance\", 2)\n ]),\n (_ctx.progress!==1)\n ? (_openBlock(), _createBlock(_component_LoadingBar, {\n key: 0,\n value: _ctx.progress\n }, null, 8, [\"value\"]))\n : _createCommentVNode(\"\", true),\n (_ctx.progress===1)\n ? (_openBlock(), _createBlock(_component_VirtualList, {\n key: 1,\n list: _ctx.playerList,\n \"row-height\": 32,\n highlighted: _ctx.playerHighlighted\n }, {\n default: _withCtx((slotProps) => [\n _createElementVNode(\"div\", {\n class: _normalizeClass('playerRow ' + (slotProps.data.id === _ctx.playerHighlighted ? 'selected ' : '') + ((slotProps.index + 1)%2 ? 'odd ':'uneven ')),\n onClick: ($event: any) => (_ctx.$emit('highlightPlayer', slotProps.data.id))\n }, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.index+1), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data.value.username), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data.value.kills), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data.value.deaths), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(slotProps.data.value.kills / Math.max(1, slotProps.data.value.deaths) * 100) / 100), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data.value.max_distance), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(((slotProps.data.value.total_distance / slotProps.data.value.kills) || 0) * 100) / 100), 1)\n ])\n ], 10, _hoisted_3)\n ]),\n _: 1\n }, 8, [\"list\", \"highlighted\"]))\n : _createCommentVNode(\"\", true)\n ], 32))\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-eeb48308\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"loadingComponent\" }\nconst _hoisted_2 = [\"value\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createElementVNode(\"progress\", {\n class: \"loadingBar\",\n max: \"1\",\n value: _ctx.value\n }, null, 8, _hoisted_2)\n ]))\n}","\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n props: {\n value: Number\n }\n})\n","import { render } from \"./LoadingBar.vue?vue&type=template&id=eeb48308&scoped=true&ts=true\"\nimport script from \"./LoadingBar.vue?vue&type=script&lang=ts\"\nexport * from \"./LoadingBar.vue?vue&type=script&lang=ts\"\n\nimport \"./LoadingBar.vue?vue&type=style&index=0&id=eeb48308&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-eeb48308\"]])\n\nexport default __exports__","\r\nimport { defineComponent, PropType, Ref } from 'vue'\r\nimport { useKillStore, Player, Filters } from '@/stores/kill'\r\nimport VirtualList from './List/VirtualList.vue'\r\nimport LoadingBar from './LoadingBar.vue'\r\n\r\nexport default defineComponent({\r\n components: { VirtualList, LoadingBar },\r\n props: {\r\n filters: { type: Object as PropType, default: () => ({}) },\r\n playerHighlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n data () {\r\n return {\r\n sortingData: { direction: -1, argument: 'kills' as keyof Player | 'k/d' | 'avg_distance' },\r\n store: useKillStore()\r\n }\r\n },\r\n computed: {\r\n progress () {\r\n const { player: _, ...withoutPlayer } = this.filters\r\n return this.store.getPlayerList(withoutPlayer)?.value.progress\r\n },\r\n players (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayer } = this.filters\r\n const data = this.store.getPlayerList(withoutPlayer)?.value.data\r\n if (!data) return this.store.fetchPlayers(withoutPlayer).value.data\r\n return data\r\n },\r\n playerList (): (Ref & { id: string })[] {\r\n if (!this.players) return []\r\n const players = Object.entries(this.players).map(e => {\r\n const target = {} as ProxyHandler[>\r\n const player = new Proxy(e[1], target) as Ref & { id: string }\r\n player.id = e[0]\r\n return player\r\n }) as (Ref & { id: string })[]\r\n\r\n if (this.sortingData.argument === 'username') {\r\n const collator = new Intl.Collator('en', { numeric: true, sensitivity: 'base' })\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return collator.compare(aVal.username, bVal.username)\r\n })\r\n } else if (this.sortingData.argument === 'k/d') {\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return aVal.kills / Math.max(1, aVal.deaths) - bVal.kills / Math.max(1, bVal.deaths)\r\n })\r\n } else if (this.sortingData.argument === 'avg_distance') {\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return ((aVal.total_distance / aVal.kills) || 0) - ((bVal.total_distance / bVal.kills) || 0)\r\n })\r\n } else {\r\n const argument = this.sortingData.argument\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return aVal[argument] - bVal[argument]\r\n })\r\n }\r\n if (this.sortingData.direction < 0) {\r\n players.reverse()\r\n }\r\n return players\r\n }\r\n },\r\n watch: {\r\n playerHighlighted (newval) {\r\n this.scrollToPlayer(newval)\r\n },\r\n playerList () {\r\n if (this.playerHighlighted) this.scrollToPlayer(this.playerHighlighted)\r\n }\r\n },\r\n methods: {\r\n selectNextPlayer (e: KeyboardEvent) {\r\n const values = {\r\n Home: -Infinity,\r\n End: Infinity,\r\n PageDown: 100,\r\n PageUp: -100,\r\n ArrowUp: -1,\r\n ArrowDown: 1,\r\n ArrowRight: 10,\r\n ArrowLeft: -10\r\n } as { [key: string]: number }\r\n if (!this.$props.playerHighlighted) return\r\n if (!Object.keys(values).includes(e.key)) return\r\n e.preventDefault()\r\n const index = this.playerList.findIndex(e => e.id === this.$props.playerHighlighted)\r\n let nextIndex = (index + values[e.key])\r\n if (nextIndex >= this.playerList.length) nextIndex = this.playerList.length - 1\r\n if (nextIndex < 0) nextIndex = 0\r\n this.$emit('highlightPlayer', this.playerList[nextIndex].id)\r\n },\r\n updateSort (argument: string) {\r\n if (this.sortingData.argument === argument) {\r\n this.sortingData.direction *= -1\r\n } else {\r\n this.sortingData.direction = -1\r\n }\r\n this.sortingData.argument = argument as typeof this.sortingData.argument\r\n },\r\n scrollToPlayer (playerid: string) {\r\n const newElement = this.$refs['player:' + playerid] as HTMLElement[]\r\n // Some hack because of some inconsistency\r\n setTimeout(function () {\r\n if (newElement && newElement[0]) { newElement[0].scrollIntoView({ behavior: 'smooth', block: 'center' }) }\r\n }, 10)\r\n }\r\n }\r\n\r\n})\r\n","import { render } from \"./PlayerList.vue?vue&type=template&id=f1f6ee46&ts=true\"\nimport script from \"./PlayerList.vue?vue&type=script&lang=ts\"\nexport * from \"./PlayerList.vue?vue&type=script&lang=ts\"\n\nimport \"./PlayerList.vue?vue&type=style&index=0&id=f1f6ee46&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-558358e6\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"playerChart\",\n ref: \"container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_LoadingBar = _resolveComponent(\"LoadingBar\")!\n const _component_Scatter = _resolveComponent(\"Scatter\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_ctx.progress!==1)\n ? (_openBlock(), _createBlock(_component_LoadingBar, {\n key: 0,\n value: _ctx.progress\n }, null, 8, [\"value\"]))\n : _createCommentVNode(\"\", true),\n (_ctx.progress===1)\n ? (_openBlock(), _createBlock(_component_Scatter, {\n key: 1,\n data: _ctx.chart,\n options: _ctx.chartOptions\n }, null, 8, [\"data\", \"options\"]))\n : _createCommentVNode(\"\", true)\n ], 512))\n}","\r\nimport {\r\n Chart as ChartJS,\r\n LinearScale,\r\n PointElement,\r\n LineElement,\r\n Tooltip,\r\n Legend,\r\n CoreChartOptions,\r\n PluginChartOptions,\r\n ScaleChartOptions\r\n} from 'chart.js'\r\nimport annotationPlugin, { AnnotationPluginOptions } from 'chartjs-plugin-annotation'\r\nimport dataLabel from 'chartjs-plugin-datalabels'\r\nimport { useKillStore, Player, Filters } from '@/stores/kill'\r\n\r\nimport { Scatter } from 'vue-chartjs'\r\nimport { defineComponent, PropType, Ref, toRaw, triggerRef, unref } from 'vue'\r\nimport { ChartEvent } from 'chart.js/dist/core/core.plugins'\r\nimport { _DeepPartialObject } from 'chart.js/dist/types/utils'\r\n\r\nimport LoadingBar from './LoadingBar.vue'\r\n\r\nChartJS.register(LinearScale, PointElement, LineElement, Tooltip, Legend, annotationPlugin, dataLabel)\r\n\r\nexport default defineComponent({\r\n name: 'PlayerChart',\r\n props: {\r\n filters: Object as PropType,\r\n playerHighlighted: String\r\n },\r\n data: () => {\r\n return {\r\n store: useKillStore(),\r\n refreshColors: 0,\r\n playerData: []\r\n }\r\n },\r\n emits: ['highlightPlayer'],\r\n components: {\r\n Scatter, LoadingBar\r\n },\r\n mounted () {\r\n this.refreshColors++\r\n },\r\n computed: {\r\n progress () {\r\n if (this.filters) {\r\n const { player: _, ...withoutPlayer } = this.filters\r\n return this.store.getPlayerList(withoutPlayer)?.value.progress\r\n }\r\n return 0\r\n },\r\n playerList (): (Player & {id:string})[] {\r\n const data = this.store.getPlayerList(this.filters || {})?.value.data\r\n if (!data) return Object.entries(this.store.fetchPlayers(this.filters || {}).value.data).map(e => ({ id: e[0], ...toRaw(e[1].value) }))\r\n const cut = Object.entries(data).map(e => ({ id: e[0], ...toRaw(e[1].value) }))\r\n cut.sort((a, b) => {\r\n return b.kills - a.kills\r\n })\r\n return cut.slice(0, 200)\r\n },\r\n colors () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.refreshColors\r\n const colors = {} as { [key: string]: string }\r\n if (this.$refs?.container) {\r\n const style = getComputedStyle(this.$refs.container as Element)\r\n colors.fg = style.getPropertyValue('--foreground')\r\n colors.bg = style.getPropertyValue('--bg-color')\r\n colors.orange = style.getPropertyValue('--orange')\r\n colors.cyan = style.getPropertyValue('--cyan')\r\n colors.currentLine = style.getPropertyValue('--current-line')\r\n } else {\r\n colors.fg = '#ffffff'\r\n }\r\n return colors\r\n },\r\n chart () {\r\n const playerIndex = this.playerList.findIndex(e => e.id === this.$props.playerHighlighted)\r\n const defaultColor = this.colors.cyan\r\n const borderColor = new Array(this.playerList.length).fill(defaultColor)\r\n borderColor[playerIndex] = this.colors.orange\r\n const backgroundColor = borderColor\r\n const pointRadius = new Array(this.playerList.length).fill(1)\r\n pointRadius[playerIndex] = 20\r\n const hoverRadius = new Array(this.playerList.length).fill(4)\r\n hoverRadius[playerIndex] = 30\r\n const pointStyle = new Array(this.playerList.length).fill('circle')\r\n pointStyle[playerIndex] = 'crossRot'\r\n return {\r\n datasets: [\r\n {\r\n label: 'Players',\r\n labels: this.playerList.map(e => e.id) || [] as string[],\r\n borderColor,\r\n backgroundColor,\r\n pointRadius,\r\n pointStyle,\r\n hoverRadius,\r\n data: this.playerList.map((player) => ({ y: player.kills, x: player.deaths }))\r\n }\r\n ]\r\n }\r\n },\r\n chartStaticOptions () {\r\n return {\r\n responsive: true,\r\n maintainAspectRatio: false,\r\n animation: { duration: 500 },\r\n layout: { autoPadding: false },\r\n scales: {\r\n y: {\r\n title: {\r\n text: 'Kills',\r\n display: true,\r\n color: this.colors.fg\r\n },\r\n ticks: {\r\n color: this.colors.fg\r\n }\r\n },\r\n x: {\r\n title: {\r\n text: 'Deaths',\r\n display: true,\r\n color: this.colors.fg\r\n },\r\n ticks: {\r\n color: this.colors.fg\r\n }\r\n }\r\n },\r\n onClick: (e: ChartEvent, element: any) => {\r\n this.$emit('highlightPlayer', element.length > 0 ? this.playerList[element[0].index].id : undefined)\r\n if (this.store.getPlayerList(this.filters || {}) !== undefined) triggerRef(this.store.getPlayerList(this.filters || {}) as unknown as Ref)\r\n },\r\n onHover: (e: any, element: any) => {\r\n if (!e.native.target) return\r\n (e.native.target as HTMLElement).style.cursor = element[0] ? 'pointer' : 'default'\r\n }\r\n }\r\n },\r\n chartStaticPlugins () {\r\n let endX = 0\r\n let endY = 0\r\n if (this.playerList) {\r\n const maxX = Math.max(...this.playerList.map(e => e.deaths))\r\n const maxY = Math.max(...this.playerList.map(e => e.kills))\r\n if (maxY > maxX) {\r\n endX = maxX\r\n endY = (maxX / maxY) * maxY\r\n } else {\r\n endY = maxY\r\n endX = (maxY / maxX) * maxX\r\n }\r\n }\r\n return {\r\n tooltip: {\r\n callbacks: {\r\n label: (ctx: any) => {\r\n let label: string\r\n if (!this.playerList) {\r\n label = ctx.dataset.labels[ctx.dataIndex]\r\n } else {\r\n label = this.playerList[ctx.dataIndex].username\r\n }\r\n label += ' (' + ctx.parsed.y + ' kills ' + ctx.parsed.x + ' deaths)'\r\n return label\r\n }\r\n }\r\n },\r\n annotation: {\r\n annotations: {\r\n line: {\r\n type: 'line',\r\n yMin: 0,\r\n xMin: 0,\r\n yMax: endY,\r\n xMax: endX,\r\n borderWidth: 2,\r\n borderColor: this.colors.orange,\r\n borderDash: [1, 5]\r\n }\r\n }\r\n } as _DeepPartialObject,\r\n legend: { display: false }\r\n }\r\n },\r\n chartOptions (): _DeepPartialObject & PluginChartOptions<'scatter'> & ScaleChartOptions<'scatter'>> {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.$props.playerHighlighted\r\n return {\r\n ...this.chartStaticOptions,\r\n plugins: {\r\n ...this.chartStaticPlugins,\r\n datalabels: {\r\n formatter: (value: any, context: any) => {\r\n return this.playerList[context.dataIndex].username\r\n },\r\n backgroundColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? this.colors.orange : null,\r\n borderColor: this.colors.fg,\r\n borderWidth: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? 1 : 0,\r\n borderRadius: 5,\r\n display: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? 'true' : 'auto',\r\n align: -45,\r\n anchor: 'end',\r\n clamp: true,\r\n color: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? this.colors.bg : this.colors.fg\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /* methods: {\r\n refreshChart () {\r\n if (this.store.getPlayerList(this.filters || {}) !== undefined) triggerRef(this.store.getPlayerList(this.filters || {}) as unknown as Ref)\r\n }\r\n } */\r\n})\r\n","import { render } from \"./PlayerChart.vue?vue&type=template&id=558358e6&scoped=true&ts=true\"\nimport script from \"./PlayerChart.vue?vue&type=script&lang=ts\"\nexport * from \"./PlayerChart.vue?vue&type=script&lang=ts\"\n\nimport \"./PlayerChart.vue?vue&type=style&index=0&id=558358e6&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-558358e6\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-1cb3cdfe\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"weaponChart\",\n ref: \"container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_LoadingBar = _resolveComponent(\"LoadingBar\")!\n const _component_Doughnut = _resolveComponent(\"Doughnut\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n (_ctx.progress !== 1)\n ? (_openBlock(), _createBlock(_component_LoadingBar, {\n key: 0,\n value: _ctx.progress\n }, null, 8, [\"value\"]))\n : _createCommentVNode(\"\", true),\n (_ctx.progress === 1)\n ? (_openBlock(), _createBlock(_component_Doughnut, {\n key: 1,\n data: _ctx.chart,\n options: _ctx.chartOptions\n }, null, 8, [\"data\", \"options\"]))\n : _createCommentVNode(\"\", true)\n ], 512))\n}","\r\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js'\r\nimport dataLabel from 'chartjs-plugin-datalabels'\r\nimport { Weapon, Filters, useKillStore } from '@/stores/kill'\r\nimport { Doughnut } from 'vue-chartjs'\r\nimport { defineComponent, PropType, Ref } from 'vue'\r\nimport weapons from '../stores/weapons.json'\r\n\r\nimport LoadingBar from './LoadingBar.vue'\r\n\r\nChartJS.register(ArcElement, Tooltip, Legend, dataLabel)\r\n\r\nexport default defineComponent({\r\n name: 'WeaponChart',\r\n props: {\r\n filters: Object as PropType,\r\n playerHighlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n components: {\r\n Doughnut, LoadingBar\r\n },\r\n mounted () {\r\n this.refreshColors++\r\n },\r\n data: () => {\r\n return {\r\n store: useKillStore(),\r\n refreshColors: 0\r\n }\r\n },\r\n computed: {\r\n progress () {\r\n const { weapon: _, ...withoutWeapon } = this.filters || {}\r\n return this.store.getWeaponList(withoutWeapon)?.value.progress\r\n },\r\n colors () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.refreshColors\r\n const colors = {} as { [key: string]: string }\r\n if (this.$refs.container) {\r\n const style = getComputedStyle(this.$refs.container as Element)\r\n colors.fg = style.getPropertyValue('--foreground')\r\n colors.bg = style.getPropertyValue('--bg-color')\r\n colors.orange = style.getPropertyValue('--orange')\r\n colors.cyan = style.getPropertyValue('--cyan')\r\n colors.yellow = style.getPropertyValue('--yellow')\r\n colors.green = style.getPropertyValue('--green')\r\n colors.purple = style.getPropertyValue('--purple')\r\n colors.red = style.getPropertyValue('--red')\r\n colors.pink = style.getPropertyValue('--pink')\r\n colors.currentLine = style.getPropertyValue('--current-line')\r\n } else {\r\n colors.fg = '#ffffff'\r\n }\r\n return colors\r\n },\r\n chart () {\r\n const colors = [\r\n 'cyan',\r\n 'green',\r\n 'orange',\r\n 'pink',\r\n 'purple',\r\n 'red',\r\n 'yellow'\r\n ]\r\n const chartData = {\r\n datasets: [\r\n {\r\n label: 'Weapons',\r\n labels: this.sortedWeaponList || ([] as string[]),\r\n borderColor: () => this.colors.fg,\r\n backgroundColor: (context: any) => {\r\n return this.colors[\r\n colors[(context.dataIndex * 3) % colors.length]\r\n ]\r\n },\r\n data: [] as number[]\r\n }\r\n ]\r\n }\r\n if (!this.sortedWeaponList) {\r\n return chartData\r\n }\r\n chartData.datasets[0].data = this.sortedWeaponList.map((e) => {\r\n if (!this.weapons) {\r\n return 0\r\n }\r\n return this.weapons[e].value.kills\r\n })\r\n return chartData\r\n },\r\n chartOptions () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.$props.playerHighlighted\r\n const options = {\r\n responsive: true,\r\n maintainAspectRatio: true,\r\n animation: { duration: 500 },\r\n layout: { autoPadding: false },\r\n plugins: {\r\n datalabels: {\r\n formatter: (value: any, context: any) => {\r\n const weaponId = this.sortedWeaponList[context.dataIndex]\r\n // if (!(weapons as {[key:string]:string})[weaponId]) console.log(weaponId)\r\n return (weapons as {[key:string]:string})[weaponId] || weaponId\r\n },\r\n backgroundColor: (context: any) => {\r\n return context.dataset.backgroundColor(context)\r\n },\r\n borderColor: this.colors.fg,\r\n borderRadius: 25,\r\n borderWidth: 2,\r\n color: this.colors.bg,\r\n display: (context: any) => {\r\n return context.dataIndex === context.dataset.labels.length - 1\r\n ? true\r\n : 'auto'\r\n },\r\n padding: 6\r\n },\r\n tooltip: {\r\n callbacks: {\r\n label: (ctx: any) => {\r\n let label: string\r\n if (!this.sortedWeaponList) {\r\n label = ctx.dataset.labels[ctx.dataIndex]\r\n } else {\r\n label = this.sortedWeaponList[ctx.dataIndex]\r\n }\r\n label += ' (' + this.weapons[label].value.kills + ' kills)'\r\n return label\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return options\r\n },\r\n weapons (): { [key: string]: Ref } {\r\n const { weapon: _, ...withoutWeapon } = this.filters || {}\r\n const data = this.store.getWeaponList(withoutWeapon)?.value.data\r\n if (!data) return this.store.fetchWeapons(withoutWeapon).value.data\r\n return data\r\n },\r\n sortedWeaponList (): string[] {\r\n if (!this.weapons) return []\r\n const weapons = Object.keys(this.weapons).filter(e => this.weapons[e].value.kills > 0)\r\n weapons.sort((a, b) => {\r\n if (Number(this.weapons[a].value.kills) < Number(this.weapons[b].value.kills)) {\r\n return -1\r\n }\r\n if (Number(this.weapons[a].value.kills) > Number(this.weapons[b].value.kills)) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n return weapons\r\n }\r\n }\r\n})\r\n","import { render } from \"./WeaponChart.vue?vue&type=template&id=1cb3cdfe&scoped=true&ts=true\"\nimport script from \"./WeaponChart.vue?vue&type=script&lang=ts\"\nexport * from \"./WeaponChart.vue?vue&type=script&lang=ts\"\n\nimport \"./WeaponChart.vue?vue&type=style&index=0&id=1cb3cdfe&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1cb3cdfe\"]])\n\nexport default __exports__","\r\nimport { Player, Weapon, Server, useKillStore, Filters } from '@/stores/kill'\r\nimport PlayerList from '@/components/PlayerList.vue'\r\nimport PlayerChart from '@/components/PlayerChart.vue'\r\nimport WeaponChart from '@/components/WeaponChart.vue'\r\nimport { Ref, defineComponent, unref } from 'vue'\r\nimport VueMultiselect from 'vue-multiselect'\r\nimport 'vue-multiselect/dist/vue-multiselect.css'\r\nimport weapons from '../stores/weapons.json'\r\nimport router from '@/router'\r\n\r\nexport default defineComponent({\r\n name: 'PlayerView',\r\n components: {\r\n VueMultiselect,\r\n PlayerList,\r\n PlayerChart,\r\n WeaponChart\r\n },\r\n\r\n data () {\r\n return {\r\n model: { server: undefined, weapon: undefined } as unknown as {\r\n weapon: string | undefined;\r\n server: string | undefined;\r\n },\r\n filters: {} as Filters,\r\n store: useKillStore(),\r\n playerHighlighted: undefined as (Player & { id: string }) | undefined,\r\n weaponLocale: weapons as { [key: string]: string }\r\n }\r\n },\r\n beforeCreate () {\r\n let server\r\n if (this.$route.query.server) server = this.$route.query.server?.toString()\r\n this.model = {\r\n server,\r\n weapon: this.$route.query.weapon?.toString()\r\n }\r\n },\r\n computed: {\r\n servers (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { server: _, player: _1, ...withoutServer } = this.filters\r\n const data = this.store.getServerList(withoutServer)?.value.data\r\n if (!data) return unref(this.store.fetchServers(withoutServer)).data\r\n return data\r\n },\r\n groupedServers () {\r\n const hosts = [] as {\r\n id: number;\r\n servers: (Server & { name?: string })[];\r\n }[]\r\n Object.entries(this.servers).forEach((e) => {\r\n const server = unref(e[1])\r\n if (!hosts.find((host) => host.id === server.host)) { hosts.push({ id: server.host, servers: [] as Server[] }) }\r\n hosts\r\n .find((host) => host.id === server.host)\r\n ?.servers.push({ name: e[0], ...server })\r\n })\r\n return hosts\r\n },\r\n weapons (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { weapon: _, player: _1, ...withoutWeapons } = this.filters\r\n const data = this.store.getWeaponList(withoutWeapons)?.value.data\r\n if (!data) return this.store.fetchWeapons(withoutWeapons).value.data\r\n return data\r\n },\r\n players (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayers } = this.filters\r\n const data = this.store.getPlayerList(withoutPlayers)?.value.data\r\n if (!data) return this.store.fetchPlayers(withoutPlayers).value.data\r\n return data\r\n },\r\n sortedWeaponList (): string[] {\r\n if (!this.weapons) return []\r\n const weapons = Object.keys(this.weapons)\r\n return weapons.sort()\r\n },\r\n sortedServerList (): string[] {\r\n if (!this.servers) return []\r\n const servers = Object.keys(this.servers)\r\n return servers.sort()\r\n },\r\n sortedPlayerList (): Player[] {\r\n if (!this.players) return []\r\n const players = Object.entries(this.players).map((e) => ({\r\n id: e[0],\r\n ...e[1]._rawValue\r\n }))\r\n return players.sort((a, b) => {\r\n if (a.username < b.username) {\r\n return -1\r\n }\r\n if (a.username > b.username) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n }\r\n },\r\n watch: {\r\n players () {\r\n const player = this.$route.query.player?.toString()\r\n if (player && this.playerHighlighted?.id !== player) {\r\n this.highlight_player(player)\r\n }\r\n },\r\n model: {\r\n handler (newModel) {\r\n this.filters.server = newModel.server\r\n this.filters.weapon = newModel.weapon\r\n },\r\n deep: true\r\n },\r\n filters: {\r\n handler (newValue) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { server: _, weapon: _2, ...withoutFilters } = this.$route.query\r\n router.push({ query: { ...newValue, ...withoutFilters } })// .then(e => { console.log(e) })\r\n },\r\n deep: true\r\n },\r\n playerHighlighted (newValue, oldValue) {\r\n if (newValue?.id === oldValue?.id) return\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayer } = this.$route.query\r\n router.push({ query: { player: newValue?.id, ...withoutPlayer } })// .then(e => { console.log(e) })\r\n },\r\n $route: {\r\n handler: function () {\r\n this.applyRouteFilters()\r\n },\r\n immediate: true\r\n }\r\n },\r\n methods: {\r\n highlight_player (playerid: string) {\r\n const player = this.players[playerid]\r\n if (player) {\r\n this.playerHighlighted = { id: playerid, ...unref(player) }\r\n return\r\n }\r\n this.playerHighlighted = undefined\r\n },\r\n applyRouteFilters () {\r\n if (this.playerHighlighted?.id !== this.$route.query.player) {\r\n const playerId = this.$route.query.player?.toString()\r\n if (playerId) {\r\n this.highlight_player(playerId)\r\n }\r\n }\r\n if (this.filters.weapon !== this.$route.query.weapon) {\r\n this.model.weapon = this.$route.query.weapon?.toString()\r\n }\r\n if (this.filters.server !== this.$route.query.server) {\r\n if (this.$route.query.server) this.model.server = this.$route.query.server?.toString()\r\n else this.model.server = undefined\r\n }\r\n }\r\n }\r\n})\r\n","import { render } from \"./PlayerView.vue?vue&type=template&id=24065b86&scoped=true&ts=true\"\nimport script from \"./PlayerView.vue?vue&type=script&lang=ts\"\nexport * from \"./PlayerView.vue?vue&type=script&lang=ts\"\n\nimport \"./PlayerView.vue?vue&type=style&index=0&id=24065b86&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-24065b86\"]])\n\nexport default __exports__","import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'\r\nimport ServerView from '../views/ServerView.vue'\r\nimport PlayerView from '../views/PlayerView.vue'\r\n\r\nconst routes: Array = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: PlayerView\r\n },\r\n {\r\n path: '/servers',\r\n name: 'servers',\r\n component: ServerView\r\n }\r\n // {\r\n // path: '/players',\r\n // name: 'players',\r\n // component: PlayerView\r\n // },\r\n // {\r\n // path: '/about',\r\n // name: 'about',\r\n // // route level code-splitting\r\n // // this generates a separate chunk (about.[hash].js) for this route\r\n // // which is lazy-loaded when the route is visited.\r\n // component: () => import(/* webpackChunkName: \"about\" */ '../views/AboutView.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","/* eslint-disable camelcase */\r\nimport { createApp, ref, unref } from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport { createPinia } from 'pinia'\r\nimport { useKillStore } from './stores/kill'\r\n\r\nconst pinia = createPinia()\r\n\r\ncreateApp(App).use(pinia).use(router).mount('#app')\r\n\r\nconst dummyData = {\r\n attacker_id: '1008704914497',\r\n attacker_name: 'DarkwinV1',\r\n cause_of_death: 'mp_weapon_car',\r\n victim_id: '1008553404453',\r\n victim_name: 'GURENTITANIUM',\r\n attacker_current_weapon: 'mp_weapon_car',\r\n victim_current_weapon: 'mp_weapon_sniper',\r\n distance: 300,\r\n game_mode: 'ps',\r\n servername: \"fvnkhead's 3v3\",\r\n map: 'lf_meadow',\r\n host: 1\r\n}\r\n\r\n// setInterval(() => registerWebSocketKill(dummyData), 100)\r\n\r\ntype websocketData = {\r\n attacker_id: string,\r\n attacker_name: string,\r\n cause_of_death: string,\r\n victim_id: string,\r\n victim_name: string,\r\n attacker_current_weapon: string,\r\n victim_current_weapon: string,\r\n distance: number,\r\n game_mode: string,\r\n servername: string,\r\n map: string,\r\n host: number\r\n}\r\n\r\n// dev stuff\r\n\r\nconst store = useKillStore()\r\nconst socket = new WebSocket('wss://tone.sleepycat.date/v2/client/websocket')\r\nsocket.onmessage = function (e) {\r\n if (e.data === 'ping') return socket.send('pong')\r\n const data = JSON.parse(e.data)\r\n registerWebSocketKill(data)\r\n}\r\n\r\nfunction registerWebSocketKill (data : websocketData) {\r\n store.$state.players.filter((e) => {\r\n return (\r\n (!e.value.filter.server ||\r\n e.value.filter.server === data.servername) &&\r\n (!e.value.filter.weapon ||\r\n e.value.filter.weapon === data.cause_of_death)\r\n // Handle other types of filters once those are implemented\r\n )\r\n }).forEach(e => {\r\n if (!e.value.data[data.attacker_id]) {\r\n e.value.data[data.attacker_id] = ref({\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: data.attacker_name\r\n })\r\n }\r\n if (!e.value.data[data.victim_id]) {\r\n e.value.data[data.victim_id] = ref({\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: data.victim_name\r\n })\r\n }\r\n // handle deaths with equipped, eventually\r\n /*\r\n if(e.value.filter.weapon){\r\n !e.value.data[data.victim_id] = e.value.data[data.victim_id] = {\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: data.victim_name,\r\n }\r\n } */\r\n\r\n unref(e.value.data[data.victim_id]).deaths++\r\n unref(e.value.data[data.victim_id]).username = data.victim_name\r\n unref(e.value.data[data.attacker_id]).username = data.attacker_name\r\n if (data.attacker_id !== data.victim_id) {\r\n unref(e.value.data[data.attacker_id]).kills++\r\n unref(e.value.data[data.attacker_id]).total_distance += data.distance\r\n unref(e.value.data[data.attacker_id]).max_distance = Math.max(data.distance, unref(e.value.data[data.attacker_id]).max_distance)\r\n }\r\n })\r\n store.$state.weapons.filter((e) => {\r\n return (\r\n (!e.value.filter.server ||\r\n e.value.filter.server === data.servername) &&\r\n (!e.value.filter.player || e.value.filter.player === data.attacker_id)\r\n // Handle other types of filters once those are implemented\r\n )\r\n }).forEach(e => {\r\n if (!e.value.data[data.cause_of_death]) {\r\n e.value.data[data.cause_of_death] = ref({\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n deaths_while_equipped: 0\r\n })\r\n }\r\n // handle deaths with equipped, eventually\r\n /*\r\n if(e.value.filter.weapon){\r\n !e.value.data[data.victim_id] = e.value.data[data.victim_id] = {\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: data.victim_name,\r\n }\r\n } */\r\n\r\n if (data.attacker_id !== data.victim_id) {\r\n unref(e.value.data[data.cause_of_death]).kills++\r\n unref(e.value.data[data.cause_of_death]).total_distance += data.distance\r\n unref(e.value.data[data.cause_of_death]).max_distance = Math.max(data.distance, unref(e.value.data[data.cause_of_death]).max_distance)\r\n }\r\n unref(e.value.data[data.cause_of_death]).deaths++\r\n })\r\n store.$state.servers.filter((e) => {\r\n return (\r\n (!e.value.filter.server ||\r\n e.value.filter.server === data.servername)\r\n // Handle other types of filters once those are implemented\r\n )\r\n }).forEach((e) => {\r\n if (!e.value.data[data.servername]) {\r\n e.value.data[data.servername] = ref({\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n deaths_while_equipped: 0,\r\n host: data.host\r\n })\r\n }\r\n\r\n if (data.attacker_id !== data.victim_id) {\r\n unref(e.value.data[data.servername]).kills++\r\n unref(e.value.data[data.servername]).total_distance += data.distance\r\n unref(e.value.data[data.servername]).max_distance = Math.max(data.distance, unref(e.value.data[data.servername]).max_distance)\r\n }\r\n unref(e.value.data[data.servername]).deaths++\r\n })\r\n}\r\n"],"names":["_hoisted_1","class","_hoisted_2","href","target","_hoisted_3","_hoisted_4","_createElementVNode","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_link","_resolveComponent","_component_router_view","_openBlock","_createElementBlock","_Fragment","src","publicPath","_createVNode","to","default","_withCtx","_createTextVNode","_","defineComponent","data","process","__exports__","_withScopeId","n","_pushScopeId","_popScopeId","id","_hoisted_5","_hoisted_6","key","_component_VirtualList","list","serverList","slotProps","_normalizeClass","nsServersByName","name","playerCount","index","_toDisplayString","map","_createCommentVNode","maxPlayers","_value","deaths","max_distance","Math","round","total_distance","kills","removeNullEntries","a","Object","fromEntries","entries","filter","e","undefined","objectEqual","b","assert","deepStrictEqual","fetchWithLoading","url","progress","fetch","then","response","ok","Error","status","statusText","body","contentEncoding","headers","get","contentLength","total","parseInt","loaded","Response","ReadableStream","start","controller","reader","getReader","read","done","value","close","byteLength","enqueue","catch","error","console","serverInterval","useKillStore","defineStore","state","servers","players","weapons","maps","gamemodes","hosts","nsServers","getters","getPlayerList","filters","find","unref","getWeaponList","getServerList","getNSServers","actions","fetchPlayers","entry","this","shallowRef","push","URLSearchParams","triggerRef","async","json","ref","fetchWeapons","fetchServers","fetchNSServers","clearInterval","setInterval","onScroll","args","scroll","style","_normalizeStyle","interval","rowHeight","max","length","_renderList","visibleList","_renderSlot","$slots","toLoad","vlistHeight","vIndex","props","type","Array","Number","highlighted","String","mounted","$refs","vlist","getBoundingClientRect","height","visibleCount","setTimeout","scrollBy","top","findIndex","scrollTop","behavior","computed","min","slice","ceil","watch","newVal","methods","scrollIndex","floor","mustScrollUp","mustScrollDown","components","VirtualList","store","sort","server1","server2","_hoisted_7","_hoisted_8","_component_VueMultiselect","_component_PlayerList","_component_PlayerChart","_component_WeaponChart","selectLabel","deselectLabel","placeholder","modelValue","model","server","$event","options","sortedServerList","onClick","disabled","weapon","weaponLocale","sortedWeaponList","playerHighlighted","sortedPlayerList","username","onHighlightPlayer","highlight_player","player","_component_LoadingBar","onKeydown","selectNextPlayer","tabindex","updateSort","sortingData","argument","_createBlock","playerList","$emit","LoadingBar","emits","direction","withoutPlayer","Proxy","collator","Intl","Collator","numeric","sensitivity","aVal","_rawValue","bVal","compare","reverse","newval","scrollToPlayer","values","Home","Infinity","End","PageDown","PageUp","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","keys","includes","preventDefault","nextIndex","playerid","newElement","scrollIntoView","block","_component_Scatter","chart","chartOptions","ChartJS","LinearScale","PointElement","LineElement","Tooltip","Legend","annotationPlugin","dataLabel","refreshColors","playerData","Scatter","toRaw","cut","colors","container","getComputedStyle","fg","getPropertyValue","bg","orange","cyan","currentLine","playerIndex","defaultColor","borderColor","fill","backgroundColor","pointRadius","hoverRadius","pointStyle","datasets","label","labels","y","x","chartStaticOptions","responsive","maintainAspectRatio","animation","duration","layout","autoPadding","scales","title","text","display","color","ticks","element","onHover","native","cursor","chartStaticPlugins","endX","endY","maxX","maxY","tooltip","callbacks","ctx","dataIndex","dataset","parsed","annotation","annotations","line","yMin","xMin","yMax","xMax","borderWidth","borderDash","legend","plugins","datalabels","formatter","context","borderRadius","align","anchor","clamp","_component_Doughnut","ArcElement","Doughnut","withoutWeapon","yellow","green","purple","red","pink","chartData","weaponId","padding","VueMultiselect","PlayerList","PlayerChart","WeaponChart","beforeCreate","$route","query","toString","_1","withoutServer","groupedServers","forEach","host","withoutWeapons","withoutPlayers","handler","newModel","deep","newValue","_2","withoutFilters","router","oldValue","applyRouteFilters","immediate","playerId","routes","path","component","PlayerView","ServerView","createRouter","history","createWebHistory","pinia","createPinia","createApp","App","use","mount","socket","WebSocket","registerWebSocketKill","$state","servername","cause_of_death","attacker_id","attacker_name","victim_id","victim_name","distance","deaths_while_equipped","onmessage","send","JSON","parse"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/js/chunk-common.9a692b01.js b/dist/js/chunk-common.9a692b01.js
deleted file mode 100644
index d3dbc13..0000000
--- a/dist/js/chunk-common.9a692b01.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";(self["webpackChunktoneapi_webclient"]=self["webpackChunktoneapi_webclient"]||[]).push([[64],{5518:function(e,t,a){var r=a(3862),s=a(4870),i=a(3396);const l={class:"navbar-logo"},n={href:"https://github.com/ToneAPI",target:"_blank"},o=["src"],d=(0,i._)("div",{class:"spacer"},null,-1);function h(e,t,a,r,s,h){const p=(0,i.up)("router-link"),u=(0,i.up)("router-view");return(0,i.wg)(),(0,i.iD)(i.HY,null,[(0,i._)("header",null,[(0,i._)("nav",null,[(0,i._)("div",l,[(0,i._)("a",n,[(0,i._)("img",{src:`${e.publicPath}tone_icon.png`},null,8,o)])]),d,(0,i.Wm)(p,{to:"/servers",class:"navbar-element"},{default:(0,i.w5)((()=>[(0,i.Uk)("Servers (Beta)")])),_:1}),(0,i.Wm)(p,{to:"/",class:"navbar-element"},{default:(0,i.w5)((()=>[(0,i.Uk)("Players")])),_:1})])]),(0,i.Wm)(u)],64)}var p=(0,i.aZ)({data(){return{publicPath:"/ToneAPI_webclient/"}}}),u=a(89);const c=(0,u.Z)(p,[["render",h]]);var m=c,_=a(2483),g=a(7139);const v=e=>((0,i.dD)("data-v-12531736"),e=e(),(0,i.Cn)(),e),y=v((()=>(0,i._)("div",{id:"filters"},null,-1))),f={class:"serverView"},w={class:"serverList"},b=v((()=>(0,i._)("div",{class:"serverHeaders"},[(0,i._)("span"),(0,i._)("span",null,"Map"),(0,i._)("span",null,"Server name"),(0,i._)("span",null,"Players"),(0,i._)("span",null,"Kills"),(0,i._)("span",null,"Max distance"),(0,i._)("span",null,"Average distance")],-1))),S=["src"],k={key:1};function L(e,t,a,r,s,l){const n=(0,i.up)("VirtualList");return(0,i.wg)(),(0,i.iD)(i.HY,null,[y,(0,i._)("div",f,[(0,i._)("div",w,[b,(0,i.Wm)(n,{list:e.serverList,"row-height":100},{default:(0,i.w5)((t=>[(0,i._)("div",{class:(0,g.C_)("serverRow "+(e.nsServersByName[t.data.name]?"":"offline ")+(e.nsServersByName[t.data.name]?.playerCount?"":"inactive ")+((t.index+1)%2?"odd ":"uneven "))},[(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(t.index+1),1)]),e.nsServersByName[t.data.name]?((0,i.wg)(),(0,i.iD)("img",{key:0,src:`${e.publicPath}maps/${e.nsServersByName[t.data.name].map}_lobby.png`},null,8,S)):(0,i.kq)("",!0),e.nsServersByName[t.data.name]?(0,i.kq)("",!0):((0,i.wg)(),(0,i.iD)("div",k)),(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(t.data.name+(e.nsServersByName[t.data.name]?"":" (offline)")),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(e.nsServersByName[t.data.name]?e.nsServersByName[t.data.name]?.playerCount+"/"+e.nsServersByName[t.data.name]?.maxPlayers:""),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(t.data._value.deaths),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(t.data._value.max_distance),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(Math.round(100*(t.data._value.total_distance/t.data._value.kills||0))/100),1)])],2)])),_:1},8,["list"])])])],64)}a(7658);var x=a(1020),P=a(5130);function H(e){return Object.fromEntries(Object.entries(e).filter((e=>void 0!==e[1]&&null!==e[1])))}function C(e,t){try{return e=H(e),t=H(t),P.deepStrictEqual(e,t),!0}catch{return!1}}let $;const V=(0,x.Q_)("kill",{state:()=>({servers:[],players:[],weapons:[],maps:[],gamemodes:[],hosts:{},nsServers:void 0}),getters:{getPlayerList:e=>t=>e.players.find((e=>C((0,s.SU)(e).filter,t))),getWeaponList:e=>t=>e.weapons.find((e=>C((0,s.SU)(e).filter,t))),getServerList:e=>t=>e.servers.find((e=>C((0,s.SU)(e).filter,t))),getNSServers:e=>e.nsServers},actions:{fetchPlayers(e){e=H(e);let t=this.players.find((t=>C((0,s.SU)(t).filter,e)));return void 0===t&&(t=(0,s.XI)({filter:e,data:{}}),this.players.push(t)),fetch("https://tone.sleepycat.date/v2/client/players?"+new URLSearchParams(e)).then((async e=>{(0,s.SU)(t).data=Object.fromEntries(Object.entries(await e.json()).map((e=>[e[0],(0,s.iH)(e[1])]))),(0,s.oR)(t)})),t},fetchWeapons(e){e=H(e);let t=this.weapons.find((t=>C((0,s.SU)(t).filter,e)));return t||(t=(0,s.XI)({filter:e,data:{}}),this.weapons.push(t)),fetch("https://tone.sleepycat.date/v2/client/weapons?"+new URLSearchParams(e)).then((async e=>{(0,s.SU)(t).data=Object.fromEntries(Object.entries(await e.json()).map((e=>[e[0],(0,s.iH)(e[1])]))),(0,s.oR)(t)})),t},fetchServers(e){e=H(e);let t=this.servers.find((t=>C((0,s.SU)(t).filter,e)));return t||(t=(0,s.XI)({filter:e,data:{}}),this.servers.push(t)),fetch("https://tone.sleepycat.date/v2/client/servers?"+new URLSearchParams(e)).then((async e=>{(0,s.SU)(t).data=Object.fromEntries(Object.entries(await e.json()).map((e=>[e[0],(0,s.iH)(e[1])]))),(0,s.oR)(t)})),t},fetchNSServers(){return fetch("https://northstar.tf/client/servers").then((async e=>{this.nsServers=await e.json()})),clearInterval($),$=setInterval((()=>this.fetchNSServers()),6e4),this.nsServers||[]}}}),W={ref:"vscroll",class:"vscroll"};function D(e,t,a,r,s,l){return(0,i.wg)(),(0,i.iD)("div",{ref:"vlist",class:"vlist",onScroll:t[0]||(t[0]=(...t)=>e.scroll&&e.scroll(...t))},[(0,i._)("div",W,[(0,i._)("div",{style:(0,g.j5)(`padding: ${e.interval[0]*e.$props.rowHeight}px 0px ${Math.max(0,e.list.length*e.$props.rowHeight-e.interval[1]*e.$props.rowHeight)}px;`)},[((0,i.wg)(!0),(0,i.iD)(i.HY,null,(0,i.Ko)(e.visibleList,((t,a)=>(0,i.WI)(e.$slots,"default",{data:t,index:a+e.interval[0]},void 0,!0))),256))],4)],512)],544)}var I=(0,i.aZ)({data(){return{toLoad:10,vlistHeight:10,vIndex:0}},props:{list:{type:Array,default:()=>[]},rowHeight:{type:Number,default:()=>32},highlighted:String},mounted(){this.$props.list&&(this.vlistHeight=this.$refs.vlist?.getBoundingClientRect().height||0,this.toLoad=3*this.visibleCount,this.$props.highlighted&&setTimeout((()=>this.$refs.vlist?.scrollBy({top:this.list.findIndex((e=>e.id===this.$props.highlighted))*this.rowHeight-this.$refs.vlist?.scrollTop-(this.vlistHeight/2-this.$props.rowHeight),behavior:"smooth"})),1))},computed:{interval(){return[Math.min(this.list.length-this.toLoad,this.vIndex),Math.min(this.vIndex+this.toLoad,this.list.length)]},visibleList(){return this.list.slice(this.interval[0],this.interval[1])},visibleCount(){return Math.ceil(this.vlistHeight/this.$props.rowHeight)}},watch:{list(){this.vlistHeight=this.$refs.vlist?.getBoundingClientRect().height||0},highlighted(e){e&&setTimeout((()=>this.$refs.vlist?.scrollBy({top:this.list.findIndex((t=>t.id===e))*this.rowHeight-this.$refs.vlist?.scrollTop-(this.vlistHeight/2-this.$props.rowHeight),behavior:"smooth"})),1)}},methods:{scroll(e){const t=e.target?.scrollTop,a=Math.floor(t/this.$props.rowHeight),r=athis.vIndex+this.visibleCount;if(r?this.vIndex=Math.max(a-this.visibleCount,0):s&&(this.vIndex=Math.min(a,this.list.length-this.toLoad)),s||r){}}}});const U=(0,u.Z)(I,[["render",D],["__scopeId","data-v-4b7b1630"]]);var M=U,O=(0,i.aZ)({name:"ServerView",components:{VirtualList:M},data(){return{store:V(),publicPath:"/ToneAPI_webclient/"}},computed:{servers(){const e=this.store.getServerList({})?.value.data;return e||(0,s.SU)(this.store.fetchServers({})).data},serverList(){const e=Object.entries(this.servers).map((e=>({...e[1],name:e[0]})));return e.sort(((e,t)=>{const a=this.nsServersByName[e.name]?this.nsServersByName[e.name].playerCount?1:0:-1,r=this.nsServersByName[t.name]?this.nsServersByName[t.name].playerCount?1:0:-1;return r-a})),e},nsServers(){const e=this.store.getNSServers;return e||this.store.fetchNSServers()},nsServersByName(){return Object.fromEntries(this.nsServers.map((e=>[e.name,e])))}}});const R=(0,u.Z)(O,[["render",L],["__scopeId","data-v-12531736"]]);var N=R;const j={id:"filters"},A={class:"multiselect-wrapper"},B=["disabled"],q={class:"multiselect-wrapper"},E=["disabled"],T={class:"multiselect-wrapper"},Z=["disabled"],z={id:"playerView"};function F(e,t,a,r,s,l){const n=(0,i.up)("VueMultiselect"),o=(0,i.up)("PlayerList"),d=(0,i.up)("PlayerChart"),h=(0,i.up)("WeaponChart");return(0,i.wg)(),(0,i.iD)(i.HY,null,[(0,i._)("div",j,[(0,i._)("span",A,[(0,i.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Select server",modelValue:e.model.server,"onUpdate:modelValue":t[0]||(t[0]=t=>e.model.server=t),options:e.sortedServerList,"allow-empty":!0},null,8,["modelValue","options"]),(0,i._)("button",{onClick:t[1]||(t[1]=t=>e.model.server=void 0),disabled:!e.model.server},"X",8,B)]),(0,i._)("span",q,[(0,i.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Select weapon",modelValue:e.model.weapon,"onUpdate:modelValue":t[2]||(t[2]=t=>e.model.weapon=t),"custom-label":t=>e.weaponLocale[t]||t,options:e.sortedWeaponList,"allow-empty":!0},null,8,["modelValue","custom-label","options"]),(0,i._)("button",{onClick:t[3]||(t[3]=t=>e.model.weapon=void 0),disabled:!e.model.weapon},"X",8,E)]),(0,i._)("span",T,[(0,i.Wm)(n,{"options-limit":20,selectLabel:"",deselectLabel:"remove",placeholder:"Search player",modelValue:e.playerHighlighted,"onUpdate:modelValue":t[4]||(t[4]=t=>e.playerHighlighted=t),options:e.sortedPlayerList,"allow-empty":!0,"custom-label":e=>e?.username},null,8,["modelValue","options","custom-label"]),(0,i._)("button",{onClick:t[5]||(t[5]=t=>e.playerHighlighted=void 0),disabled:!e.playerHighlighted},"X",8,Z)])]),(0,i._)("div",z,[(0,i.Wm)(o,{filters:e.filters,onHighlightPlayer:e.highlight_player,playerHighlighted:e.playerHighlighted?.id},null,8,["filters","onHighlightPlayer","playerHighlighted"]),(0,i.Wm)(d,{filters:e.filters,onHighlightPlayer:e.highlight_player,playerHighlighted:e.playerHighlighted?.id},null,8,["filters","onHighlightPlayer","playerHighlighted"]),(0,i.Wm)(h,{filters:{player:e.playerHighlighted?.id,...e.filters},playerHighlighted:e.playerHighlighted?.id},null,8,["filters","playerHighlighted"])])],64)}const K={class:"playerHeaders"},X=(0,i._)("span",null,null,-1),G=["onClick"];function Y(e,t,a,r,s,l){const n=(0,i.up)("VirtualList");return(0,i.wg)(),(0,i.iD)("div",{class:"playerTable",onKeydown:t[6]||(t[6]=(...t)=>e.selectNextPlayer&&e.selectNextPlayer(...t)),tabindex:"0"},[(0,i._)("div",K,[X,(0,i._)("span",{onClick:t[0]||(t[0]=t=>e.updateSort("username")),class:(0,g.C_)("username"==e.sortingData.argument?"selected":"")},"Username",2),(0,i._)("span",{onClick:t[1]||(t[1]=t=>e.updateSort("kills")),class:(0,g.C_)("kills"==e.sortingData.argument?"selected":"")},"K",2),(0,i._)("span",{onClick:t[2]||(t[2]=t=>e.updateSort("deaths")),class:(0,g.C_)("deaths"==e.sortingData.argument?"selected":"")},"D",2),(0,i._)("span",{onClick:t[3]||(t[3]=t=>e.updateSort("k/d")),class:(0,g.C_)("k/d"==e.sortingData.argument?"selected":"")},"K/D",2),(0,i._)("span",{onClick:t[4]||(t[4]=t=>e.updateSort("max_distance")),class:(0,g.C_)("max_distance"==e.sortingData.argument?"selected":"")},"Max distance",2),(0,i._)("span",{onClick:t[5]||(t[5]=t=>e.updateSort("avg_distance")),class:(0,g.C_)("avg_distance"==e.sortingData.argument?"selected":"")},"Average distance",2)]),(0,i.Wm)(n,{list:e.playerList,"row-height":32,highlighted:e.playerHighlighted},{default:(0,i.w5)((t=>[(0,i._)("div",{class:(0,g.C_)("playerRow "+(t.data.id===e.playerHighlighted?"selected ":"")+((t.index+1)%2?"odd ":"uneven ")),onClick:a=>e.$emit("highlightPlayer",t.data.id)},[(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(t.index+1),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(t.data.value.username),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(t.data.value.kills),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(t.data.value.deaths),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(Math.round(t.data.value.kills/Math.max(1,t.data.value.deaths)*100)/100),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(t.data.value.max_distance),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,g.zw)(Math.round(100*(t.data.value.total_distance/t.data.value.kills||0))/100),1)])],10,G)])),_:1},8,["list","highlighted"])],32)}var J=(0,i.aZ)({components:{VirtualList:M},props:{filters:{type:Object,default:()=>({})},playerHighlighted:String},emits:["highlightPlayer"],data(){return{sortingData:{direction:-1,argument:"kills"},store:V()}},computed:{players(){const{player:e,...t}=this.filters,a=this.store.getPlayerList(t)?.value.data;return a||this.store.fetchPlayers(t).value.data},playerList(){if(!this.players)return[];const e=Object.entries(this.players).map((e=>{const t={},a=new Proxy(e[1],t);return a.id=e[0],a}));new Date;if("username"===this.sortingData.argument){const t=new Intl.Collator("en",{numeric:!0,sensitivity:"base"});e.sort(((e,a)=>{const r=e._rawValue,s=a._rawValue;return t.compare(r.username,s.username)}))}else if("k/d"===this.sortingData.argument)e.sort(((e,t)=>{const a=e._rawValue,r=t._rawValue;return a.kills/Math.max(1,a.deaths)-r.kills/Math.max(1,r.deaths)}));else if("avg_distance"===this.sortingData.argument)e.sort(((e,t)=>{const a=e._rawValue,r=t._rawValue;return(a.total_distance/a.kills||0)-(r.total_distance/r.kills||0)}));else{const t=this.sortingData.argument;e.sort(((e,a)=>{const r=e._rawValue,s=a._rawValue;return r[t]-s[t]}))}return this.sortingData.direction<0&&e.reverse(),e}},watch:{playerHighlighted(e){this.scrollToPlayer(e)},playerList(){this.playerHighlighted&&this.scrollToPlayer(this.playerHighlighted)}},methods:{selectNextPlayer(e){const t={Home:-1/0,End:1/0,PageDown:100,PageUp:-100,ArrowUp:-1,ArrowDown:1,ArrowRight:10,ArrowLeft:-10};if(!this.$props.playerHighlighted)return;if(!Object.keys(t).includes(e.key))return;e.preventDefault();const a=this.playerList.findIndex((e=>e.id===this.$props.playerHighlighted));let r=a+t[e.key];r>=this.playerList.length&&(r=this.playerList.length-1),r<0&&(r=0),this.$emit("highlightPlayer",this.playerList[r].id)},updateSort(e){this.sortingData.argument===e?this.sortingData.direction*=-1:this.sortingData.direction=-1,this.sortingData.argument=e},scrollToPlayer(e){const t=this.$refs["player:"+e];setTimeout((function(){t&&t[0]&&t[0].scrollIntoView({behavior:"smooth",block:"center"})}),10)}}});const Q=(0,u.Z)(J,[["render",Y]]);var ee=Q;const te={class:"playerChart",ref:"container"};function ae(e,t,a,r,s,l){const n=(0,i.up)("Scatter");return(0,i.wg)(),(0,i.iD)("div",te,[(0,i.Wm)(n,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}var re=a(3254),se=a(9152),ie=a(1131),le=a(5866);re.kL.register(re.f$,re.od,re.jn,re.u,re.De,se.Z,ie.Z);var ne=(0,i.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},data:()=>({store:V(),refreshColors:0,playerData:[]}),emits:["highlightPlayer"],components:{Scatter:le.bp},mounted(){this.refreshColors++},computed:{playerList(){const e=this.store.getPlayerList(this.filters||{})?.value.data;if(!e)return Object.entries(this.store.fetchPlayers(this.filters||{}).value.data).map((e=>({id:e[0],...(0,s.IU)(e[1].value)})));const t=Object.entries(e).map((e=>({id:e[0],...(0,s.IU)(e[1].value)})));return t.sort(((e,t)=>t.kills-e.kills)),t.slice(0,200)},colors(){this.refreshColors;const e={};if(this.$refs?.container){const t=getComputedStyle(this.$refs.container);e.fg=t.getPropertyValue("--foreground"),e.bg=t.getPropertyValue("--bg-color"),e.orange=t.getPropertyValue("--orange"),e.cyan=t.getPropertyValue("--cyan"),e.currentLine=t.getPropertyValue("--current-line")}else e.fg="#ffffff";return e},chart(){const e=this.playerList.findIndex((e=>e.id===this.$props.playerHighlighted)),t=this.colors.cyan,a=new Array(this.playerList.length).fill(t);a[e]=this.colors.orange;const r=a,s=new Array(this.playerList.length).fill(1);s[e]=20;const i=new Array(this.playerList.length).fill(4);i[e]=30;const l=new Array(this.playerList.length).fill("circle");return l[e]="crossRot",{datasets:[{label:"Players",labels:this.playerList.map((e=>e.id))||[],borderColor:a,backgroundColor:r,pointRadius:s,pointStyle:l,hoverRadius:i,data:this.playerList.map((e=>({y:e.kills,x:e.deaths})))}]}},chartStaticOptions(){return{responsive:!0,maintainAspectRatio:!1,animation:{duration:500},layout:{autoPadding:!1},scales:{y:{title:{text:"Kills",display:!0,color:this.colors.fg},ticks:{color:this.colors.fg}},x:{title:{text:"Deaths",display:!0,color:this.colors.fg},ticks:{color:this.colors.fg}}},onClick:(e,t)=>{this.$emit("highlightPlayer",t.length>0?this.playerList[t[0].index].id:void 0),void 0!==this.store.getPlayerList(this.filters||{})&&(0,s.oR)(this.store.getPlayerList(this.filters||{}))},onHover:(e,t)=>{e.native.target&&(e.native.target.style.cursor=t[0]?"pointer":"default")}}},chartStaticPlugins(){let e=0,t=0;if(this.playerList){const a=Math.max(...this.playerList.map((e=>e.deaths))),r=Math.max(...this.playerList.map((e=>e.kills)));r>a?(e=a,t=a/r*r):(t=r,e=r/a*a)}return{tooltip:{callbacks:{label:e=>{let t;return t=this.playerList?this.playerList[e.dataIndex].username:e.dataset.labels[e.dataIndex],t+=" ("+e.parsed.y+" kills "+e.parsed.x+" deaths)",t}}},annotation:{annotations:{line:{type:"line",yMin:0,xMin:0,yMax:t,xMax:e,borderWidth:2,borderColor:this.colors.orange,borderDash:[1,5]}}},legend:{display:!1}}},chartOptions(){return this.$props.playerHighlighted,{...this.chartStaticOptions,plugins:{...this.chartStaticPlugins,datalabels:{formatter:(e,t)=>this.playerList[t.dataIndex].username,backgroundColor:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?this.colors.orange:null,borderColor:this.colors.fg,borderWidth:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?1:0,borderRadius:5,display:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?"true":"auto",align:-45,anchor:"end",clamp:!0,color:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?this.colors.bg:this.colors.fg}}}}}});const oe=(0,u.Z)(ne,[["render",ae],["__scopeId","data-v-77326078"]]);var de=oe;const he={class:"weaponChart",ref:"container"};function pe(e,t,a,r,s,l){const n=(0,i.up)("Doughnut");return(0,i.wg)(),(0,i.iD)("div",he,[(0,i.Wm)(n,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}var ue=JSON.parse('{"rodeo_battery_removal":"Rodeo Battery Removal","human_execution":"Human Execution","melee_pilot_kunai":"Kunai Melee","execution":"Execution","mp_weapon_car":"CAR","mp_weapon_defender":"Charge Rifle","mp_weapon_doubletake":"Double Take","mp_weapon_epg":"EPG-1","mp_weapon_hemlok_smg":"Volt","mp_weapon_lstar":"L-STAR","mp_weapon_r97":"R-97","mp_weapon_rspn101":"R-201","mp_weapon_smart_pistol":"Smart Pistol","mp_weapon_sniper":"Kraber","mp_weapon_vinson":"Flatline","mp_weapon_autopistol":"RE-45 auto","mp_weapon_alternator_smg":"Alternator","mp_weapon_frag_grenade":"Frag Grenade","mp_weapon_g2":"G2","mp_weapon_lmg":"Spitfire","mp_weapon_smr":"Sidewinder SMR","mp_weapon_softball":"Softball","mp_weapon_thermite_grenade":"Firestar","pilot_emptyhanded":"Melee","mp_weapon_mastiff":"Mastiff","mp_weapon_mgl":"MGL","mp_weapon_rspn101_og":"R-101","mp_weapon_wingman":"Wingman","invalid":"invalid","mp_weapon_arc_launcher":"Thunderbolt","mp_weapon_dmr":"DMR","mp_weapon_grenade_electric_smoke":"Electric Smoke","mp_weapon_pulse_lmg":"Cold War","mp_weapon_satchel":"Satchel","mp_weapon_shotgun":"EVA-8 Auto","mp_weapon_shotgun_pistol":"Mozambique","mp_weapon_wingman_n":"Wingman Elite","mp_weapon_grenade_gravity":"Gravity Star","mp_weapon_grenade_sonar":"Pulse Blade","mp_weapon_rocket_launcher":"Archer","outOfBounds":"OutOfBounds","mind_crime":"Mind Crime","mp_weapon_esaw":"Devotion","fall":"Fall","mp_weapon_semipistol":"P2016","mp_weapon_grenade_emp":"Arc Grenade","mp_weapon_hemlok":"Hemlok","melee_pilot_emptyhanded":"Melee","phase_shift":"Phase Shift","damagedef_suicide":"Suicide","damagedef_titan_hotdrop":"Crushed by Titanfall","mp_titanweapon_arc_cannon":"Arc Cannon","mp_weapon_peacekraber":"Peacekraber","damagedef_crush":"Crushed","mp_titanweapon_brute4_quad_rocket":"Quad Rocket Launcher","mp_weapon_turretplasma":"Antititan Turret","mp_titanweapon_xo16_vanguard":"XO-16","mp_titanweapon_sticky_40mm":"40mm Cannon","mp_titanweapon_predator_cannon":"Predator Cannon","mp_titanweapon_leadwall":"Leadwall","mp_titanweapon_sniper":"Plasma Railgun","titan_execution":"Titan Execution","titan_explosion":"Titan Explosion","auto_titan_melee":"Autotitan Melee","mp_titanweapon_vortex_shield_ion":"Vortex Shield","mp_titanweapon_heat_shield":"Heat shield","bubble_shield":"Bubble Shield","mp_titancore_salvo_core":"Salvo Core","mp_titancore_flame_wave":"Flame Wave","mp_titanweapon_flightcore_rockets":"Flight Core","mp_titancore_laser_cannon":"Laser Cannon","mp_titancore_flame_wave_secondary":"Scorched Earth","mp_titanweapon_flame_wall":"Flame Wall","mp_titanweapon_arc_wave":"Arc Wave"}');re.kL.register(re.qi,re.u,re.De,ie.Z);var ce=(0,i.aZ)({name:"WeaponChart",props:{filters:Object,playerHighlighted:String},emits:["highlightPlayer"],components:{Doughnut:le.$I},mounted(){this.refreshColors++},data:()=>({store:V(),refreshColors:0}),computed:{colors(){this.refreshColors;const e={};if(this.$refs.container){const t=getComputedStyle(this.$refs.container);e.fg=t.getPropertyValue("--foreground"),e.bg=t.getPropertyValue("--bg-color"),e.orange=t.getPropertyValue("--orange"),e.cyan=t.getPropertyValue("--cyan"),e.yellow=t.getPropertyValue("--yellow"),e.green=t.getPropertyValue("--green"),e.purple=t.getPropertyValue("--purple"),e.red=t.getPropertyValue("--red"),e.pink=t.getPropertyValue("--pink"),e.currentLine=t.getPropertyValue("--current-line")}else e.fg="#ffffff";return e},chart(){const e=["cyan","green","orange","pink","purple","red","yellow"],t={datasets:[{label:"Weapons",labels:this.sortedWeaponList||[],borderColor:()=>this.colors.fg,backgroundColor:t=>this.colors[e[3*t.dataIndex%e.length]],data:[]}]};return this.sortedWeaponList?(t.datasets[0].data=this.sortedWeaponList.map((e=>this.weapons?this.weapons[e].value.kills:0)),t):t},chartOptions(){this.$props.playerHighlighted;const e={responsive:!0,maintainAspectRatio:!0,animation:{duration:500},layout:{autoPadding:!1},plugins:{datalabels:{formatter:(e,t)=>{const a=this.sortedWeaponList[t.dataIndex];return ue[a]||a},backgroundColor:e=>e.dataset.backgroundColor(e),borderColor:this.colors.fg,borderRadius:25,borderWidth:2,color:this.colors.bg,display:e=>e.dataIndex===e.dataset.labels.length-1||"auto",padding:6},tooltip:{callbacks:{label:e=>{let t;return t=this.sortedWeaponList?this.sortedWeaponList[e.dataIndex]:e.dataset.labels[e.dataIndex],t+=" ("+this.weapons[t].value.kills+" kills)",t}}}}};return e},weapons(){const{weapon:e,...t}=this.filters||{},a=this.store.getWeaponList(t)?.value.data;return a||this.store.fetchWeapons(t).value.data},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons).filter((e=>this.weapons[e].value.kills>0));return e.sort(((e,t)=>Number(this.weapons[e].value.kills)Number(this.weapons[t].value.kills)?1:0)),e}}});const me=(0,u.Z)(ce,[["render",pe],["__scopeId","data-v-54a2c8e6"]]);var _e=me,ge=a(6368),ve=(0,i.aZ)({name:"PlayerView",components:{VueMultiselect:ge.ZP,PlayerList:ee,PlayerChart:de,WeaponChart:_e},data(){return{model:{server:void 0,weapon:void 0},filters:{},store:V(),playerHighlighted:void 0,weaponLocale:ue}},beforeCreate(){let e;this.$route.query.server&&(e=this.$route.query.server?.toString()),this.model={server:e,weapon:this.$route.query.weapon?.toString()}},computed:{servers(){const{server:e,player:t,...a}=this.filters,r=this.store.getServerList(a)?.value.data;return r||(0,s.SU)(this.store.fetchServers(a)).data},groupedServers(){const e=[];return Object.entries(this.servers).forEach((t=>{const a=(0,s.SU)(t[1]);e.find((e=>e.id===a.host))||e.push({id:a.host,servers:[]}),e.find((e=>e.id===a.host))?.servers.push({name:t[0],...a})})),e},weapons(){const{weapon:e,player:t,...a}=this.filters,r=this.store.getWeaponList(a)?.value.data;return r||this.store.fetchWeapons(a).value.data},players(){const{player:e,...t}=this.filters,a=this.store.getPlayerList(t)?.value.data;return a||this.store.fetchPlayers(t).value.data},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons);return e.sort()},sortedServerList(){if(!this.servers)return[];const e=Object.keys(this.servers);return e.sort()},sortedPlayerList(){if(!this.players)return[];const e=Object.entries(this.players).map((e=>({id:e[0],...e[1]._rawValue})));return e.sort(((e,t)=>e.usernamet.username?1:0))}},watch:{players(){const e=this.$route.query.player?.toString();e&&this.playerHighlighted?.id!==e&&this.highlight_player(e)},model:{handler(e){this.filters.server=e.server,this.filters.weapon=e.weapon},deep:!0},filters:{handler(e){const{server:t,weapon:a,...r}=this.$route.query;Se.push({query:{...e,...r}})},deep:!0},playerHighlighted(e,t){if(e?.id===t?.id)return;const{player:a,...r}=this.$route.query;Se.push({query:{player:e?.id,...r}})},$route:{handler:function(){this.applyRouteFilters()},immediate:!0}},methods:{highlight_player(e){const t=this.players[e];this.playerHighlighted=t?{id:e,...(0,s.SU)(t)}:void 0},applyRouteFilters(){if(this.playerHighlighted?.id!==this.$route.query.player){const e=this.$route.query.player?.toString();e&&this.highlight_player(e)}this.filters.weapon!==this.$route.query.weapon&&(this.model.weapon=this.$route.query.weapon?.toString()),this.filters.server!==this.$route.query.server&&(this.$route.query.server?this.model.server=this.$route.query.server?.toString():this.model.server=void 0)}}});const ye=(0,u.Z)(ve,[["render",F],["__scopeId","data-v-24065b86"]]);var fe=ye;const we=[{path:"/",name:"home",component:fe},{path:"/servers",name:"servers",component:N}],be=(0,_.p7)({history:(0,_.PO)("/ToneAPI_webclient/"),routes:we});var Se=be;const ke=(0,x.WB)();(0,r.ri)(m).use(ke).use(Se).mount("#app");const Le=V(),xe=new WebSocket("wss://tone.sleepycat.date/v2/client/websocket");function Pe(e){Le.$state.players.filter((t=>(!t.value.filter.server||t.value.filter.server===e.servername)&&(!t.value.filter.weapon||t.value.filter.weapon===e.cause_of_death))).forEach((t=>{t.value.data[e.attacker_id]||(t.value.data[e.attacker_id]=(0,s.iH)({deaths:0,kills:0,max_distance:0,total_distance:0,username:e.attacker_name})),t.value.data[e.victim_id]||(t.value.data[e.victim_id]=(0,s.iH)({deaths:0,kills:0,max_distance:0,total_distance:0,username:e.victim_name})),(0,s.SU)(t.value.data[e.victim_id]).deaths++,(0,s.SU)(t.value.data[e.victim_id]).username=e.victim_name,(0,s.SU)(t.value.data[e.attacker_id]).username=e.attacker_name,e.attacker_id!==e.victim_id&&((0,s.SU)(t.value.data[e.attacker_id]).kills++,(0,s.SU)(t.value.data[e.attacker_id]).total_distance+=e.distance,(0,s.SU)(t.value.data[e.attacker_id]).max_distance=Math.max(e.distance,(0,s.SU)(t.value.data[e.attacker_id]).max_distance))})),Le.$state.weapons.filter((t=>(!t.value.filter.server||t.value.filter.server===e.servername)&&(!t.value.filter.player||t.value.filter.player===e.attacker_id))).forEach((t=>{t.value.data[e.cause_of_death]||(t.value.data[e.cause_of_death]=(0,s.iH)({deaths:0,kills:0,max_distance:0,total_distance:0,deaths_while_equipped:0})),e.attacker_id!==e.victim_id&&((0,s.SU)(t.value.data[e.cause_of_death]).kills++,(0,s.SU)(t.value.data[e.cause_of_death]).total_distance+=e.distance,(0,s.SU)(t.value.data[e.cause_of_death]).max_distance=Math.max(e.distance,(0,s.SU)(t.value.data[e.cause_of_death]).max_distance)),(0,s.SU)(t.value.data[e.cause_of_death]).deaths++})),Le.$state.servers.filter((t=>!t.value.filter.server||t.value.filter.server===e.servername)).forEach((t=>{t.value.data[e.servername]||(t.value.data[e.servername]=(0,s.iH)({deaths:0,kills:0,max_distance:0,total_distance:0,deaths_while_equipped:0,host:e.host})),e.attacker_id!==e.victim_id&&((0,s.SU)(t.value.data[e.servername]).kills++,(0,s.SU)(t.value.data[e.servername]).total_distance+=e.distance,(0,s.SU)(t.value.data[e.servername]).max_distance=Math.max(e.distance,(0,s.SU)(t.value.data[e.servername]).max_distance)),(0,s.SU)(t.value.data[e.servername]).deaths++}))}xe.onmessage=function(e){if("ping"===e.data)return xe.send("pong");const t=JSON.parse(e.data);Pe(t)}}}]);
-//# sourceMappingURL=chunk-common.9a692b01.js.map
\ No newline at end of file
diff --git a/dist/js/chunk-common.9a692b01.js.map b/dist/js/chunk-common.9a692b01.js.map
deleted file mode 100644
index 7e8aa3e..0000000
--- a/dist/js/chunk-common.9a692b01.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"js/chunk-common.9a692b01.js","mappings":"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","sources":["webpack://toneapi_webclient/./src/App.vue?3bba","webpack://toneapi_webclient/./src/App.vue?847a","webpack://toneapi_webclient/./src/App.vue","webpack://toneapi_webclient/./src/views/ServerView.vue?d58e","webpack://toneapi_webclient/./src/stores/kill.ts","webpack://toneapi_webclient/./src/components/List/VirtualList.vue?d0ed","webpack://toneapi_webclient/./src/components/List/VirtualList.vue?49a5","webpack://toneapi_webclient/./src/components/List/VirtualList.vue","webpack://toneapi_webclient/./src/views/ServerView.vue?0473","webpack://toneapi_webclient/./src/views/ServerView.vue","webpack://toneapi_webclient/./src/views/PlayerView.vue?7aca","webpack://toneapi_webclient/./src/components/PlayerList.vue?f979","webpack://toneapi_webclient/./src/components/PlayerList.vue?f30b","webpack://toneapi_webclient/./src/components/PlayerList.vue","webpack://toneapi_webclient/./src/components/PlayerChart.vue?8e29","webpack://toneapi_webclient/./src/components/PlayerChart.vue?ec59","webpack://toneapi_webclient/./src/components/PlayerChart.vue","webpack://toneapi_webclient/./src/components/WeaponChart.vue?f993","webpack://toneapi_webclient/./src/components/WeaponChart.vue?1a04","webpack://toneapi_webclient/./src/components/WeaponChart.vue","webpack://toneapi_webclient/./src/views/PlayerView.vue?6941","webpack://toneapi_webclient/./src/views/PlayerView.vue","webpack://toneapi_webclient/./src/router/index.ts","webpack://toneapi_webclient/./src/main.ts"],"sourcesContent":["import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"navbar-logo\" }\nconst _hoisted_2 = {\n href: \"https://github.com/ToneAPI\",\n target: \"_blank\"\n}\nconst _hoisted_3 = [\"src\"]\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"div\", { class: \"spacer\" }, null, -1)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_router_link = _resolveComponent(\"router-link\")!\n const _component_router_view = _resolveComponent(\"router-view\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"header\", null, [\n _createElementVNode(\"nav\", null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"a\", _hoisted_2, [\n _createElementVNode(\"img\", {\n src: `${_ctx.publicPath}tone_icon.png`\n }, null, 8, _hoisted_3)\n ])\n ]),\n _hoisted_4,\n _createVNode(_component_router_link, {\n to: \"/servers\",\n class: \"navbar-element\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Servers (Beta)\")\n ]),\n _: 1\n }),\n _createVNode(_component_router_link, {\n to: \"/\",\n class: \"navbar-element\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Players\")\n ]),\n _: 1\n })\n ])\n ]),\n _createVNode(_component_router_view)\n ], 64))\n}","\r\n\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n data () {\r\n return {\r\n publicPath: process.env.BASE_URL\r\n }\r\n }\r\n})\r\n","import { render } from \"./App.vue?vue&type=template&id=5925bcb7&ts=true\"\nimport script from \"./App.vue?vue&type=script&lang=ts\"\nexport * from \"./App.vue?vue&type=script&lang=ts\"\n\nimport \"./App.vue?vue&type=style&index=0&id=5925bcb7&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, Fragment as _Fragment, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-12531736\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { id: \"filters\" }, null, -1))\nconst _hoisted_2 = { class: \"serverView\" }\nconst _hoisted_3 = { class: \"serverList\" }\nconst _hoisted_4 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { class: \"serverHeaders\" }, [\n /*#__PURE__*/_createElementVNode(\"span\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Map\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Server name\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Players\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Kills\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Max distance\"),\n /*#__PURE__*/_createElementVNode(\"span\", null, \"Average distance\")\n], -1))\nconst _hoisted_5 = [\"src\"]\nconst _hoisted_6 = { key: 1 }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_VirtualList = _resolveComponent(\"VirtualList\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _hoisted_1,\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"div\", _hoisted_3, [\n _hoisted_4,\n _createVNode(_component_VirtualList, {\n list: _ctx.serverList,\n \"row-height\": 100\n }, {\n default: _withCtx((slotProps) => [\n _createElementVNode(\"div\", {\n class: _normalizeClass('serverRow ' + (!_ctx.nsServersByName[slotProps.data.name] ? 'offline ' : '') + (!_ctx.nsServersByName[slotProps.data.name]?.playerCount ? 'inactive ' : '') + ((slotProps.index + 1) % 2 ? 'odd ' : 'uneven '))\n }, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.index + 1), 1)\n ]),\n (_ctx.nsServersByName[slotProps.data.name])\n ? (_openBlock(), _createElementBlock(\"img\", {\n key: 0,\n src: `${_ctx.publicPath}maps/${_ctx.nsServersByName[slotProps.data.name].map}_lobby.png`\n }, null, 8, _hoisted_5))\n : _createCommentVNode(\"\", true),\n (!_ctx.nsServersByName[slotProps.data.name])\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6))\n : _createCommentVNode(\"\", true),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data.name + (!_ctx.nsServersByName[slotProps.data.name] ? ' (offline)' : '')), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.nsServersByName[slotProps.data.name] ? _ctx.nsServersByName[slotProps.data.name]?.playerCount\r\n + '/' + _ctx.nsServersByName[slotProps.data.name]?.maxPlayers : ''), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data._value.deaths), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data._value.max_distance), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(((slotProps.data._value.total_distance / slotProps.data._value.kills) || 0) * 100) /\r\n 100), 1)\n ])\n ], 2)\n ]),\n _: 1\n }, 8, [\"list\"])\n ])\n ])\n ], 64))\n}","import { defineStore } from 'pinia'\r\nimport * as assert from 'assert'\r\nimport { Ref, reactive, ref, shallowRef, triggerRef, unref } from 'vue'\r\n\r\nexport interface Filters {\r\n server?: string;\r\n player?: string;\r\n weapon?: string;\r\n host?: string;\r\n map?: string;\r\n gamemode?: string;\r\n}\r\n\r\nfunction removeNullEntries (a: Filters) {\r\n return Object.fromEntries(\r\n Object.entries(a).filter((e) => e[1] !== undefined && e[1] !== null)\r\n )\r\n}\r\nfunction objectEqual (a: Filters, b: Filters) {\r\n try {\r\n a = removeNullEntries(a)\r\n b = removeNullEntries(b)\r\n assert.deepStrictEqual(a, b)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport interface Kill {\r\n deaths: number;\r\n kills: number;\r\n // eslint-disable-next-line camelcase\r\n max_distance: number;\r\n // eslint-disable-next-line camelcase\r\n total_distance: number;\r\n}\r\nexport interface KillData {\r\n filter: Filters;\r\n data: { [key: string]: Ref };\r\n}\r\n\r\nexport interface Player extends Kill {\r\n username: string;\r\n // eslint-disable-next-line camelcase\r\n // deaths_while_equipped?: number;\r\n}\r\n\r\nexport interface Weapon extends Kill {\r\n // eslint-disable-next-line camelcase\r\n deaths_while_equipped: number;\r\n}\r\n\r\nexport interface Server extends Kill {\r\n host: number;\r\n}\r\n\r\nexport interface NSServer {\r\n name:string;\r\n region:string;\r\n description:string;\r\n playerCount:number;\r\n maxPlayers:number;\r\n map:string;\r\n playlist:string;\r\n hasPassword:boolean;\r\n modInfo:{Mods:[]}\r\n}\r\n// define your typings for the store state\r\nexport interface State {\r\n servers: Ref>[];\r\n players: Ref>[];\r\n weapons: Ref>[];\r\n maps: Ref>[];\r\n gamemodes: Ref>[];\r\n hosts: { [key: number]: string };\r\n nsServers: NSServer[] | undefined\r\n}\r\n\r\nlet serverInterval:number\r\nexport const useKillStore = defineStore('kill', {\r\n state: (): State => ({\r\n servers: [],\r\n players: [],\r\n weapons: [],\r\n maps: [],\r\n gamemodes: [],\r\n hosts: {},\r\n nsServers: undefined\r\n }),\r\n getters: {\r\n getPlayerList: (state) => (filters: Filters) => {\r\n return state.players.find((e) => objectEqual(unref(e).filter, filters))\r\n },\r\n getWeaponList: (state) => (filters: Filters) =>\r\n state.weapons.find((e) => objectEqual(unref(e).filter, filters)),\r\n getServerList: (state) => (filters: Filters) =>\r\n state.servers.find((e) => objectEqual(unref(e).filter, filters)),\r\n getNSServers: (state) => state.nsServers\r\n },\r\n actions: {\r\n fetchPlayers (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.players.find((e) => objectEqual(unref(e).filter, filter))\r\n if (entry === undefined) {\r\n entry = shallowRef({ filter, data: {} })\r\n this.players.push(entry)\r\n }\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/players?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n unref(entry)!.data = Object.fromEntries(Object.entries(await response.json()).map(e => [e[0], ref(e[1] as Player)]))\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n triggerRef(entry!)\r\n })\r\n return entry\r\n },\r\n fetchWeapons (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.weapons.find((e) => objectEqual(unref(e).filter, filter))\r\n if (!entry) {\r\n entry = shallowRef({ filter, data: {} })\r\n this.weapons.push(entry)\r\n }\r\n\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/weapons?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n unref(entry)!.data = Object.fromEntries(Object.entries(await response.json()).map(e => [e[0], ref(e[1] as Weapon)]))\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n triggerRef(entry!)\r\n })\r\n return entry\r\n },\r\n fetchServers (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.servers.find((e) => objectEqual(unref(e).filter, filter))\r\n if (!entry) {\r\n entry = shallowRef({ filter, data: {} })\r\n this.servers.push(entry)\r\n }\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/servers?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n unref(entry)!.data = Object.fromEntries(Object.entries(await response.json()).map(e => [e[0], ref(e[1] as Server)]))\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n triggerRef(entry!)\r\n })\r\n return entry\r\n },\r\n fetchNSServers () {\r\n fetch(\r\n 'https://northstar.tf/client/servers').then(async response => {\r\n this.nsServers = await response.json()\r\n })\r\n clearInterval(serverInterval)\r\n serverInterval = setInterval(() => this.fetchNSServers(), 60000)\r\n return this.nsServers || []\r\n }\r\n }\r\n})\r\n","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, renderSlot as _renderSlot, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-4b7b1630\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n ref: \"vscroll\",\n class: \"vscroll\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", {\n ref: \"vlist\",\n class: \"vlist\",\n onScroll: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.scroll && _ctx.scroll(...args)))\n }, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"div\", {\n style: _normalizeStyle(`padding: ${(_ctx.interval[0]*_ctx.$props.rowHeight!)}px 0px ${Math.max(0,(((_ctx.list.length)*_ctx.$props.rowHeight!)-(_ctx.interval[1])*_ctx.$props.rowHeight!))}px;`)\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.visibleList, (data, index) => {\n return _renderSlot(_ctx.$slots, \"default\", {\n data: data,\n index: index+_ctx.interval[0]\n }, undefined, true)\n }), 256))\n ], 4)\n ], 512)\n ], 544))\n}","\r\nimport { defineComponent, PropType } from 'vue'\r\n\r\nexport default defineComponent({\r\n data () {\r\n return {\r\n toLoad: 10,\r\n vlistHeight: 10,\r\n vIndex: 0\r\n }\r\n },\r\n props: {\r\n list: { type: Array as PropType, default: () => [] },\r\n rowHeight: { type: Number, default: () => 32 },\r\n highlighted: String\r\n },\r\n mounted () {\r\n if (this.$props.list) {\r\n this.vlistHeight = (this.$refs.vlist as HTMLElement)?.getBoundingClientRect().height || 0\r\n this.toLoad = this.visibleCount * 3\r\n if (this.$props.highlighted) {\r\n setTimeout(() => (this.$refs.vlist as HTMLElement)?.scrollBy({ top: ((this.list.findIndex(e => e.id === this.$props.highlighted)) * this.rowHeight) - ((this.$refs.vlist as HTMLElement))?.scrollTop - (this.vlistHeight / 2 - this.$props.rowHeight), behavior: 'smooth' }), 1)\r\n }\r\n }\r\n },\r\n computed: {\r\n interval () {\r\n // console.log(this.list.length, this.vIndex + this.toLoad)\r\n return [Math.min(this.list.length - this.toLoad, this.vIndex), Math.min(this.vIndex + this.toLoad, this.list.length)]\r\n },\r\n visibleList () {\r\n return this.list.slice(this.interval[0], this.interval[1])\r\n },\r\n visibleCount () {\r\n return Math.ceil(this.vlistHeight / this.$props.rowHeight)\r\n }\r\n },\r\n watch: {\r\n list () {\r\n this.vlistHeight = (this.$refs.vlist as HTMLElement)?.getBoundingClientRect().height || 0\r\n },\r\n highlighted (newVal) {\r\n if (newVal) setTimeout(() => (this.$refs.vlist as HTMLElement)?.scrollBy({ top: ((this.list.findIndex(e => e.id === newVal)) * this.rowHeight) - ((this.$refs.vlist as HTMLElement))?.scrollTop - (this.vlistHeight / 2 - this.$props.rowHeight), behavior: 'smooth' }), 1)\r\n }\r\n },\r\n methods: {\r\n scroll (e:Event) {\r\n const scrollTop = (e.target as HTMLElement)?.scrollTop\r\n const scrollIndex = Math.floor(scrollTop / this.$props.rowHeight)\r\n\r\n const mustScrollUp = scrollIndex < this.vIndex\r\n const mustScrollDown = scrollIndex > this.vIndex + this.visibleCount\r\n // console.log(this.vIndex + this.visibleCount, scrollIndex + this.visibleCount)\r\n if (mustScrollUp) {\r\n this.vIndex = Math.max(scrollIndex - this.visibleCount, 0)\r\n } else if (mustScrollDown) {\r\n this.vIndex = Math.min(scrollIndex, this.list.length - this.toLoad)\r\n }\r\n if (mustScrollDown || mustScrollUp) {\r\n const msg = (mustScrollDown ? 'down ' : '') + (mustScrollUp ? 'up ' : '')\r\n // console.log(this.toLoad)\r\n // console.log((this.list.length * this.$props.rowHeight) - (this.vIndex * this.$props.rowHeight) - (this.visibleCount * this.$props.rowHeight))\r\n }\r\n }\r\n }\r\n\r\n})\r\n","import { render } from \"./VirtualList.vue?vue&type=template&id=4b7b1630&scoped=true&ts=true\"\nimport script from \"./VirtualList.vue?vue&type=script&lang=ts\"\nexport * from \"./VirtualList.vue?vue&type=script&lang=ts\"\n\nimport \"./VirtualList.vue?vue&type=style&index=0&id=4b7b1630&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4b7b1630\"]])\n\nexport default __exports__","\r\nimport { NSServer, Server, useKillStore } from '@/stores/kill'\r\nimport VirtualList from '@/components/List/VirtualList.vue'\r\nimport { Ref, defineComponent, unref } from 'vue'\r\n\r\nexport default defineComponent({\r\n name: 'ServerView',\r\n components: {\r\n VirtualList\r\n },\r\n data () {\r\n return {\r\n store: useKillStore(),\r\n publicPath: process.env.BASE_URL\r\n }\r\n },\r\n computed: {\r\n servers (): { [key: string]: Ref } {\r\n const data = this.store.getServerList({})?.value.data\r\n if (!data) return unref(this.store.fetchServers({})).data\r\n return data\r\n },\r\n serverList (): (Ref & { name: string })[] {\r\n const data = Object.entries(this.servers).map(e => ({ ...e[1], name: e[0] }))\r\n data.sort((server1, server2) => {\r\n const a = !this.nsServersByName[server1.name] ? -1 : this.nsServersByName[server1.name].playerCount ? 1 : 0\r\n const b = !this.nsServersByName[server2.name] ? -1 : this.nsServersByName[server2.name].playerCount ? 1 : 0\r\n return b - a\r\n })\r\n return data\r\n },\r\n nsServers (): NSServer[] {\r\n const data = this.store.getNSServers\r\n if (!data) {\r\n return this.store.fetchNSServers()\r\n }\r\n return data\r\n },\r\n nsServersByName (): { [key: string]: NSServer } {\r\n return Object.fromEntries(this.nsServers.map(e => [e.name, e]))\r\n }\r\n }\r\n\r\n})\r\n","import { render } from \"./ServerView.vue?vue&type=template&id=12531736&scoped=true&ts=true\"\nimport script from \"./ServerView.vue?vue&type=script&lang=ts\"\nexport * from \"./ServerView.vue?vue&type=script&lang=ts\"\n\nimport \"./ServerView.vue?vue&type=style&index=0&id=12531736&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-12531736\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-24065b86\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { id: \"filters\" }\nconst _hoisted_2 = { class: \"multiselect-wrapper\" }\nconst _hoisted_3 = [\"disabled\"]\nconst _hoisted_4 = { class: \"multiselect-wrapper\" }\nconst _hoisted_5 = [\"disabled\"]\nconst _hoisted_6 = { class: \"multiselect-wrapper\" }\nconst _hoisted_7 = [\"disabled\"]\nconst _hoisted_8 = { id: \"playerView\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_VueMultiselect = _resolveComponent(\"VueMultiselect\")!\n const _component_PlayerList = _resolveComponent(\"PlayerList\")!\n const _component_PlayerChart = _resolveComponent(\"PlayerChart\")!\n const _component_WeaponChart = _resolveComponent(\"WeaponChart\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createElementVNode(\"span\", _hoisted_2, [\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select server\",\n modelValue: _ctx.model.server,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.model.server) = $event)),\n options: _ctx.sortedServerList,\n \"allow-empty\": true\n }, null, 8, [\"modelValue\", \"options\"]),\n _createElementVNode(\"button\", {\n onClick: _cache[1] || (_cache[1] = ($event: any) => (_ctx.model.server = undefined)),\n disabled: !_ctx.model.server\n }, \"X\", 8, _hoisted_3)\n ]),\n _createElementVNode(\"span\", _hoisted_4, [\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select weapon\",\n modelValue: _ctx.model.weapon,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((_ctx.model.weapon) = $event)),\n \"custom-label\": ((e) => _ctx.weaponLocale[e] || e),\n options: _ctx.sortedWeaponList,\n \"allow-empty\": true\n }, null, 8, [\"modelValue\", \"custom-label\", \"options\"]),\n _createElementVNode(\"button\", {\n onClick: _cache[3] || (_cache[3] = ($event: any) => (_ctx.model.weapon = undefined)),\n disabled: !_ctx.model.weapon\n }, \"X\", 8, _hoisted_5)\n ]),\n _createElementVNode(\"span\", _hoisted_6, [\n _createVNode(_component_VueMultiselect, {\n \"options-limit\": 20,\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Search player\",\n modelValue: _ctx.playerHighlighted,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = ($event: any) => ((_ctx.playerHighlighted) = $event)),\n options: _ctx.sortedPlayerList,\n \"allow-empty\": true,\n \"custom-label\": ((e) => e?.username)\n }, null, 8, [\"modelValue\", \"options\", \"custom-label\"]),\n _createElementVNode(\"button\", {\n onClick: _cache[5] || (_cache[5] = ($event: any) => (_ctx.playerHighlighted = undefined)),\n disabled: !_ctx.playerHighlighted\n }, \"X\", 8, _hoisted_7)\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_8, [\n _createVNode(_component_PlayerList, {\n filters: _ctx.filters,\n onHighlightPlayer: _ctx.highlight_player,\n playerHighlighted: _ctx.playerHighlighted?.id\n }, null, 8, [\"filters\", \"onHighlightPlayer\", \"playerHighlighted\"]),\n _createVNode(_component_PlayerChart, {\n filters: _ctx.filters,\n onHighlightPlayer: _ctx.highlight_player,\n playerHighlighted: _ctx.playerHighlighted?.id\n }, null, 8, [\"filters\", \"onHighlightPlayer\", \"playerHighlighted\"]),\n _createVNode(_component_WeaponChart, {\n filters: { player: _ctx.playerHighlighted?.id, ..._ctx.filters },\n playerHighlighted: _ctx.playerHighlighted?.id\n }, null, 8, [\"filters\", \"playerHighlighted\"])\n ])\n ], 64))\n}","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"playerHeaders\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"span\", null, null, -1)\nconst _hoisted_3 = [\"onClick\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_VirtualList = _resolveComponent(\"VirtualList\")!\n\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"playerTable\",\n onKeydown: _cache[6] || (_cache[6] = \n//@ts-ignore\n(...args) => (_ctx.selectNextPlayer && _ctx.selectNextPlayer(...args))),\n tabindex: \"0\"\n }, [\n _createElementVNode(\"div\", _hoisted_1, [\n _hoisted_2,\n _createElementVNode(\"span\", {\n onClick: _cache[0] || (_cache[0] = ($event: any) => (_ctx.updateSort('username'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'username' ? 'selected' : '')\n }, \"Username\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[1] || (_cache[1] = ($event: any) => (_ctx.updateSort('kills'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'kills' ? 'selected' : '')\n }, \"K\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[2] || (_cache[2] = ($event: any) => (_ctx.updateSort('deaths'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'deaths' ? 'selected' : '')\n }, \"D\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[3] || (_cache[3] = ($event: any) => (_ctx.updateSort('k/d'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'k/d' ? 'selected' : '')\n }, \"K/D\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[4] || (_cache[4] = ($event: any) => (_ctx.updateSort('max_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'max_distance' ? 'selected' : '')\n }, \"Max distance\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[5] || (_cache[5] = ($event: any) => (_ctx.updateSort('avg_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'avg_distance' ? 'selected' : '')\n }, \"Average distance\", 2)\n ]),\n _createVNode(_component_VirtualList, {\n list: _ctx.playerList,\n \"row-height\": 32,\n highlighted: _ctx.playerHighlighted\n }, {\n default: _withCtx((slotProps) => [\n _createElementVNode(\"div\", {\n class: _normalizeClass('playerRow ' + (slotProps.data.id === _ctx.playerHighlighted ? 'selected ' : '') + ((slotProps.index + 1)%2 ? 'odd ':'uneven ')),\n onClick: ($event: any) => (_ctx.$emit('highlightPlayer', slotProps.data.id))\n }, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.index+1), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data.value.username), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data.value.kills), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data.value.deaths), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(slotProps.data.value.kills / Math.max(1, slotProps.data.value.deaths) * 100) / 100), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(slotProps.data.value.max_distance), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(((slotProps.data.value.total_distance / slotProps.data.value.kills) || 0) * 100) / 100), 1)\n ])\n ], 10, _hoisted_3)\n ]),\n _: 1\n }, 8, [\"list\", \"highlighted\"])\n ], 32))\n}","\r\nimport { defineComponent, PropType, Ref } from 'vue'\r\nimport { useKillStore, Player, Filters } from '@/stores/kill'\r\nimport VirtualList from './List/VirtualList.vue'\r\n\r\nexport default defineComponent({\r\n components: { VirtualList },\r\n props: {\r\n filters: { type: Object as PropType, default: () => ({}) },\r\n playerHighlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n data () {\r\n return {\r\n sortingData: { direction: -1, argument: 'kills' as keyof Player | 'k/d' | 'avg_distance' },\r\n store: useKillStore()\r\n }\r\n },\r\n computed: {\r\n players (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayer } = this.filters\r\n const data = this.store.getPlayerList(withoutPlayer)?.value.data\r\n if (!data) return this.store.fetchPlayers(withoutPlayer).value.data\r\n return data\r\n },\r\n playerList (): (Ref & { id: string })[] {\r\n if (!this.players) return []\r\n const players = Object.entries(this.players).map(e => {\r\n const target = {} as ProxyHandler][>\r\n const player = new Proxy(e[1], target) as Ref & { id: string }\r\n player.id = e[0]\r\n return player\r\n }) as (Ref & { id: string })[]\r\n\r\n const date = new Date()\r\n if (this.sortingData.argument === 'username') {\r\n const collator = new Intl.Collator('en', { numeric: true, sensitivity: 'base' })\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return collator.compare(aVal.username, bVal.username)\r\n })\r\n } else if (this.sortingData.argument === 'k/d') {\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return aVal.kills / Math.max(1, aVal.deaths) - bVal.kills / Math.max(1, bVal.deaths)\r\n })\r\n } else if (this.sortingData.argument === 'avg_distance') {\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return ((aVal.total_distance / aVal.kills) || 0) - ((bVal.total_distance / bVal.kills) || 0)\r\n })\r\n } else {\r\n const argument = this.sortingData.argument\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return aVal[argument] - bVal[argument]\r\n })\r\n }\r\n if (this.sortingData.direction < 0) {\r\n players.reverse()\r\n }\r\n return players\r\n }\r\n },\r\n watch: {\r\n playerHighlighted (newval) {\r\n this.scrollToPlayer(newval)\r\n },\r\n playerList () {\r\n if (this.playerHighlighted) this.scrollToPlayer(this.playerHighlighted)\r\n }\r\n },\r\n methods: {\r\n selectNextPlayer (e: KeyboardEvent) {\r\n const values = {\r\n Home: -Infinity,\r\n End: Infinity,\r\n PageDown: 100,\r\n PageUp: -100,\r\n ArrowUp: -1,\r\n ArrowDown: 1,\r\n ArrowRight: 10,\r\n ArrowLeft: -10\r\n } as { [key: string]: number }\r\n if (!this.$props.playerHighlighted) return\r\n if (!Object.keys(values).includes(e.key)) return\r\n e.preventDefault()\r\n const index = this.playerList.findIndex(e => e.id === this.$props.playerHighlighted)\r\n let nextIndex = (index + values[e.key])\r\n if (nextIndex >= this.playerList.length) nextIndex = this.playerList.length - 1\r\n if (nextIndex < 0) nextIndex = 0\r\n this.$emit('highlightPlayer', this.playerList[nextIndex].id)\r\n },\r\n updateSort (argument: string) {\r\n if (this.sortingData.argument === argument) {\r\n this.sortingData.direction *= -1\r\n } else {\r\n this.sortingData.direction = -1\r\n }\r\n this.sortingData.argument = argument as typeof this.sortingData.argument\r\n },\r\n scrollToPlayer (playerid: string) {\r\n const newElement = this.$refs['player:' + playerid] as HTMLElement[]\r\n // Some hack because of some inconsistency\r\n setTimeout(function () {\r\n if (newElement && newElement[0]) { newElement[0].scrollIntoView({ behavior: 'smooth', block: 'center' }) }\r\n }, 10)\r\n }\r\n }\r\n\r\n})\r\n","import { render } from \"./PlayerList.vue?vue&type=template&id=2f631ac0&ts=true\"\nimport script from \"./PlayerList.vue?vue&type=script&lang=ts\"\nexport * from \"./PlayerList.vue?vue&type=script&lang=ts\"\n\nimport \"./PlayerList.vue?vue&type=style&index=0&id=2f631ac0&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-77326078\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"playerChart\",\n ref: \"container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_Scatter = _resolveComponent(\"Scatter\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_Scatter, {\n data: _ctx.chart,\n options: _ctx.chartOptions\n }, null, 8, [\"data\", \"options\"])\n ], 512))\n}","\r\nimport {\r\n Chart as ChartJS,\r\n LinearScale,\r\n PointElement,\r\n LineElement,\r\n Tooltip,\r\n Legend,\r\n CoreChartOptions,\r\n PluginChartOptions,\r\n ScaleChartOptions\r\n} from 'chart.js'\r\nimport annotationPlugin, { AnnotationPluginOptions } from 'chartjs-plugin-annotation'\r\nimport dataLabel from 'chartjs-plugin-datalabels'\r\nimport { useKillStore, Player, Filters } from '@/stores/kill'\r\n\r\nimport { Scatter } from 'vue-chartjs'\r\nimport { defineComponent, PropType, Ref, toRaw, triggerRef, unref } from 'vue'\r\nimport { ChartEvent } from 'chart.js/dist/core/core.plugins'\r\nimport { _DeepPartialObject } from 'chart.js/dist/types/utils'\r\n\r\nChartJS.register(LinearScale, PointElement, LineElement, Tooltip, Legend, annotationPlugin, dataLabel)\r\n\r\nexport default defineComponent({\r\n name: 'PlayerChart',\r\n props: {\r\n filters: Object as PropType,\r\n playerHighlighted: String\r\n },\r\n data: () => {\r\n return {\r\n store: useKillStore(),\r\n refreshColors: 0,\r\n playerData: []\r\n }\r\n },\r\n emits: ['highlightPlayer'],\r\n components: {\r\n Scatter\r\n },\r\n mounted () {\r\n this.refreshColors++\r\n },\r\n computed: {\r\n playerList (): (Player & {id:string})[] {\r\n const data = this.store.getPlayerList(this.filters || {})?.value.data\r\n if (!data) return Object.entries(this.store.fetchPlayers(this.filters || {}).value.data).map(e => ({ id: e[0], ...toRaw(e[1].value) }))\r\n const cut = Object.entries(data).map(e => ({ id: e[0], ...toRaw(e[1].value) }))\r\n cut.sort((a, b) => {\r\n return b.kills - a.kills\r\n })\r\n return cut.slice(0, 200)\r\n },\r\n colors () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.refreshColors\r\n const colors = {} as { [key: string]: string }\r\n if (this.$refs?.container) {\r\n const style = getComputedStyle(this.$refs.container as Element)\r\n colors.fg = style.getPropertyValue('--foreground')\r\n colors.bg = style.getPropertyValue('--bg-color')\r\n colors.orange = style.getPropertyValue('--orange')\r\n colors.cyan = style.getPropertyValue('--cyan')\r\n colors.currentLine = style.getPropertyValue('--current-line')\r\n } else {\r\n colors.fg = '#ffffff'\r\n }\r\n return colors\r\n },\r\n chart () {\r\n const playerIndex = this.playerList.findIndex(e => e.id === this.$props.playerHighlighted)\r\n const defaultColor = this.colors.cyan\r\n const borderColor = new Array(this.playerList.length).fill(defaultColor)\r\n borderColor[playerIndex] = this.colors.orange\r\n const backgroundColor = borderColor\r\n const pointRadius = new Array(this.playerList.length).fill(1)\r\n pointRadius[playerIndex] = 20\r\n const hoverRadius = new Array(this.playerList.length).fill(4)\r\n hoverRadius[playerIndex] = 30\r\n const pointStyle = new Array(this.playerList.length).fill('circle')\r\n pointStyle[playerIndex] = 'crossRot'\r\n return {\r\n datasets: [\r\n {\r\n label: 'Players',\r\n labels: this.playerList.map(e => e.id) || [] as string[],\r\n borderColor,\r\n backgroundColor,\r\n pointRadius,\r\n pointStyle,\r\n hoverRadius,\r\n data: this.playerList.map((player) => ({ y: player.kills, x: player.deaths }))\r\n }\r\n ]\r\n }\r\n },\r\n chartStaticOptions () {\r\n return {\r\n responsive: true,\r\n maintainAspectRatio: false,\r\n animation: { duration: 500 },\r\n layout: { autoPadding: false },\r\n scales: {\r\n y: {\r\n title: {\r\n text: 'Kills',\r\n display: true,\r\n color: this.colors.fg\r\n },\r\n ticks: {\r\n color: this.colors.fg\r\n }\r\n },\r\n x: {\r\n title: {\r\n text: 'Deaths',\r\n display: true,\r\n color: this.colors.fg\r\n },\r\n ticks: {\r\n color: this.colors.fg\r\n }\r\n }\r\n },\r\n onClick: (e: ChartEvent, element: any) => {\r\n this.$emit('highlightPlayer', element.length > 0 ? this.playerList[element[0].index].id : undefined)\r\n if (this.store.getPlayerList(this.filters || {}) !== undefined) triggerRef(this.store.getPlayerList(this.filters || {}) as unknown as Ref)\r\n },\r\n onHover: (e: any, element: any) => {\r\n if (!e.native.target) return\r\n (e.native.target as HTMLElement).style.cursor = element[0] ? 'pointer' : 'default'\r\n }\r\n }\r\n },\r\n chartStaticPlugins () {\r\n let endX = 0\r\n let endY = 0\r\n if (this.playerList) {\r\n const maxX = Math.max(...this.playerList.map(e => e.deaths))\r\n const maxY = Math.max(...this.playerList.map(e => e.kills))\r\n if (maxY > maxX) {\r\n endX = maxX\r\n endY = (maxX / maxY) * maxY\r\n } else {\r\n endY = maxY\r\n endX = (maxY / maxX) * maxX\r\n }\r\n }\r\n return {\r\n tooltip: {\r\n callbacks: {\r\n label: (ctx: any) => {\r\n let label: string\r\n if (!this.playerList) {\r\n label = ctx.dataset.labels[ctx.dataIndex]\r\n } else {\r\n label = this.playerList[ctx.dataIndex].username\r\n }\r\n label += ' (' + ctx.parsed.y + ' kills ' + ctx.parsed.x + ' deaths)'\r\n return label\r\n }\r\n }\r\n },\r\n annotation: {\r\n annotations: {\r\n line: {\r\n type: 'line',\r\n yMin: 0,\r\n xMin: 0,\r\n yMax: endY,\r\n xMax: endX,\r\n borderWidth: 2,\r\n borderColor: this.colors.orange,\r\n borderDash: [1, 5]\r\n }\r\n }\r\n } as _DeepPartialObject,\r\n legend: { display: false }\r\n }\r\n },\r\n chartOptions (): _DeepPartialObject & PluginChartOptions<'scatter'> & ScaleChartOptions<'scatter'>> {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.$props.playerHighlighted\r\n return {\r\n ...this.chartStaticOptions,\r\n plugins: {\r\n ...this.chartStaticPlugins,\r\n datalabels: {\r\n formatter: (value: any, context: any) => {\r\n return this.playerList[context.dataIndex].username\r\n },\r\n backgroundColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? this.colors.orange : null,\r\n borderColor: this.colors.fg,\r\n borderWidth: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? 1 : 0,\r\n borderRadius: 5,\r\n display: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? 'true' : 'auto',\r\n align: -45,\r\n anchor: 'end',\r\n clamp: true,\r\n color: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? this.colors.bg : this.colors.fg\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /* methods: {\r\n refreshChart () {\r\n if (this.store.getPlayerList(this.filters || {}) !== undefined) triggerRef(this.store.getPlayerList(this.filters || {}) as unknown as Ref)\r\n }\r\n } */\r\n})\r\n","import { render } from \"./PlayerChart.vue?vue&type=template&id=77326078&scoped=true&ts=true\"\nimport script from \"./PlayerChart.vue?vue&type=script&lang=ts\"\nexport * from \"./PlayerChart.vue?vue&type=script&lang=ts\"\n\nimport \"./PlayerChart.vue?vue&type=style&index=0&id=77326078&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-77326078\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-54a2c8e6\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"weaponChart\",\n ref: \"container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_Doughnut = _resolveComponent(\"Doughnut\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_Doughnut, {\n data: _ctx.chart,\n options: _ctx.chartOptions\n }, null, 8, [\"data\", \"options\"])\n ], 512))\n}","\r\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js'\r\nimport dataLabel from 'chartjs-plugin-datalabels'\r\nimport { Weapon, Filters, useKillStore } from '@/stores/kill'\r\nimport { Doughnut } from 'vue-chartjs'\r\nimport { defineComponent, PropType, Ref } from 'vue'\r\nimport weapons from '../stores/weapons.json'\r\n\r\nChartJS.register(ArcElement, Tooltip, Legend, dataLabel)\r\n\r\nexport default defineComponent({\r\n name: 'WeaponChart',\r\n props: {\r\n filters: Object as PropType,\r\n playerHighlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n components: {\r\n Doughnut\r\n },\r\n mounted () {\r\n this.refreshColors++\r\n },\r\n data: () => {\r\n return {\r\n store: useKillStore(),\r\n refreshColors: 0\r\n }\r\n },\r\n computed: {\r\n colors () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.refreshColors\r\n const colors = {} as { [key: string]: string }\r\n if (this.$refs.container) {\r\n const style = getComputedStyle(this.$refs.container as Element)\r\n colors.fg = style.getPropertyValue('--foreground')\r\n colors.bg = style.getPropertyValue('--bg-color')\r\n colors.orange = style.getPropertyValue('--orange')\r\n colors.cyan = style.getPropertyValue('--cyan')\r\n colors.yellow = style.getPropertyValue('--yellow')\r\n colors.green = style.getPropertyValue('--green')\r\n colors.purple = style.getPropertyValue('--purple')\r\n colors.red = style.getPropertyValue('--red')\r\n colors.pink = style.getPropertyValue('--pink')\r\n colors.currentLine = style.getPropertyValue('--current-line')\r\n } else {\r\n colors.fg = '#ffffff'\r\n }\r\n return colors\r\n },\r\n chart () {\r\n const colors = [\r\n 'cyan',\r\n 'green',\r\n 'orange',\r\n 'pink',\r\n 'purple',\r\n 'red',\r\n 'yellow'\r\n ]\r\n const chartData = {\r\n datasets: [\r\n {\r\n label: 'Weapons',\r\n labels: this.sortedWeaponList || ([] as string[]),\r\n borderColor: () => this.colors.fg,\r\n backgroundColor: (context: any) => {\r\n return this.colors[\r\n colors[(context.dataIndex * 3) % colors.length]\r\n ]\r\n },\r\n data: [] as number[]\r\n }\r\n ]\r\n }\r\n if (!this.sortedWeaponList) {\r\n return chartData\r\n }\r\n chartData.datasets[0].data = this.sortedWeaponList.map((e) => {\r\n if (!this.weapons) {\r\n return 0\r\n }\r\n return this.weapons[e].value.kills\r\n })\r\n return chartData\r\n },\r\n chartOptions () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.$props.playerHighlighted\r\n const options = {\r\n responsive: true,\r\n maintainAspectRatio: true,\r\n animation: { duration: 500 },\r\n layout: { autoPadding: false },\r\n plugins: {\r\n datalabels: {\r\n formatter: (value: any, context: any) => {\r\n const weaponId = this.sortedWeaponList[context.dataIndex]\r\n // if (!(weapons as {[key:string]:string})[weaponId]) console.log(weaponId)\r\n return (weapons as {[key:string]:string})[weaponId] || weaponId\r\n },\r\n backgroundColor: (context: any) => {\r\n return context.dataset.backgroundColor(context)\r\n },\r\n borderColor: this.colors.fg,\r\n borderRadius: 25,\r\n borderWidth: 2,\r\n color: this.colors.bg,\r\n display: (context: any) => {\r\n return context.dataIndex === context.dataset.labels.length - 1\r\n ? true\r\n : 'auto'\r\n },\r\n padding: 6\r\n },\r\n tooltip: {\r\n callbacks: {\r\n label: (ctx: any) => {\r\n let label: string\r\n if (!this.sortedWeaponList) {\r\n label = ctx.dataset.labels[ctx.dataIndex]\r\n } else {\r\n label = this.sortedWeaponList[ctx.dataIndex]\r\n }\r\n label += ' (' + this.weapons[label].value.kills + ' kills)'\r\n return label\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return options\r\n },\r\n weapons (): { [key: string]: Ref } {\r\n const { weapon: _, ...withoutWeapon } = this.filters || {}\r\n const data = this.store.getWeaponList(withoutWeapon)?.value.data\r\n if (!data) return this.store.fetchWeapons(withoutWeapon).value.data\r\n return data\r\n },\r\n sortedWeaponList (): string[] {\r\n if (!this.weapons) return []\r\n const weapons = Object.keys(this.weapons).filter(e => this.weapons[e].value.kills > 0)\r\n weapons.sort((a, b) => {\r\n if (Number(this.weapons[a].value.kills) < Number(this.weapons[b].value.kills)) {\r\n return -1\r\n }\r\n if (Number(this.weapons[a].value.kills) > Number(this.weapons[b].value.kills)) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n return weapons\r\n }\r\n }\r\n})\r\n","import { render } from \"./WeaponChart.vue?vue&type=template&id=54a2c8e6&scoped=true&ts=true\"\nimport script from \"./WeaponChart.vue?vue&type=script&lang=ts\"\nexport * from \"./WeaponChart.vue?vue&type=script&lang=ts\"\n\nimport \"./WeaponChart.vue?vue&type=style&index=0&id=54a2c8e6&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-54a2c8e6\"]])\n\nexport default __exports__","\r\nimport { Player, Weapon, Server, useKillStore, Filters } from '@/stores/kill'\r\nimport PlayerList from '@/components/PlayerList.vue'\r\nimport PlayerChart from '@/components/PlayerChart.vue'\r\nimport WeaponChart from '@/components/WeaponChart.vue'\r\nimport { Ref, defineComponent, unref } from 'vue'\r\nimport VueMultiselect from 'vue-multiselect'\r\nimport 'vue-multiselect/dist/vue-multiselect.css'\r\nimport weapons from '../stores/weapons.json'\r\nimport router from '@/router'\r\n\r\nexport default defineComponent({\r\n name: 'PlayerView',\r\n components: {\r\n VueMultiselect,\r\n PlayerList,\r\n PlayerChart,\r\n WeaponChart\r\n },\r\n\r\n data () {\r\n return {\r\n model: { server: undefined, weapon: undefined } as unknown as {\r\n weapon: string | undefined;\r\n server: string | undefined;\r\n },\r\n filters: {} as Filters,\r\n store: useKillStore(),\r\n playerHighlighted: undefined as (Player & { id: string }) | undefined,\r\n weaponLocale: weapons as { [key: string]: string }\r\n }\r\n },\r\n beforeCreate () {\r\n let server\r\n if (this.$route.query.server) server = this.$route.query.server?.toString()\r\n this.model = {\r\n server,\r\n weapon: this.$route.query.weapon?.toString()\r\n }\r\n },\r\n computed: {\r\n servers (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { server: _, player: _1, ...withoutServer } = this.filters\r\n const data = this.store.getServerList(withoutServer)?.value.data\r\n if (!data) return unref(this.store.fetchServers(withoutServer)).data\r\n return data\r\n },\r\n groupedServers () {\r\n const hosts = [] as {\r\n id: number;\r\n servers: (Server & { name?: string })[];\r\n }[]\r\n Object.entries(this.servers).forEach((e) => {\r\n const server = unref(e[1])\r\n if (!hosts.find((host) => host.id === server.host)) { hosts.push({ id: server.host, servers: [] as Server[] }) }\r\n hosts\r\n .find((host) => host.id === server.host)\r\n ?.servers.push({ name: e[0], ...server })\r\n })\r\n return hosts\r\n },\r\n weapons (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { weapon: _, player: _1, ...withoutWeapons } = this.filters\r\n const data = this.store.getWeaponList(withoutWeapons)?.value.data\r\n if (!data) return this.store.fetchWeapons(withoutWeapons).value.data\r\n return data\r\n },\r\n players (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayers } = this.filters\r\n const data = this.store.getPlayerList(withoutPlayers)?.value.data\r\n if (!data) return this.store.fetchPlayers(withoutPlayers).value.data\r\n return data\r\n },\r\n sortedWeaponList (): string[] {\r\n if (!this.weapons) return []\r\n const weapons = Object.keys(this.weapons)\r\n return weapons.sort()\r\n },\r\n sortedServerList (): string[] {\r\n if (!this.servers) return []\r\n const servers = Object.keys(this.servers)\r\n return servers.sort()\r\n },\r\n sortedPlayerList (): Player[] {\r\n if (!this.players) return []\r\n const players = Object.entries(this.players).map((e) => ({\r\n id: e[0],\r\n ...e[1]._rawValue\r\n }))\r\n return players.sort((a, b) => {\r\n if (a.username < b.username) {\r\n return -1\r\n }\r\n if (a.username > b.username) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n }\r\n },\r\n watch: {\r\n players () {\r\n const player = this.$route.query.player?.toString()\r\n if (player && this.playerHighlighted?.id !== player) {\r\n this.highlight_player(player)\r\n }\r\n },\r\n model: {\r\n handler (newModel) {\r\n this.filters.server = newModel.server\r\n this.filters.weapon = newModel.weapon\r\n },\r\n deep: true\r\n },\r\n filters: {\r\n handler (newValue) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { server: _, weapon: _2, ...withoutFilters } = this.$route.query\r\n router.push({ query: { ...newValue, ...withoutFilters } })// .then(e => { console.log(e) })\r\n },\r\n deep: true\r\n },\r\n playerHighlighted (newValue, oldValue) {\r\n if (newValue?.id === oldValue?.id) return\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayer } = this.$route.query\r\n router.push({ query: { player: newValue?.id, ...withoutPlayer } })// .then(e => { console.log(e) })\r\n },\r\n $route: {\r\n handler: function () {\r\n this.applyRouteFilters()\r\n },\r\n immediate: true\r\n }\r\n },\r\n methods: {\r\n highlight_player (playerid: string) {\r\n const player = this.players[playerid]\r\n if (player) {\r\n this.playerHighlighted = { id: playerid, ...unref(player) }\r\n return\r\n }\r\n this.playerHighlighted = undefined\r\n },\r\n applyRouteFilters () {\r\n if (this.playerHighlighted?.id !== this.$route.query.player) {\r\n const playerId = this.$route.query.player?.toString()\r\n if (playerId) {\r\n this.highlight_player(playerId)\r\n }\r\n }\r\n if (this.filters.weapon !== this.$route.query.weapon) {\r\n this.model.weapon = this.$route.query.weapon?.toString()\r\n }\r\n if (this.filters.server !== this.$route.query.server) {\r\n if (this.$route.query.server) this.model.server = this.$route.query.server?.toString()\r\n else this.model.server = undefined\r\n }\r\n }\r\n }\r\n})\r\n","import { render } from \"./PlayerView.vue?vue&type=template&id=24065b86&scoped=true&ts=true\"\nimport script from \"./PlayerView.vue?vue&type=script&lang=ts\"\nexport * from \"./PlayerView.vue?vue&type=script&lang=ts\"\n\nimport \"./PlayerView.vue?vue&type=style&index=0&id=24065b86&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-24065b86\"]])\n\nexport default __exports__","import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'\r\nimport ServerView from '../views/ServerView.vue'\r\nimport PlayerView from '../views/PlayerView.vue'\r\n\r\nconst routes: Array = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: PlayerView\r\n },\r\n {\r\n path: '/servers',\r\n name: 'servers',\r\n component: ServerView\r\n }\r\n // {\r\n // path: '/players',\r\n // name: 'players',\r\n // component: PlayerView\r\n // },\r\n // {\r\n // path: '/about',\r\n // name: 'about',\r\n // // route level code-splitting\r\n // // this generates a separate chunk (about.[hash].js) for this route\r\n // // which is lazy-loaded when the route is visited.\r\n // component: () => import(/* webpackChunkName: \"about\" */ '../views/AboutView.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","/* eslint-disable camelcase */\r\nimport { createApp, ref, unref } from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport { createPinia } from 'pinia'\r\nimport { useKillStore } from './stores/kill'\r\n\r\nconst pinia = createPinia()\r\n\r\ncreateApp(App).use(pinia).use(router).mount('#app')\r\n\r\nconst dummyData = {\r\n attacker_id: '1008704914497',\r\n attacker_name: 'DarkwinV1',\r\n cause_of_death: 'mp_weapon_car',\r\n victim_id: '1008553404453',\r\n victim_name: 'GURENTITANIUM',\r\n attacker_current_weapon: 'mp_weapon_car',\r\n victim_current_weapon: 'mp_weapon_sniper',\r\n distance: 300,\r\n game_mode: 'ps',\r\n servername: \"fvnkhead's 3v3\",\r\n map: 'lf_meadow',\r\n host: 1\r\n}\r\n\r\n// setInterval(() => registerWebSocketKill(dummyData), 100)\r\n\r\ntype websocketData = {\r\n attacker_id: string,\r\n attacker_name: string,\r\n cause_of_death: string,\r\n victim_id: string,\r\n victim_name: string,\r\n attacker_current_weapon: string,\r\n victim_current_weapon: string,\r\n distance: number,\r\n game_mode: string,\r\n servername: string,\r\n map: string,\r\n host: number\r\n}\r\n\r\n// dev stuff\r\n\r\nconst store = useKillStore()\r\nconst socket = new WebSocket('wss://tone.sleepycat.date/v2/client/websocket')\r\nsocket.onmessage = function (e) {\r\n if (e.data === 'ping') return socket.send('pong')\r\n const data = JSON.parse(e.data)\r\n registerWebSocketKill(data)\r\n}\r\n\r\nfunction registerWebSocketKill (data : websocketData) {\r\n store.$state.players.filter((e) => {\r\n return (\r\n (!e.value.filter.server ||\r\n e.value.filter.server === data.servername) &&\r\n (!e.value.filter.weapon ||\r\n e.value.filter.weapon === data.cause_of_death)\r\n // Handle other types of filters once those are implemented\r\n )\r\n }).forEach(e => {\r\n if (!e.value.data[data.attacker_id]) {\r\n e.value.data[data.attacker_id] = ref({\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: data.attacker_name\r\n })\r\n }\r\n if (!e.value.data[data.victim_id]) {\r\n e.value.data[data.victim_id] = ref({\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: data.victim_name\r\n })\r\n }\r\n // handle deaths with equipped, eventually\r\n /*\r\n if(e.value.filter.weapon){\r\n !e.value.data[data.victim_id] = e.value.data[data.victim_id] = {\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: data.victim_name,\r\n }\r\n } */\r\n\r\n unref(e.value.data[data.victim_id]).deaths++\r\n unref(e.value.data[data.victim_id]).username = data.victim_name\r\n unref(e.value.data[data.attacker_id]).username = data.attacker_name\r\n if (data.attacker_id !== data.victim_id) {\r\n unref(e.value.data[data.attacker_id]).kills++\r\n unref(e.value.data[data.attacker_id]).total_distance += data.distance\r\n unref(e.value.data[data.attacker_id]).max_distance = Math.max(data.distance, unref(e.value.data[data.attacker_id]).max_distance)\r\n }\r\n })\r\n store.$state.weapons.filter((e) => {\r\n return (\r\n (!e.value.filter.server ||\r\n e.value.filter.server === data.servername) &&\r\n (!e.value.filter.player || e.value.filter.player === data.attacker_id)\r\n // Handle other types of filters once those are implemented\r\n )\r\n }).forEach(e => {\r\n if (!e.value.data[data.cause_of_death]) {\r\n e.value.data[data.cause_of_death] = ref({\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n deaths_while_equipped: 0\r\n })\r\n }\r\n // handle deaths with equipped, eventually\r\n /*\r\n if(e.value.filter.weapon){\r\n !e.value.data[data.victim_id] = e.value.data[data.victim_id] = {\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: data.victim_name,\r\n }\r\n } */\r\n\r\n if (data.attacker_id !== data.victim_id) {\r\n unref(e.value.data[data.cause_of_death]).kills++\r\n unref(e.value.data[data.cause_of_death]).total_distance += data.distance\r\n unref(e.value.data[data.cause_of_death]).max_distance = Math.max(data.distance, unref(e.value.data[data.cause_of_death]).max_distance)\r\n }\r\n unref(e.value.data[data.cause_of_death]).deaths++\r\n })\r\n store.$state.servers.filter((e) => {\r\n return (\r\n (!e.value.filter.server ||\r\n e.value.filter.server === data.servername)\r\n // Handle other types of filters once those are implemented\r\n )\r\n }).forEach((e) => {\r\n if (!e.value.data[data.servername]) {\r\n e.value.data[data.servername] = ref({\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n deaths_while_equipped: 0,\r\n host: data.host\r\n })\r\n }\r\n\r\n if (data.attacker_id !== data.victim_id) {\r\n unref(e.value.data[data.servername]).kills++\r\n unref(e.value.data[data.servername]).total_distance += data.distance\r\n unref(e.value.data[data.servername]).max_distance = Math.max(data.distance, unref(e.value.data[data.servername]).max_distance)\r\n }\r\n unref(e.value.data[data.servername]).deaths++\r\n })\r\n}\r\n"],"names":["_hoisted_1","class","_hoisted_2","href","target","_hoisted_3","_hoisted_4","_createElementVNode","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_link","_resolveComponent","_component_router_view","_openBlock","_createElementBlock","_Fragment","src","publicPath","_createVNode","to","default","_withCtx","_createTextVNode","_","defineComponent","data","process","__exports__","_withScopeId","n","_pushScopeId","_popScopeId","id","_hoisted_5","_hoisted_6","key","_component_VirtualList","list","serverList","slotProps","_normalizeClass","nsServersByName","name","playerCount","index","_toDisplayString","map","_createCommentVNode","maxPlayers","_value","deaths","max_distance","Math","round","total_distance","kills","removeNullEntries","a","Object","fromEntries","entries","filter","e","undefined","objectEqual","b","assert","deepStrictEqual","serverInterval","useKillStore","defineStore","state","servers","players","weapons","maps","gamemodes","hosts","nsServers","getters","getPlayerList","filters","find","unref","getWeaponList","getServerList","getNSServers","actions","fetchPlayers","entry","this","shallowRef","push","fetch","URLSearchParams","then","async","response","json","ref","triggerRef","fetchWeapons","fetchServers","fetchNSServers","clearInterval","setInterval","onScroll","args","scroll","style","_normalizeStyle","interval","rowHeight","max","length","_renderList","visibleList","_renderSlot","$slots","toLoad","vlistHeight","vIndex","props","type","Array","Number","highlighted","String","mounted","$refs","vlist","getBoundingClientRect","height","visibleCount","setTimeout","scrollBy","top","findIndex","scrollTop","behavior","computed","min","slice","ceil","watch","newVal","methods","scrollIndex","floor","mustScrollUp","mustScrollDown","components","VirtualList","store","value","sort","server1","server2","_hoisted_7","_hoisted_8","_component_VueMultiselect","_component_PlayerList","_component_PlayerChart","_component_WeaponChart","selectLabel","deselectLabel","placeholder","modelValue","model","server","$event","options","sortedServerList","onClick","disabled","weapon","weaponLocale","sortedWeaponList","playerHighlighted","sortedPlayerList","username","onHighlightPlayer","highlight_player","player","onKeydown","selectNextPlayer","tabindex","updateSort","sortingData","argument","playerList","$emit","emits","direction","withoutPlayer","Proxy","Date","collator","Intl","Collator","numeric","sensitivity","aVal","_rawValue","bVal","compare","reverse","newval","scrollToPlayer","values","Home","Infinity","End","PageDown","PageUp","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","keys","includes","preventDefault","nextIndex","playerid","newElement","scrollIntoView","block","_component_Scatter","chart","chartOptions","ChartJS","LinearScale","PointElement","LineElement","Tooltip","Legend","annotationPlugin","dataLabel","refreshColors","playerData","Scatter","toRaw","cut","colors","container","getComputedStyle","fg","getPropertyValue","bg","orange","cyan","currentLine","playerIndex","defaultColor","borderColor","fill","backgroundColor","pointRadius","hoverRadius","pointStyle","datasets","label","labels","y","x","chartStaticOptions","responsive","maintainAspectRatio","animation","duration","layout","autoPadding","scales","title","text","display","color","ticks","element","onHover","native","cursor","chartStaticPlugins","endX","endY","maxX","maxY","tooltip","callbacks","ctx","dataIndex","dataset","parsed","annotation","annotations","line","yMin","xMin","yMax","xMax","borderWidth","borderDash","legend","plugins","datalabels","formatter","context","borderRadius","align","anchor","clamp","_component_Doughnut","ArcElement","Doughnut","yellow","green","purple","red","pink","chartData","weaponId","padding","withoutWeapon","VueMultiselect","PlayerList","PlayerChart","WeaponChart","beforeCreate","$route","query","toString","_1","withoutServer","groupedServers","forEach","host","withoutWeapons","withoutPlayers","handler","newModel","deep","newValue","_2","withoutFilters","router","oldValue","applyRouteFilters","immediate","playerId","routes","path","component","PlayerView","ServerView","createRouter","history","createWebHistory","pinia","createPinia","createApp","App","use","mount","socket","WebSocket","registerWebSocketKill","$state","servername","cause_of_death","attacker_id","attacker_name","victim_id","victim_name","distance","deaths_while_equipped","onmessage","send","JSON","parse"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/js/index.bd0013f0.js b/dist/js/index.36d84f24.js
similarity index 95%
rename from dist/js/index.bd0013f0.js
rename to dist/js/index.36d84f24.js
index 0567ca7..6e4cbaf 100644
--- a/dist/js/index.bd0013f0.js
+++ b/dist/js/index.36d84f24.js
@@ -1,2 +1,2 @@
-(function(){"use strict";var n={},t={};function r(e){var o=t[e];if(void 0!==o)return o.exports;var i=t[e]={exports:{}};return n[e](i,i.exports,r),i.exports}r.m=n,function(){var n=[];r.O=function(t,e,o,i){if(!e){var u=1/0;for(l=0;l=i)&&Object.keys(r.O).every((function(n){return r.O[n](e[c])}))?e.splice(c--,1):(f=!1,i0&&n[l-1][2]>i;l--)n[l]=n[l-1];n[l]=[e,o,i]}}(),function(){r.n=function(n){var t=n&&n.__esModule?function(){return n["default"]}:function(){return n};return r.d(t,{a:t}),t}}(),function(){r.d=function(n,t){for(var e in t)r.o(t,e)&&!r.o(n,e)&&Object.defineProperty(n,e,{enumerable:!0,get:t[e]})}}(),function(){r.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"===typeof window)return window}}()}(),function(){r.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)}}(),function(){var n={826:0,377:0};r.O.j=function(t){return 0===n[t]};var t=function(t,e){var o,i,u=e[0],f=e[1],c=e[2],a=0;if(u.some((function(t){return 0!==n[t]}))){for(o in f)r.o(f,o)&&(r.m[o]=f[o]);if(c)var l=c(r)}for(t&&t(e);a=i)&&Object.keys(r.O).every((function(n){return r.O[n](e[c])}))?e.splice(c--,1):(f=!1,i0&&n[l-1][2]>i;l--)n[l]=n[l-1];n[l]=[e,o,i]}}(),function(){r.n=function(n){var t=n&&n.__esModule?function(){return n["default"]}:function(){return n};return r.d(t,{a:t}),t}}(),function(){r.d=function(n,t){for(var e in t)r.o(t,e)&&!r.o(n,e)&&Object.defineProperty(n,e,{enumerable:!0,get:t[e]})}}(),function(){r.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"===typeof window)return window}}()}(),function(){r.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)}}(),function(){var n={826:0,377:0};r.O.j=function(t){return 0===n[t]};var t=function(t,e){var o,i,u=e[0],f=e[1],c=e[2],a=0;if(u.some((function(t){return 0!==n[t]}))){for(o in f)r.o(f,o)&&(r.m[o]=f[o]);if(c)var l=c(r)}for(t&&t(e);a 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__.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); }","// 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\t826: 0,\n\t377: 0\n};\n\n// no chunk on demand loading\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[\"webpackChunktoneapi_webclient\"] = self[\"webpackChunktoneapi_webclient\"] || [];\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, [998,64], function() { return __webpack_require__(5518); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","this","Function","e","window","obj","prop","prototype","hasOwnProperty","call","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","id","chunkLoadingGlobal","self","forEach","bind","push","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"js/index.36d84f24.js","mappings":"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","sources":["webpack://toneapi_webclient/webpack/bootstrap","webpack://toneapi_webclient/webpack/runtime/chunk loaded","webpack://toneapi_webclient/webpack/runtime/compat get default export","webpack://toneapi_webclient/webpack/runtime/define property getters","webpack://toneapi_webclient/webpack/runtime/global","webpack://toneapi_webclient/webpack/runtime/hasOwnProperty shorthand","webpack://toneapi_webclient/webpack/runtime/jsonp chunk loading","webpack://toneapi_webclient/webpack/startup"],"sourcesContent":["// 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](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__.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); }","// 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\t826: 0,\n\t377: 0\n};\n\n// no chunk on demand loading\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[\"webpackChunktoneapi_webclient\"] = self[\"webpackChunktoneapi_webclient\"] || [];\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, [998,64], function() { return __webpack_require__(6370); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","this","Function","e","window","obj","prop","prototype","hasOwnProperty","call","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","id","chunkLoadingGlobal","self","forEach","bind","push","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/js/server.c16a3c8c.js b/dist/js/server.a11e2336.js
similarity index 95%
rename from dist/js/server.c16a3c8c.js
rename to dist/js/server.a11e2336.js
index a1f2749..79fcdd8 100644
--- a/dist/js/server.c16a3c8c.js
+++ b/dist/js/server.a11e2336.js
@@ -1,2 +1,2 @@
-(function(){"use strict";var n={},t={};function r(e){var o=t[e];if(void 0!==o)return o.exports;var i=t[e]={exports:{}};return n[e](i,i.exports,r),i.exports}r.m=n,function(){var n=[];r.O=function(t,e,o,i){if(!e){var u=1/0;for(l=0;l=i)&&Object.keys(r.O).every((function(n){return r.O[n](e[c])}))?e.splice(c--,1):(f=!1,i0&&n[l-1][2]>i;l--)n[l]=n[l-1];n[l]=[e,o,i]}}(),function(){r.n=function(n){var t=n&&n.__esModule?function(){return n["default"]}:function(){return n};return r.d(t,{a:t}),t}}(),function(){r.d=function(n,t){for(var e in t)r.o(t,e)&&!r.o(n,e)&&Object.defineProperty(n,e,{enumerable:!0,get:t[e]})}}(),function(){r.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"===typeof window)return window}}()}(),function(){r.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)}}(),function(){var n={377:0,826:0};r.O.j=function(t){return 0===n[t]};var t=function(t,e){var o,i,u=e[0],f=e[1],c=e[2],a=0;if(u.some((function(t){return 0!==n[t]}))){for(o in f)r.o(f,o)&&(r.m[o]=f[o]);if(c)var l=c(r)}for(t&&t(e);a=i)&&Object.keys(r.O).every((function(n){return r.O[n](e[c])}))?e.splice(c--,1):(f=!1,i0&&n[l-1][2]>i;l--)n[l]=n[l-1];n[l]=[e,o,i]}}(),function(){r.n=function(n){var t=n&&n.__esModule?function(){return n["default"]}:function(){return n};return r.d(t,{a:t}),t}}(),function(){r.d=function(n,t){for(var e in t)r.o(t,e)&&!r.o(n,e)&&Object.defineProperty(n,e,{enumerable:!0,get:t[e]})}}(),function(){r.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(n){if("object"===typeof window)return window}}()}(),function(){r.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)}}(),function(){var n={377:0,826:0};r.O.j=function(t){return 0===n[t]};var t=function(t,e){var o,i,u=e[0],f=e[1],c=e[2],a=0;if(u.some((function(t){return 0!==n[t]}))){for(o in f)r.o(f,o)&&(r.m[o]=f[o]);if(c)var l=c(r)}for(t&&t(e);a 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__.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); }","// 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\t377: 0,\n\t826: 0\n};\n\n// no chunk on demand loading\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[\"webpackChunktoneapi_webclient\"] = self[\"webpackChunktoneapi_webclient\"] || [];\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, [998,64], function() { return __webpack_require__(5518); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","this","Function","e","window","obj","prop","prototype","hasOwnProperty","call","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","id","chunkLoadingGlobal","self","forEach","bind","push","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"js/server.a11e2336.js","mappings":"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","sources":["webpack://toneapi_webclient/webpack/bootstrap","webpack://toneapi_webclient/webpack/runtime/chunk loaded","webpack://toneapi_webclient/webpack/runtime/compat get default export","webpack://toneapi_webclient/webpack/runtime/define property getters","webpack://toneapi_webclient/webpack/runtime/global","webpack://toneapi_webclient/webpack/runtime/hasOwnProperty shorthand","webpack://toneapi_webclient/webpack/runtime/jsonp chunk loading","webpack://toneapi_webclient/webpack/startup"],"sourcesContent":["// 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](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__.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); }","// 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\t377: 0,\n\t826: 0\n};\n\n// no chunk on demand loading\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[\"webpackChunktoneapi_webclient\"] = self[\"webpackChunktoneapi_webclient\"] || [];\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, [998,64], function() { return __webpack_require__(6370); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","this","Function","e","window","obj","prop","prototype","hasOwnProperty","call","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","id","chunkLoadingGlobal","self","forEach","bind","push","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/servers.html b/dist/servers.html
index adffd90..21ad324 100644
--- a/dist/servers.html
+++ b/dist/servers.html
@@ -1 +1 @@
-Servers : Tone API
\ No newline at end of file
+Servers : Tone API
\ No newline at end of file
]