diff --git a/404.html b/404.html new file mode 100644 index 0000000..e101d5c --- /dev/null +++ b/404.html @@ -0,0 +1,33 @@ + + + + + + + + + ScoreSaber Wiki + + + + +

404

There's nothing here.
Take me home
+ + + diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..bee3d8d --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +https://wiki.scoresaber.com diff --git a/about-us.html b/about-us.html new file mode 100644 index 0000000..0b5cdf0 --- /dev/null +++ b/about-us.html @@ -0,0 +1,33 @@ + + + + + + + + + About us | ScoreSaber Wiki + + + + +

About us

The Team

If you want to know who is keeping ScoreSaber alive,

You can find our complete Team hereopen in new window

If you want to know what each Team Role does,

You can find more Information here

About ScoreSaber

ScoreSaber is Beat Saber's largest leaderboard system for custom songs, hosting 60 million scores across 170,000+ leaderboards, with more than 1 million users worldwide

+ + + diff --git a/app.e68a1260.mjs b/app.e68a1260.mjs new file mode 100644 index 0000000..d24a577 --- /dev/null +++ b/app.e68a1260.mjs @@ -0,0 +1,10 @@ +const El="modulepreload",wl=function(e){return"/"+e},wo={},re=function(t,n,r){return!n||n.length===0?t():Promise.all(n.map(o=>{if(o=wl(o),o in wo)return;wo[o]=!0;const s=o.endsWith(".css"),i=s?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${o}"]${i}`))return;const l=document.createElement("link");if(l.rel=s?"stylesheet":El,s||(l.as="script",l.crossOrigin=""),l.href=o,document.head.appendChild(l),s)return new Promise((a,c)=>{l.addEventListener("load",a),l.addEventListener("error",()=>c(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t())},Cl={"v-8daa1a0e":()=>re(()=>import("./assets/index.html.d718eebb.js"),[]).then(({data:e})=>e),"v-408f3862":()=>re(()=>import("./assets/about-us.html.db683ed4.js"),[]).then(({data:e})=>e),"v-58e1e27c":()=>re(()=>import("./assets/beginners-guide.html.cb0108ab.js"),[]).then(({data:e})=>e),"v-092a1d7c":()=>re(()=>import("./assets/faq.html.cbb8887c.js"),[]).then(({data:e})=>e),"v-0e753d4c":()=>re(()=>import("./assets/ranking-system.html.b6c86fd0.js"),[]).then(({data:e})=>e),"v-56476c0a":()=>re(()=>import("./assets/rules.html.081b5421.js"),[]).then(({data:e})=>e),"v-1b35bd3b":()=>re(()=>import("./assets/how-to-rank-map.html.8cbedec5.js"),[]).then(({data:e})=>e),"v-7d4771f0":()=>re(()=>import("./assets/modding-queue-information.html.85c17d16.js"),[]).then(({data:e})=>e),"v-737b7fdb":()=>re(()=>import("./assets/qat-guidelines.html.8bf99421.js"),[]).then(({data:e})=>e),"v-790243e7":()=>re(()=>import("./assets/ranking-queue-rules.html.5a207e34.js"),[]).then(({data:e})=>e),"v-355e83f4":()=>re(()=>import("./assets/ranking-unban-system-and-terms.html.8b520ea5.js"),[]).then(({data:e})=>e),"v-1d3a639e":()=>re(()=>import("./assets/scoresaber-team-information.html.56e54911.js"),[]).then(({data:e})=>e),"v-07d4df84":()=>re(()=>import("./assets/index.html.35873366.js"),[]).then(({data:e})=>e),"v-6b9aed7a":()=>re(()=>import("./assets/difficulty-spread-requirements.html.f456555e.js"),[]).then(({data:e})=>e),"v-7510c06a":()=>re(()=>import("./assets/formatting-and-metadata.html.cbae5f7c.js"),[]).then(({data:e})=>e),"v-22a4d09d":()=>re(()=>import("./assets/mapping-criteria.html.aaabbf24.js"),[]).then(({data:e})=>e),"v-3e479638":()=>re(()=>import("./assets/technical-limitations-criteria.html.b01f3119.js"),[]).then(({data:e})=>e),"v-3706649a":()=>re(()=>import("./assets/404.html.d55be9f8.js"),[]).then(({data:e})=>e)};function Ur(e,t){const n=Object.create(null),r=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}const Ol="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Pl=Ur(Ol);function Ns(e){return!!e||e===""}function Wn(e){if(Q(e)){const t={};for(let n=0;n{if(n){const r=n.split(Sl);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function bn(e){let t="";if(pe(e))t=e;else if(Q(e))for(let n=0;npe(e)?e:e==null?"":Q(e)||Ee(e)&&(e.toString===$s||!X(e.toString))?JSON.stringify(e,Ds,2):String(e),Ds=(e,t)=>t&&t.__v_isRef?Ds(e,t.value):Bt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o])=>(n[`${r} =>`]=o,n),{})}:Hs(t)?{[`Set(${t.size})`]:[...t.values()]}:Ee(t)&&!Q(t)&&!zs(t)?String(t):t,he={},jt=[],Qe=()=>{},Al=()=>!1,Ll=/^on[^a-z]/,En=e=>Ll.test(e),Vr=e=>e.startsWith("onUpdate:"),Te=Object.assign,qr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Il=Object.prototype.hasOwnProperty,oe=(e,t)=>Il.call(e,t),Q=Array.isArray,Bt=e=>Qn(e)==="[object Map]",Hs=e=>Qn(e)==="[object Set]",X=e=>typeof e=="function",pe=e=>typeof e=="string",Kr=e=>typeof e=="symbol",Ee=e=>e!==null&&typeof e=="object",Fs=e=>Ee(e)&&X(e.then)&&X(e.catch),$s=Object.prototype.toString,Qn=e=>$s.call(e),kl=e=>Qn(e).slice(8,-1),zs=e=>Qn(e)==="[object Object]",Wr=e=>pe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,sn=Ur(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Yn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Ml=/-(\w)/g,Ze=Yn(e=>e.replace(Ml,(t,n)=>n?n.toUpperCase():"")),Nl=/\B([A-Z])/g,kt=Yn(e=>e.replace(Nl,"-$1").toLowerCase()),Jn=Yn(e=>e.charAt(0).toUpperCase()+e.slice(1)),ar=Yn(e=>e?`on${Jn(e)}`:""),hn=(e,t)=>!Object.is(e,t),cr=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},js=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Co;const Dl=()=>Co||(Co=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let Ne;class Hl{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&Ne&&(this.parent=Ne,this.index=(Ne.scopes||(Ne.scopes=[])).push(this)-1)}run(t){if(this.active){const n=Ne;try{return Ne=this,t()}finally{Ne=n}}}on(){Ne=this}off(){Ne=this.parent}stop(t){if(this.active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Bs=e=>(e.w&vt)>0,Us=e=>(e.n&vt)>0,jl=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(c==="length"||c>=r)&&l.push(a)});else switch(n!==void 0&&l.push(i.get(n)),t){case"add":Q(e)?Wr(n)&&l.push(i.get("length")):(l.push(i.get(Rt)),Bt(e)&&l.push(i.get(Pr)));break;case"delete":Q(e)||(l.push(i.get(Rt)),Bt(e)&&l.push(i.get(Pr)));break;case"set":Bt(e)&&l.push(i.get(Rt));break}if(l.length===1)l[0]&&Tr(l[0]);else{const a=[];for(const c of l)c&&a.push(...c);Tr(Qr(a))}}function Tr(e,t){const n=Q(e)?e:[...e];for(const r of n)r.computed&&Po(r);for(const r of n)r.computed||Po(r)}function Po(e,t){(e!==Ke||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const Ul=Ur("__proto__,__v_isRef,__isVue"),Ks=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Kr)),Vl=Jr(),ql=Jr(!1,!0),Kl=Jr(!0),To=Wl();function Wl(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=ae(this);for(let s=0,i=this.length;s{e[t]=function(...n){Yt();const r=ae(this)[t].apply(this,n);return Jt(),r}}),e}function Jr(e=!1,t=!1){return function(r,o,s){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&s===(e?t?ca:Gs:t?Js:Ys).get(r))return r;const i=Q(r);if(!e&&i&&oe(To,o))return Reflect.get(To,o,s);const l=Reflect.get(r,o,s);return(Kr(o)?Ks.has(o):Ul(o))||(e||Fe(r,"get",o),t)?l:Ce(l)?i&&Wr(o)?l:l.value:Ee(l)?e?Xr(l):Gt(l):l}}const Ql=Ws(),Yl=Ws(!0);function Ws(e=!1){return function(n,r,o,s){let i=n[r];if(pn(i)&&Ce(i)&&!Ce(o))return!1;if(!e&&!pn(o)&&(Sr(o)||(o=ae(o),i=ae(i)),!Q(n)&&Ce(i)&&!Ce(o)))return i.value=o,!0;const l=Q(n)&&Wr(r)?Number(r)e,Gn=e=>Reflect.getPrototypeOf(e);function On(e,t,n=!1,r=!1){e=e.__v_raw;const o=ae(e),s=ae(t);n||(t!==s&&Fe(o,"get",t),Fe(o,"get",s));const{has:i}=Gn(o),l=r?Gr:n?to:mn;if(i.call(o,t))return l(e.get(t));if(i.call(o,s))return l(e.get(s));e!==o&&e.get(t)}function Pn(e,t=!1){const n=this.__v_raw,r=ae(n),o=ae(e);return t||(e!==o&&Fe(r,"has",e),Fe(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Tn(e,t=!1){return e=e.__v_raw,!t&&Fe(ae(e),"iterate",Rt),Reflect.get(e,"size",e)}function So(e){e=ae(e);const t=ae(this);return Gn(t).has.call(t,e)||(t.add(e),rt(t,"add",e,e)),this}function xo(e,t){t=ae(t);const n=ae(this),{has:r,get:o}=Gn(n);let s=r.call(n,e);s||(e=ae(e),s=r.call(n,e));const i=o.call(n,e);return n.set(e,t),s?hn(t,i)&&rt(n,"set",e,t):rt(n,"add",e,t),this}function Ro(e){const t=ae(this),{has:n,get:r}=Gn(t);let o=n.call(t,e);o||(e=ae(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&rt(t,"delete",e,void 0),s}function Ao(){const e=ae(this),t=e.size!==0,n=e.clear();return t&&rt(e,"clear",void 0,void 0),n}function Sn(e,t){return function(r,o){const s=this,i=s.__v_raw,l=ae(i),a=t?Gr:e?to:mn;return!e&&Fe(l,"iterate",Rt),i.forEach((c,u)=>r.call(o,a(c),a(u),s))}}function xn(e,t,n){return function(...r){const o=this.__v_raw,s=ae(o),i=Bt(s),l=e==="entries"||e===Symbol.iterator&&i,a=e==="keys"&&i,c=o[e](...r),u=n?Gr:t?to:mn;return!t&&Fe(s,"iterate",a?Pr:Rt),{next(){const{value:d,done:p}=c.next();return p?{value:d,done:p}:{value:l?[u(d[0]),u(d[1])]:u(d),done:p}},[Symbol.iterator](){return this}}}}function it(e){return function(...t){return e==="delete"?!1:this}}function ta(){const e={get(s){return On(this,s)},get size(){return Tn(this)},has:Pn,add:So,set:xo,delete:Ro,clear:Ao,forEach:Sn(!1,!1)},t={get(s){return On(this,s,!1,!0)},get size(){return Tn(this)},has:Pn,add:So,set:xo,delete:Ro,clear:Ao,forEach:Sn(!1,!0)},n={get(s){return On(this,s,!0)},get size(){return Tn(this,!0)},has(s){return Pn.call(this,s,!0)},add:it("add"),set:it("set"),delete:it("delete"),clear:it("clear"),forEach:Sn(!0,!1)},r={get(s){return On(this,s,!0,!0)},get size(){return Tn(this,!0)},has(s){return Pn.call(this,s,!0)},add:it("add"),set:it("set"),delete:it("delete"),clear:it("clear"),forEach:Sn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=xn(s,!1,!1),n[s]=xn(s,!0,!1),t[s]=xn(s,!1,!0),r[s]=xn(s,!0,!0)}),[e,n,t,r]}const[na,ra,oa,sa]=ta();function Zr(e,t){const n=t?e?sa:oa:e?ra:na;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(oe(n,o)&&o in r?n:r,o,s)}const ia={get:Zr(!1,!1)},la={get:Zr(!1,!0)},aa={get:Zr(!0,!1)},Ys=new WeakMap,Js=new WeakMap,Gs=new WeakMap,ca=new WeakMap;function ua(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function fa(e){return e.__v_skip||!Object.isExtensible(e)?0:ua(kl(e))}function Gt(e){return pn(e)?e:eo(e,!1,Qs,ia,Ys)}function da(e){return eo(e,!1,ea,la,Js)}function Xr(e){return eo(e,!0,Xl,aa,Gs)}function eo(e,t,n,r,o){if(!Ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=fa(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return o.set(e,l),l}function Ut(e){return pn(e)?Ut(e.__v_raw):!!(e&&e.__v_isReactive)}function pn(e){return!!(e&&e.__v_isReadonly)}function Sr(e){return!!(e&&e.__v_isShallow)}function Zs(e){return Ut(e)||pn(e)}function ae(e){const t=e&&e.__v_raw;return t?ae(t):e}function Xs(e){return Nn(e,"__v_skip",!0),e}const mn=e=>Ee(e)?Gt(e):e,to=e=>Ee(e)?Xr(e):e;function ei(e){pt&&Ke&&(e=ae(e),qs(e.dep||(e.dep=Qr())))}function ti(e,t){e=ae(e),e.dep&&Tr(e.dep)}function Ce(e){return!!(e&&e.__v_isRef===!0)}function Oe(e){return ri(e,!1)}function ni(e){return ri(e,!0)}function ri(e,t){return Ce(e)?e:new ha(e,t)}class ha{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:ae(t),this._value=n?t:mn(t)}get value(){return ei(this),this._value}set value(t){t=this.__v_isShallow?t:ae(t),hn(t,this._rawValue)&&(this._rawValue=t,this._value=this.__v_isShallow?t:mn(t),ti(this))}}function At(e){return Ce(e)?e.value:e}const pa={get:(e,t,n)=>At(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Ce(o)&&!Ce(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function oi(e){return Ut(e)?e:new Proxy(e,pa)}function fh(e){const t=Q(e)?new Array(e.length):{};for(const n in e)t[n]=ga(e,n);return t}class ma{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function ga(e,t,n){const r=e[t];return Ce(r)?r:new ma(e,t,n)}class va{constructor(t,n,r,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new Yr(t,()=>{this._dirty||(this._dirty=!0,ti(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=ae(this);return ei(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function _a(e,t,n=!1){let r,o;const s=X(e);return s?(r=e,o=Qe):(r=e.get,o=e.set),new va(r,o,s||!o,n)}function mt(e,t,n,r){let o;try{o=r?e(...r):e()}catch(s){wn(s,t,n)}return o}function Be(e,t,n,r){if(X(e)){const s=mt(e,t,n,r);return s&&Fs(s)&&s.catch(i=>{wn(i,t,n)}),s}const o=[];for(let s=0;s>>1;gn(De[r])tt&&De.splice(t,1)}function li(e,t,n,r){Q(e)?n.push(...e):(!t||!t.includes(e,e.allowRecurse?r+1:r))&&n.push(e),ii()}function wa(e){li(e,on,ln,Ft)}function Ca(e){li(e,ut,an,$t)}function Xn(e,t=null){if(ln.length){for(Rr=t,on=[...new Set(ln)],ln.length=0,Ft=0;Ftgn(n)-gn(r)),$t=0;$te.id==null?1/0:e.id;function ai(e){xr=!1,Dn=!0,Xn(e),De.sort((n,r)=>gn(n)-gn(r));const t=Qe;try{for(tt=0;tt_.trim())),d&&(o=n.map(js))}let l,a=r[l=ar(t)]||r[l=ar(Ze(t))];!a&&s&&(a=r[l=ar(kt(t))]),a&&Be(a,e,6,o);const c=r[l+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Be(c,e,6,o)}}function ci(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},l=!1;if(!X(e)){const a=c=>{const u=ci(c,t,!0);u&&(l=!0,Te(i,u))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!s&&!l?(r.set(e,null),null):(Q(s)?s.forEach(a=>i[a]=null):Te(i,s),r.set(e,i),i)}function er(e,t){return!e||!En(t)?!1:(t=t.slice(2).replace(/Once$/,""),oe(e,t[0].toLowerCase()+t.slice(1))||oe(e,kt(t))||oe(e,t))}let Se=null,ui=null;function Fn(e){const t=Se;return Se=e,ui=e&&e.type.__scopeId||null,t}function Pa(e,t=Se,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&jo(-1);const s=Fn(t),i=e(...o);return Fn(s),r._d&&jo(1),i};return r._n=!0,r._c=!0,r._d=!0,r}function ur(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:s,propsOptions:[i],slots:l,attrs:a,emit:c,render:u,renderCache:d,data:p,setupState:_,ctx:b,inheritAttrs:I}=e;let R,g;const y=Fn(e);try{if(n.shapeFlag&4){const H=o||r;R=qe(u.call(H,H,d,s,_,p,b)),g=a}else{const H=t;R=qe(H.length>1?H(s,{attrs:a,slots:l,emit:c}):H(s,null)),g=t.props?a:Ta(a)}}catch(H){un.length=0,wn(H,e,1),R=_e(He)}let T=R;if(g&&I!==!1){const H=Object.keys(g),{shapeFlag:q}=T;H.length&&q&7&&(i&&H.some(Vr)&&(g=Sa(g,i)),T=_t(T,g))}return n.dirs&&(T=_t(T),T.dirs=T.dirs?T.dirs.concat(n.dirs):n.dirs),n.transition&&(T.transition=n.transition),R=T,Fn(y),R}const Ta=e=>{let t;for(const n in e)(n==="class"||n==="style"||En(n))&&((t||(t={}))[n]=e[n]);return t},Sa=(e,t)=>{const n={};for(const r in e)(!Vr(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function xa(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:l,patchFlag:a}=t,c=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return r?Lo(r,i,c):!!i;if(a&8){const u=t.dynamicProps;for(let d=0;de.__isSuspense;function fi(e,t){t&&t.pendingBranch?Q(e)?t.effects.push(...e):t.effects.push(e):Ca(e)}function Lt(e,t){if(we){let n=we.provides;const r=we.parent&&we.parent.provides;r===n&&(n=we.provides=Object.create(r)),n[e]=t}}function Pe(e,t,n=!1){const r=we||Se;if(r){const o=r.parent==null?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&X(t)?t.call(r.proxy):t}}const Io={};function gt(e,t,n){return di(e,t,n)}function di(e,t,{immediate:n,deep:r,flush:o,onTrack:s,onTrigger:i}=he){const l=we;let a,c=!1,u=!1;if(Ce(e)?(a=()=>e.value,c=Sr(e)):Ut(e)?(a=()=>e,r=!0):Q(e)?(u=!0,c=e.some(g=>Ut(g)||Sr(g)),a=()=>e.map(g=>{if(Ce(g))return g.value;if(Ut(g))return xt(g);if(X(g))return mt(g,l,2)})):X(e)?t?a=()=>mt(e,l,2):a=()=>{if(!(l&&l.isUnmounted))return d&&d(),Be(e,l,3,[p])}:a=Qe,t&&r){const g=a;a=()=>xt(g())}let d,p=g=>{d=R.onStop=()=>{mt(g,l,4)}};if(Kt)return p=Qe,t?n&&Be(t,l,3,[a(),u?[]:void 0,p]):a(),Qe;let _=u?[]:Io;const b=()=>{if(!!R.active)if(t){const g=R.run();(r||c||(u?g.some((y,T)=>hn(y,_[T])):hn(g,_)))&&(d&&d(),Be(t,l,3,[g,_===Io?void 0:_,p]),_=g)}else R.run()};b.allowRecurse=!!t;let I;o==="sync"?I=b:o==="post"?I=()=>Le(b,l&&l.suspense):I=()=>wa(b);const R=new Yr(a,I);return t?n?b():_=R.run():o==="post"?Le(R.run.bind(R),l&&l.suspense):R.run(),()=>{R.stop(),l&&l.scope&&qr(l.scope.effects,R)}}function La(e,t,n){const r=this.proxy,o=pe(e)?e.includes(".")?hi(r,e):()=>r[e]:e.bind(r,r);let s;X(t)?s=t:(s=t.handler,n=t);const i=we;qt(this);const l=di(o,s.bind(r),n);return i?qt(i):It(),l}function hi(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{xt(n,t)});else if(zs(e))for(const n in e)xt(e[n],t);return e}function Ia(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return st(()=>{e.isMounted=!0}),oo(()=>{e.isUnmounting=!0}),e}const ze=[Function,Array],ka={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ze,onEnter:ze,onAfterEnter:ze,onEnterCancelled:ze,onBeforeLeave:ze,onLeave:ze,onAfterLeave:ze,onLeaveCancelled:ze,onBeforeAppear:ze,onAppear:ze,onAfterAppear:ze,onAppearCancelled:ze},setup(e,{slots:t}){const n=co(),r=Ia();let o;return()=>{const s=t.default&&gi(t.default(),!0);if(!s||!s.length)return;let i=s[0];if(s.length>1){for(const I of s)if(I.type!==He){i=I;break}}const l=ae(e),{mode:a}=l;if(r.isLeaving)return fr(i);const c=ko(i);if(!c)return fr(i);const u=Ar(c,l,r,n);Lr(c,u);const d=n.subTree,p=d&&ko(d);let _=!1;const{getTransitionKey:b}=c.type;if(b){const I=b();o===void 0?o=I:I!==o&&(o=I,_=!0)}if(p&&p.type!==He&&(!Tt(c,p)||_)){const I=Ar(p,l,r,n);if(Lr(p,I),a==="out-in")return r.isLeaving=!0,I.afterLeave=()=>{r.isLeaving=!1,n.update()},fr(i);a==="in-out"&&c.type!==He&&(I.delayLeave=(R,g,y)=>{const T=mi(r,p);T[String(p.key)]=p,R._leaveCb=()=>{g(),R._leaveCb=void 0,delete u.delayedLeave},u.delayedLeave=y})}return i}}},pi=ka;function mi(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Ar(e,t,n,r){const{appear:o,mode:s,persisted:i=!1,onBeforeEnter:l,onEnter:a,onAfterEnter:c,onEnterCancelled:u,onBeforeLeave:d,onLeave:p,onAfterLeave:_,onLeaveCancelled:b,onBeforeAppear:I,onAppear:R,onAfterAppear:g,onAppearCancelled:y}=t,T=String(e.key),H=mi(n,e),q=(m,U)=>{m&&Be(m,r,9,U)},Y=(m,U)=>{const $=U[1];q(m,U),Q(m)?m.every(V=>V.length<=1)&&$():m.length<=1&&$()},S={mode:s,persisted:i,beforeEnter(m){let U=l;if(!n.isMounted)if(o)U=I||l;else return;m._leaveCb&&m._leaveCb(!0);const $=H[T];$&&Tt(e,$)&&$.el._leaveCb&&$.el._leaveCb(),q(U,[m])},enter(m){let U=a,$=c,V=u;if(!n.isMounted)if(o)U=R||a,$=g||c,V=y||u;else return;let w=!1;const N=m._enterCb=L=>{w||(w=!0,L?q(V,[m]):q($,[m]),S.delayedLeave&&S.delayedLeave(),m._enterCb=void 0)};U?Y(U,[m,N]):N()},leave(m,U){const $=String(e.key);if(m._enterCb&&m._enterCb(!0),n.isUnmounting)return U();q(d,[m]);let V=!1;const w=m._leaveCb=N=>{V||(V=!0,U(),N?q(b,[m]):q(_,[m]),m._leaveCb=void 0,H[$]===e&&delete H[$])};H[$]=e,p?Y(p,[m,w]):w()},clone(m){return Ar(m,t,n,r)}};return S}function fr(e){if(Cn(e))return e=_t(e),e.children=null,e}function ko(e){return Cn(e)?e.children?e.children[0]:void 0:e}function Lr(e,t){e.shapeFlag&6&&e.component?Lr(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function gi(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;s!!e.type.__asyncLoader;function be(e){X(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:s,suspensible:i=!0,onError:l}=e;let a=null,c,u=0;const d=()=>(u++,a=null,p()),p=()=>{let _;return a||(_=a=t().catch(b=>{if(b=b instanceof Error?b:new Error(String(b)),l)return new Promise((I,R)=>{l(b,()=>I(d()),()=>R(b),u+1)});throw b}).then(b=>_!==a&&a?a:(b&&(b.__esModule||b[Symbol.toStringTag]==="Module")&&(b=b.default),c=b,b)))};return Ue({name:"AsyncComponentWrapper",__asyncLoader:p,get __asyncResolved(){return c},setup(){const _=we;if(c)return()=>dr(c,_);const b=y=>{a=null,wn(y,_,13,!r)};if(i&&_.suspense||Kt)return p().then(y=>()=>dr(y,_)).catch(y=>(b(y),()=>r?_e(r,{error:y}):null));const I=Oe(!1),R=Oe(),g=Oe(!!o);return o&&setTimeout(()=>{g.value=!1},o),s!=null&&setTimeout(()=>{if(!I.value&&!R.value){const y=new Error(`Async component timed out after ${s}ms.`);b(y),R.value=y}},s),p().then(()=>{I.value=!0,_.parent&&Cn(_.parent.vnode)&&ro(_.parent.update)}).catch(y=>{b(y),R.value=y}),()=>{if(I.value&&c)return dr(c,_);if(R.value&&r)return _e(r,{error:R.value});if(n&&!g.value)return _e(n)}}})}function dr(e,{vnode:{ref:t,props:n,children:r,shapeFlag:o},parent:s}){const i=_e(e,n,r);return i.ref=t,i}const Cn=e=>e.type.__isKeepAlive;function Ma(e,t){vi(e,"a",t)}function Na(e,t){vi(e,"da",t)}function vi(e,t,n=we){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(tr(t,r,n),n){let o=n.parent;for(;o&&o.parent;)Cn(o.parent.vnode)&&Da(r,t,n,o),o=o.parent}}function Da(e,t,n,r){const o=tr(t,e,r,!0);so(()=>{qr(r[t],o)},n)}function tr(e,t,n=we,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;Yt(),qt(n);const l=Be(t,n,e,i);return It(),Jt(),l});return r?o.unshift(s):o.push(s),s}}const ot=e=>(t,n=we)=>(!Kt||e==="sp")&&tr(e,t,n),_i=ot("bm"),st=ot("m"),Ha=ot("bu"),Fa=ot("u"),oo=ot("bum"),so=ot("um"),$a=ot("sp"),za=ot("rtg"),ja=ot("rtc");function Ba(e,t=we){tr("ec",e,t)}function dh(e,t){const n=Se;if(n===null)return e;const r=or(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let s=0;st(i,l,void 0,s&&s[l]));else{const i=Object.keys(e);o=new Array(i.length);for(let l=0,a=i.length;lBn(t)?!(t.type===He||t.type===Ie&&!Ei(t.children)):!0)?e:null}const Ir=e=>e?Di(e)?or(e)||e.proxy:Ir(e.parent):null,$n=Te(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ir(e.parent),$root:e=>Ir(e.root),$emit:e=>e.emit,$options:e=>Ci(e),$forceUpdate:e=>e.f||(e.f=()=>ro(e.update)),$nextTick:e=>e.n||(e.n=Zn.bind(e.proxy)),$watch:e=>La.bind(e)}),Ka={get({_:e},t){const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:l,appContext:a}=e;let c;if(t[0]!=="$"){const _=i[t];if(_!==void 0)switch(_){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(r!==he&&oe(r,t))return i[t]=1,r[t];if(o!==he&&oe(o,t))return i[t]=2,o[t];if((c=e.propsOptions[0])&&oe(c,t))return i[t]=3,s[t];if(n!==he&&oe(n,t))return i[t]=4,n[t];kr&&(i[t]=0)}}const u=$n[t];let d,p;if(u)return t==="$attrs"&&Fe(e,"get",t),u(e);if((d=l.__cssModules)&&(d=d[t]))return d;if(n!==he&&oe(n,t))return i[t]=4,n[t];if(p=a.config.globalProperties,oe(p,t))return p[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return o!==he&&oe(o,t)?(o[t]=n,!0):r!==he&&oe(r,t)?(r[t]=n,!0):oe(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:s}},i){let l;return!!n[i]||e!==he&&oe(e,i)||t!==he&&oe(t,i)||(l=s[0])&&oe(l,i)||oe(r,i)||oe($n,i)||oe(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:oe(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let kr=!0;function Wa(e){const t=Ci(e),n=e.proxy,r=e.ctx;kr=!1,t.beforeCreate&&No(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:l,provide:a,inject:c,created:u,beforeMount:d,mounted:p,beforeUpdate:_,updated:b,activated:I,deactivated:R,beforeDestroy:g,beforeUnmount:y,destroyed:T,unmounted:H,render:q,renderTracked:Y,renderTriggered:S,errorCaptured:m,serverPrefetch:U,expose:$,inheritAttrs:V,components:w,directives:N,filters:L}=t;if(c&&Qa(c,r,null,e.appContext.config.unwrapInjectedRef),i)for(const Z in i){const te=i[Z];X(te)&&(r[Z]=te.bind(n))}if(o){const Z=o.call(n,n);Ee(Z)&&(e.data=Gt(Z))}if(kr=!0,s)for(const Z in s){const te=s[Z],ye=X(te)?te.bind(n,n):X(te.get)?te.get.bind(n,n):Qe,xe=!X(te)&&X(te.set)?te.set.bind(n):Qe,ke=ge({get:ye,set:xe});Object.defineProperty(r,Z,{enumerable:!0,configurable:!0,get:()=>ke.value,set:$e=>ke.value=$e})}if(l)for(const Z in l)wi(l[Z],r,n,Z);if(a){const Z=X(a)?a.call(n):a;Reflect.ownKeys(Z).forEach(te=>{Lt(te,Z[te])})}u&&No(u,e,"c");function F(Z,te){Q(te)?te.forEach(ye=>Z(ye.bind(n))):te&&Z(te.bind(n))}if(F(_i,d),F(st,p),F(Ha,_),F(Fa,b),F(Ma,I),F(Na,R),F(Ba,m),F(ja,Y),F(za,S),F(oo,y),F(so,H),F($a,U),Q($))if($.length){const Z=e.exposed||(e.exposed={});$.forEach(te=>{Object.defineProperty(Z,te,{get:()=>n[te],set:ye=>n[te]=ye})})}else e.exposed||(e.exposed={});q&&e.render===Qe&&(e.render=q),V!=null&&(e.inheritAttrs=V),w&&(e.components=w),N&&(e.directives=N)}function Qa(e,t,n=Qe,r=!1){Q(e)&&(e=Mr(e));for(const o in e){const s=e[o];let i;Ee(s)?"default"in s?i=Pe(s.from||o,s.default,!0):i=Pe(s.from||o):i=Pe(s),Ce(i)&&r?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>i.value,set:l=>i.value=l}):t[o]=i}}function No(e,t,n){Be(Q(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function wi(e,t,n,r){const o=r.includes(".")?hi(n,r):()=>n[r];if(pe(e)){const s=t[e];X(s)&>(o,s)}else if(X(e))gt(o,e.bind(n));else if(Ee(e))if(Q(e))e.forEach(s=>wi(s,t,n,r));else{const s=X(e.handler)?e.handler.bind(n):t[e.handler];X(s)&>(o,s,e)}}function Ci(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,l=s.get(t);let a;return l?a=l:!o.length&&!n&&!r?a=t:(a={},o.length&&o.forEach(c=>zn(a,c,i,!0)),zn(a,t,i)),s.set(t,a),a}function zn(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&zn(e,s,n,!0),o&&o.forEach(i=>zn(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=Ya[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Ya={data:Do,props:Ct,emits:Ct,methods:Ct,computed:Ct,beforeCreate:Re,created:Re,beforeMount:Re,mounted:Re,beforeUpdate:Re,updated:Re,beforeDestroy:Re,beforeUnmount:Re,destroyed:Re,unmounted:Re,activated:Re,deactivated:Re,errorCaptured:Re,serverPrefetch:Re,components:Ct,directives:Ct,watch:Ga,provide:Do,inject:Ja};function Do(e,t){return t?e?function(){return Te(X(e)?e.call(this,this):e,X(t)?t.call(this,this):t)}:t:e}function Ja(e,t){return Ct(Mr(e),Mr(t))}function Mr(e){if(Q(e)){const t={};for(let n=0;n0)&&!(i&16)){if(i&8){const u=e.vnode.dynamicProps;for(let d=0;d{a=!0;const[p,_]=Pi(d,t,!0);Te(i,p),_&&l.push(..._)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!s&&!a)return r.set(e,jt),jt;if(Q(s))for(let u=0;u-1,_[1]=I<0||b-1||oe(_,"default"))&&l.push(d)}}}const c=[i,l];return r.set(e,c),c}function Ho(e){return e[0]!=="$"}function Fo(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function $o(e,t){return Fo(e)===Fo(t)}function zo(e,t){return Q(t)?t.findIndex(n=>$o(n,e)):X(t)&&$o(t,e)?0:-1}const Ti=e=>e[0]==="_"||e==="$stable",io=e=>Q(e)?e.map(qe):[qe(e)],ec=(e,t,n)=>{if(t._n)return t;const r=Pa((...o)=>io(t(...o)),n);return r._c=!1,r},Si=(e,t,n)=>{const r=e._ctx;for(const o in e){if(Ti(o))continue;const s=e[o];if(X(s))t[o]=ec(o,s,r);else if(s!=null){const i=io(s);t[o]=()=>i}}},xi=(e,t)=>{const n=io(t);e.slots.default=()=>n},tc=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=ae(t),Nn(t,"_",n)):Si(t,e.slots={})}else e.slots={},t&&xi(e,t);Nn(e.slots,rr,1)},nc=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=he;if(r.shapeFlag&32){const l=t._;l?n&&l===1?s=!1:(Te(o,t),!n&&l===1&&delete o._):(s=!t.$stable,Si(t,o)),i=t}else t&&(xi(e,t),i={default:1});if(s)for(const l in o)!Ti(l)&&!(l in i)&&delete o[l]};function Ri(){return{app:null,config:{isNativeTag:Al,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let rc=0;function oc(e,t){return function(r,o=null){X(r)||(r=Object.assign({},r)),o!=null&&!Ee(o)&&(o=null);const s=Ri(),i=new Set;let l=!1;const a=s.app={_uid:rc++,_component:r,_props:o,_container:null,_context:s,_instance:null,version:Cc,get config(){return s.config},set config(c){},use(c,...u){return i.has(c)||(c&&X(c.install)?(i.add(c),c.install(a,...u)):X(c)&&(i.add(c),c(a,...u))),a},mixin(c){return s.mixins.includes(c)||s.mixins.push(c),a},component(c,u){return u?(s.components[c]=u,a):s.components[c]},directive(c,u){return u?(s.directives[c]=u,a):s.directives[c]},mount(c,u,d){if(!l){const p=_e(r,o);return p.appContext=s,u&&t?t(p,c):e(p,c,d),l=!0,a._container=c,c.__vue_app__=a,or(p.component)||p.component.proxy}},unmount(){l&&(e(null,a._container),delete a._container.__vue_app__)},provide(c,u){return s.provides[c]=u,a}};return a}}function jn(e,t,n,r,o=!1){if(Q(e)){e.forEach((p,_)=>jn(p,t&&(Q(t)?t[_]:t),n,r,o));return}if(Vt(r)&&!o)return;const s=r.shapeFlag&4?or(r.component)||r.component.proxy:r.el,i=o?null:s,{i:l,r:a}=e,c=t&&t.r,u=l.refs===he?l.refs={}:l.refs,d=l.setupState;if(c!=null&&c!==a&&(pe(c)?(u[c]=null,oe(d,c)&&(d[c]=null)):Ce(c)&&(c.value=null)),X(a))mt(a,l,12,[i,u]);else{const p=pe(a),_=Ce(a);if(p||_){const b=()=>{if(e.f){const I=p?u[a]:a.value;o?Q(I)&&qr(I,s):Q(I)?I.includes(s)||I.push(s):p?(u[a]=[s],oe(d,a)&&(d[a]=u[a])):(a.value=[s],e.k&&(u[e.k]=a.value))}else p?(u[a]=i,oe(d,a)&&(d[a]=i)):_&&(a.value=i,e.k&&(u[e.k]=i))};i?(b.id=-1,Le(b,n)):b()}}}let lt=!1;const Rn=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",An=e=>e.nodeType===8;function sc(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:s,parentNode:i,remove:l,insert:a,createComment:c}}=e,u=(g,y)=>{if(!y.hasChildNodes()){n(null,g,y),Hn(),y._vnode=g;return}lt=!1,d(y.firstChild,g,null,null,null),Hn(),y._vnode=g,lt&&console.error("Hydration completed but contains mismatches.")},d=(g,y,T,H,q,Y=!1)=>{const S=An(g)&&g.data==="[",m=()=>I(g,y,T,H,q,S),{type:U,ref:$,shapeFlag:V,patchFlag:w}=y,N=g.nodeType;y.el=g,w===-2&&(Y=!1,y.dynamicChildren=null);let L=null;switch(U){case vn:N!==3?y.children===""?(a(y.el=o(""),i(g),g),L=g):L=m():(g.data!==y.children&&(lt=!0,g.data=y.children),L=s(g));break;case He:N!==8||S?L=m():L=s(g);break;case cn:if(N!==1&&N!==3)L=m();else{L=g;const ne=!y.children.length;for(let F=0;F{Y=Y||!!y.dynamicChildren;const{type:S,props:m,patchFlag:U,shapeFlag:$,dirs:V}=y,w=S==="input"&&V||S==="option";if(w||U!==-1){if(V&&Ge(y,null,T,"created"),m)if(w||!Y||U&48)for(const L in m)(w&&L.endsWith("value")||En(L)&&!sn(L))&&r(g,L,null,m[L],!1,void 0,T);else m.onClick&&r(g,"onClick",null,m.onClick,!1,void 0,T);let N;if((N=m&&m.onVnodeBeforeMount)&&je(N,T,y),V&&Ge(y,null,T,"beforeMount"),((N=m&&m.onVnodeMounted)||V)&&fi(()=>{N&&je(N,T,y),V&&Ge(y,null,T,"mounted")},H),$&16&&!(m&&(m.innerHTML||m.textContent))){let L=_(g.firstChild,y,g,T,H,q,Y);for(;L;){lt=!0;const ne=L;L=L.nextSibling,l(ne)}}else $&8&&g.textContent!==y.children&&(lt=!0,g.textContent=y.children)}return g.nextSibling},_=(g,y,T,H,q,Y,S)=>{S=S||!!y.dynamicChildren;const m=y.children,U=m.length;for(let $=0;${const{slotScopeIds:S}=y;S&&(q=q?q.concat(S):S);const m=i(g),U=_(s(g),y,m,T,H,q,Y);return U&&An(U)&&U.data==="]"?s(y.anchor=U):(lt=!0,a(y.anchor=c("]"),m,U),U)},I=(g,y,T,H,q,Y)=>{if(lt=!0,y.el=null,Y){const U=R(g);for(;;){const $=s(g);if($&&$!==U)l($);else break}}const S=s(g),m=i(g);return l(g),n(null,y,m,S,T,H,Rn(m),q),S},R=g=>{let y=0;for(;g;)if(g=s(g),g&&An(g)&&(g.data==="["&&y++,g.data==="]")){if(y===0)return s(g);y--}return g};return[u,d]}const Le=fi;function ic(e){return lc(e,sc)}function lc(e,t){const n=Dl();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:l,createComment:a,setText:c,setElementText:u,parentNode:d,nextSibling:p,setScopeId:_=Qe,cloneNode:b,insertStaticContent:I}=e,R=(f,h,v,O=null,C=null,x=null,D=!1,A=null,M=!!h.dynamicChildren)=>{if(f===h)return;f&&!Tt(f,h)&&(O=j(f),Ae(f,C,x,!0),f=null),h.patchFlag===-2&&(M=!1,h.dynamicChildren=null);const{type:P,ref:K,shapeFlag:B}=h;switch(P){case vn:g(f,h,v,O);break;case He:y(f,h,v,O);break;case cn:f==null&&T(h,v,O,D);break;case Ie:N(f,h,v,O,C,x,D,A,M);break;default:B&1?Y(f,h,v,O,C,x,D,A,M):B&6?L(f,h,v,O,C,x,D,A,M):(B&64||B&128)&&P.process(f,h,v,O,C,x,D,A,M,ue)}K!=null&&C&&jn(K,f&&f.ref,x,h||f,!h)},g=(f,h,v,O)=>{if(f==null)r(h.el=l(h.children),v,O);else{const C=h.el=f.el;h.children!==f.children&&c(C,h.children)}},y=(f,h,v,O)=>{f==null?r(h.el=a(h.children||""),v,O):h.el=f.el},T=(f,h,v,O)=>{[f.el,f.anchor]=I(f.children,h,v,O,f.el,f.anchor)},H=({el:f,anchor:h},v,O)=>{let C;for(;f&&f!==h;)C=p(f),r(f,v,O),f=C;r(h,v,O)},q=({el:f,anchor:h})=>{let v;for(;f&&f!==h;)v=p(f),o(f),f=v;o(h)},Y=(f,h,v,O,C,x,D,A,M)=>{D=D||h.type==="svg",f==null?S(h,v,O,C,x,D,A,M):$(f,h,C,x,D,A,M)},S=(f,h,v,O,C,x,D,A)=>{let M,P;const{type:K,props:B,shapeFlag:W,transition:G,patchFlag:se,dirs:fe}=f;if(f.el&&b!==void 0&&se===-1)M=f.el=b(f.el);else{if(M=f.el=i(f.type,x,B&&B.is,B),W&8?u(M,f.children):W&16&&U(f.children,M,null,O,C,x&&K!=="foreignObject",D,A),fe&&Ge(f,null,O,"created"),B){for(const me in B)me!=="value"&&!sn(me)&&s(M,me,null,B[me],x,f.children,O,C,k);"value"in B&&s(M,"value",null,B.value),(P=B.onVnodeBeforeMount)&&je(P,O,f)}m(M,f,f.scopeId,D,O)}fe&&Ge(f,null,O,"beforeMount");const de=(!C||C&&!C.pendingBranch)&&G&&!G.persisted;de&&G.beforeEnter(M),r(M,h,v),((P=B&&B.onVnodeMounted)||de||fe)&&Le(()=>{P&&je(P,O,f),de&&G.enter(M),fe&&Ge(f,null,O,"mounted")},C)},m=(f,h,v,O,C)=>{if(v&&_(f,v),O)for(let x=0;x{for(let P=M;P{const A=h.el=f.el;let{patchFlag:M,dynamicChildren:P,dirs:K}=h;M|=f.patchFlag&16;const B=f.props||he,W=h.props||he;let G;v&&bt(v,!1),(G=W.onVnodeBeforeUpdate)&&je(G,v,h,f),K&&Ge(h,f,v,"beforeUpdate"),v&&bt(v,!0);const se=C&&h.type!=="foreignObject";if(P?V(f.dynamicChildren,P,A,v,O,se,x):D||ye(f,h,A,null,v,O,se,x,!1),M>0){if(M&16)w(A,h,B,W,v,O,C);else if(M&2&&B.class!==W.class&&s(A,"class",null,W.class,C),M&4&&s(A,"style",B.style,W.style,C),M&8){const fe=h.dynamicProps;for(let de=0;de{G&&je(G,v,h,f),K&&Ge(h,f,v,"updated")},O)},V=(f,h,v,O,C,x,D)=>{for(let A=0;A{if(v!==O){for(const A in O){if(sn(A))continue;const M=O[A],P=v[A];M!==P&&A!=="value"&&s(f,A,P,M,D,h.children,C,x,k)}if(v!==he)for(const A in v)!sn(A)&&!(A in O)&&s(f,A,v[A],null,D,h.children,C,x,k);"value"in O&&s(f,"value",v.value,O.value)}},N=(f,h,v,O,C,x,D,A,M)=>{const P=h.el=f?f.el:l(""),K=h.anchor=f?f.anchor:l("");let{patchFlag:B,dynamicChildren:W,slotScopeIds:G}=h;G&&(A=A?A.concat(G):G),f==null?(r(P,v,O),r(K,v,O),U(h.children,v,K,C,x,D,A,M)):B>0&&B&64&&W&&f.dynamicChildren?(V(f.dynamicChildren,W,v,C,x,D,A),(h.key!=null||C&&h===C.subTree)&&Ai(f,h,!0)):ye(f,h,v,K,C,x,D,A,M)},L=(f,h,v,O,C,x,D,A,M)=>{h.slotScopeIds=A,f==null?h.shapeFlag&512?C.ctx.activate(h,v,O,D,M):ne(h,v,O,C,x,D,M):F(f,h,M)},ne=(f,h,v,O,C,x,D)=>{const A=f.component=gc(f,O,C);if(Cn(f)&&(A.ctx.renderer=ue),vc(A),A.asyncDep){if(C&&C.registerDep(A,Z),!f.el){const M=A.subTree=_e(He);y(null,M,h,v)}return}Z(A,f,h,v,C,x,D)},F=(f,h,v)=>{const O=h.component=f.component;if(xa(f,h,v))if(O.asyncDep&&!O.asyncResolved){te(O,h,v);return}else O.next=h,Ea(O.update),O.update();else h.el=f.el,O.vnode=h},Z=(f,h,v,O,C,x,D)=>{const A=()=>{if(f.isMounted){let{next:K,bu:B,u:W,parent:G,vnode:se}=f,fe=K,de;bt(f,!1),K?(K.el=se.el,te(f,K,D)):K=se,B&&cr(B),(de=K.props&&K.props.onVnodeBeforeUpdate)&&je(de,G,K,se),bt(f,!0);const me=ur(f),Ve=f.subTree;f.subTree=me,R(Ve,me,d(Ve.el),j(Ve),f,C,x),K.el=me.el,fe===null&&Ra(f,me.el),W&&Le(W,C),(de=K.props&&K.props.onVnodeUpdated)&&Le(()=>je(de,G,K,se),C)}else{let K;const{el:B,props:W}=h,{bm:G,m:se,parent:fe}=f,de=Vt(h);if(bt(f,!1),G&&cr(G),!de&&(K=W&&W.onVnodeBeforeMount)&&je(K,fe,h),bt(f,!0),B&&J){const me=()=>{f.subTree=ur(f),J(B,f.subTree,f,C,null)};de?h.type.__asyncLoader().then(()=>!f.isUnmounted&&me()):me()}else{const me=f.subTree=ur(f);R(null,me,v,O,f,C,x),h.el=me.el}if(se&&Le(se,C),!de&&(K=W&&W.onVnodeMounted)){const me=h;Le(()=>je(K,fe,me),C)}(h.shapeFlag&256||fe&&Vt(fe.vnode)&&fe.vnode.shapeFlag&256)&&f.a&&Le(f.a,C),f.isMounted=!0,h=v=O=null}},M=f.effect=new Yr(A,()=>ro(P),f.scope),P=f.update=()=>M.run();P.id=f.uid,bt(f,!0),P()},te=(f,h,v)=>{h.component=f;const O=f.vnode.props;f.vnode=h,f.next=null,Xa(f,h.props,O,v),nc(f,h.children,v),Yt(),Xn(void 0,f.update),Jt()},ye=(f,h,v,O,C,x,D,A,M=!1)=>{const P=f&&f.children,K=f?f.shapeFlag:0,B=h.children,{patchFlag:W,shapeFlag:G}=h;if(W>0){if(W&128){ke(P,B,v,O,C,x,D,A,M);return}else if(W&256){xe(P,B,v,O,C,x,D,A,M);return}}G&8?(K&16&&k(P,C,x),B!==P&&u(v,B)):K&16?G&16?ke(P,B,v,O,C,x,D,A,M):k(P,C,x,!0):(K&8&&u(v,""),G&16&&U(B,v,O,C,x,D,A,M))},xe=(f,h,v,O,C,x,D,A,M)=>{f=f||jt,h=h||jt;const P=f.length,K=h.length,B=Math.min(P,K);let W;for(W=0;WK?k(f,C,x,!0,!1,B):U(h,v,O,C,x,D,A,M,B)},ke=(f,h,v,O,C,x,D,A,M)=>{let P=0;const K=h.length;let B=f.length-1,W=K-1;for(;P<=B&&P<=W;){const G=f[P],se=h[P]=M?ft(h[P]):qe(h[P]);if(Tt(G,se))R(G,se,v,null,C,x,D,A,M);else break;P++}for(;P<=B&&P<=W;){const G=f[B],se=h[W]=M?ft(h[W]):qe(h[W]);if(Tt(G,se))R(G,se,v,null,C,x,D,A,M);else break;B--,W--}if(P>B){if(P<=W){const G=W+1,se=GW)for(;P<=B;)Ae(f[P],C,x,!0),P++;else{const G=P,se=P,fe=new Map;for(P=se;P<=W;P++){const Me=h[P]=M?ft(h[P]):qe(h[P]);Me.key!=null&&fe.set(Me.key,P)}let de,me=0;const Ve=W-se+1;let Nt=!1,yo=0;const Zt=new Array(Ve);for(P=0;P=Ve){Ae(Me,C,x,!0);continue}let Je;if(Me.key!=null)Je=fe.get(Me.key);else for(de=se;de<=W;de++)if(Zt[de-se]===0&&Tt(Me,h[de])){Je=de;break}Je===void 0?Ae(Me,C,x,!0):(Zt[Je-se]=P+1,Je>=yo?yo=Je:Nt=!0,R(Me,h[Je],v,null,C,x,D,A,M),me++)}const bo=Nt?ac(Zt):jt;for(de=bo.length-1,P=Ve-1;P>=0;P--){const Me=se+P,Je=h[Me],Eo=Me+1{const{el:x,type:D,transition:A,children:M,shapeFlag:P}=f;if(P&6){$e(f.component.subTree,h,v,O);return}if(P&128){f.suspense.move(h,v,O);return}if(P&64){D.move(f,h,v,ue);return}if(D===Ie){r(x,h,v);for(let B=0;BA.enter(x),C);else{const{leave:B,delayLeave:W,afterLeave:G}=A,se=()=>r(x,h,v),fe=()=>{B(x,()=>{se(),G&&G()})};W?W(x,se,fe):fe()}else r(x,h,v)},Ae=(f,h,v,O=!1,C=!1)=>{const{type:x,props:D,ref:A,children:M,dynamicChildren:P,shapeFlag:K,patchFlag:B,dirs:W}=f;if(A!=null&&jn(A,null,v,f,!0),K&256){h.ctx.deactivate(f);return}const G=K&1&&W,se=!Vt(f);let fe;if(se&&(fe=D&&D.onVnodeBeforeUnmount)&&je(fe,h,f),K&6)z(f.component,v,O);else{if(K&128){f.suspense.unmount(v,O);return}G&&Ge(f,null,h,"beforeUnmount"),K&64?f.type.remove(f,h,v,C,ue,O):P&&(x!==Ie||B>0&&B&64)?k(P,h,v,!1,!0):(x===Ie&&B&384||!C&&K&16)&&k(M,h,v),O&&yt(f)}(se&&(fe=D&&D.onVnodeUnmounted)||G)&&Le(()=>{fe&&je(fe,h,f),G&&Ge(f,null,h,"unmounted")},v)},yt=f=>{const{type:h,el:v,anchor:O,transition:C}=f;if(h===Ie){E(v,O);return}if(h===cn){q(f);return}const x=()=>{o(v),C&&!C.persisted&&C.afterLeave&&C.afterLeave()};if(f.shapeFlag&1&&C&&!C.persisted){const{leave:D,delayLeave:A}=C,M=()=>D(v,x);A?A(f.el,x,M):M()}else x()},E=(f,h)=>{let v;for(;f!==h;)v=p(f),o(f),f=v;o(h)},z=(f,h,v)=>{const{bum:O,scope:C,update:x,subTree:D,um:A}=f;O&&cr(O),C.stop(),x&&(x.active=!1,Ae(D,f,h,v)),A&&Le(A,h),Le(()=>{f.isUnmounted=!0},h),h&&h.pendingBranch&&!h.isUnmounted&&f.asyncDep&&!f.asyncResolved&&f.suspenseId===h.pendingId&&(h.deps--,h.deps===0&&h.resolve())},k=(f,h,v,O=!1,C=!1,x=0)=>{for(let D=x;Df.shapeFlag&6?j(f.component.subTree):f.shapeFlag&128?f.suspense.next():p(f.anchor||f.el),le=(f,h,v)=>{f==null?h._vnode&&Ae(h._vnode,null,null,!0):R(h._vnode||null,f,h,null,null,null,v),Hn(),h._vnode=f},ue={p:R,um:Ae,m:$e,r:yt,mt:ne,mc:U,pc:ye,pbc:V,n:j,o:e};let ee,J;return t&&([ee,J]=t(ue)),{render:le,hydrate:ee,createApp:oc(le,ee)}}function bt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Ai(e,t,n=!1){const r=e.children,o=t.children;if(Q(r)&&Q(o))for(let s=0;s>1,e[n[l]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,i=n[s-1];s-- >0;)n[s]=i,i=t[i];return n}const cc=e=>e.__isTeleport,Ie=Symbol(void 0),vn=Symbol(void 0),He=Symbol(void 0),cn=Symbol(void 0),un=[];let We=null;function nr(e=!1){un.push(We=e?null:[])}function uc(){un.pop(),We=un[un.length-1]||null}let _n=1;function jo(e){_n+=e}function Li(e){return e.dynamicChildren=_n>0?We||jt:null,uc(),_n>0&&We&&We.push(e),e}function Ii(e,t,n,r,o,s){return Li(Ni(e,t,n,r,o,s,!0))}function ki(e,t,n,r,o){return Li(_e(e,t,n,r,o,!0))}function Bn(e){return e?e.__v_isVNode===!0:!1}function Tt(e,t){return e.type===t.type&&e.key===t.key}const rr="__vInternal",Mi=({key:e})=>e!=null?e:null,kn=({ref:e,ref_key:t,ref_for:n})=>e!=null?pe(e)||Ce(e)||X(e)?{i:Se,r:e,k:t,f:!!n}:e:null;function Ni(e,t=null,n=null,r=0,o=null,s=e===Ie?0:1,i=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Mi(t),ref:t&&kn(t),scopeId:ui,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null};return l?(ao(a,n),s&128&&e.normalize(a)):n&&(a.shapeFlag|=pe(n)?8:16),_n>0&&!i&&We&&(a.patchFlag>0||s&6)&&a.patchFlag!==32&&We.push(a),a}const _e=fc;function fc(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===Va)&&(e=He),Bn(e)){const l=_t(e,t,!0);return n&&ao(l,n),_n>0&&!s&&We&&(l.shapeFlag&6?We[We.indexOf(e)]=l:We.push(l)),l.patchFlag|=-2,l}if(wc(e)&&(e=e.__vccOpts),t){t=dc(t);let{class:l,style:a}=t;l&&!pe(l)&&(t.class=bn(l)),Ee(a)&&(Zs(a)&&!Q(a)&&(a=Te({},a)),t.style=Wn(a))}const i=pe(e)?1:Aa(e)?128:cc(e)?64:Ee(e)?4:X(e)?2:0;return Ni(e,t,n,r,o,i,s,!0)}function dc(e){return e?Zs(e)||rr in e?Te({},e):e:null}function _t(e,t,n=!1){const{props:r,ref:o,patchFlag:s,children:i}=e,l=t?hc(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Mi(l),ref:t&&t.ref?n&&o?Q(o)?o.concat(kn(t)):[o,kn(t)]:kn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ie?s===-1?16:s|16:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&_t(e.ssContent),ssFallback:e.ssFallback&&_t(e.ssFallback),el:e.el,anchor:e.anchor}}function lo(e=" ",t=0){return _e(vn,null,e,t)}function ph(e,t){const n=_e(cn,null,e);return n.staticCount=t,n}function mh(e="",t=!1){return t?(nr(),ki(He,null,e)):_e(He,null,e)}function qe(e){return e==null||typeof e=="boolean"?_e(He):Q(e)?_e(Ie,null,e.slice()):typeof e=="object"?ft(e):_e(vn,null,String(e))}function ft(e){return e.el===null||e.memo?e:_t(e)}function ao(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(Q(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),ao(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(rr in t)?t._ctx=Se:o===3&&Se&&(Se.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else X(t)?(t={default:t,_ctx:Se},n=32):(t=String(t),r&64?(n=16,t=[lo(t)]):n=8);e.children=t,e.shapeFlag|=n}function hc(...e){const t={};for(let n=0;nwe||Se,qt=e=>{we=e,e.scope.on()},It=()=>{we&&we.scope.off(),we=null};function Di(e){return e.vnode.shapeFlag&4}let Kt=!1;function vc(e,t=!1){Kt=t;const{props:n,children:r}=e.vnode,o=Di(e);Za(e,n,o,t),tc(e,r);const s=o?_c(e,t):void 0;return Kt=!1,s}function _c(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Xs(new Proxy(e.ctx,Ka));const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?bc(e):null;qt(e),Yt();const s=mt(r,e,0,[e.props,o]);if(Jt(),It(),Fs(s)){if(s.then(It,It),t)return s.then(i=>{Bo(e,i,t)}).catch(i=>{wn(i,e,0)});e.asyncDep=s}else Bo(e,s,t)}else Hi(e,t)}function Bo(e,t,n){X(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Ee(t)&&(e.setupState=oi(t)),Hi(e,n)}let Uo;function Hi(e,t,n){const r=e.type;if(!e.render){if(!t&&Uo&&!r.render){const o=r.template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:a}=r,c=Te(Te({isCustomElement:s,delimiters:l},i),a);r.render=Uo(o,c)}}e.render=r.render||Qe}qt(e),Yt(),Wa(e),Jt(),It()}function yc(e){return new Proxy(e.attrs,{get(t,n){return Fe(e,"get","$attrs"),t[n]}})}function bc(e){const t=r=>{e.exposed=r||{}};let n;return{get attrs(){return n||(n=yc(e))},slots:e.slots,emit:e.emit,expose:t}}function or(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(oi(Xs(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in $n)return $n[n](e)}}))}function Ec(e,t=!0){return X(e)?e.displayName||e.name:e.name||t&&e.__name}function wc(e){return X(e)&&"__vccOpts"in e}const ge=(e,t)=>_a(e,t,Kt);function ve(e,t,n){const r=arguments.length;return r===2?Ee(t)&&!Q(t)?Bn(t)?_e(e,null,[t]):_e(e,t):_e(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Bn(n)&&(n=[n]),_e(e,t,n))}const Cc="3.2.37",Oc="http://www.w3.org/2000/svg",St=typeof document<"u"?document:null,Vo=St&&St.createElement("template"),Pc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?St.createElementNS(Oc,e):St.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>St.createTextNode(e),createComment:e=>St.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>St.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{Vo.innerHTML=r?`${e}`:e;const l=Vo.content;if(r){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function Tc(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Sc(e,t,n){const r=e.style,o=pe(n);if(n&&!o){for(const s in n)Dr(r,s,n[s]);if(t&&!pe(t))for(const s in t)n[s]==null&&Dr(r,s,"")}else{const s=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=s)}}const qo=/\s*!important$/;function Dr(e,t,n){if(Q(n))n.forEach(r=>Dr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=xc(e,t);qo.test(n)?e.setProperty(kt(r),n.replace(qo,""),"important"):e[r]=n}}const Ko=["Webkit","Moz","ms"],hr={};function xc(e,t){const n=hr[t];if(n)return n;let r=Ze(t);if(r!=="filter"&&r in e)return hr[t]=r;r=Jn(r);for(let o=0;o{let e=Date.now,t=!1;if(typeof window<"u"){Date.now()>document.createEvent("Event").timeStamp&&(e=performance.now.bind(performance));const n=navigator.userAgent.match(/firefox\/(\d+)/i);t=!!(n&&Number(n[1])<=53)}return[e,t]})();let Hr=0;const Ic=Promise.resolve(),kc=()=>{Hr=0},Mc=()=>Hr||(Ic.then(kc),Hr=Fi());function Nc(e,t,n,r){e.addEventListener(t,n,r)}function Dc(e,t,n,r){e.removeEventListener(t,n,r)}function Hc(e,t,n,r,o=null){const s=e._vei||(e._vei={}),i=s[t];if(r&&i)i.value=r;else{const[l,a]=Fc(t);if(r){const c=s[t]=$c(r,o);Nc(e,l,c,a)}else i&&(Dc(e,l,i,a),s[t]=void 0)}}const Qo=/(?:Once|Passive|Capture)$/;function Fc(e){let t;if(Qo.test(e)){t={};let n;for(;n=e.match(Qo);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[kt(e.slice(2)),t]}function $c(e,t){const n=r=>{const o=r.timeStamp||Fi();(Lc||o>=n.attached-1)&&Be(zc(r,n.value),t,5,[r])};return n.value=e,n.attached=Mc(),n}function zc(e,t){if(Q(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Yo=/^on[a-z]/,jc=(e,t,n,r,o=!1,s,i,l,a)=>{t==="class"?Tc(e,r,o):t==="style"?Sc(e,n,r):En(t)?Vr(t)||Hc(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Bc(e,t,r,o))?Ac(e,t,r,s,i,l,a):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Rc(e,t,r,o))};function Bc(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&Yo.test(t)&&X(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||Yo.test(t)&&pe(n)?!1:t in e}const at="transition",Xt="animation",uo=(e,{slots:t})=>ve(pi,Uc(e),t);uo.displayName="Transition";const $i={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};uo.props=Te({},pi.props,$i);const Et=(e,t=[])=>{Q(e)?e.forEach(n=>n(...t)):e&&e(...t)},Jo=e=>e?Q(e)?e.some(t=>t.length>1):e.length>1:!1;function Uc(e){const t={};for(const w in e)w in $i||(t[w]=e[w]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:c=i,appearToClass:u=l,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,b=Vc(o),I=b&&b[0],R=b&&b[1],{onBeforeEnter:g,onEnter:y,onEnterCancelled:T,onLeave:H,onLeaveCancelled:q,onBeforeAppear:Y=g,onAppear:S=y,onAppearCancelled:m=T}=t,U=(w,N,L)=>{wt(w,N?u:l),wt(w,N?c:i),L&&L()},$=(w,N)=>{w._isLeaving=!1,wt(w,d),wt(w,_),wt(w,p),N&&N()},V=w=>(N,L)=>{const ne=w?S:y,F=()=>U(N,w,L);Et(ne,[N,F]),Go(()=>{wt(N,w?a:s),ct(N,w?u:l),Jo(ne)||Zo(N,r,I,F)})};return Te(t,{onBeforeEnter(w){Et(g,[w]),ct(w,s),ct(w,i)},onBeforeAppear(w){Et(Y,[w]),ct(w,a),ct(w,c)},onEnter:V(!1),onAppear:V(!0),onLeave(w,N){w._isLeaving=!0;const L=()=>$(w,N);ct(w,d),Wc(),ct(w,p),Go(()=>{!w._isLeaving||(wt(w,d),ct(w,_),Jo(H)||Zo(w,r,R,L))}),Et(H,[w,L])},onEnterCancelled(w){U(w,!1),Et(T,[w])},onAppearCancelled(w){U(w,!0),Et(m,[w])},onLeaveCancelled(w){$(w),Et(q,[w])}})}function Vc(e){if(e==null)return null;if(Ee(e))return[pr(e.enter),pr(e.leave)];{const t=pr(e);return[t,t]}}function pr(e){return js(e)}function ct(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function wt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function Go(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let qc=0;function Zo(e,t,n,r){const o=e._endId=++qc,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=Kc(e,t);if(!i)return r();const c=i+"end";let u=0;const d=()=>{e.removeEventListener(c,p),s()},p=_=>{_.target===e&&++u>=a&&d()};setTimeout(()=>{u(n[b]||"").split(", "),o=r(at+"Delay"),s=r(at+"Duration"),i=Xo(o,s),l=r(Xt+"Delay"),a=r(Xt+"Duration"),c=Xo(l,a);let u=null,d=0,p=0;t===at?i>0&&(u=at,d=i,p=s.length):t===Xt?c>0&&(u=Xt,d=c,p=a.length):(d=Math.max(i,c),u=d>0?i>c?at:Xt:null,p=u?u===at?s.length:a.length:0);const _=u===at&&/\b(transform|all)(,|$)/.test(n[at+"Property"]);return{type:u,timeout:d,propCount:p,hasTransform:_}}function Xo(e,t){for(;e.lengthes(n)+es(e[r])))}function es(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Wc(){return document.body.offsetHeight}const Qc={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},gh=(e,t)=>n=>{if(!("key"in n))return;const r=kt(n.key);if(t.some(o=>o===r||Qc[o]===r))return e(n)},vh={beforeMount(e,{value:t},{transition:n}){e._vod=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):en(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),en(e,!0),r.enter(e)):r.leave(e,()=>{en(e,!1)}):en(e,t))},beforeUnmount(e,{value:t}){en(e,t)}};function en(e,t){e.style.display=t?e._vod:"none"}const Yc=Te({patchProp:jc},Pc);let mr,ts=!1;function Jc(){return mr=ts?mr:ic(Yc),ts=!0,mr}const Gc=(...e)=>{const t=Jc().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=Zc(r);if(o)return n(o,!0,o instanceof SVGElement)},t};function Zc(e){return pe(e)?document.querySelector(e):e}const Xc=JSON.parse('{"base":"/","lang":"en-US","title":"ScoreSaber Wiki","description":"","head":[["link",{"rel":"icon","href":"/favicon.png"}],["meta",{"name":"theme-color","content":"#FDD85E"}]],"locales":{"/":{"lang":"en-US","title":"ScoreSaber Wiki"}}}');var eu=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),tu=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=eu(r);t.has(o)||(t.add(o),n.push(r))}),n},nu=e=>/^(https?:)?\/\//.test(e),_h=e=>/^mailto:/.test(e),yh=e=>/^tel:/.test(e),zi=e=>Object.prototype.toString.call(e)==="[object Object]",ru=e=>e.replace(/\/$/,""),ou=e=>e.replace(/^\//,""),ji=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const s=o.split("/").length-r.split("/").length;return s!==0?s:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"};const Bi={"v-8daa1a0e":be(()=>re(()=>import("./assets/index.html.5df29b4e.js"),[])),"v-408f3862":be(()=>re(()=>import("./assets/about-us.html.fe158ef8.js"),[])),"v-58e1e27c":be(()=>re(()=>import("./assets/beginners-guide.html.adfabb39.js"),[])),"v-092a1d7c":be(()=>re(()=>import("./assets/faq.html.36b5ed8a.js"),[])),"v-0e753d4c":be(()=>re(()=>import("./assets/ranking-system.html.31aa24fd.js"),[])),"v-56476c0a":be(()=>re(()=>import("./assets/rules.html.47234536.js"),[])),"v-1b35bd3b":be(()=>re(()=>import("./assets/how-to-rank-map.html.3d86f824.js"),[])),"v-7d4771f0":be(()=>re(()=>import("./assets/modding-queue-information.html.2963be92.js"),[])),"v-737b7fdb":be(()=>re(()=>import("./assets/qat-guidelines.html.09739e1c.js"),[])),"v-790243e7":be(()=>re(()=>import("./assets/ranking-queue-rules.html.e7dbd40d.js"),[])),"v-355e83f4":be(()=>re(()=>import("./assets/ranking-unban-system-and-terms.html.603acf8c.js"),[])),"v-1d3a639e":be(()=>re(()=>import("./assets/scoresaber-team-information.html.43d159d8.js"),[])),"v-07d4df84":be(()=>re(()=>import("./assets/index.html.6cee2b5e.js"),[])),"v-6b9aed7a":be(()=>re(()=>import("./assets/difficulty-spread-requirements.html.45bbc661.js"),[])),"v-7510c06a":be(()=>re(()=>import("./assets/formatting-and-metadata.html.0e2e2b30.js"),[])),"v-22a4d09d":be(()=>re(()=>import("./assets/mapping-criteria.html.142e54bb.js"),[])),"v-3e479638":be(()=>re(()=>import("./assets/technical-limitations-criteria.html.70c0536c.js"),[])),"v-3706649a":be(()=>re(()=>import("./assets/404.html.eafdd8b4.js"),[]))},su={404:be(()=>re(()=>import("./assets/404.ac109edc.js"),[])),Layout:be(()=>re(()=>import("./assets/Layout.5483b500.js"),[]))};var Ui=Oe(Cl),Vi=Xr({key:"",path:"",title:"",lang:"",frontmatter:{},excerpt:"",headers:[]}),nt=Oe(Vi),sr=()=>nt;import.meta.webpackHot&&(__VUE_HMR_RUNTIME__.updatePageData=e=>{Ui.value[e.key]=()=>Promise.resolve(e),e.key===nt.value.key&&(nt.value=e)});var qi=Symbol(""),iu=()=>{const e=Pe(qi);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},Ki=Symbol(""),lu=()=>{const e=Pe(Ki);if(!e)throw new Error("usePageHead() is called without provider.");return e},au=Symbol(""),Wi=Symbol(""),cu=()=>{const e=Pe(Wi);if(!e)throw new Error("usePageLang() is called without provider.");return e},fo=Symbol(""),uu=()=>{const e=Pe(fo);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},ht=Oe(Xc),fu=()=>ht;import.meta.webpackHot&&(__VUE_HMR_RUNTIME__.updateSiteData=e=>{ht.value=e});var Qi=Symbol(""),bh=()=>{const e=Pe(Qi);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},du=Symbol(""),Ot=Gt({resolvePageData:async e=>{const t=Ui.value[e],n=await(t==null?void 0:t());return n!=null?n:Vi},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const r=pe(t.description)?t.description:n.description,o=[...Q(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return tu(o)},resolvePageHeadTitle:(e,t)=>`${e.title?`${e.title} | `:""}${t.title}`,resolvePageLang:e=>e.lang||"en",resolveRouteLocale:(e,t)=>ji(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),hu=Ue({name:"ClientOnly",setup(e,t){const n=Oe(!1);return st(()=>{n.value=!0}),()=>{var r,o;return n.value?(o=(r=t.slots).default)==null?void 0:o.call(r):null}}}),pu=Ue({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=sr(),n=ge(()=>Bi[e.pageKey||t.value.key]);return()=>n.value?ve(n.value):ve("div","404 Not Found")}}),ns=Ue({name:"Vuepress",setup(){const e=sr(),t=ge(()=>{let n;if(e.value.path){const r=e.value.frontmatter.layout;pe(r)?n=r:n="Layout"}else n="404";return su[n]||Ua(n,!1)});return()=>ve(t.value)}}),mu=e=>nu(e)?e:`${fu().value.base}${ou(e)}`,Mt=e=>e;function Yi(e,t,n){var r,o,s;t===void 0&&(t=50),n===void 0&&(n={});var i=(r=n.isImmediate)!=null&&r,l=(o=n.callback)!=null&&o,a=n.maxWait,c=Date.now(),u=[];function d(){if(a!==void 0){var _=Date.now()-c;if(_+t>=a)return a-_}return t}var p=function(){var _=[].slice.call(arguments),b=this;return new Promise(function(I,R){var g=i&&s===void 0;if(s!==void 0&&clearTimeout(s),s=setTimeout(function(){if(s=void 0,c=Date.now(),!i){var T=e.apply(b,_);l&&l(T),u.forEach(function(H){return(0,H.resolve)(T)}),u=[]}},d()),g){var y=e.apply(b,_);return l&&l(y),I(y)}u.push({resolve:I,reject:R})})};return p.cancel=function(_){s!==void 0&&clearTimeout(s),u.forEach(function(b){return(0,b.reject)(_)}),u=[]},p}/*! + * vue-router v4.1.4 + * (c) 2022 Eduardo San Martin Morote + * @license MIT + */const zt=typeof window<"u";function gu(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const ce=Object.assign;function gr(e,t){const n={};for(const r in t){const o=t[r];n[r]=Ye(o)?o.map(e):e(o)}return n}const fn=()=>{},Ye=Array.isArray,vu=/\/$/,_u=e=>e.replace(vu,"");function vr(e,t,n="/"){let r,o={},s="",i="";const l=t.indexOf("#");let a=t.indexOf("?");return l=0&&(a=-1),a>-1&&(r=t.slice(0,a),s=t.slice(a+1,l>-1?l:t.length),o=e(s)),l>-1&&(r=r||t.slice(0,l),i=t.slice(l,t.length)),r=wu(r!=null?r:t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:i}}function yu(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function rs(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function bu(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&Wt(t.matched[r],n.matched[o])&&Ji(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Wt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Ji(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!Eu(e[n],t[n]))return!1;return!0}function Eu(e,t){return Ye(e)?os(e,t):Ye(t)?os(t,e):e===t}function os(e,t){return Ye(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function wu(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/");let o=n.length-1,s,i;for(s=0;s1&&o--;else break;return n.slice(0,o).join("/")+"/"+r.slice(s-(s===r.length?1:0)).join("/")}var yn;(function(e){e.pop="pop",e.push="push"})(yn||(yn={}));var dn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(dn||(dn={}));function Cu(e){if(!e)if(zt){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),_u(e)}const Ou=/^[^#]+#/;function Pu(e,t){return e.replace(Ou,"#")+t}function Tu(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const ir=()=>({left:window.pageXOffset,top:window.pageYOffset});function Su(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=Tu(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function ss(e,t){return(history.state?history.state.position-t:-1)+e}const Fr=new Map;function xu(e,t){Fr.set(e,t)}function Ru(e){const t=Fr.get(e);return Fr.delete(e),t}let Au=()=>location.protocol+"//"+location.host;function Gi(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let l=o.includes(e.slice(s))?e.slice(s).length:1,a=o.slice(l);return a[0]!=="/"&&(a="/"+a),rs(a,"")}return rs(n,e)+r+o}function Lu(e,t,n,r){let o=[],s=[],i=null;const l=({state:p})=>{const _=Gi(e,location),b=n.value,I=t.value;let R=0;if(p){if(n.value=_,t.value=p,i&&i===b){i=null;return}R=I?p.position-I.position:0}else r(_);o.forEach(g=>{g(n.value,b,{delta:R,type:yn.pop,direction:R?R>0?dn.forward:dn.back:dn.unknown})})};function a(){i=n.value}function c(p){o.push(p);const _=()=>{const b=o.indexOf(p);b>-1&&o.splice(b,1)};return s.push(_),_}function u(){const{history:p}=window;!p.state||p.replaceState(ce({},p.state,{scroll:ir()}),"")}function d(){for(const p of s)p();s=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",u)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",u),{pauseListeners:a,listen:c,destroy:d}}function is(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?ir():null}}function Iu(e){const{history:t,location:n}=window,r={value:Gi(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(a,c,u){const d=e.indexOf("#"),p=d>-1?(n.host&&document.querySelector("base")?e:e.slice(d))+a:Au()+e+a;try{t[u?"replaceState":"pushState"](c,"",p),o.value=c}catch(_){console.error(_),n[u?"replace":"assign"](p)}}function i(a,c){const u=ce({},t.state,is(o.value.back,a,o.value.forward,!0),c,{position:o.value.position});s(a,u,!0),r.value=a}function l(a,c){const u=ce({},o.value,t.state,{forward:a,scroll:ir()});s(u.current,u,!0);const d=ce({},is(r.value,a,null),{position:u.position+1},c);s(a,d,!1),r.value=a}return{location:r,state:o,push:l,replace:i}}function ku(e){e=Cu(e);const t=Iu(e),n=Lu(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=ce({location:"",base:e,go:r,createHref:Pu.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Mu(e){return typeof e=="string"||e&&typeof e=="object"}function Zi(e){return typeof e=="string"||typeof e=="symbol"}const et={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Xi=Symbol("");var ls;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(ls||(ls={}));function Qt(e,t){return ce(new Error,{type:e,[Xi]:!0},t)}function Xe(e,t){return e instanceof Error&&Xi in e&&(t==null||!!(e.type&t))}const as="[^/]+?",Nu={sensitive:!1,strict:!1,start:!0,end:!0},Du=/[.+*?^${}()[\]/\\]/g;function Hu(e,t){const n=ce({},Nu,t),r=[];let o=n.start?"^":"";const s=[];for(const c of e){const u=c.length?[]:[90];n.strict&&!c.length&&(o+="/");for(let d=0;dt.length?t.length===1&&t[0]===40+40?1:-1:0}function $u(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const zu={type:0,value:""},ju=/[a-zA-Z0-9_]/;function Bu(e){if(!e)return[[]];if(e==="/")return[[zu]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(_){throw new Error(`ERR (${n})/"${c}": ${_}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let l=0,a,c="",u="";function d(){!c||(n===0?s.push({type:0,value:c}):n===1||n===2||n===3?(s.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:c,regexp:u,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),c="")}function p(){c+=a}for(;l{i(y)}:fn}function i(u){if(Zi(u)){const d=r.get(u);d&&(r.delete(u),n.splice(n.indexOf(d),1),d.children.forEach(i),d.alias.forEach(i))}else{const d=n.indexOf(u);d>-1&&(n.splice(d,1),u.record.name&&r.delete(u.record.name),u.children.forEach(i),u.alias.forEach(i))}}function l(){return n}function a(u){let d=0;for(;d=0&&(u.record.path!==n[d].record.path||!el(u,n[d]));)d++;n.splice(d,0,u),u.record.name&&!fs(u)&&r.set(u.record.name,u)}function c(u,d){let p,_={},b,I;if("name"in u&&u.name){if(p=r.get(u.name),!p)throw Qt(1,{location:u});I=p.record.name,_=ce(us(d.params,p.keys.filter(y=>!y.optional).map(y=>y.name)),u.params&&us(u.params,p.keys.map(y=>y.name))),b=p.stringify(_)}else if("path"in u)b=u.path,p=n.find(y=>y.re.test(b)),p&&(_=p.parse(b),I=p.record.name);else{if(p=d.name?r.get(d.name):n.find(y=>y.re.test(d.path)),!p)throw Qt(1,{location:u,currentLocation:d});I=p.record.name,_=ce({},d.params,u.params),b=p.stringify(_)}const R=[];let g=p;for(;g;)R.unshift(g.record),g=g.parent;return{name:I,path:b,params:_,matched:R,meta:Wu(R)}}return e.forEach(u=>s(u)),{addRoute:s,resolve:c,removeRoute:i,getRoutes:l,getRecordMatcher:o}}function us(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function qu(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:Ku(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function Ku(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="boolean"?n:n[r];return t}function fs(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Wu(e){return e.reduce((t,n)=>ce(t,n.meta),{})}function ds(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function el(e,t){return t.children.some(n=>n===e||el(e,n))}const tl=/#/g,Qu=/&/g,Yu=/\//g,Ju=/=/g,Gu=/\?/g,nl=/\+/g,Zu=/%5B/g,Xu=/%5D/g,rl=/%5E/g,ef=/%60/g,ol=/%7B/g,tf=/%7C/g,sl=/%7D/g,nf=/%20/g;function ho(e){return encodeURI(""+e).replace(tf,"|").replace(Zu,"[").replace(Xu,"]")}function rf(e){return ho(e).replace(ol,"{").replace(sl,"}").replace(rl,"^")}function $r(e){return ho(e).replace(nl,"%2B").replace(nf,"+").replace(tl,"%23").replace(Qu,"%26").replace(ef,"`").replace(ol,"{").replace(sl,"}").replace(rl,"^")}function of(e){return $r(e).replace(Ju,"%3D")}function sf(e){return ho(e).replace(tl,"%23").replace(Gu,"%3F")}function lf(e){return e==null?"":sf(e).replace(Yu,"%2F")}function Un(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function af(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;os&&$r(s)):[r&&$r(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function cf(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=Ye(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const uf=Symbol(""),ps=Symbol(""),lr=Symbol(""),po=Symbol(""),zr=Symbol("");function tn(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e,reset:n}}function dt(e,t,n,r,o){const s=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((i,l)=>{const a=d=>{d===!1?l(Qt(4,{from:n,to:t})):d instanceof Error?l(d):Mu(d)?l(Qt(2,{from:t,to:d})):(s&&r.enterCallbacks[o]===s&&typeof d=="function"&&s.push(d),i())},c=e.call(r&&r.instances[o],t,n,a);let u=Promise.resolve(c);e.length<3&&(u=u.then(a)),u.catch(d=>l(d))})}function _r(e,t,n,r){const o=[];for(const s of e)for(const i in s.components){let l=s.components[i];if(!(t!=="beforeRouteEnter"&&!s.instances[i]))if(ff(l)){const c=(l.__vccOpts||l)[t];c&&o.push(dt(c,n,r,s,i))}else{let a=l();o.push(()=>a.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${i}" at "${s.path}"`));const u=gu(c)?c.default:c;s.components[i]=u;const p=(u.__vccOpts||u)[t];return p&&dt(p,n,r,s,i)()}))}}return o}function ff(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function ms(e){const t=Pe(lr),n=Pe(po),r=ge(()=>t.resolve(At(e.to))),o=ge(()=>{const{matched:a}=r.value,{length:c}=a,u=a[c-1],d=n.matched;if(!u||!d.length)return-1;const p=d.findIndex(Wt.bind(null,u));if(p>-1)return p;const _=gs(a[c-2]);return c>1&&gs(u)===_&&d[d.length-1].path!==_?d.findIndex(Wt.bind(null,a[c-2])):p}),s=ge(()=>o.value>-1&&mf(n.params,r.value.params)),i=ge(()=>o.value>-1&&o.value===n.matched.length-1&&Ji(n.params,r.value.params));function l(a={}){return pf(a)?t[At(e.replace)?"replace":"push"](At(e.to)).catch(fn):Promise.resolve()}return{route:r,href:ge(()=>r.value.href),isActive:s,isExactActive:i,navigate:l}}const df=Ue({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:ms,setup(e,{slots:t}){const n=Gt(ms(e)),{options:r}=Pe(lr),o=ge(()=>({[vs(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[vs(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:ve("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),hf=df;function pf(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function mf(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!Ye(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function gs(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const vs=(e,t,n)=>e!=null?e:t!=null?t:n,gf=Ue({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Pe(zr),o=ge(()=>e.route||r.value),s=Pe(ps,0),i=ge(()=>{let c=At(s);const{matched:u}=o.value;let d;for(;(d=u[c])&&!d.components;)c++;return c}),l=ge(()=>o.value.matched[i.value]);Lt(ps,ge(()=>i.value+1)),Lt(uf,l),Lt(zr,o);const a=Oe();return gt(()=>[a.value,l.value,e.name],([c,u,d],[p,_,b])=>{u&&(u.instances[d]=c,_&&_!==u&&c&&c===p&&(u.leaveGuards.size||(u.leaveGuards=_.leaveGuards),u.updateGuards.size||(u.updateGuards=_.updateGuards))),c&&u&&(!_||!Wt(u,_)||!p)&&(u.enterCallbacks[d]||[]).forEach(I=>I(c))},{flush:"post"}),()=>{const c=o.value,u=e.name,d=l.value,p=d&&d.components[u];if(!p)return _s(n.default,{Component:p,route:c});const _=d.props[u],b=_?_===!0?c.params:typeof _=="function"?_(c):_:null,R=ve(p,ce({},b,t,{onVnodeUnmounted:g=>{g.component.isUnmounted&&(d.instances[u]=null)},ref:a}));return _s(n.default,{Component:R,route:c})||R}}});function _s(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const il=gf;function vf(e){const t=Vu(e.routes,e),n=e.parseQuery||af,r=e.stringifyQuery||hs,o=e.history,s=tn(),i=tn(),l=tn(),a=ni(et);let c=et;zt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=gr.bind(null,E=>""+E),d=gr.bind(null,lf),p=gr.bind(null,Un);function _(E,z){let k,j;return Zi(E)?(k=t.getRecordMatcher(E),j=z):j=E,t.addRoute(j,k)}function b(E){const z=t.getRecordMatcher(E);z&&t.removeRoute(z)}function I(){return t.getRoutes().map(E=>E.record)}function R(E){return!!t.getRecordMatcher(E)}function g(E,z){if(z=ce({},z||a.value),typeof E=="string"){const J=vr(n,E,z.path),f=t.resolve({path:J.path},z),h=o.createHref(J.fullPath);return ce(J,f,{params:p(f.params),hash:Un(J.hash),redirectedFrom:void 0,href:h})}let k;if("path"in E)k=ce({},E,{path:vr(n,E.path,z.path).path});else{const J=ce({},E.params);for(const f in J)J[f]==null&&delete J[f];k=ce({},E,{params:d(E.params)}),z.params=d(z.params)}const j=t.resolve(k,z),le=E.hash||"";j.params=u(p(j.params));const ue=yu(r,ce({},E,{hash:rf(le),path:j.path})),ee=o.createHref(ue);return ce({fullPath:ue,hash:le,query:r===hs?cf(E.query):E.query||{}},j,{redirectedFrom:void 0,href:ee})}function y(E){return typeof E=="string"?vr(n,E,a.value.path):ce({},E)}function T(E,z){if(c!==E)return Qt(8,{from:z,to:E})}function H(E){return S(E)}function q(E){return H(ce(y(E),{replace:!0}))}function Y(E){const z=E.matched[E.matched.length-1];if(z&&z.redirect){const{redirect:k}=z;let j=typeof k=="function"?k(E):k;return typeof j=="string"&&(j=j.includes("?")||j.includes("#")?j=y(j):{path:j},j.params={}),ce({query:E.query,hash:E.hash,params:"path"in j?{}:E.params},j)}}function S(E,z){const k=c=g(E),j=a.value,le=E.state,ue=E.force,ee=E.replace===!0,J=Y(k);if(J)return S(ce(y(J),{state:typeof J=="object"?ce({},le,J.state):le,force:ue,replace:ee}),z||k);const f=k;f.redirectedFrom=z;let h;return!ue&&bu(r,j,k)&&(h=Qt(16,{to:f,from:j}),xe(j,j,!0,!1)),(h?Promise.resolve(h):U(f,j)).catch(v=>Xe(v)?Xe(v,2)?v:ye(v):Z(v,f,j)).then(v=>{if(v){if(Xe(v,2))return S(ce({replace:ee},y(v.to),{state:typeof v.to=="object"?ce({},le,v.to.state):le,force:ue}),z||f)}else v=V(f,j,!0,ee,le);return $(f,j,v),v})}function m(E,z){const k=T(E,z);return k?Promise.reject(k):Promise.resolve()}function U(E,z){let k;const[j,le,ue]=_f(E,z);k=_r(j.reverse(),"beforeRouteLeave",E,z);for(const J of j)J.leaveGuards.forEach(f=>{k.push(dt(f,E,z))});const ee=m.bind(null,E,z);return k.push(ee),Dt(k).then(()=>{k=[];for(const J of s.list())k.push(dt(J,E,z));return k.push(ee),Dt(k)}).then(()=>{k=_r(le,"beforeRouteUpdate",E,z);for(const J of le)J.updateGuards.forEach(f=>{k.push(dt(f,E,z))});return k.push(ee),Dt(k)}).then(()=>{k=[];for(const J of E.matched)if(J.beforeEnter&&!z.matched.includes(J))if(Ye(J.beforeEnter))for(const f of J.beforeEnter)k.push(dt(f,E,z));else k.push(dt(J.beforeEnter,E,z));return k.push(ee),Dt(k)}).then(()=>(E.matched.forEach(J=>J.enterCallbacks={}),k=_r(ue,"beforeRouteEnter",E,z),k.push(ee),Dt(k))).then(()=>{k=[];for(const J of i.list())k.push(dt(J,E,z));return k.push(ee),Dt(k)}).catch(J=>Xe(J,8)?J:Promise.reject(J))}function $(E,z,k){for(const j of l.list())j(E,z,k)}function V(E,z,k,j,le){const ue=T(E,z);if(ue)return ue;const ee=z===et,J=zt?history.state:{};k&&(j||ee?o.replace(E.fullPath,ce({scroll:ee&&J&&J.scroll},le)):o.push(E.fullPath,le)),a.value=E,xe(E,z,k,ee),ye()}let w;function N(){w||(w=o.listen((E,z,k)=>{if(!yt.listening)return;const j=g(E),le=Y(j);if(le){S(ce(le,{replace:!0}),j).catch(fn);return}c=j;const ue=a.value;zt&&xu(ss(ue.fullPath,k.delta),ir()),U(j,ue).catch(ee=>Xe(ee,12)?ee:Xe(ee,2)?(S(ee.to,j).then(J=>{Xe(J,20)&&!k.delta&&k.type===yn.pop&&o.go(-1,!1)}).catch(fn),Promise.reject()):(k.delta&&o.go(-k.delta,!1),Z(ee,j,ue))).then(ee=>{ee=ee||V(j,ue,!1),ee&&(k.delta&&!Xe(ee,8)?o.go(-k.delta,!1):k.type===yn.pop&&Xe(ee,20)&&o.go(-1,!1)),$(j,ue,ee)}).catch(fn)}))}let L=tn(),ne=tn(),F;function Z(E,z,k){ye(E);const j=ne.list();return j.length?j.forEach(le=>le(E,z,k)):console.error(E),Promise.reject(E)}function te(){return F&&a.value!==et?Promise.resolve():new Promise((E,z)=>{L.add([E,z])})}function ye(E){return F||(F=!E,N(),L.list().forEach(([z,k])=>E?k(E):z()),L.reset()),E}function xe(E,z,k,j){const{scrollBehavior:le}=e;if(!zt||!le)return Promise.resolve();const ue=!k&&Ru(ss(E.fullPath,0))||(j||!k)&&history.state&&history.state.scroll||null;return Zn().then(()=>le(E,z,ue)).then(ee=>ee&&Su(ee)).catch(ee=>Z(ee,E,z))}const ke=E=>o.go(E);let $e;const Ae=new Set,yt={currentRoute:a,listening:!0,addRoute:_,removeRoute:b,hasRoute:R,getRoutes:I,resolve:g,options:e,push:H,replace:q,go:ke,back:()=>ke(-1),forward:()=>ke(1),beforeEach:s.add,beforeResolve:i.add,afterEach:l.add,onError:ne.add,isReady:te,install(E){const z=this;E.component("RouterLink",hf),E.component("RouterView",il),E.config.globalProperties.$router=z,Object.defineProperty(E.config.globalProperties,"$route",{enumerable:!0,get:()=>At(a)}),zt&&!$e&&a.value===et&&($e=!0,H(o.location).catch(le=>{}));const k={};for(const le in et)k[le]=ge(()=>a.value[le]);E.provide(lr,z),E.provide(po,Gt(k)),E.provide(zr,a);const j=E.unmount;Ae.add(E),E.unmount=function(){Ae.delete(E),Ae.size<1&&(c=et,w&&w(),w=null,a.value=et,$e=!1,F=!1),j()}}};return yt}function Dt(e){return e.reduce((t,n)=>t.then(()=>n()),Promise.resolve())}function _f(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;iWt(c,l))?r.push(l):n.push(l));const a=e.matched[i];a&&(t.matched.find(c=>Wt(c,a))||o.push(a))}return[n,r,o]}function mo(){return Pe(lr)}function go(){return Pe(po)}const yf=({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:r=5})=>{const o=mo(),i=Yi(()=>{var I,R,g,y;const l=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(l-0)p.some(H=>H.hash===T.hash));for(let T=0;T=((R=(I=H.parentElement)==null?void 0:I.offsetTop)!=null?R:0)-r,S=!q||l<((y=(g=q.parentElement)==null?void 0:g.offsetTop)!=null?y:0)-r;if(!(Y&&S))continue;const U=decodeURIComponent(o.currentRoute.value.hash),$=decodeURIComponent(H.hash);if(U===$)return;if(d){for(let V=T+1;V{window.addEventListener("scroll",i)}),oo(()=>{window.removeEventListener("scroll",i)})},ys=async(e,t)=>{const{scrollBehavior:n}=e.options;e.options.scrollBehavior=void 0,await e.replace({query:e.currentRoute.value.query,hash:t,force:!0}).finally(()=>e.options.scrollBehavior=n)},bf="a.sidebar-item",Ef=".header-anchor",wf=300,Cf=5,Of=Mt({setup(){yf({headerLinkSelector:bf,headerAnchorSelector:Ef,delay:wf,offset:Cf})}}),bs=()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,Pf=()=>window.scrollTo({top:0,behavior:"smooth"});const Tf=Ue({name:"BackToTop",setup(){const e=Oe(0),t=ge(()=>e.value>300),n=Yi(()=>{e.value=bs()},100);st(()=>{e.value=bs(),window.addEventListener("scroll",()=>n())});const r=ve("div",{class:"back-to-top",onClick:Pf});return()=>ve(uo,{name:"back-to-top"},()=>t.value?r:null)}}),Sf=Mt({rootComponents:[Tf]});const xf=ve("svg",{class:"external-link-icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},[ve("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}),ve("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"})]),Rf=Ue({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const t=uu(),n=ge(()=>{var r;return(r=e.locales[t.value])!=null?r:{openInNewWindow:"open in new window"}});return()=>ve("span",[xf,ve("span",{class:"external-link-icon-sr-only"},n.value.openInNewWindow)])}}),Af={"/":{openInNewWindow:"open in new window"}},Lf=Mt({enhance({app:e}){e.component("ExternalLinkIcon",ve(Rf,{locales:Af}))}});/** + * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT + */const ie={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
'},status:null,set:e=>{const t=ie.isStarted();e=yr(e,ie.settings.minimum,1),ie.status=e===1?null:e;const n=ie.render(!t),r=n.querySelector(ie.settings.barSelector),o=ie.settings.speed,s=ie.settings.easing;return n.offsetWidth,If(i=>{Ln(r,{transform:"translate3d("+Es(e)+"%,0,0)",transition:"all "+o+"ms "+s}),e===1?(Ln(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout(function(){Ln(n,{transition:"all "+o+"ms linear",opacity:"0"}),setTimeout(function(){ie.remove(),i()},o)},o)):setTimeout(()=>i(),o)}),ie},isStarted:()=>typeof ie.status=="number",start:()=>{ie.status||ie.set(0);const e=()=>{setTimeout(()=>{!ie.status||(ie.trickle(),e())},ie.settings.trickleSpeed)};return ie.settings.trickle&&e(),ie},done:e=>!e&&!ie.status?ie:ie.inc(.3+.5*Math.random()).set(1),inc:e=>{let t=ie.status;return t?(typeof e!="number"&&(e=(1-t)*yr(Math.random()*t,.1,.95)),t=yr(t+e,0,.994),ie.set(t)):ie.start()},trickle:()=>ie.inc(Math.random()*ie.settings.trickleRate),render:e=>{if(ie.isRendered())return document.getElementById("nprogress");ws(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=ie.settings.template;const n=t.querySelector(ie.settings.barSelector),r=e?"-100":Es(ie.status||0),o=document.querySelector(ie.settings.parent);return Ln(n,{transition:"all 0 linear",transform:"translate3d("+r+"%,0,0)"}),o!==document.body&&ws(o,"nprogress-custom-parent"),o==null||o.appendChild(t),t},remove:()=>{Cs(document.documentElement,"nprogress-busy"),Cs(document.querySelector(ie.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&kf(e)},isRendered:()=>!!document.getElementById("nprogress")},yr=(e,t,n)=>en?n:e,Es=e=>(-1+e)*100,If=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),e.length===1&&t()}}(),Ln=function(){const e=["Webkit","O","Moz","ms"],t={};function n(i){return i.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(l,a){return a.toUpperCase()})}function r(i){const l=document.body.style;if(i in l)return i;let a=e.length;const c=i.charAt(0).toUpperCase()+i.slice(1);let u;for(;a--;)if(u=e[a]+c,u in l)return u;return i}function o(i){return i=n(i),t[i]||(t[i]=r(i))}function s(i,l,a){l=o(l),i.style[l]=a}return function(i,l){for(const a in l){const c=l[a];c!==void 0&&Object.prototype.hasOwnProperty.call(l,a)&&s(i,a,c)}}}(),ll=(e,t)=>(typeof e=="string"?e:vo(e)).indexOf(" "+t+" ")>=0,ws=(e,t)=>{const n=vo(e),r=n+t;ll(n,t)||(e.className=r.substring(1))},Cs=(e,t)=>{const n=vo(e);if(!ll(e,t))return;const r=n.replace(" "+t+" "," ");e.className=r.substring(1,r.length-1)},vo=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),kf=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)};const Mf=()=>{st(()=>{const e=mo(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||ie.start()}),e.afterEach(n=>{t.add(n.path),ie.done()})})},Nf=Mt({setup(){Mf()}}),Df=JSON.parse(`{"repo":"ScoreSaber/ScoreSaber-Wiki","docsDir":"wiki","docsBranch":"master","editLink":true,"contributors":false,"locales":{"/":{"selectLanguageText":"\u{1F310} English","selectLanguageName":"English","selectLanguageAriaLabel":"Languages","editLinkText":"Help improve this page!","lastUpdatedText":"Last Updated","navbar":[{"text":"Home","link":"/"},{"text":"ScoreSaber","link":"https://scoresaber.com"},{"text":"ScoreSaber Discord","link":"https://discord.gg/scoresaber"}]}},"colorMode":"auto","colorModeSwitch":true,"navbar":[],"logo":null,"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","sidebar":"auto","sidebarDepth":2,"editLinkText":"Edit this page","lastUpdated":true,"lastUpdatedText":"Last Updated","contributorsText":"Contributors","notFound":["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],"backToHome":"Take me home","openInNewWindow":"open in new window","toggleColorMode":"toggle color mode","toggleSidebar":"toggle sidebar"}`),al=Oe(Df),Hf=()=>al;import.meta.webpackHot&&(__VUE_HMR_RUNTIME__.updateThemeData=e=>{al.value=e});const cl=Symbol(""),Ff=()=>{const e=Pe(cl);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},$f=(e,t)=>{var n;return{...e,...(n=e.locales)==null?void 0:n[t]}},zf=Mt({enhance({app:e}){const t=Hf(),n=e._context.provides[fo],r=ge(()=>$f(t.value,n.value));e.provide(cl,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}})}}),jf=Ue({__name:"Badge",props:{type:{type:String,required:!1,default:"tip"},text:{type:String,required:!1,default:""},vertical:{type:String,required:!1,default:void 0}},setup(e){return(t,n)=>(nr(),Ii("span",{class:bn(["badge",e.type]),style:Wn({verticalAlign:e.vertical})},[bi(t.$slots,"default",{},()=>[lo(Rl(e.text),1)])],6))}}),ul=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},Bf=ul(jf,[["__file","Badge.vue"]]),Uf=Ue({name:"CodeGroup",setup(e,{slots:t}){const n=Oe(-1),r=Oe([]),o=(l=n.value)=>{l{l>0?n.value=l-1:n.value=r.value.length-1,r.value[n.value].focus()},i=(l,a)=>{l.key===" "||l.key==="Enter"?(l.preventDefault(),n.value=a):l.key==="ArrowRight"?(l.preventDefault(),o(a)):l.key==="ArrowLeft"&&(l.preventDefault(),s(a))};return()=>{var a;const l=(((a=t.default)==null?void 0:a.call(t))||[]).filter(c=>c.type.name==="CodeGroupItem").map(c=>(c.props===null&&(c.props={}),c));return l.length===0?null:(n.value<0||n.value>l.length-1?(n.value=l.findIndex(c=>c.props.active===""||c.props.active===!0),n.value===-1&&(n.value=0)):l.forEach((c,u)=>{c.props.active=u===n.value}),ve("div",{class:"code-group"},[ve("div",{class:"code-group__nav"},ve("ul",{class:"code-group__ul"},l.map((c,u)=>{const d=u===n.value;return ve("li",{class:"code-group__li"},ve("button",{ref:p=>{p&&(r.value[u]=p)},class:{"code-group__nav-tab":!0,"code-group__nav-tab-active":d},ariaPressed:d,ariaExpanded:d,onClick:()=>n.value=u,onKeydown:p=>i(p,u)},c.props.title))}))),l]))}}}),Vf=["aria-selected"],qf=Ue({name:"CodeGroupItem"}),Kf=Ue({...qf,props:{title:{type:String,required:!0},active:{type:Boolean,required:!1,default:!1}},setup(e){return(t,n)=>(nr(),Ii("div",{class:bn(["code-group-item",{"code-group-item__active":e.active}]),"aria-selected":e.active},[bi(t.$slots,"default")],10,Vf))}}),Wf=ul(Kf,[["__file","CodeGroupItem.vue"]]);var Os;const fl=typeof window<"u",Qf=e=>typeof e=="function",Yf=e=>typeof e=="string",br=()=>{};fl&&((Os=window==null?void 0:window.navigator)==null?void 0:Os.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function Vn(e){return typeof e=="function"?e():At(e)}function Jf(e,t){function n(...r){e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})}return n}const dl=e=>e();function Gf(e=dl){const t=Oe(!0);function n(){t.value=!1}function r(){t.value=!0}return{isActive:t,pause:n,resume:r,eventFilter:(...s)=>{t.value&&e(...s)}}}function Zf(e){return e}function hl(e){return $l()?(zl(e),!0):!1}function Xf(e,t=!0){co()?_i(e):t?e():Zn(e)}function ed(e,t=!0){co()?st(e):t?e():Zn(e)}function Eh(e=!1,t={}){const{truthyValue:n=!0,falsyValue:r=!1}=t,o=Ce(e),s=Oe(e);function i(l){if(arguments.length)return s.value=l,s.value;{const a=Vn(n);return s.value=s.value===a?Vn(r):a,s.value}}return o?i:[s,i]}var Ps=Object.getOwnPropertySymbols,td=Object.prototype.hasOwnProperty,nd=Object.prototype.propertyIsEnumerable,rd=(e,t)=>{var n={};for(var r in e)td.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Ps)for(var r of Ps(e))t.indexOf(r)<0&&nd.call(e,r)&&(n[r]=e[r]);return n};function od(e,t,n={}){const r=n,{eventFilter:o=dl}=r,s=rd(r,["eventFilter"]);return gt(e,Jf(o,t),s)}var sd=Object.defineProperty,id=Object.defineProperties,ld=Object.getOwnPropertyDescriptors,qn=Object.getOwnPropertySymbols,pl=Object.prototype.hasOwnProperty,ml=Object.prototype.propertyIsEnumerable,Ts=(e,t,n)=>t in e?sd(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ad=(e,t)=>{for(var n in t||(t={}))pl.call(t,n)&&Ts(e,n,t[n]);if(qn)for(var n of qn(t))ml.call(t,n)&&Ts(e,n,t[n]);return e},cd=(e,t)=>id(e,ld(t)),ud=(e,t)=>{var n={};for(var r in e)pl.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&qn)for(var r of qn(e))t.indexOf(r)<0&&ml.call(e,r)&&(n[r]=e[r]);return n};function fd(e,t,n={}){const r=n,{eventFilter:o}=r,s=ud(r,["eventFilter"]),{eventFilter:i,pause:l,resume:a,isActive:c}=Gf(o);return{stop:od(e,t,cd(ad({},s),{eventFilter:i})),pause:l,resume:a,isActive:c}}function dd(e){var t;const n=Vn(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Kn=fl?window:void 0;function hd(...e){let t,n,r,o;if(Yf(e[0])?([n,r,o]=e,t=Kn):[t,n,r,o]=e,!t)return br;let s=br;const i=gt(()=>dd(t),a=>{s(),a&&(a.addEventListener(n,r,o),s=()=>{a.removeEventListener(n,r,o),s=br})},{immediate:!0,flush:"post"}),l=()=>{i(),s()};return hl(l),l}function pd(e,t=!1){const n=Oe(),r=()=>n.value=Boolean(e());return r(),ed(r,t),n}function md(e,t={}){const{window:n=Kn}=t,r=pd(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let o;const s=Oe(!1),i=()=>{!r.value||(o||(o=n.matchMedia(e)),s.value=o.matches)};return Xf(()=>{i(),o&&("addEventListener"in o?o.addEventListener("change",i):o.addListener(i),hl(()=>{"removeEventListener"in o?o.removeEventListener("change",i):o.removeListener(i)}))}),s}const jr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Br="__vueuse_ssr_handlers__";jr[Br]=jr[Br]||{};const gd=jr[Br];function vd(e,t){return gd[e]||t}function _d(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"||Array.isArray(e)?"object":Number.isNaN(e)?"any":"number"}var yd=Object.defineProperty,Ss=Object.getOwnPropertySymbols,bd=Object.prototype.hasOwnProperty,Ed=Object.prototype.propertyIsEnumerable,xs=(e,t,n)=>t in e?yd(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Rs=(e,t)=>{for(var n in t||(t={}))bd.call(t,n)&&xs(e,n,t[n]);if(Ss)for(var n of Ss(t))Ed.call(t,n)&&xs(e,n,t[n]);return e};const wd={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}};function Cd(e,t,n,r={}){var o;const{flush:s="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:a=!0,mergeDefaults:c=!1,shallow:u,window:d=Kn,eventFilter:p,onError:_=S=>{console.error(S)}}=r,b=(u?ni:Oe)(t);if(!n)try{n=vd("getDefaultStorage",()=>{var S;return(S=Kn)==null?void 0:S.localStorage})()}catch(S){_(S)}if(!n)return b;const I=Vn(t),R=_d(I),g=(o=r.serializer)!=null?o:wd[R],{pause:y,resume:T}=fd(b,()=>H(b.value),{flush:s,deep:i,eventFilter:p});return d&&l&&hd(d,"storage",Y),Y(),b;function H(S){try{S==null?n.removeItem(e):n.setItem(e,g.write(S))}catch(m){_(m)}}function q(S){if(!(S&&S.key!==e)){y();try{const m=S?S.newValue:n.getItem(e);if(m==null)return a&&I!==null&&n.setItem(e,g.write(I)),I;if(!S&&c){const U=g.read(m);return Qf(c)?c(U,I):R==="object"&&!Array.isArray(U)?Rs(Rs({},I),U):U}else return typeof m!="string"?m:g.read(m)}catch(m){_(m)}finally{T()}}}function Y(S){S&&S.key!==e||(b.value=q(S))}}function Od(e){return md("(prefers-color-scheme: dark)",e)}var As;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(As||(As={}));var Pd=Object.defineProperty,Ls=Object.getOwnPropertySymbols,Td=Object.prototype.hasOwnProperty,Sd=Object.prototype.propertyIsEnumerable,Is=(e,t,n)=>t in e?Pd(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,xd=(e,t)=>{for(var n in t||(t={}))Td.call(t,n)&&Is(e,n,t[n]);if(Ls)for(var n of Ls(t))Sd.call(t,n)&&Is(e,n,t[n]);return e};const Rd={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]};xd({linear:Zf},Rd);const gl=()=>Ff(),vl=Symbol(""),wh=()=>{const e=Pe(vl);if(!e)throw new Error("useDarkMode() is called without provider.");return e},Ad=()=>{const e=gl(),t=Od(),n=Cd("vuepress-color-scheme",e.value.colorMode),r=ge({get(){return e.value.colorModeSwitch?n.value==="auto"?t.value:n.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?n.value="auto":n.value=o?"dark":"light"}});Lt(vl,r),Ld(r)},Ld=e=>{const t=(n=e.value)=>{const r=window==null?void 0:window.document.querySelector("html");r==null||r.classList.toggle("dark",n)};st(()=>{gt(e,t,{immediate:!0})}),so(()=>t())},_l=(...e)=>{const n=mo().resolve(...e),r=n.matched[n.matched.length-1];if(!(r!=null&&r.redirect))return n;const{redirect:o}=r,s=X(o)?o(n):o,i=pe(s)?{path:s}:s;return _l({hash:n.hash,query:n.query,params:n.params,...i})},Id=e=>{const t=_l(encodeURI(e));return{text:t.meta.title||e,link:t.name==="404"?e:t.fullPath}};let Er=null,nn=null;const kd={wait:()=>Er,pending:()=>{Er=new Promise(e=>nn=e)},resolve:()=>{nn==null||nn(),Er=null,nn=null}},Md=()=>kd,yl=Symbol("sidebarItems"),Ch=()=>{const e=Pe(yl);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},Nd=()=>{const e=gl(),t=iu(),n=ge(()=>Dd(t.value,e.value));Lt(yl,n)},Dd=(e,t)=>{var o,s,i,l;const n=(s=(o=e.sidebar)!=null?o:t.sidebar)!=null?s:"auto",r=(l=(i=e.sidebarDepth)!=null?i:t.sidebarDepth)!=null?l:2;return e.home||n===!1?[]:n==="auto"?Fd(r):Q(n)?bl(n,r):zi(n)?$d(n,r):[]},Hd=(e,t)=>({text:e.title,link:`#${e.slug}`,children:_o(e.children,t)}),_o=(e,t)=>t>0?e.map(n=>Hd(n,t-1)):[],Fd=e=>{const t=sr();return[{text:t.value.title,children:_o(t.value.headers,e)}]},bl=(e,t)=>{const n=go(),r=sr(),o=s=>{var l;let i;if(pe(s)?i=Id(s):i=s,i.children)return{...i,children:i.children.map(a=>o(a))};if(i.link===n.path){const a=((l=r.value.headers[0])==null?void 0:l.level)===1?r.value.headers[0].children:r.value.headers;return{...i,children:_o(a,t)}}return i};return e.map(s=>o(s))},$d=(e,t)=>{var s;const n=go(),r=ji(e,n.path),o=(s=e[r])!=null?s:[];return bl(o,t)};const zd=Mt({enhance({app:e,router:t}){e.component("Badge",Bf),e.component("CodeGroup",Uf),e.component("CodeGroupItem",Wf),e.component("AutoLinkExternalIcon",()=>{const r=e.component("ExternalLinkIcon");return r?ve(r):null}),e.component("NavbarSearch",()=>{const r=e.component("Docsearch")||e.component("SearchBox");return r?ve(r):null});const n=t.options.scrollBehavior;t.options.scrollBehavior=async(...r)=>(await Md().wait(),n(...r))},setup(){Ad(),Nd()}}),jd={enhance:({app:e})=>{}};/*! medium-zoom 1.0.6 | MIT License | https://github.com/francoischalifour/medium-zoom */var Pt=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==void 0?arguments[1]:{},r=window.Promise||function(w){function N(){}w(N,N)},o=function(w){var N=w.target;if(N===U){b();return}T.indexOf(N)!==-1&&I({target:N})},s=function(){if(!(q||!m.original)){var w=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(Y-w)>S.scrollOffset&&setTimeout(b,150)}},i=function(w){var N=w.key||w.keyCode;(N==="Escape"||N==="Esc"||N===27)&&b()},l=function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},N=w;if(w.background&&(U.style.background=w.background),w.container&&w.container instanceof Object&&(N.container=Pt({},S.container,w.container)),w.template){var L=Mn(w.template)?w.template:document.querySelector(w.template);N.template=L}return S=Pt({},S,N),T.forEach(function(ne){ne.dispatchEvent(Ht("medium-zoom:update",{detail:{zoom:$}}))}),$},a=function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return e(Pt({},S,w))},c=function(){for(var w=arguments.length,N=Array(w),L=0;L0?N.reduce(function(F,Z){return[].concat(F,Ms(Z))},[]):T;return ne.forEach(function(F){F.classList.remove("medium-zoom-image"),F.dispatchEvent(Ht("medium-zoom:detach",{detail:{zoom:$}}))}),T=T.filter(function(F){return ne.indexOf(F)===-1}),$},d=function(w,N){var L=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return T.forEach(function(ne){ne.addEventListener("medium-zoom:"+w,N,L)}),H.push({type:"medium-zoom:"+w,listener:N,options:L}),$},p=function(w,N){var L=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return T.forEach(function(ne){ne.removeEventListener("medium-zoom:"+w,N,L)}),H=H.filter(function(ne){return!(ne.type==="medium-zoom:"+w&&ne.listener.toString()===N.toString())}),$},_=function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},N=w.target,L=function(){var F={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},Z=void 0,te=void 0;if(S.container)if(S.container instanceof Object)F=Pt({},F,S.container),Z=F.width-F.left-F.right-S.margin*2,te=F.height-F.top-F.bottom-S.margin*2;else{var ye=Mn(S.container)?S.container:document.querySelector(S.container),xe=ye.getBoundingClientRect(),ke=xe.width,$e=xe.height,Ae=xe.left,yt=xe.top;F=Pt({},F,{width:ke,height:$e,left:Ae,top:yt})}Z=Z||F.width-S.margin*2,te=te||F.height-S.margin*2;var E=m.zoomedHd||m.original,z=ks(E)?Z:E.naturalWidth||Z,k=ks(E)?te:E.naturalHeight||te,j=E.getBoundingClientRect(),le=j.top,ue=j.left,ee=j.width,J=j.height,f=Math.min(z,Z)/ee,h=Math.min(k,te)/J,v=Math.min(f,h),O=(-ue+(Z-ee)/2+S.margin+F.left)/v,C=(-le+(te-J)/2+S.margin+F.top)/v,x="scale("+v+") translate3d("+O+"px, "+C+"px, 0)";m.zoomed.style.transform=x,m.zoomedHd&&(m.zoomedHd.style.transform=x)};return new r(function(ne){if(N&&T.indexOf(N)===-1){ne($);return}var F=function ke(){q=!1,m.zoomed.removeEventListener("transitionend",ke),m.original.dispatchEvent(Ht("medium-zoom:opened",{detail:{zoom:$}})),ne($)};if(m.zoomed){ne($);return}if(N)m.original=N;else if(T.length>0){var Z=T;m.original=Z[0]}else{ne($);return}if(m.original.dispatchEvent(Ht("medium-zoom:open",{detail:{zoom:$}})),Y=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,q=!0,m.zoomed=Vd(m.original),document.body.appendChild(U),S.template){var te=Mn(S.template)?S.template:document.querySelector(S.template);m.template=document.createElement("div"),m.template.appendChild(te.content.cloneNode(!0)),document.body.appendChild(m.template)}if(document.body.appendChild(m.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),m.original.classList.add("medium-zoom-image--hidden"),m.zoomed.classList.add("medium-zoom-image--opened"),m.zoomed.addEventListener("click",b),m.zoomed.addEventListener("transitionend",F),m.original.getAttribute("data-zoom-src")){m.zoomedHd=m.zoomed.cloneNode(),m.zoomedHd.removeAttribute("srcset"),m.zoomedHd.removeAttribute("sizes"),m.zoomedHd.src=m.zoomed.getAttribute("data-zoom-src"),m.zoomedHd.onerror=function(){clearInterval(ye),console.warn("Unable to reach the zoom image target "+m.zoomedHd.src),m.zoomedHd=null,L()};var ye=setInterval(function(){m.zoomedHd.complete&&(clearInterval(ye),m.zoomedHd.classList.add("medium-zoom-image--opened"),m.zoomedHd.addEventListener("click",b),document.body.appendChild(m.zoomedHd),L())},10)}else if(m.original.hasAttribute("srcset")){m.zoomedHd=m.zoomed.cloneNode(),m.zoomedHd.removeAttribute("sizes"),m.zoomedHd.removeAttribute("loading");var xe=m.zoomedHd.addEventListener("load",function(){m.zoomedHd.removeEventListener("load",xe),m.zoomedHd.classList.add("medium-zoom-image--opened"),m.zoomedHd.addEventListener("click",b),document.body.appendChild(m.zoomedHd),L()})}else L()})},b=function(){return new r(function(w){if(q||!m.original){w($);return}var N=function L(){m.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(m.zoomed),m.zoomedHd&&document.body.removeChild(m.zoomedHd),document.body.removeChild(U),m.zoomed.classList.remove("medium-zoom-image--opened"),m.template&&document.body.removeChild(m.template),q=!1,m.zoomed.removeEventListener("transitionend",L),m.original.dispatchEvent(Ht("medium-zoom:closed",{detail:{zoom:$}})),m.original=null,m.zoomed=null,m.zoomedHd=null,m.template=null,w($)};q=!0,document.body.classList.remove("medium-zoom--opened"),m.zoomed.style.transform="",m.zoomedHd&&(m.zoomedHd.style.transform=""),m.template&&(m.template.style.transition="opacity 150ms",m.template.style.opacity=0),m.original.dispatchEvent(Ht("medium-zoom:close",{detail:{zoom:$}})),m.zoomed.addEventListener("transitionend",N)})},I=function(){var w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},N=w.target;return m.original?b():_({target:N})},R=function(){return S},g=function(){return T},y=function(){return m.original},T=[],H=[],q=!1,Y=0,S=n,m={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(t)==="[object Object]"?S=t:(t||typeof t=="string")&&c(t),S=Pt({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},S);var U=Ud(S.background);document.addEventListener("click",o),document.addEventListener("keyup",i),document.addEventListener("scroll",s),window.addEventListener("resize",b);var $={open:_,close:b,toggle:I,update:l,clone:a,attach:c,detach:u,on:d,off:p,getOptions:R,getImages:g,getZoomedImage:y};return $};function Kd(e,t){t===void 0&&(t={});var n=t.insertAt;if(!(!e||typeof document>"u")){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var Wd=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";Kd(Wd);const Qd=qd,Yd=Symbol("mediumZoom");const Jd=":not(a) > img",Gd={margin:16},Zd=500,Xd=Mt({enhance({app:e,router:t}){const n=Qd(Gd);n.refresh=(r=Jd)=>{n.detach(),n.attach(r)},e.provide(Yd,n),t.afterEach(()=>{setTimeout(()=>n.refresh(),Zd)})}}),wr=[Of,Sf,Lf,Nf,zf,zd,jd,Xd],eh=[["v-8daa1a0e","/",{title:""},["/index.html","/README.md"]],["v-408f3862","/about-us.html",{title:"About us"},["/about-us","/about-us.md"]],["v-58e1e27c","/beginners-guide.html",{title:"Beginners Guide"},["/beginners-guide","/beginners-guide.md"]],["v-092a1d7c","/faq.html",{title:"Frequently asked questions"},["/faq","/faq.md"]],["v-0e753d4c","/ranking-system.html",{title:"How does ScoreSaber and the PP system work?"},["/ranking-system","/ranking-system.md"]],["v-56476c0a","/rules.html",{title:"Rules"},["/rules","/rules.md"]],["v-1b35bd3b","/ranking/how-to-rank-map.html",{title:"How do I get my map ranked?"},["/ranking/how-to-rank-map","/ranking/how-to-rank-map.md"]],["v-7d4771f0","/ranking/modding-queue-information.html",{title:"Modding Queue Information"},["/ranking/modding-queue-information","/ranking/modding-queue-information.md"]],["v-737b7fdb","/ranking/qat-guidelines.html",{title:"ScoreSaber QAT Guidelines"},["/ranking/qat-guidelines","/ranking/qat-guidelines.md"]],["v-790243e7","/ranking/ranking-queue-rules.html",{title:"Ranking Queue Rules"},["/ranking/ranking-queue-rules","/ranking/ranking-queue-rules.md"]],["v-355e83f4","/ranking/ranking-unban-system-and-terms.html",{title:"Unban System and Terms"},["/ranking/ranking-unban-system-and-terms","/ranking/ranking-unban-system-and-terms.md"]],["v-1d3a639e","/ranking/scoresaber-team-information.html",{title:"ScoreSaber Team Information"},["/ranking/scoresaber-team-information","/ranking/scoresaber-team-information.md"]],["v-07d4df84","/ranking/criteria/",{title:"Ranking Criteria"},["/ranking/criteria/index.html","/ranking/criteria/README.md"]],["v-6b9aed7a","/ranking/criteria/difficulty-spread-requirements.html",{title:"Difficulty Spread Requirements"},["/ranking/criteria/difficulty-spread-requirements","/ranking/criteria/difficulty-spread-requirements.md"]],["v-7510c06a","/ranking/criteria/formatting-and-metadata.html",{title:"Formatting and Metadata Criteria"},["/ranking/criteria/formatting-and-metadata","/ranking/criteria/formatting-and-metadata.md"]],["v-22a4d09d","/ranking/criteria/mapping-criteria.html",{title:"Mapping Criteria"},["/ranking/criteria/mapping-criteria","/ranking/criteria/mapping-criteria.md"]],["v-3e479638","/ranking/criteria/technical-limitations-criteria.html",{title:"Technical Limitations Criteria"},["/ranking/criteria/technical-limitations-criteria","/ranking/criteria/technical-limitations-criteria.md"]],["v-3706649a","/404.html",{title:""},["/404"]]];var th=()=>eh.reduce((e,[t,n,r,o])=>(e.push({name:t,path:n,component:ns,meta:r},...o.map(s=>({path:s,redirect:n}))),e),[{name:"404",path:"/:catchAll(.*)",component:ns}]),nh=ku,rh=()=>{const e=vf({history:nh(ru(ht.value.base)),routes:th(),scrollBehavior:(t,n,r)=>r||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{var r;(t.path!==n.path||n===et)&&([nt.value]=await Promise.all([Ot.resolvePageData(t.name),(r=Bi[t.name])==null?void 0:r.__asyncLoader()]))}),e},oh=e=>{e.component("ClientOnly",hu),e.component("Content",pu)},sh=(e,t)=>{const n=ge(()=>Ot.resolveRouteLocale(ht.value.locales,t.currentRoute.value.path)),r=ge(()=>Ot.resolveSiteLocaleData(ht.value,n.value)),o=ge(()=>Ot.resolvePageFrontmatter(nt.value)),s=ge(()=>Ot.resolvePageHeadTitle(nt.value,r.value)),i=ge(()=>Ot.resolvePageHead(s.value,o.value,r.value)),l=ge(()=>Ot.resolvePageLang(nt.value));return e.provide(fo,n),e.provide(Qi,r),e.provide(qi,o),e.provide(au,s),e.provide(Ki,i),e.provide(Wi,l),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>o.value},$head:{get:()=>i.value},$headTitle:{get:()=>s.value},$lang:{get:()=>l.value},$page:{get:()=>nt.value},$routeLocale:{get:()=>n.value},$site:{get:()=>ht.value},$siteLocale:{get:()=>r.value},$withBase:{get:()=>mu}}),{pageData:nt,pageFrontmatter:o,pageHead:i,pageHeadTitle:s,pageLang:l,routeLocale:n,siteData:ht,siteLocaleData:r}},ih=()=>{const e=go(),t=lu(),n=cu(),r=Oe([]),o=()=>{t.value.forEach(i=>{const l=lh(i);l&&r.value.push(l)})},s=()=>{document.documentElement.lang=n.value,r.value.forEach(i=>{i.parentNode===document.head&&document.head.removeChild(i)}),r.value.splice(0,r.value.length),t.value.forEach(i=>{const l=ah(i);l!==null&&(document.head.appendChild(l),r.value.push(l))})};Lt(du,s),st(()=>{o(),s(),gt(()=>e.path,()=>s())})},lh=([e,t,n=""])=>{const r=Object.entries(t).map(([l,a])=>pe(a)?`[${l}="${a}"]`:a===!0?`[${l}]`:"").join(""),o=`head > ${e}${r}`;return Array.from(document.querySelectorAll(o)).find(l=>l.innerText===n)||null},ah=([e,t,n])=>{if(!pe(e))return null;const r=document.createElement(e);return zi(t)&&Object.entries(t).forEach(([o,s])=>{pe(s)?r.setAttribute(o,s):s===!0&&r.setAttribute(o,"")}),pe(n)&&r.appendChild(document.createTextNode(n)),r},ch=Gc,uh=async()=>{var n;const e=ch({name:"VuepressApp",setup(){var r;ih();for(const o of wr)(r=o.setup)==null||r.call(o);return()=>[ve(il),...wr.flatMap(({rootComponents:o=[]})=>o.map(s=>ve(s)))]}}),t=rh();oh(e),sh(e,t);for(const r of wr)await((n=r.enhance)==null?void 0:n.call(r,{app:e,router:t,siteData:ht}));return e.use(t),{app:e,router:t}};uh().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{gh as $,fu as A,bh as B,wh as C,ve as D,mu as E,Ie as F,hu as G,bn as H,Oe as I,gt as J,dh as K,vh as L,ou as M,ru as N,mo as O,pe as P,Id as Q,st as R,Wn as S,uo as T,sr as U,Ch as V,zi as W,Eh as X,Zn as Y,oo as Z,ul as _,Ni as a,so as a0,Md as a1,_e as b,Ii as c,uh as createVueApp,lo as d,ph as e,Ue as f,gl as g,At as h,iu as i,ge as j,hh as k,mh as l,Q as m,go as n,nr as o,fh as p,ki as q,Ua as r,hc as s,Rl as t,uu as u,bi as v,Pa as w,nu as x,_h as y,yh as z}; diff --git a/assets/404.ac109edc.js b/assets/404.ac109edc.js new file mode 100644 index 0000000..eb4f378 --- /dev/null +++ b/assets/404.ac109edc.js @@ -0,0 +1 @@ +import{f as i,u as d,g as p,o as f,c as k,a as e,t as c,b as v,w as g,h as l,r as L,d as x,_ as B}from"../app.e68a1260.mjs";const N={class:"theme-container"},T={class:"page"},b={class:"theme-default-content"},C=e("h1",null,"404",-1),M=i({__name:"404",setup(R){var s,a,n;const _=d(),o=p(),t=(s=o.value.notFound)!=null?s:["Not Found"],u=()=>t[Math.floor(Math.random()*t.length)],r=(a=o.value.home)!=null?a:_.value,m=(n=o.value.backToHome)!=null?n:"Back to home";return(V,w)=>{const h=L("RouterLink");return f(),k("div",N,[e("main",T,[e("div",b,[C,e("blockquote",null,c(u()),1),v(h,{to:l(r)},{default:g(()=>[x(c(l(m)),1)]),_:1},8,["to"])])])])}}}),F=B(M,[["__file","404.vue"]]);export{F as default}; diff --git a/assets/404.html.d55be9f8.js b/assets/404.html.d55be9f8.js new file mode 100644 index 0000000..c4c5770 --- /dev/null +++ b/assets/404.html.d55be9f8.js @@ -0,0 +1 @@ +const t=JSON.parse('{"key":"v-3706649a","path":"/404.html","title":"","lang":"en-US","frontmatter":{"layout":"404"},"excerpt":"","headers":[],"git":{},"filePathRelative":null}');export{t as data}; diff --git a/assets/404.html.eafdd8b4.js b/assets/404.html.eafdd8b4.js new file mode 100644 index 0000000..409ba15 --- /dev/null +++ b/assets/404.html.eafdd8b4.js @@ -0,0 +1 @@ +import{_ as e,o as c,c as t}from"../app.e68a1260.mjs";const _={};function o(r,n){return c(),t("div")}const a=e(_,[["render",o],["__file","404.html.vue"]]);export{a as default}; diff --git a/assets/InstallationSuccess.163538f7.png b/assets/InstallationSuccess.163538f7.png new file mode 100644 index 0000000..9ff4344 Binary files /dev/null and b/assets/InstallationSuccess.163538f7.png differ diff --git a/assets/Layout.5483b500.js b/assets/Layout.5483b500.js new file mode 100644 index 0000000..65aa0b2 --- /dev/null +++ b/assets/Layout.5483b500.js @@ -0,0 +1 @@ +import{_ as w,o as a,c as i,b as L,r as R,f as S,i as P,j as h,h as e,F as I,k as A,l as y,m as pe,a as g,t as x,n as W,p as J,q as C,w as B,s as ve,v as k,d as j,x as Y,y as Be,z as Ne,A as He,B as Q,C as Z,D as q,E as he,G as me,H as E,u as fe,g as H,T as be,I as z,J as ge,K as G,L as X,M as Ie,N as Me,O as ee,P as ke,Q as $e,e as De,R as te,S as Pe,U as K,V as ne,W as Ee,X as Re,Y as Ae,Z as Oe,$ as Fe,a0 as ze,a1 as We}from"../app.e68a1260.mjs";const Ue={},Ve={class:"theme-default-content"};function Ke(d,n){const t=R("Content");return a(),i("div",Ve,[L(t)])}const je=w(Ue,[["render",Ke],["__file","HomeContent.vue"]]),qe={key:0,class:"features"},Ge=S({__name:"HomeFeatures",setup(d){const n=P(),t=h(()=>pe(n.value.features)?n.value.features:[]);return(u,o)=>e(t).length?(a(),i("div",qe,[(a(!0),i(I,null,A(e(t),_=>(a(),i("div",{key:_.title,class:"feature"},[g("h2",null,x(_.title),1),g("p",null,x(_.details),1)]))),128))])):y("",!0)}}),Xe=w(Ge,[["__file","HomeFeatures.vue"]]),Ye=["innerHTML"],Je=["textContent"],Qe=S({__name:"HomeFooter",setup(d){const n=P(),t=h(()=>n.value.footer),u=h(()=>n.value.footerHtml);return(o,_)=>e(t)?(a(),i(I,{key:0},[e(u)?(a(),i("div",{key:0,class:"footer",innerHTML:e(t)},null,8,Ye)):(a(),i("div",{key:1,class:"footer",textContent:x(e(t))},null,8,Je))],64)):y("",!0)}}),Ze=w(Qe,[["__file","HomeFooter.vue"]]),et=["href","rel","target","aria-label"],tt=S({inheritAttrs:!1}),nt=S({...tt,__name:"AutoLink",props:{item:{type:Object,required:!0}},setup(d){const n=d,t=W(),u=He(),{item:o}=J(n),_=h(()=>Y(o.value.link)),f=h(()=>Be(o.value.link)||Ne(o.value.link)),c=h(()=>{if(!f.value){if(o.value.target)return o.value.target;if(_.value)return"_blank"}}),r=h(()=>c.value==="_blank"),s=h(()=>!_.value&&!f.value&&!r.value),l=h(()=>{if(!f.value){if(o.value.rel)return o.value.rel;if(r.value)return"noopener noreferrer"}}),p=h(()=>o.value.ariaLabel||o.value.text),v=h(()=>{const $=Object.keys(u.value.locales);return $.length?!$.some(m=>m===o.value.link):o.value.link!=="/"}),b=h(()=>v.value?t.path.startsWith(o.value.link):!1),N=h(()=>s.value?o.value.activeMatch?new RegExp(o.value.activeMatch).test(t.path):b.value:!1);return($,m)=>{const T=R("RouterLink"),M=R("AutoLinkExternalIcon");return e(s)?(a(),C(T,ve({key:0,class:{"router-link-active":e(N)},to:e(o).link,"aria-label":e(p)},$.$attrs),{default:B(()=>[k($.$slots,"before"),j(" "+x(e(o).text)+" ",1),k($.$slots,"after")]),_:3},16,["class","to","aria-label"])):(a(),i("a",ve({key:1,class:"external-link",href:e(o).link,rel:e(l),target:e(c),"aria-label":e(p)},$.$attrs),[k($.$slots,"before"),j(" "+x(e(o).text)+" ",1),e(r)?(a(),C(M,{key:0})):y("",!0),k($.$slots,"after")],16,et))}}}),D=w(nt,[["__file","AutoLink.vue"]]),at={class:"hero"},ot={key:0,id:"main-title"},st={key:1,class:"description"},rt={key:2,class:"actions"},lt=S({__name:"HomeHero",setup(d){const n=P(),t=Q(),u=Z(),o=h(()=>u.value&&n.value.heroImageDark!==void 0?n.value.heroImageDark:n.value.heroImage),_=h(()=>n.value.heroText===null?null:n.value.heroText||t.value.title||"Hello"),f=h(()=>n.value.heroAlt||_.value||"hero"),c=h(()=>n.value.tagline===null?null:n.value.tagline||t.value.description||"Welcome to your VuePress site"),r=h(()=>pe(n.value.actions)?n.value.actions.map(({text:l,link:p,type:v="primary"})=>({text:l,link:p,type:v})):[]),s=()=>{if(!o.value)return null;const l=q("img",{src:he(o.value),alt:f.value});return n.value.heroImageDark===void 0?l:q(me,()=>l)};return(l,p)=>(a(),i("header",at,[L(s),e(_)?(a(),i("h1",ot,x(e(_)),1)):y("",!0),e(c)?(a(),i("p",st,x(e(c)),1)):y("",!0),e(r).length?(a(),i("p",rt,[(a(!0),i(I,null,A(e(r),v=>(a(),C(D,{key:v.text,class:E(["action-button",[v.type]]),item:v},null,8,["class","item"]))),128))])):y("",!0)]))}}),ut=w(lt,[["__file","HomeHero.vue"]]),it={class:"home"},ct=S({__name:"Home",setup(d){return(n,t)=>(a(),i("main",it,[L(ut),L(Xe),L(je),L(Ze)]))}}),dt=w(ct,[["__file","Home.vue"]]),vt=S({__name:"NavbarBrand",setup(d){const n=fe(),t=Q(),u=H(),o=Z(),_=h(()=>u.value.home||n.value),f=h(()=>t.value.title),c=h(()=>o.value&&u.value.logoDark!==void 0?u.value.logoDark:u.value.logo),r=()=>{if(!c.value)return null;const s=q("img",{class:"logo",src:he(c.value),alt:f.value});return u.value.logoDark===void 0?s:q(me,()=>s)};return(s,l)=>{const p=R("RouterLink");return a(),C(p,{to:e(_)},{default:B(()=>[L(r),e(f)?(a(),i("span",{key:0,class:E(["site-name",{"can-hide":e(c)}])},x(e(f)),3)):y("",!0)]),_:1},8,["to"])}}}),_t=w(vt,[["__file","NavbarBrand.vue"]]),pt=S({__name:"DropdownTransition",setup(d){const n=u=>{u.style.height=u.scrollHeight+"px"},t=u=>{u.style.height=""};return(u,o)=>(a(),C(be,{name:"dropdown",onEnter:n,onAfterEnter:t,onBeforeLeave:n},{default:B(()=>[k(u.$slots,"default")]),_:3}))}}),Le=w(pt,[["__file","DropdownTransition.vue"]]),ht=["aria-label"],mt={class:"title"},ft=g("span",{class:"arrow down"},null,-1),bt=["aria-label"],gt={class:"title"},kt={class:"navbar-dropdown"},$t={class:"navbar-dropdown-subtitle"},Lt={key:1},yt={class:"navbar-dropdown-subitem-wrapper"},wt=S({__name:"NavbarDropdown",props:{item:{type:Object,required:!0}},setup(d){const n=d,{item:t}=J(n),u=h(()=>t.value.ariaLabel||t.value.text),o=z(!1),_=W();ge(()=>_.path,()=>{o.value=!1});const f=r=>{r.detail===0?o.value=!o.value:o.value=!1},c=(r,s)=>s[s.length-1]===r;return(r,s)=>(a(),i("div",{class:E(["navbar-dropdown-wrapper",{open:o.value}])},[g("button",{class:"navbar-dropdown-title",type:"button","aria-label":e(u),onClick:f},[g("span",mt,x(e(t).text),1),ft],8,ht),g("button",{class:"navbar-dropdown-title-mobile",type:"button","aria-label":e(u),onClick:s[0]||(s[0]=l=>o.value=!o.value)},[g("span",gt,x(e(t).text),1),g("span",{class:E(["arrow",o.value?"down":"right"])},null,2)],8,bt),L(Le,null,{default:B(()=>[G(g("ul",kt,[(a(!0),i(I,null,A(e(t).children,l=>(a(),i("li",{key:l.text,class:"navbar-dropdown-item"},[l.children?(a(),i(I,{key:0},[g("h4",$t,[l.link?(a(),C(D,{key:0,item:l,onFocusout:p=>c(l,e(t).children)&&l.children.length===0&&(o.value=!1)},null,8,["item","onFocusout"])):(a(),i("span",Lt,x(l.text),1))]),g("ul",yt,[(a(!0),i(I,null,A(l.children,p=>(a(),i("li",{key:p.link,class:"navbar-dropdown-subitem"},[L(D,{item:p,onFocusout:v=>c(p,l.children)&&c(l,e(t).children)&&(o.value=!1)},null,8,["item","onFocusout"])]))),128))])],64)):(a(),C(D,{key:1,item:l,onFocusout:p=>c(l,e(t).children)&&(o.value=!1)},null,8,["item","onFocusout"]))]))),128))],512),[[X,o.value]])]),_:1})],2))}}),St=w(wt,[["__file","NavbarDropdown.vue"]]),_e=d=>decodeURI(d).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),Ct=(d,n)=>{if(n.hash===d)return!0;const t=_e(n.path),u=_e(d);return t===u},ye=(d,n)=>d.link&&Ct(d.link,n)?!0:d.children?d.children.some(t=>ye(t,n)):!1,we=d=>!Y(d)||/github\.com/.test(d)?"GitHub":/bitbucket\.org/.test(d)?"Bitbucket":/gitlab\.com/.test(d)?"GitLab":/gitee\.com/.test(d)?"Gitee":null,Tt={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},xt=({docsRepo:d,editLinkPattern:n})=>{if(n)return n;const t=we(d);return t!==null?Tt[t]:null},Bt=({docsRepo:d,docsBranch:n,docsDir:t,filePathRelative:u,editLinkPattern:o})=>{if(!u)return null;const _=xt({docsRepo:d,editLinkPattern:o});return _?_.replace(/:repo/,Y(d)?d:`https://github.com/${d}`).replace(/:branch/,n).replace(/:path/,Ie(`${Me(t)}/${u}`)):null},Nt={key:0,class:"navbar-items"},Ht=S({__name:"NavbarItems",setup(d){const n=()=>{const s=ee(),l=fe(),p=Q(),v=H();return h(()=>{var M,O,F;const b=Object.keys(p.value.locales);if(b.length<2)return[];const N=s.currentRoute.value.path,$=s.currentRoute.value.fullPath,m=s.currentRoute.value.hash;return[{text:(M=v.value.selectLanguageText)!=null?M:"unknown language",ariaLabel:(F=(O=v.value.selectLanguageAriaLabel)!=null?O:v.value.selectLanguageText)!=null?F:"unknown language",children:b.map(U=>{var se,re,le,ue,ie,ce;const Ce=(re=(se=p.value.locales)==null?void 0:se[U])!=null?re:{},ae=(ue=(le=v.value.locales)==null?void 0:le[U])!=null?ue:{},oe=`${Ce.lang}`,Te=(ie=ae.selectLanguageName)!=null?ie:oe;let V;if(oe===p.value.lang)V=$;else{const de=N.replace(l.value,U);s.getRoutes().some(xe=>xe.path===de)?V=`${de}${m}`:V=(ce=ae.home)!=null?ce:U}return{text:Te,link:V}})}]})},t=()=>{const s=H(),l=h(()=>s.value.repo),p=h(()=>l.value?we(l.value):null),v=h(()=>l.value&&!Y(l.value)?`https://github.com/${l.value}`:l.value),b=h(()=>v.value?s.value.repoLabel?s.value.repoLabel:p.value===null?"Source":p.value:null);return h(()=>!v.value||!b.value?[]:[{text:b.value,link:v.value}])},u=s=>ke(s)?$e(s):s.children?{...s,children:s.children.map(u)}:s,_=(()=>{const s=H();return h(()=>(s.value.navbar||[]).map(u))})(),f=n(),c=t(),r=h(()=>[..._.value,...f.value,...c.value]);return(s,l)=>e(r).length?(a(),i("nav",Nt,[(a(!0),i(I,null,A(e(r),p=>(a(),i("div",{key:p.text,class:"navbar-item"},[p.children?(a(),C(St,{key:0,item:p},null,8,["item"])):(a(),C(D,{key:1,item:p},null,8,["item"]))]))),128))])):y("",!0)}}),Se=w(Ht,[["__file","NavbarItems.vue"]]),It=["title"],Mt={class:"icon",focusable:"false",viewBox:"0 0 32 32"},Dt=De('',9),Pt=[Dt],Et={class:"icon",focusable:"false",viewBox:"0 0 32 32"},Rt=g("path",{d:"M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z",fill:"currentColor"},null,-1),At=[Rt],Ot=S({__name:"ToggleColorModeButton",setup(d){const n=H(),t=Z(),u=()=>{t.value=!t.value};return(o,_)=>(a(),i("button",{class:"toggle-color-mode-button",title:e(n).toggleColorMode,onClick:u},[G((a(),i("svg",Mt,Pt,512)),[[X,!e(t)]]),G((a(),i("svg",Et,At,512)),[[X,e(t)]])],8,It))}}),Ft=w(Ot,[["__file","ToggleColorModeButton.vue"]]),zt=["title"],Wt=g("div",{class:"icon","aria-hidden":"true"},[g("span"),g("span"),g("span")],-1),Ut=[Wt],Vt=S({__name:"ToggleSidebarButton",emits:["toggle"],setup(d){const n=H();return(t,u)=>(a(),i("div",{class:"toggle-sidebar-button",title:e(n).toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:u[0]||(u[0]=o=>t.$emit("toggle"))},Ut,8,zt))}}),Kt=w(Vt,[["__file","ToggleSidebarButton.vue"]]),jt=S({__name:"Navbar",emits:["toggle-sidebar"],setup(d){const n=H(),t=z(null),u=z(null),o=z(0),_=h(()=>o.value?{maxWidth:o.value+"px"}:{});te(()=>{const r=f(t.value,"paddingLeft")+f(t.value,"paddingRight"),s=()=>{var l;window.innerWidth<=719?o.value=0:o.value=t.value.offsetWidth-r-(((l=u.value)==null?void 0:l.offsetWidth)||0)};s(),window.addEventListener("resize",s,!1),window.addEventListener("orientationchange",s,!1)});function f(c,r){var p,v,b;const s=(b=(v=(p=c==null?void 0:c.ownerDocument)==null?void 0:p.defaultView)==null?void 0:v.getComputedStyle(c,null))==null?void 0:b[r],l=Number.parseInt(s,10);return Number.isNaN(l)?0:l}return(c,r)=>{const s=R("NavbarSearch");return a(),i("header",{ref_key:"navbar",ref:t,class:"navbar"},[L(Kt,{onToggle:r[0]||(r[0]=l=>c.$emit("toggle-sidebar"))}),g("span",{ref_key:"navbarBrand",ref:u},[L(_t)],512),g("div",{class:"navbar-items-wrapper",style:Pe(e(_))},[k(c.$slots,"before"),L(Se,{class:"can-hide"}),k(c.$slots,"after"),e(n).colorModeSwitch?(a(),C(Ft,{key:0})):y("",!0),L(s)],4)],512)}}}),qt=w(jt,[["__file","Navbar.vue"]]),Gt={class:"page-meta"},Xt={key:0,class:"meta-item edit-link"},Yt={key:1,class:"meta-item last-updated"},Jt={class:"meta-item-label"},Qt={class:"meta-item-info"},Zt={key:2,class:"meta-item contributors"},en={class:"meta-item-label"},tn={class:"meta-item-info"},nn=["title"],an=j(", "),on=S({__name:"PageMeta",setup(d){const n=()=>{const r=H(),s=K(),l=P();return h(()=>{var M,O,F;if(!((O=(M=l.value.editLink)!=null?M:r.value.editLink)!=null?O:!0))return null;const{repo:v,docsRepo:b=v,docsBranch:N="main",docsDir:$="",editLinkText:m}=r.value;if(!b)return null;const T=Bt({docsRepo:b,docsBranch:N,docsDir:$,filePathRelative:s.value.filePathRelative,editLinkPattern:(F=l.value.editLinkPattern)!=null?F:r.value.editLinkPattern});return T?{text:m!=null?m:"Edit this page",link:T}:null})},t=()=>{const r=H(),s=K(),l=P();return h(()=>{var b,N,$,m;return!((N=(b=l.value.lastUpdated)!=null?b:r.value.lastUpdated)!=null?N:!0)||!(($=s.value.git)!=null&&$.updatedTime)?null:new Date((m=s.value.git)==null?void 0:m.updatedTime).toLocaleString()})},u=()=>{const r=H(),s=K(),l=P();return h(()=>{var v,b,N,$;return((b=(v=l.value.contributors)!=null?v:r.value.contributors)!=null?b:!0)&&($=(N=s.value.git)==null?void 0:N.contributors)!=null?$:null})},o=H(),_=n(),f=t(),c=u();return(r,s)=>{const l=R("ClientOnly");return a(),i("footer",Gt,[e(_)?(a(),i("div",Xt,[L(D,{class:"meta-item-label",item:e(_)},null,8,["item"])])):y("",!0),e(f)?(a(),i("div",Yt,[g("span",Jt,x(e(o).lastUpdatedText)+": ",1),L(l,null,{default:B(()=>[g("span",Qt,x(e(f)),1)]),_:1})])):y("",!0),e(c)&&e(c).length?(a(),i("div",Zt,[g("span",en,x(e(o).contributorsText)+": ",1),g("span",tn,[(a(!0),i(I,null,A(e(c),(p,v)=>(a(),i(I,{key:v},[g("span",{class:"contributor",title:`email: ${p.email}`},x(p.name),9,nn),v!==e(c).length-1?(a(),i(I,{key:0},[an],64)):y("",!0)],64))),128))])])):y("",!0)])}}}),sn=w(on,[["__file","PageMeta.vue"]]),rn={key:0,class:"page-nav"},ln={class:"inner"},un={key:0,class:"prev"},cn={key:1,class:"next"},dn=S({__name:"PageNav",setup(d){const n=r=>r===!1?null:ke(r)?$e(r):Ee(r)?r:!1,t=(r,s,l)=>{const p=r.findIndex(v=>v.link===s);if(p!==-1){const v=r[p+l];return v!=null&&v.link?v:null}for(const v of r)if(v.children){const b=t(v.children,s,l);if(b)return b}return null},u=P(),o=ne(),_=W(),f=h(()=>{const r=n(u.value.prev);return r!==!1?r:t(o.value,_.path,-1)}),c=h(()=>{const r=n(u.value.next);return r!==!1?r:t(o.value,_.path,1)});return(r,s)=>e(f)||e(c)?(a(),i("nav",rn,[g("p",ln,[e(f)?(a(),i("span",un,[L(D,{item:e(f)},null,8,["item"])])):y("",!0),e(c)?(a(),i("span",cn,[L(D,{item:e(c)},null,8,["item"])])):y("",!0)])])):y("",!0)}}),vn=w(dn,[["__file","PageNav.vue"]]),_n={class:"page"},pn={class:"theme-default-content"},hn=S({__name:"Page",setup(d){return(n,t)=>{const u=R("Content");return a(),i("main",_n,[k(n.$slots,"top"),g("div",pn,[k(n.$slots,"content-top"),L(u),k(n.$slots,"content-bottom")]),L(sn),L(vn),k(n.$slots,"bottom")])}}}),mn=w(hn,[["__file","Page.vue"]]),fn=["onKeydown"],bn={class:"sidebar-item-children"},gn=S({__name:"SidebarItem",props:{item:{type:Object,required:!0},depth:{type:Number,required:!1,default:0}},setup(d){const n=d,{item:t,depth:u}=J(n),o=W(),_=ee(),f=h(()=>ye(t.value,o)),c=h(()=>({"sidebar-item":!0,"sidebar-heading":u.value===0,active:f.value,collapsible:t.value.collapsible})),r=h(()=>t.value.collapsible?f.value:!0),[s,l]=Re(r.value),p=b=>{t.value.collapsible&&(b.preventDefault(),l())},v=_.afterEach(b=>{Ae(()=>{s.value=r.value})});return Oe(()=>{v()}),(b,N)=>{var m;const $=R("SidebarItem",!0);return a(),i("li",null,[e(t).link?(a(),C(D,{key:0,class:E(e(c)),item:e(t)},null,8,["class","item"])):(a(),i("p",{key:1,tabindex:"0",class:E(e(c)),onClick:p,onKeydown:Fe(p,["enter"])},[j(x(e(t).text)+" ",1),e(t).collapsible?(a(),i("span",{key:0,class:E(["arrow",e(s)?"down":"right"])},null,2)):y("",!0)],42,fn)),(m=e(t).children)!=null&&m.length?(a(),C(Le,{key:2},{default:B(()=>[G(g("ul",bn,[(a(!0),i(I,null,A(e(t).children,T=>(a(),C($,{key:`${e(u)}${T.text}${T.link}`,item:T,depth:e(u)+1},null,8,["item","depth"]))),128))],512),[[X,e(s)]])]),_:1})):y("",!0)])}}}),kn=w(gn,[["__file","SidebarItem.vue"]]),$n={key:0,class:"sidebar-items"},Ln=S({__name:"SidebarItems",setup(d){const n=W(),t=ne();return te(()=>{ge(()=>n.hash,u=>{const o=document.querySelector(".sidebar");if(!o)return;const _=document.querySelector(`.sidebar a.sidebar-item[href="${n.path}${u}"]`);if(!_)return;const{top:f,height:c}=o.getBoundingClientRect(),{top:r,height:s}=_.getBoundingClientRect();rf+c&&_.scrollIntoView(!1)})}),(u,o)=>e(t).length?(a(),i("ul",$n,[(a(!0),i(I,null,A(e(t),_=>(a(),C(kn,{key:`${_.text}${_.link}`,item:_},null,8,["item"]))),128))])):y("",!0)}}),yn=w(Ln,[["__file","SidebarItems.vue"]]),wn={class:"sidebar"},Sn=S({__name:"Sidebar",setup(d){return(n,t)=>(a(),i("aside",wn,[L(Se),k(n.$slots,"top"),L(yn),k(n.$slots,"bottom")]))}}),Cn=w(Sn,[["__file","Sidebar.vue"]]),Tn=S({__name:"Layout",setup(d){const n=K(),t=P(),u=H(),o=h(()=>t.value.navbar!==!1&&u.value.navbar!==!1),_=ne(),f=z(!1),c=m=>{f.value=typeof m=="boolean"?m:!f.value},r={x:0,y:0},s=m=>{r.x=m.changedTouches[0].clientX,r.y=m.changedTouches[0].clientY},l=m=>{const T=m.changedTouches[0].clientX-r.x,M=m.changedTouches[0].clientY-r.y;Math.abs(T)>Math.abs(M)&&Math.abs(T)>40&&(T>0&&r.x<=80?c(!0):c(!1))},p=h(()=>[{"no-navbar":!o.value,"no-sidebar":!_.value.length,"sidebar-open":f.value},t.value.pageClass]);let v;te(()=>{v=ee().afterEach(()=>{c(!1)})}),ze(()=>{v()});const b=We(),N=b.resolve,$=b.pending;return(m,T)=>(a(),i("div",{class:E(["theme-container",e(p)]),onTouchstart:s,onTouchend:l},[k(m.$slots,"navbar",{},()=>[e(o)?(a(),C(qt,{key:0,onToggleSidebar:c},{before:B(()=>[k(m.$slots,"navbar-before")]),after:B(()=>[k(m.$slots,"navbar-after")]),_:3})):y("",!0)]),g("div",{class:"sidebar-mask",onClick:T[0]||(T[0]=M=>c(!1))}),k(m.$slots,"sidebar",{},()=>[L(Cn,null,{top:B(()=>[k(m.$slots,"sidebar-top")]),bottom:B(()=>[k(m.$slots,"sidebar-bottom")]),_:3})]),k(m.$slots,"page",{},()=>[e(t).home?(a(),C(dt,{key:0})):(a(),C(be,{key:1,name:"fade-slide-y",mode:"out-in",onBeforeEnter:e(N),onBeforeLeave:e($)},{default:B(()=>[(a(),C(mn,{key:e(n).path},{top:B(()=>[k(m.$slots,"page-top")]),"content-top":B(()=>[k(m.$slots,"page-content-top")]),"content-bottom":B(()=>[k(m.$slots,"page-content-bottom")]),bottom:B(()=>[k(m.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"]))])],34))}}),Bn=w(Tn,[["__file","Layout.vue"]]);export{Bn as default}; diff --git a/assets/Picture1.47f360c5.png b/assets/Picture1.47f360c5.png new file mode 100644 index 0000000..935e8f4 Binary files /dev/null and b/assets/Picture1.47f360c5.png differ diff --git a/assets/Picture2.080d8c83.png b/assets/Picture2.080d8c83.png new file mode 100644 index 0000000..1ff9be9 Binary files /dev/null and b/assets/Picture2.080d8c83.png differ diff --git a/assets/Picture3.16075eab.png b/assets/Picture3.16075eab.png new file mode 100644 index 0000000..08714f2 Binary files /dev/null and b/assets/Picture3.16075eab.png differ diff --git a/assets/Picture4.022b7bd0.png b/assets/Picture4.022b7bd0.png new file mode 100644 index 0000000..9dff17f Binary files /dev/null and b/assets/Picture4.022b7bd0.png differ diff --git a/assets/Picture5.4df24d24.png b/assets/Picture5.4df24d24.png new file mode 100644 index 0000000..7d4fdd0 Binary files /dev/null and b/assets/Picture5.4df24d24.png differ diff --git a/assets/Picture6.bee9d5f8.png b/assets/Picture6.bee9d5f8.png new file mode 100644 index 0000000..d7f494d Binary files /dev/null and b/assets/Picture6.bee9d5f8.png differ diff --git a/assets/Picture7.5c43b911.png b/assets/Picture7.5c43b911.png new file mode 100644 index 0000000..504ee4b Binary files /dev/null and b/assets/Picture7.5c43b911.png differ diff --git a/assets/Picture8.e3dfc860.png b/assets/Picture8.e3dfc860.png new file mode 100644 index 0000000..6a0aae2 Binary files /dev/null and b/assets/Picture8.e3dfc860.png differ diff --git a/assets/ScoreSaber_1.d806f21b.png b/assets/ScoreSaber_1.d806f21b.png new file mode 100644 index 0000000..10e8a8f Binary files /dev/null and b/assets/ScoreSaber_1.d806f21b.png differ diff --git a/assets/ScoreSaber_2.c19ab7db.png b/assets/ScoreSaber_2.c19ab7db.png new file mode 100644 index 0000000..d208cde Binary files /dev/null and b/assets/ScoreSaber_2.c19ab7db.png differ diff --git a/assets/ScoreSaber_3.b0177a9c.png b/assets/ScoreSaber_3.b0177a9c.png new file mode 100644 index 0000000..e0d6898 Binary files /dev/null and b/assets/ScoreSaber_3.b0177a9c.png differ diff --git a/assets/ScoreSaber_4.4074a47c.png b/assets/ScoreSaber_4.4074a47c.png new file mode 100644 index 0000000..940686d Binary files /dev/null and b/assets/ScoreSaber_4.4074a47c.png differ diff --git a/assets/ScoreSaber_5.08d79a9c.png b/assets/ScoreSaber_5.08d79a9c.png new file mode 100644 index 0000000..58cb187 Binary files /dev/null and b/assets/ScoreSaber_5.08d79a9c.png differ diff --git a/assets/ScoreSaber_6.07260be0.png b/assets/ScoreSaber_6.07260be0.png new file mode 100644 index 0000000..4ae15dd Binary files /dev/null and b/assets/ScoreSaber_6.07260be0.png differ diff --git a/assets/about-us.html.db683ed4.js b/assets/about-us.html.db683ed4.js new file mode 100644 index 0000000..ea91b7f --- /dev/null +++ b/assets/about-us.html.db683ed4.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-408f3862","path":"/about-us.html","title":"About us","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"The Team","slug":"the-team","children":[]},{"level":2,"title":"About ScoreSaber","slug":"about-scoresaber","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"about-us.md"}');export{e as data}; diff --git a/assets/about-us.html.fe158ef8.js b/assets/about-us.html.fe158ef8.js new file mode 100644 index 0000000..a583c3e --- /dev/null +++ b/assets/about-us.html.fe158ef8.js @@ -0,0 +1 @@ +import{_ as r,o as c,c as i,a as e,b as t,w as d,d as o,r as a}from"../app.e68a1260.mjs";const h={},l=e("h1",{id:"about-us",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#about-us","aria-hidden":"true"},"#"),o(" About us")],-1),_=e("h2",{id:"the-team",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#the-team","aria-hidden":"true"},"#"),o(" The Team")],-1),u={class:"custom-container tip"},m=e("p",{class:"custom-container-title"},"If you want to know who is keeping ScoreSaber alive,",-1),b={href:"https://scoresaber.com/team",target:"_blank",rel:"noopener noreferrer"},f=o("You can find our complete Team here"),p={class:"custom-container tip"},k=e("p",{class:"custom-container-title"},"If you want to know what each Team Role does,",-1),w=o("You can find more Information here"),x=e("h2",{id:"about-scoresaber",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#about-scoresaber","aria-hidden":"true"},"#"),o(" About ScoreSaber")],-1),g=e("p",null,[e("strong",null,"ScoreSaber is Beat Saber's largest leaderboard system for custom songs, hosting 60 million scores across 170,000+ leaderboards, with more than 1 million users worldwide")],-1);function S(v,I){const s=a("ExternalLinkIcon"),n=a("RouterLink");return c(),i("div",null,[l,_,e("div",u,[m,e("p",null,[e("a",b,[f,t(s)])])]),e("div",p,[k,e("p",null,[t(n,{to:"/ranking/scoresaber-team-information.html"},{default:d(()=>[w]),_:1})])]),x,g])}const B=r(h,[["render",S],["__file","about-us.html.vue"]]);export{B as default}; diff --git a/assets/back-to-top.8efcbe56.svg b/assets/back-to-top.8efcbe56.svg new file mode 100644 index 0000000..8323678 --- /dev/null +++ b/assets/back-to-top.8efcbe56.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/badges.f5aa8ea9.jpg b/assets/badges.f5aa8ea9.jpg new file mode 100644 index 0000000..aedd6e8 Binary files /dev/null and b/assets/badges.f5aa8ea9.jpg differ diff --git a/assets/beginners-guide.html.adfabb39.js b/assets/beginners-guide.html.adfabb39.js new file mode 100644 index 0000000..81a9118 --- /dev/null +++ b/assets/beginners-guide.html.adfabb39.js @@ -0,0 +1 @@ +import{_ as l,o as d,c,a as e,b as t,w as n,e as s,d as o,r as i}from"../app.e68a1260.mjs";const h="/assets/modassistant.b36c557c.png",u="/assets/InstallationSuccess.163538f7.png",p="/assets/ScoreSaber_1.d806f21b.png",g="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADbElEQVRIiY2WwWtdVRDGf3MJIYTweJQgoYQQQnir4EZcuBE3UolBSgmlSClScCMSRReioFAEi6sixaWE/BNpQxaiG7uw6KJ0EQJtiEmNieT5SNOXVr/PxZ37ehsT04HhnnPunG/mzpn5zg2OEUlExAQwDbwOTNkejoi/gTZw1/ZSRNwEViPiOKhnxTa2x2x/Z/tPp0j6x3alT/xUdm3P2x6T9FwOzknakOQa+Lrtd2xv2K7G6zUnlrRh++xJ4HOSDmw/sr2cUW/bbtluSrqX2pTUkrSVNsuSHuXeuSPzbXvW9oGkbUlv2f4+U3EpbZq276U2M6CLafOD7ZkM5kDSbJWuvvQxbvsboD8ibgEv2X4tItrAqO2PgAGgYZuIeM921/ZAROzZfhX4MSJu2Z4BrkfEz8B9JCFpXpKrvJ80fh7NgydsTwC3gT3gakb6CTAIfGl7DyAiBoFP84uvAvs5HrL9eUTsA18D3bQbAl7G9vvp8UrmdcT2X7Z/sT1QK4DeGUhq1tYHbN/OPSN5Xl9kcc0VwBngMXAj95y23QBWIqJbA+ppXdJmNfeM5vJN24+BM33AVER0bO9klK3syh1JzYioQBsRUaSzRuUon3/knknbq7Z3IqIDTIXt3czjb2k0CLwAtG23KwqwXUTE6QTcBHptGxFN282I2LG9l3tGbe/3VVFkdAKKw2lIkF56DvNO3T7fFYkJeXDbkiazQy/kAX2b80rHJK3ZXpM0Xn9n+3qW8YWcT2bTrRXAHaABnCqKog2sZDDDRVG0K82cKrVdfwcM51es5vxUYt4pgGXKDn4zP3HTdsf2pKRemR6Vjpz3224BnYjYzOU3bPcDS33AInAFuCzpQbZ/F2gBc5I6CTQYEUOZ38uS9nN9KCJawL7t85K6wLuUd8ZiVdvzFRWcJIdo/NixpAXbREYxbvsnYARYjIhfgc9st4FrEdF12dUfAEW1BvQDH7tk16+AF4GZiPgdeCUi7vfyans2+XzL9rSf0vVFeJauK6qQ9Lakiq6nc+9BYh0+vvLCccnnDyUtu7wet7LsmpJ6DnKtfuE8TPAP/4tcE0nnJD04RNHrki7lsxqv1W0ykPP/C15L17jtBZcXeiVPfMSlL2lX0oKkCR/FACc4moyIaUrGnQKaLimgDdwFlijLfOW435Z/AXSgepJ0kmMPAAAAAElFTkSuQmCC",b="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABgUlEQVRIibVUvUoDQRicL6QQCXKVWEiwEv/KVOIjWFhYWYpP4CvkCVKJDxQLESwsJIiNgiARg8YqhBkLb8Nms95ecjpw3HDsznz77XcD/DOszCKSGYAWgA0AYzN7AnBjZp+VK5B0QPJBAUjeS2pVFW+SfCXpRBXwZ0lrRRq1hMGJma2a/XTSzBDwdUnHCxuY2W7EdPLO+fbCBgDqntDMu4xGPWEwdi0BAJ87SBoXCaROMMpFfMGQj4oEUid4j4kHLRoUCaSmqBuZHP+hmV0niiw0yEg+utl38+/xO0mNhQ1yk/PffjRJZ5XEc4NlSb1IVNxKWkrtT93BCoBDAC/eN0ffABzlQThXxZC0JemC5Eckf6Y4ySHJS5KbwXRNgyRINkl2JA3ClpTAIN/bJDlTdSapTbKfUimYKEf7ktqSMlf5DsleqhXzcpI9SXsmqQtgf66LKo8rkzQE0HAXHAu0oJ2TNSX4V83f6HPN5n4q9KLcSJ6aWV1SLVZNFUgqTNo/wTci+3Dw5gIvKQAAAABJRU5ErkJggg==",A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACMElEQVRIidWVQUuVURCG3/mQuIsWl4tISIRJREREiETU3kW48ge0kIiW0calPyBaSQtpGf2FaBMtrhIFuQk3lqCERgYqWpKk79PinmvHe7+rN3DjwMcZ5sy8M2fmPeeTTrtEt462JakvIgSsFUVxclUAl2zXAWxjexa4fFLgAuq0yyzwf8cAqsAYMApUku2C7QPUXAcGk8+ZFDMGVDuBD9j+mrXhPVADbjRBk/3gA4aTz7vMvtJM3JrgSUkbxm3XbP8p2dsH+myPl+w9beLmPRxsSShJF4uiWI+ImRa7JM1ExJqk8y12SRooS7DQdMrWz2mdlLST2XckTUpSRCzlcUn/Utaia8BudswV2/1prwBeZIN+2WSQ7X5gJYvbBa63JUjOUxnIw6yy28B8NuiPwHCKEfAgI8KzUvDEhqnktAhUbd+y/baVRZn+JiWvAouptimgllddsf0IWM6OOGL7HrBRwpBW2bZ93/ZI1uJl24+BioBpGpRrVjcPDNn+VYZWdumS7xDwKbPvA9MBbEiq8o9mryXtSRpND5sSW47TXyX9bmbfCmBb0tlsHEuSzkmqlA6rs/yWtKrD9+lnAD8k9aZBK+LoFzz36UJfLyRNAJtZi/IL06bnPkfpwJakCQGyfdX2tO1vtve7YE6ppNjvwHMaF7c41A+gV9JNSXckDUu6IqlfUk+HFu1FxKqkBUlzkuqSPqQ3SlIXv0ygR1JNDSIUyeaI2JK0GRF7x2GcbvkL1IOAqZwj/aMAAAAASUVORK5CYII=",_="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABVUlEQVRIib2ULW8VURRF155UERQK+XTTP4CpqsMRfgVpwOKRBNVU8PUHUGAIEoOGBPIkoFCQEEKa0MBZNfOaafPuDB/z2OaeK+5eZ985d2CgqtpVP6i7zKRuuEmyDSyAW+pC7dae+lsAsNWv14DX6v2q2v5XyKnUfdWqsqrs61/qM3VP3Zp2GQfctK0f6iv1unpxE4BVItW3VbWvXpjyPPMN1NO1VffrDnDQT9ydqlrMlqCR6EtVHao7npu85hiuup2qkwBcAm4Ad4HLk4Ap8+G1AUfA0yRXgKtJPg291o5d39VorX5N8gQ4BJZJfq7zas71IP6ZGvgMPEjyOMn71vlRQONalkkeAo+SfJ8yHgUMuj1O8ga4B7xI8u13jUcBQKnPkxyoL7uuO/5T47UavIPbsxjSfgdHmwbMpv8OqE0DZlcrwWxJzgNW/5ONAZbqR+DdXIATGsNZ44vEwkkAAAAASUVORK5CYII=",m="/assets/ScoreSaber_2.c19ab7db.png",f="/assets/ScoreSaber_3.b0177a9c.png",S="/assets/ScoreSaber_4.4074a47c.png",w="/assets/ScoreSaber_6.07260be0.png",y="/assets/ScoreSaber_5.08d79a9c.png",k="/assets/badges.f5aa8ea9.jpg",v={},B=s('

Beginners Guide

Installing ScoreSaber

PC

Installing ScoreSaber on Beat Saber is relatively quick and easy. You need to install the mod onto your game, but before you go and install any mod, make sure to run the game at least once. This applies to reinstalling your game too.

',4),U=o("Next, it is strongly recommended to use the ModAssistant installer, available "),I={href:"https://github.com/Assistant/ModAssistant/releases/latest",target:"_blank",rel:"noopener noreferrer"},E=o("here"),R=o(" to get the ScoreSaber mod up and running."),x=e("div",{class:"custom-container warning"},[e("p",{class:"custom-container-title"},"\u{1F4A1} For safety, only install mods from this application since they are approved and verified mods.")],-1),D=e("p",null,[e("img",{src:h,alt:"Mod Assistant"})],-1),V=e("p",null,"When this is done installing, you can go ahead and launch Beat Saber.",-1),X={class:"custom-container tip"},P=e("p",{class:"custom-container-title"},"Need help with Plugins/Mods?",-1),C=o("Please head over to the "),K={href:"https://bsmg.wiki/pc-modding.html",target:"_blank",rel:"noopener noreferrer"},N=o("BSMG Wiki"),Q=o(" for a detailed guide on Modding."),J=e("hr",null,null,-1),M=e("p",null,[o("After the game is loaded, head over to Solo. If everything went well, you should see a new banner on the top of the leaderboards with the ScoreSaber logo, like so: "),e("img",{src:u,alt:"Logged In"})],-1),T=e("p",null,"Congratulations! You are now fully ready to use the ScoreSaber mod and submit scores onto custom maps!",-1),q=o("Head over to "),W=o("Using ScoreSaber"),O=o(" to learn more about ScoreSaber's website, mod, and all their functions."),G=s('

ScoreSaber for Quest

Make sure you're on the exact version ScoreSaber was made for otherwise it will not work!
\u26A0\uFE0F Do not put your Steam/Oculus login information into anything that isn't Steam/Oculus!


Installing ScoreSaber for Quest

',4),Y=o("If you are on a supported game version for using ScoreSaber on Quest and your game has BMBF ready, please head over to the "),Z={href:"https://scoresaber.com/quest",target:"_blank",rel:"noopener noreferrer"},z=o("ScoreSaber for Quest Page"),L=o(" on how to install ScoreSaber for Quest."),F=o("Your Quest Beat Saber is not modded or first time using Modded Beat Saber for native Quest?"),H=e("br",null,null,-1),j=o(" Please head over to the "),$={href:"https://bsmg.wiki/quest-modding.html",target:"_blank",rel:"noopener noreferrer"},ee=o("BSMG Wiki"),oe=o(' for a detailed guide on "Quest Modding"'),te=e("h2",{id:"using-scoresaber",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#using-scoresaber","aria-hidden":"true"},"#"),o(" Using ScoreSaber")],-1),ae=e("strong",null,"The ScoreSaber website is available at",-1),se=o(),re={href:"https://scoresaber.com/",target:"_blank",rel:"noopener noreferrer"},ne=o("https://scoresaber.com/"),ie=s('

In-Game Song Leaderboards

Leaderboard_full

With the ScoreSaber mod, you have access to various leaderboards within maps. This is to help players identify with ease how they compete with others around the world. You can use the icons on the left of each leaderboard to filter the scores that are shown:

  • Global - Global leaderboard of selected map
  • Around You - The scores around yours
  • Friends - The scores from your friends
  • Country - The scores from your local country

On each leaderboard, you can use the Up and Down arrow on top and bottom of the icon list to scroll through the different shown score pages.

leaderboard_detail


You can also click on an individual Score, via the button at the right side to see more information about the score, such as:

Score_info


On the Top right of the newly opened Window, you can also open the Users Profile, indicated by the card icon:

Profile


In-Game ScoreSaber Overview

by pressing on the big yellow ScoreSaber button right at the top of the leaderboard:

Lb_top

You can find our in-game dashboard:

SS_Info

Here you can see a in-game view of our Team Page as well as the Global Leaderboards and links to our socials.

ScoreSaber Profile

To be able to see and edit your ScoreSaber profile, you must first submit a score on a custom map. Doing so will automatically create your profile based on your Steam or Oculus information, and add you onto the leaderboards.

On your profile, you should be able to see the following: Your username, profile picture, total amount of pp earned, global & local ranking and various other statistics about the scores you submitted to ScoreSaber.

',22),le=o("If you would like more stats or features added to ScoreSaber and to profiles, make sure to first check if this wasn't already suggested "),de={href:"https://scoresaber.canny.io/feature-requests",target:"_blank",rel:"noopener noreferrer"},ce=o("here"),he=o(", and create a request about said feature."),ue=e("h3",{id:"badges-and-biography",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#badges-and-biography","aria-hidden":"true"},"#"),o(" Badges and Biography")],-1),pe=e("p",null,[o("While browsing on various ScoreSaber profiles, you may come across profiles which look like this: "),e("img",{src:k,alt:"Profile badges"})],-1),ge=e("p",null,"All the icons that are seen on this profile header are badges. You can earn a badge by either achieving a rewarding rank during a community event such as a tournament, or by simply becoming a ScoreSaber supporter on patreon. Doing so will also add the possibility to have and edit a biography in order to personalize your ScoreSaber profile even more.",-1),be={class:"custom-container tip"},Ae=e("p",{class:"custom-container-title"},"\u{1F4A1} TIP",-1),_e=o("For more information on the perks given to supporters, please check our "),me={href:"https://www.patreon.com/scoresaber",target:"_blank",rel:"noopener noreferrer"},fe=o("patreon page"),Se=o("."),we=e("h2",{id:"whats-next",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#whats-next","aria-hidden":"true"},"#"),o(" Whats next?")],-1),ye=o("Now that you're all set-up and ready to go, you can start using ScoreSaber and compete with everyone else!"),ke=e("br",null,null,-1),ve=o(" If you wish to learn more about the ranking process and how are things calculated, there is a more in depth guide from our wiki available "),Be=o("here"),Ue=o(".");function Ie(Ee,Re){const a=i("ExternalLinkIcon"),r=i("RouterLink");return d(),c("div",null,[B,e("p",null,[U,e("a",I,[E,t(a)]),R]),x,D,V,e("div",X,[P,e("p",null,[C,e("a",K,[N,t(a)]),Q])]),J,M,T,e("p",null,[q,t(r,{to:"/beginners-guide.html#using-scoresaber"},{default:n(()=>[W]),_:1}),O]),G,e("p",null,[Y,e("a",Z,[z,t(a)]),L]),e("p",null,[F,H,j,e("a",$,[ee,t(a)]),oe]),te,e("p",null,[ae,se,e("a",re,[ne,t(a)])]),ie,e("p",null,[le,e("a",de,[ce,t(a)]),he]),ue,pe,ge,e("div",be,[Ae,e("p",null,[_e,e("a",me,[fe,t(a)]),Se])]),we,e("p",null,[ye,ke,ve,t(r,{to:"/ranking-system.html"},{default:n(()=>[Be]),_:1}),Ue])])}const De=l(v,[["render",Ie],["__file","beginners-guide.html.vue"]]);export{De as default}; diff --git a/assets/beginners-guide.html.cb0108ab.js b/assets/beginners-guide.html.cb0108ab.js new file mode 100644 index 0000000..56e8292 --- /dev/null +++ b/assets/beginners-guide.html.cb0108ab.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-58e1e27c","path":"/beginners-guide.html","title":"Beginners Guide","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Installing ScoreSaber","slug":"installing-scoresaber","children":[{"level":3,"title":"PC","slug":"pc","children":[]},{"level":3,"title":"ScoreSaber for Quest","slug":"scoresaber-for-quest","children":[]}]},{"level":2,"title":"Using ScoreSaber","slug":"using-scoresaber","children":[{"level":3,"title":"In-Game Song Leaderboards","slug":"in-game-song-leaderboards","children":[]},{"level":3,"title":"In-Game ScoreSaber Overview","slug":"in-game-scoresaber-overview","children":[]},{"level":3,"title":"ScoreSaber Profile","slug":"scoresaber-profile","children":[]},{"level":3,"title":"Badges and Biography","slug":"badges-and-biography","children":[]}]},{"level":2,"title":"Whats next?","slug":"whats-next","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"beginners-guide.md"}');export{e as data}; diff --git a/assets/difficulty-spread-requirements.html.45bbc661.js b/assets/difficulty-spread-requirements.html.45bbc661.js new file mode 100644 index 0000000..b098676 --- /dev/null +++ b/assets/difficulty-spread-requirements.html.45bbc661.js @@ -0,0 +1 @@ +import{_ as o,o as l,c as a,a as e,b as t,w as h,d as i,e as d,r as n}from"../app.e68a1260.mjs";const f={},c=e("h1",{id:"difficulty-spread-requirements",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#difficulty-spread-requirements","aria-hidden":"true"},"#"),i(" Difficulty Spread Requirements")],-1),u=i("Looking for the Mapping Criteria? The ScoreSaber Mapping Criteria "),m=i("can be found here"),p=e("h2",{id:"explanation",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#explanation","aria-hidden":"true"},"#"),i(" Explanation")],-1),g=e("p",null,"A mapset must contain a reasonable difficulty progression starting from the highest difficulty level submitted for rank and ending at or below the lowest difficulty level required for the song's length, following the rules outlined in Progression Requirements.",-1),y=i("Difficulty is measured in Swings per Second (SPS) with the "),b={href:"https://drive.google.com/file/d/1xFjZRlwKPS078ZZe5G1-5xW9Pb2FYB1Q/view?usp=drivesdk",target:"_blank",rel:"noopener noreferrer"},_=i("Swings per Second Calculator"),v=i(". Place the calculator inside the map folder or a folder containing the zipped map files and run, or run the calculator on the command line with \u201C--help\u201D to see more options. The overall combined SPS is considered the SPS for the map. "),S=e("li",null,"If it does not print, it is likely because there are special characters in the info.dat. Workaround: Run the calculator on the zipped files instead.",-1),w={href:"https://drive.google.com/file/d/1T1oa2FBGlmJhVrCkA1vAMfhpgUE4OAvB/view?usp=drivesdk",target:"_blank",rel:"noopener noreferrer"},k=i("Source Code"),x=i(" if you would like to build it yourself or run on a non-Windows platform."),q=e("li",null,"Song length is defined as the length listed in the official metadata of the song, or the time difference between the start of the first significant musical element and the end of the last significant musical element if the official metadata is not available.",-1),P=d('

Lowest Required Difficulty Level

Starting from the highest SPS difficulty submitted for rank, there must be a difficulty or difficulties following the progression requirements until either the SPS Requirements or the Total Downmap Requirements are met.

SPS Requirements

  • If the song length is less than 2:00.0, the lowest difficulty submitted for rank must have less than 3.20 SPS.
  • If the song length is 2:00.0 to 3:59.99, the lowest difficulty submitted for rank must have less than 4.20 SPS.
  • If the song length is 4:00.0 to 5:59.99:
    • If the top difficulty submitted for rank has 5.20 SPS or more, there must be at least one lower difficulty that follows the progression requirements.
    • If the top difficulty submitted for rank has less than 5.20 SPS, the mapset is exempt from difficulty and progression requirements. However, mapping multiple difficulties is still encouraged.
  • If the song length is 6:00.0 or more, the mapset is exempt from difficulty and progression requirements. However, mapping multiple difficulties is still encouraged.

OR

Total Downmap Requirements

  • If the song length is less than 4:00.0, the lowest difficulty submitted for rank must have a minimum SPS reduction of 60% from the highest SPS difficulty submitted for rank.
  • If the song length is 4:00.0 to 5:59.99, the SPS Requirements should be applied instead.
  • If the song length is 6:00.0 or greater, the mapset is exempt from difficulty and progression requirements. However, mapping multiple difficulties is still encouraged.

Progression Requirements

As one progresses down from the highest difficulty in the mapset, these rules should be followed:

  • The overall swings per second in the interactive portion of the map must be decreased by 10.00-40.00% from the previous difficulty.
    • An exception can be made if the SPS decreases by less than 10% but the effective BPM of the highest effective BPM sections decreases by more than 40%. This primarily concerns cases where high effective BPM one-handed sections are converted into lower effective BPM sections that utilize both hands.
  • The mapping in periods of peak difficulty must be made easier.
  • The average effective BPM in the hardest section(s) must decrease OR the hardest sections should be made significantly shorter.
  • The average effective BPM must decrease.
  • Complexity, the difficulty involved in reading and executing the movements required to hit the notes, must not increase, unless justified by a large decrease in other components of difficulty.
  • The duration of the period(s) of peak difficulty must not significantly increase, unless justified by a large decrease in other components of difficulty.
  • The overall interactive object density should decrease.
  • Spacing, the distance between successive notes of the same color on the 4x3 grid, should not increase within a section if the average effective BPM remains the same in that section.

Miscellaneous

  • If the spread causes the mapset to exceed the 5 difficulty limit, the easiest or hardest additional levels should be placed in a separate mapset.
  • All difficulty labels must be appropriately named in relation to the difficulty of the map they represent.
  • Difficulty labels must not contain obscene content including derogatory terms, sexual content, or other explicit terminology.
  • Having multiple guest difficulties of the same relative difficulty is okay, as long as all difficulties are appropriately named to reflect their difficulty.
  • All difficulties in the mapset going for rank must go through the ranking process at the same time, and all decisions are final once any difficulties in the mapset are ranked.
  • Any difficulties which are not going for rank must not be inserted between difficulties going for rank. This includes lightshows, challenge difficulties, difficulties that require external mods, etc.
',12);function R(T,B){const r=n("RouterLink"),s=n("ExternalLinkIcon");return l(),a("div",null,[c,e("blockquote",null,[e("p",null,[u,t(r,{to:"/ranking/criteria/mapping-criteria.html"},{default:h(()=>[m]),_:1})])]),p,g,e("ul",null,[e("li",null,[y,e("a",b,[_,t(s)]),v,e("ul",null,[S,e("li",null,[e("a",w,[k,t(s)]),x])])]),q]),P])}const M=o(f,[["render",R],["__file","difficulty-spread-requirements.html.vue"]]);export{M as default}; diff --git a/assets/difficulty-spread-requirements.html.f456555e.js b/assets/difficulty-spread-requirements.html.f456555e.js new file mode 100644 index 0000000..4000832 --- /dev/null +++ b/assets/difficulty-spread-requirements.html.f456555e.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-6b9aed7a","path":"/ranking/criteria/difficulty-spread-requirements.html","title":"Difficulty Spread Requirements","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Explanation","slug":"explanation","children":[]},{"level":2,"title":"Lowest Required Difficulty Level","slug":"lowest-required-difficulty-level","children":[{"level":3,"title":"SPS Requirements","slug":"sps-requirements","children":[]}]},{"level":2,"title":"OR","slug":"or","children":[{"level":3,"title":"Total Downmap Requirements","slug":"total-downmap-requirements","children":[]}]},{"level":2,"title":"Progression Requirements","slug":"progression-requirements","children":[]},{"level":2,"title":"Miscellaneous","slug":"miscellaneous","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"ranking/criteria/difficulty-spread-requirements.md"}');export{e as data}; diff --git a/assets/discord-modding.4be99099.png b/assets/discord-modding.4be99099.png new file mode 100644 index 0000000..849431d Binary files /dev/null and b/assets/discord-modding.4be99099.png differ diff --git a/assets/faq.html.36b5ed8a.js b/assets/faq.html.36b5ed8a.js new file mode 100644 index 0000000..f23c3e0 --- /dev/null +++ b/assets/faq.html.36b5ed8a.js @@ -0,0 +1 @@ +import{_ as i,o as h,c as d,a as e,b as t,w as n,e as l,d as a,r as s}from"../app.e68a1260.mjs";const c={},p=l('

Frequently asked questions

What is PPv3, and when is it coming?

PPv3 is essentially the new algorithm which is aimed to be used to assign star rating to ranked maps. It is currently being developed by Umbranox and his PPv3 team. Considering the complexity of various elements slowing down the process of making PPv3 available, there is currently no ETA as to when it will come into place.

Why are the OST maps not ranked?

Scores which are submitted to the Beat Saber original soundtracks are not submitted to ScoreSaber for various reasons. This makes them ineligible for ranking as no ScoreSaber leaderboard is available for them to be a part of ranked maps.

Why are replays only available on ranked maps?

Replays over time take up a very considerable amount of storage space and ScoreSaber only has so much of it in its current state. There are too many maps available and storing all of them would be unhealthy for the well-being of ScoreSaber servers.

How do modifiers work with ScoreSaber?

Positive modifiers (Ghost Notes, Disappearing Arrows, Faster Song) are only enabled on both ranked Overkills. You can still set scores on other songs with modifiers, but only your base score is considered for scoring and PP calculations. Negative modifiers (No Fail, Slower Song, etc.), always apply.

Why not autorank every map?

There are many reasons as to this is a bad idea. It was attempted in the past and failed. It took almost a year to clean up all the unplayable and mistimed maps that got auto-ranked. In addition, ScoreSaber\u2019s servers would not be able to handle the processing load of auto-ranking all maps, this goes along the replays being only available to ranked maps.

I played all these maps but they give 0pp?

',12),m=a("That means the map is most likely not ranked. If you would like to see those maps ranked in order to gain PP from them, please reach out to the mapper and ask if it could be a possibility for them to push their map for rank via the "),u=a("ranking process"),b=a("."),f=e("h2",{id:"why-can-a-map-not-be-unranked",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#why-can-a-map-not-be-unranked","aria-hidden":"true"},"#"),a(" Why can a map not be unranked?")],-1),g=e("p",null,"There are three main reasons why a map cannot be unranked, one benefiting each of the player, mapper, and team. The first reason is because players have to put time into a map to get a good score, and would be discouraged from doing that if there is a threat of the map being unranked. The second is because mappers would likely be less inclined to spend the time pushing a map for rank if their map could be unranked. The last reason is because the ranking team would have to check over every map for every new issue outlined in criteria. This would be a large use of resources which would be better spent ranking new maps, which eventually will make the map pool large enough for players to be able to pick which maps to play.",-1),y=e("h2",{id:"how-can-i-get-unbanned-from-ranking-maps",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#how-can-i-get-unbanned-from-ranking-maps","aria-hidden":"true"},"#"),a(" How can I get unbanned from ranking maps?")],-1),k=a("To get unbanned read the terms and conditions stated "),w=a("here"),_=a(" and submit an unban request in the following form "),v={href:"https://forms.gle/mLmEpxJ25eSabX9R8",target:"_blank",rel:"noopener noreferrer"},x=a("here"),S=e("h2",{id:"i-have-feedback-that-i-d-like-to-give-on-a-map-what-do-i-do",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#i-have-feedback-that-i-d-like-to-give-on-a-map-what-do-i-do","aria-hidden":"true"},"#"),a(" I have feedback that I'd like to give on a map what do I do?")],-1),T=a("Most mappers are open to feedback, so don't hesitate to DM them through their available socials. Please keep criticism constructive. Try to "),P=a("follow the QAT Guidelines here"),q=a(" in order to write constructive and actionable feedback."),I=e("h2",{id:"why-is-there-so-much-japanese-music-on-scoresaber",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#why-is-there-so-much-japanese-music-on-scoresaber","aria-hidden":"true"},"#"),a(" Why is there so much Japanese music on ScoreSaber?")],-1),W=e("p",null,"Japan has a long history of rhythm games, thus has many music producers that make music influenced by rhythm games and/or specifically for rhythm games a lot of the times. These songs tend to be high-tempo and include a variety of rhythms to map, which makes them generally more appealing to mappers since they are better and easier to work with. If you're dissatisfied about the current state of the available map pool, be the change you want to see and map the songs of the genres you feel are lacking for ranked.",-1),N=e("h2",{id:"where-can-i-request-a-new-feature-or-report-a-bug",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#where-can-i-request-a-new-feature-or-report-a-bug","aria-hidden":"true"},"#"),a(" Where can I request a new feature or report a bug?")],-1),R=a("Please open "),B={href:"https://scoresaber.canny.io/",target:"_blank",rel:"noopener noreferrer"},E=a("our canny page"),L=a(" for submitting Feature Requests, Website Bug Reports or in-game Bug Reports.");function F(V,A){const o=s("RouterLink"),r=s("ExternalLinkIcon");return h(),d("div",null,[p,e("p",null,[m,t(o,{to:"/ranking-system.md/#ranking-process"},{default:n(()=>[u]),_:1}),b]),f,g,y,e("p",null,[k,t(o,{to:"/ranking/ranking-unban-system-and-terms.html"},{default:n(()=>[w]),_:1}),_,e("a",v,[x,t(r)])]),S,e("p",null,[T,t(o,{to:"/ranking/qat-guidelines.html"},{default:n(()=>[P]),_:1}),q]),I,W,N,e("p",null,[R,e("a",B,[E,t(r)]),L])])}const J=i(c,[["render",F],["__file","faq.html.vue"]]);export{J as default}; diff --git a/assets/faq.html.cbb8887c.js b/assets/faq.html.cbb8887c.js new file mode 100644 index 0000000..efec706 --- /dev/null +++ b/assets/faq.html.cbb8887c.js @@ -0,0 +1 @@ +const e=JSON.parse(`{"key":"v-092a1d7c","path":"/faq.html","title":"Frequently asked questions","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"What is PPv3, and when is it coming?","slug":"what-is-ppv3-and-when-is-it-coming","children":[]},{"level":2,"title":"Why are the OST maps not ranked?","slug":"why-are-the-ost-maps-not-ranked","children":[]},{"level":2,"title":"Why are replays only available on ranked maps?","slug":"why-are-replays-only-available-on-ranked-maps","children":[]},{"level":2,"title":"How do modifiers work with ScoreSaber?","slug":"how-do-modifiers-work-with-scoresaber","children":[]},{"level":2,"title":"Why not autorank every map?","slug":"why-not-autorank-every-map","children":[]},{"level":2,"title":"I played all these maps but they give 0pp?","slug":"i-played-all-these-maps-but-they-give-0pp","children":[]},{"level":2,"title":"Why can a map not be unranked?","slug":"why-can-a-map-not-be-unranked","children":[]},{"level":2,"title":"How can I get unbanned from ranking maps?","slug":"how-can-i-get-unbanned-from-ranking-maps","children":[]},{"level":2,"title":"I have feedback that I'd like to give on a map what do I do?","slug":"i-have-feedback-that-i-d-like-to-give-on-a-map-what-do-i-do","children":[]},{"level":2,"title":"Why is there so much Japanese music on ScoreSaber?","slug":"why-is-there-so-much-japanese-music-on-scoresaber","children":[]},{"level":2,"title":"Where can I request a new feature or report a bug?","slug":"where-can-i-request-a-new-feature-or-report-a-bug","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"faq.md"}`);export{e as data}; diff --git a/assets/formatting-and-metadata.html.0e2e2b30.js b/assets/formatting-and-metadata.html.0e2e2b30.js new file mode 100644 index 0000000..34ed5dd --- /dev/null +++ b/assets/formatting-and-metadata.html.0e2e2b30.js @@ -0,0 +1,75 @@ +import{_ as r,o,c as i,a as e,b as n,w as s,d as a,e as d,r as h}from"../app.e68a1260.mjs";const l={},c=e("h1",{id:"formatting-and-metadata-criteria",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#formatting-and-metadata-criteria","aria-hidden":"true"},"#"),a(" Formatting and Metadata Criteria")],-1),m=a("Looking for the Mapping Criteria? The ScoreSaber Mapping Criteria "),u=a("can be found here"),p=d(`

Rules

\u{1F4A1}

The data on external sources do not have to abide by these rules, but should be kept relevant to the song and artist. You may add additional tags and other information. The metadata rules in this document are for in-game purposes.

Official metadata should be used in all fields, then follow the formatting as explained below. In the case of a contradiction, follow the official metadata. In the case that the official metadata uses unsearchable characters (anything besides A-Z, 0-9) then please refer to Unsearchable characters, translations, and romanization below.

Regular Use Case

In the vast majority of cases, song metadata should follow this format:

levelAuthorName: Mapper
+songAuthorName: Artist of the song
+songName: Song name
+songSubName: All following tags: (Short Ver.), (ft. Hatsune Miku), etc.
+

If there are multiple tags, then put them alongside each other in the songSubName in any order. Do not add any tags that are not specified in this document or the official metadata. The type(s) of brackets and other typographical marks used in tags, if used, should follow the official metadata if available.

Example:

levelAuthorName: Uninstaller
+songAuthorName: Camellia
+songName: Bassline Yatteru? w
+songSubName: feat. Nanahira (Cranky Remix) (Short Ver.)
+

Track is a remix or other musical modification of the original

The remix, bootleg, etc. tag must go into songSubName in brackets regardless of official or source metadata.

Example:

songAuthorName: DJ'TEKINA//SOMETHING
+songName: Internet Bitch
+songSubName: (P*Light Remix)
+

Track is a cover

The cover artist, followed by \u201CCover\u201D, must go into songSubName in brackets regardless of official or source metadata.

Example:

songAuthorName: 150p
+songName: Kodoku no Kakurenbo
+songSubName: (Himeringo Cover)
+

Track has an official length modification

If the track is an official length modification, the source metadata should be followed.

Example:

songAuthorName: Camellia as "fluX Xroise"
+songName: Xronier
+songSubName: (\u201DgeneXe\u201D Long ver.)
+

Track has an unofficial length modification

If the track is modified in such a way that it is similar enough to an official version of the track, the source metadata of that version of the track should be used.

If the track is a shortened version of the full version of the track for the purpose of animation openings or endings, then (TV Size) must be added to the songSubName.

Example:

songAuthorName: PENGUIN RESEARCH
+songName: HETENA
+songSubName: (TV Size)
+

If the track is simply shortened, then (Short Edit) or (Short Ver.) must be added to the songSubName. If the original track metadata already has a length designation, (Short Edit) or (Short Ver.) must replace the original length designation.

Example:

songAuthorName: VINXIS
+songName: Sidetracked Day
+songSubName: (Short Edit)
+

If the track is extended in some way, (Extended Edit) or (Extended Ver.) must be added to the songSubName. If the original track metadata already has a length designation, (Extended Edit) or (Extended Ver.) must replace the original length designation.

Example:

songAuthorName: ExileLord
+songName: Soulless 5
+songSubName: (Extended Edit)
+

Track is a mashup

Use the information provided by the artist.

Examples:

songAuthorName: gmtn. vs. kozato (fw. LUZE) & gmtn. (witch\u2019s slave)
+songName: squartatrice vs disperagioia
+
+songAuthorName: Kove x Perfume
+songName: Stellar x Polyrhythm
+songSubName: (TANUKI Mashup)
+

Track has vocals from a Vocaloid

Vocaloids are rarely the sole artist for a song. The producer or artist must be placed in the songAuthorName, and the Vocaloid featured must be added to the songSubName.

Example:

songAuthorName: Rasen Hikou
+songName: Omoi
+songSubName: [ft. Hatsune Miku]
+

Track has multiple artists

Comma separation

Source metadata must be used, and the artist names should be separated by a whitespace.

Example:

songAuthorName: TEA, ginkiha
+songName: Luvin\u2019Epoch
+

vs. (Versus)

vs., VS, and Versus are commonly used to indicate a collaboration between two artists. The source metadata should be followed as is.

Example:

songAuthorName: C-Show vs. DJ Genki
+songName: BLACK LABEL
+

With

With is commonly used to indicate a collaboration between two artists. The source metadata should be followed as is.

Example:

songAuthorName: Minazuki Airi with Atsushi
+songName: Daisuki, Evolution
+

And (or &)

And (or &) is commonly used to indicate a collaboration between the two artists. The source metadata should be followed as is. Do not replace an ampersand with \u201Cand\u201D or vice versa.

Example:

songAuthorName: Draw The Emotional & Foreground Eclipse
+songName: Sad Spring
+

Feat (or ft.)

Featuring (aka. feat. / ft.) is commonly used to indicate a collaboration between the two artists. This can appear in both the artist name and the title name. Always put the feat/ft. Sections inside songSubName.

Example:

songAuthorName: The Black Eyed Peas
+songName: DOPENESS
+songSubName: (feat. CL)
+

CV (Character Voice)

Character Voice (CV) is typically used when the vocalist is singing under the alias of a character from a show. This is rarely consistent so is enforced as such, in spite of official metadata.

The correct way to format CV designations is to use the romanised name of the character within brackets, followed by the romanised name of the vocalist with CV: as a prefix, in brackets.

Examples:

songAuthorName: Emilia (CV: Rie Takahashi)
+songName: Stay Alive
+
+songAuthorName: Tanya Degurechaff (CV: Yuki Aoi)
+songName: Los! Los! Los!
+

Track has 3 or more artists

When 3 or more artists are involved with a track, Various Artists should be used instead.

Example:

songAuthorName: Various Artists
+songName: Songs Compilation
+

Map has multiple contributors

When there are two or more contributors, each contributor can be named individually as long as the in-game character limit is not exceeded; in doing so, all contributor names must be present and separated with the correct punctuation.

Should the character limit be exceeded, the levelAuthorName must be replaced with "Various Mappers" or an alternative group name, and all contributors must be credited on the relevant beatmap source pages or listed inside custom DAT file fields.

Alternative group names are allowed for a collaboration of 2 contributors or more. A group name must not exceed the character limit unless the group name is 15 characters or less.

Example:

levelAuthorName: Amanatsu & Kikis  
+songAuthorName: Camellia  
+songName: finorza  
+songSubName: feat.Nanahira  
+
+levelAuthorName: DE125, Skeelie, & Vilawes
+songAuthorName: ReeK
+songName: Possesed By The Blood Moon
+

Unsearchable characters, translations, and romanization

Official metadata should be used in all fields, even if it contains unsearchable characters, as long as there is a significant string of searchable characters in each field. In all cases, official translations of metadata, as well as romanization, can both be used at the mapper's discretion. "Significant string" will be defined on a case-by-case basis where searchability of the string is prioritized.

Example of acceptable, searchable metadata:

levelAuthorName: Uninstaller
+songAuthorName: KIV\u039B
+songName: Code:11
+

Other examples of searchable metadata:

XHRONOXAPSUL\u039E, t+pazolite, \u03A9\u03A9PARTS, \u2020:OLPHEUX:\u2020, +ERABY+E CONNEC+10N, A\u03BCreoLe ~for Triumph~, \\frac{\\textup{sig}=\\frac{821}{149}}{bpm\\approx533}, \u56AE\u5C0EBRING+\u77B3EYES=\u6B7BDEATH+\u9F4EINVITE
+

If the official metadata for any field does not contain any searchable characters, then official translations or romanization should be used. We will use "\u30D2\u30A2\u30BD\u30D3" by \u304B\u3081\u308A\u3042 as an example here.

Example of official translation:

levelAuthorName: Amanatsu
+songAuthorName: Camellia
+songName: Play with Fire
+

Example of romanization:

levelAuthorName: Amanatsu
+songAuthorName: Camellia
+songName: Hiasobi
+

All cases where a map would break any metadata criteria, but cannot be changed in a way that would adhere to the metadata criteria for any reason, will be handled on a case-by-case basis.

Example:

levelAuthorName: Skeelie
+songAuthorName: x0o0x_
+songName: / / // / /
+
`,90);function g(x,f){const t=h("RouterLink");return o(),i("div",null,[c,e("blockquote",null,[e("p",null,[m,n(t,{to:"/ranking/criteria/mapping-criteria.html"},{default:s(()=>[u]),_:1})])]),p])}const v=r(l,[["render",g],["__file","formatting-and-metadata.html.vue"]]);export{v as default}; diff --git a/assets/formatting-and-metadata.html.cbae5f7c.js b/assets/formatting-and-metadata.html.cbae5f7c.js new file mode 100644 index 0000000..e39562c --- /dev/null +++ b/assets/formatting-and-metadata.html.cbae5f7c.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-7510c06a","path":"/ranking/criteria/formatting-and-metadata.html","title":"Formatting and Metadata Criteria","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Rules","slug":"rules","children":[]},{"level":2,"title":"Regular Use Case","slug":"regular-use-case","children":[{"level":3,"title":"Example:","slug":"example","children":[]}]},{"level":2,"title":"Track is a remix or other musical modification of the original","slug":"track-is-a-remix-or-other-musical-modification-of-the-original","children":[{"level":3,"title":"Example:","slug":"example-1","children":[]}]},{"level":2,"title":"Track is a cover","slug":"track-is-a-cover","children":[{"level":3,"title":"Example:","slug":"example-2","children":[]}]},{"level":2,"title":"Track has an official length modification","slug":"track-has-an-official-length-modification","children":[{"level":3,"title":"Example:","slug":"example-3","children":[]}]},{"level":2,"title":"Track has an unofficial length modification","slug":"track-has-an-unofficial-length-modification","children":[{"level":3,"title":"Example:","slug":"example-4","children":[]},{"level":3,"title":"Example:","slug":"example-5","children":[]},{"level":3,"title":"Example:","slug":"example-6","children":[]}]},{"level":2,"title":"Track is a mashup","slug":"track-is-a-mashup","children":[{"level":3,"title":"Examples:","slug":"examples","children":[]}]},{"level":2,"title":"Track has vocals from a Vocaloid","slug":"track-has-vocals-from-a-vocaloid","children":[{"level":3,"title":"Example:","slug":"example-7","children":[]}]},{"level":2,"title":"Track has multiple artists","slug":"track-has-multiple-artists","children":[{"level":3,"title":"Comma separation","slug":"comma-separation","children":[]},{"level":3,"title":"vs. (Versus)","slug":"vs-versus","children":[]},{"level":3,"title":"With","slug":"with","children":[]},{"level":3,"title":"And (or &)","slug":"and-or","children":[]},{"level":3,"title":"Feat (or ft.)","slug":"feat-or-ft","children":[]},{"level":3,"title":"CV (Character Voice)","slug":"cv-character-voice","children":[]}]},{"level":2,"title":"Track has 3 or more artists","slug":"track-has-3-or-more-artists","children":[{"level":3,"title":"Example:","slug":"example-13","children":[]}]},{"level":2,"title":"Map has multiple contributors","slug":"map-has-multiple-contributors","children":[{"level":3,"title":"Example:","slug":"example-14","children":[]}]},{"level":2,"title":"Unsearchable characters, translations, and romanization","slug":"unsearchable-characters-translations-and-romanization","children":[{"level":3,"title":"Example of acceptable, searchable metadata:","slug":"example-of-acceptable-searchable-metadata","children":[]},{"level":3,"title":"Other examples of searchable metadata:","slug":"other-examples-of-searchable-metadata","children":[]},{"level":3,"title":"Example of official translation:","slug":"example-of-official-translation","children":[]},{"level":3,"title":"Example of romanization:","slug":"example-of-romanization","children":[]},{"level":3,"title":"Example:","slug":"example-15","children":[]}]}],"git":{"updatedTime":1709736109000},"filePathRelative":"ranking/criteria/formatting-and-metadata.md"}');export{e as data}; diff --git a/assets/how-to-rank-map.html.3d86f824.js b/assets/how-to-rank-map.html.3d86f824.js new file mode 100644 index 0000000..06cfcc6 --- /dev/null +++ b/assets/how-to-rank-map.html.3d86f824.js @@ -0,0 +1 @@ +import{_ as s,o as d,c as h,a as e,b as t,w as n,d as a,e as m,r as i}from"../app.e68a1260.mjs";const p="/assets/discord-modding.4be99099.png",u="/assets/mod-example.698338a4.png",l="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARwAAAAfCAIAAAC6deWtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAfoSURBVHhe7ZtPaxtHFMAnpZ8gWp9asFQcr3wr8U0SOA2kh7ZIgoQS3yw5gUDppWlkakSMi0mwSnpKoFBL8qk2IQFb9JKENDZYujn0Zq0TkHT2yh+h7Xszs7uzs7OO5C6NXc8PgWae3rydf2/em3Vy7uOPPiEajSY6PuDfGo0mIrRTaTQRo51Ko4kY7VQaTcToFxWaU8Of505uDPj07794SUcqjSZytFNpNBGj0z/NqcFN/8Rc6/2i7JKOVBpNxGin0mgiJiz9MzI3smSjtmPz+n9AMl8yrcrmnrr6Xrle7155Hp9d49WTBZ2oBsma1vJmm8uGBxY8TzZWBlzwZG7u3z3unaj64+Zav5W+Z4XDZo2rTORKWZPKXKyG1EPUIX4hDMRpZjUqG6I69CBtr0hjlPUjSv+gZ/kkLwNS9dgYmYxpWa4LSVVNGGdnoowMLxBSW65U8FNrJ4u5CSra26QS/mlY4G9Nvz8YmbTkdeghI80abyV6FOzquWIqxmsO4fp+Tkr6ZyTHiTALUlUTxtmZKBypgxO+7HbbHokZvOZCD5odf9A1MtmUbVm8hiTz6CGK2IxZWqxVBcf0Eaof4GinAtcslfCTY8HIyBQxyJpZEMIJIVWpPmi6rYoZZ7yoKZqCfgu/Qj2ZJDBBvCZUJxdedrpv6ac6zX4kF+9uM4krFCTb5UmqRIUv706Xtzw1yOK4Wt2xpbA/XXUkL+86tihuc1EetBl8rssxev62s3pdeIpkUJo3hjv/bFEoePQyoTjtgqYv2whagAUrZiZg1UDo6ioWmmrytqUbgljRgaDNsP4AONIAyXS6LzkPkMykiHTQGJl8ut/Y8PmUaaJP8pqIvbOyHLz4hOsHOMKpjNQs5M0smJpZmuPZOzWMrJBNLuNtR6pSzCxm2zQ+NvqpWe5COCQulPyfMpFOkX2vw251svyg0J2PjyXg88ML+htsuMeFThkl8bFr9Y4s+eOzJ97uHC3cIrdRDtchUFtK1L+mamVynzqGwj6ZHu9c45Ju4WfX1NQ9vFY58qeuSwRsIuJzXY7X8/LWpaVO92bnKmsVv4c+5iDNG4LHrJOiwEWL7+BkrM9TJliUPJOJmhXLSJ1HoST3LOB+SJMNFLJrhmqhsW0xZeN+gE+tPV50/ErVAUC0GdYfCh0pLxNC/RA+qnudIkzB/ksdNPyahjFC+vaI6+oBL5YYRv8Ip7JbVd6P9k7r0DCciTgarxXZa7b6psmPuhhvv9fGX/2HARwCVtObBn81foFttLV13KDT3xRGt+dn1qmI7C4urU1+cdknuVMnn33p7M2tX5Z2WQkaktXbi69pZf351ujlry7Sst8+fC86TdZebI0mnJyjV7/qeMjao3pv6nPwqlCbwnNdhut5r/4ds7D+sN7r1e/8SCu7v7/qJcacwcnzhuDma21wWduy4IDHeW+7u2zPsmI0YYJfYt7mwyVmpRALgP9ZqoWmNhvOZcPeabTIOGut6ADFsxnWHwobKa8QssL8c9kyxWhMCebDyTz6ueqNl5k1LebDFTg93ulXA+tHfqfq297E21DGlBdcqLqfnEUXl6aAgjMmXLWF6u7SpauvLj/FzMdN2Eiv4x1ZwHhiVJJ4+H8YnXnCk6i39y5RidL+pJN3dZeYFqX7xvOS1286JDFO/SdoEwnp0BA9HwRp3hxiqSI/TYX3YRAGuNCRjcTO9/uCkwgoLRC7f8BLFNVCH2Ez2AFEsHlE27CRkvYmJFFpN+4B4Jr+fHgilzVaNfVLBbu148jxXHDO/VAG1f+Qf0cGfRIfFEa3A4tWMDTBSYNJc474XpQbmZRptTZ5Ta7ivo8vsUtFnYwVuNQPjSdyZAjSW702FQggsv1q5z6BhJAGJRBeoUoADWi88cULCdJ5RgOUwiYPVgMxYM9VyBPl0m/Jt2m4z+Cr5ArdEbAEzq6mEYNrwp4mfVZUWCDB7ROy0KJNl7AOSIT0J3SkQdCn9je8x9M3fjFSnEtxAYSbuaJRhSzJPiDem493M4x+5JHKSGV4VMT3LaTVBP+ZyDkByu6zicJziyXrOA3eASBVp6tOANnv9Og3pmQzDxb4xp1cKE/TZMy9aUwu/FTo/MqSJR/+hpygfcCJHpMLN4VINVr4VngEWX0Ibqe0KYFxj961jt1zNdK8OWByJdxZXJwggBuUFlCTmBmuKbxuDrMgo1pomgey6zeXw+HOHhzsgERYf8JGiiRzWfNQCEyQ+53HqOkCZzlLFNmHvgDg9452s0m8cSpupxJD6A8fqWDw2SwEcatBA45UhU5bJlSpKgyA9v+gPwK5nyOrgJq7ZNLRIlX3OwnIze7T8lY5geFjvRAn9e7jDotZECgWX69NlRNduM1DwGGhg99S/Pgbku35+Oyawv6j+q3HT7ozUOrVV7dIgv4GbM8/u8IfgW35hUdhkxUVHLvnKqSJ8mhvLpPcXLGUZlX6B1DY6+kiO60Pmy0Ljm6kvVk1bswyTbvVaB3yJioLrOhDtdC4iRuxOdwPWMOIR5uqOyAR0h/VSCGNZAXYTSu46zgQMS1L6X4K7J1awyjxIKYIzjKD60f7D2oxsg/1h/ZkvpSxve5JVU0YZ2eixJHqf1A7CHgBFd5+SlVNGGdnok7lSN9zpNJoBue0RCr9/6k0pwZ3B59ATk76p9H8D9FOpdFEjE7/NJqI0ZFKo4kY7VQaTcRop9JoIoWQfwDVw8vC+DlWQgAAAABJRU5ErkJggg==",c="/assets/leaderboard-id-format.b736f50c.png",g={},f=e("h1",{id:"how-do-i-get-my-map-ranked",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#how-do-i-get-my-map-ranked","aria-hidden":"true"},"#"),a(" How do I get my map ranked?")],-1),y=e("p",null,"Before you consider pushing your first map for ranked, make sure to first fulfill these basic pre-requisitions:",-1),k=e("li",null,"The map is made and fully finished",-1),w=a("The map seems to meet every point from the "),b=a("ranking criteria"),v=e("li",null,"The map was play-tested by players and appear to not have any issues",-1),A=e("div",{class:"custom-container tip"},[e("p",{class:"custom-container-title"},"TIP"),e("p",null,"Once all the above-mentioned points are met, you can go ahead and read the rest of this page on on how to get your map modded and eventually ranked.")],-1),x=e("h2",{id:"what-is-modding",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#what-is-modding","aria-hidden":"true"},"#"),a(' What is "modding"?')],-1),T=a("Modding is a term borrowed from osu!. It is the process of reviewing and providing feedback for a map via editor and/or in-game analysis. Maps have to go through this process to eventually end up ranked in ScoreSaber. See "),q={href:"https://bit.ly/ScoreSaberModding",target:"_blank",rel:"noopener noreferrer"},J=a("this"),S=a(" guide to get started with modding maps."),I=e("h2",{id:"get-a-mod-from-a-ranking-team-member",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#get-a-mod-from-a-ranking-team-member","aria-hidden":"true"},"#"),a(" Get a mod from a Ranking Team member")],-1),_=a("Before you contact a ranking team member in order to have your map ranked, please pay attention to their queue rules. A mod is a list of changes to make in a map that are issues within said map. It can range anywhere from playability issues to rank-ability issues with the "),N=a("ranking criteria"),O=a(". This step can generally take anywhere from an hour to a month depending on ranking team activity and song of choice. You work with the RT member to fix all the ranked issues with the maps and work through any listed playability issues. Generally requests are handled by looking for open ranking queues in ScoreSaber's Discord server. The green circles indicate queues that are open for maps."),Z=m('

Discord Modding Example

Once you read the rules of the modder and made sure that your map matches said rules, send them a direct message asking for a spot in queue. Generally, having information like the song title, song artist, BPM, length of the song, number of difficulties going for rank, are helpful to include in your message since they can make team members more interested in choosing your maps. If a person from the team accepts your map, they will explicitly tell you they have. You shouldn't have multiple people modding your map at the same time to avoid having overlapping mods and wasting someone's time.

(Optional) Get a mod from a Student

Student modding queues are from people who are working towards becoming a member of the ranking team. They have their mods checked by a member of the ranking team which acts as their mentor.

Attention

Student mods are a great way of getting ranking team eyes on a map, however this process takes extra time compared to a direct mod from a ranking team member. This doesn't guarantee the map will enter queue, it will depend on the student's mentor to decide if they want to help you ranking your map.

Work on the map when you get the mod

Once you have received the mod, acknowledge it and work to fix the map in a timely manner. Don't rush for fixes, but remember that fixing it when the map is still fresh in both you and the modder's mind can be beneficial in working towards a better map.

A mod will generally be a line by line list of issues with the map. Sorted by beat number, issue severity, and the issue itself. Example of a mod:

Mod Example

While everyone's system for making a mod is different, anything labeled as "Unrankable" or "Questionable" requires justification on the mapper's part as to why it is not fixed or why is it that way.

The mapper will make changes to their map and justify what they didn't change. While it is not required to make changes based on suggestions, doing so will generally make your map better, and the modder will appreciate his efforts being rewarded.

TIP

If a modder doesn't respond in a week or so feel free to remind them unless they have explicitly stated a timeframe they will be unavailable. Modder's have other obligations that require their time but things are occasionally forgotten.

Put the map in the ranking-queue

Once all of the above is done, it is now time for the ranking team member to add your map into the ranking-queue. This doesn't mean your map will be ranked as is, but it will eventually end up ranked. The ranking team member should in the end be asking you for the leaderboard IDs.

Example of a leaderboard ID:

Leaderboard ID Example

If your map consists of more than one difficulties, you will need to provide the ID of each difficulty, preferably in the following format:

Leaderboard ID Format

Wait for the map to go through the ranking-queue

At this point the mapper (you) may receive feedback in the form of a QAT downvote indicating that said map should be fixed. QAT votes affect queue position so having a positive rating is beneficial. If a map is re-uploaded, the initial modder who put the map in queue should be notified. Every new upload requires a new set of leaderboards so it is advised to take feedback in batches and upload when only needed. You should always reupload after fixing a map with ranking team or QAT.

Once the map reaches the top of queue, other ranking team members will mod through the map and find any issues within it. If you are sent a DM by someone on the ranking team, you should fix any issues with the map and reupload it. The new leaderboards should be sent to the last person who sent you a mod.

At 3 RT upvotes and 0 downvotes your map gets qualified. The map gets increased attention due to its qualified status and issues are generally presented to the mapper. The mapper can then reupload the map as necessary before the map is officially ranked. This period is of 7 days. If the map is reuploaded then the 7 day period is reset.

Your map is now ranked

Congratulations! The 7 days of qualified period has passed, and your map is now considered ranked.

\u26A0\uFE0F ATTENTION

You must never make your ranked maps unavailable to players. If you violate this rule, you will be banned from ranking any maps on ScoreSaber in the future.

',25);function B(D,V){const o=i("RouterLink"),r=i("ExternalLinkIcon");return d(),h("div",null,[f,y,e("ol",null,[k,e("li",null,[w,t(o,{to:"/ranking/criteria/"},{default:n(()=>[b]),_:1})]),v]),A,x,e("p",null,[T,e("a",q,[J,t(r)]),S]),I,e("p",null,[_,t(o,{to:"/ranking/criteria/"},{default:n(()=>[N]),_:1}),O]),Z])}const R=s(g,[["render",B],["__file","how-to-rank-map.html.vue"]]);export{R as default}; diff --git a/assets/how-to-rank-map.html.8cbedec5.js b/assets/how-to-rank-map.html.8cbedec5.js new file mode 100644 index 0000000..743b149 --- /dev/null +++ b/assets/how-to-rank-map.html.8cbedec5.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-1b35bd3b","path":"/ranking/how-to-rank-map.html","title":"How do I get my map ranked?","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"What is \\"modding\\"?","slug":"what-is-modding","children":[]},{"level":2,"title":"Get a mod from a Ranking Team member","slug":"get-a-mod-from-a-ranking-team-member","children":[]},{"level":2,"title":"(Optional) Get a mod from a Student","slug":"optional-get-a-mod-from-a-student","children":[]},{"level":2,"title":"Work on the map when you get the mod","slug":"work-on-the-map-when-you-get-the-mod","children":[]},{"level":2,"title":"Put the map in the ranking-queue","slug":"put-the-map-in-the-ranking-queue","children":[]},{"level":2,"title":"Wait for the map to go through the ranking-queue","slug":"wait-for-the-map-to-go-through-the-ranking-queue","children":[]},{"level":2,"title":"Your map is now ranked","slug":"your-map-is-now-ranked","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"ranking/how-to-rank-map.md"}');export{e as data}; diff --git a/assets/index.html.35873366.js b/assets/index.html.35873366.js new file mode 100644 index 0000000..df94885 --- /dev/null +++ b/assets/index.html.35873366.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-07d4df84","path":"/ranking/criteria/","title":"Ranking Criteria","lang":"en-US","frontmatter":{},"excerpt":"","headers":[],"git":{"updatedTime":1709736109000},"filePathRelative":"ranking/criteria/README.md"}');export{e as data}; diff --git a/assets/index.html.5df29b4e.js b/assets/index.html.5df29b4e.js new file mode 100644 index 0000000..e5c2f3d --- /dev/null +++ b/assets/index.html.5df29b4e.js @@ -0,0 +1 @@ +import{_ as i,o as a,c as _,a as e,b as n,w as s,d as t,r}from"../app.e68a1260.mjs";const d={},c={class:"features"},u={class:"feature"},h=e("h2",{style:{"pointer-events":"none"}},"Getting Started",-1),m=t("Rules"),f=t("Beginners Guide"),g=t("The Ranking System"),k=t("Frequently Asked Questions"),p={class:"feature"},b=e("h2",{style:{"pointer-events":"none"}},"Ranking Resources",-1),v=t("How to Rank my Map"),R=t("Ranking Criteria"),y=t("Ranking Queue Rules"),x=t("QAT Guidelines"),S=t("Modding Queue Information"),T=t("ScoreSaber Team Information"),w=t("Ranking Unban System and Terms"),q={class:"feature"},B=e("h2",{style:{"pointer-events":"none"}},"Other Resources",-1),E=t("About Us"),I=e("hr",null,null,-1),L=e("h2",{class:"noborder"},"External Links",-1),C={href:"https://discord.gg/scoresaber",target:"_blank",rel:"noopener noreferrer"},G=t("Discord"),Q=t(" - Join us on Discord"),A={href:"https://trello.com/b/Jd9EdIml/scoresaber-development",target:"_blank",rel:"noopener noreferrer"},M=t("Trello"),N=t(" - Track ScoreSaber development on Trello"),V={href:"https://scoresaber.canny.io/",target:"_blank",rel:"noopener noreferrer"},D=t("Canny"),F=t(" - Suggest a feature or submit bug reports"),J={href:"https://patreon.com/scoresaber",target:"_blank",rel:"noopener noreferrer"},P=t("Patreon"),U=t(" - Support us on Patreon \u2764\uFE0F"),H={href:"https://patreon.com/scoresaber",target:"_blank",rel:"noopener noreferrer"},O=t("Twitter"),W=t(" - Follow us on Twitter"),j={href:"https://bsmg.wiki/",target:"_blank",rel:"noopener noreferrer"},z=t("BSMG Wiki");function K(X,Y){const o=r("RouterLink"),l=r("ExternalLinkIcon");return a(),_("div",null,[e("div",c,[e("div",u,[h,e("ul",null,[e("li",null,[n(o,{to:"/rules.html"},{default:s(()=>[m]),_:1})]),e("li",null,[n(o,{to:"/beginners-guide.html"},{default:s(()=>[f]),_:1})]),e("li",null,[n(o,{to:"/ranking-system.html"},{default:s(()=>[g]),_:1})]),e("li",null,[n(o,{to:"/faq.html"},{default:s(()=>[k]),_:1})])])]),e("div",p,[b,e("ul",null,[e("li",null,[n(o,{to:"/ranking/how-to-rank-map.html"},{default:s(()=>[v]),_:1})]),e("li",null,[n(o,{to:"/ranking/criteria/"},{default:s(()=>[R]),_:1})]),e("li",null,[n(o,{to:"/ranking/ranking-queue-rules.html"},{default:s(()=>[y]),_:1})]),e("li",null,[n(o,{to:"/ranking/qat-guidelines.html"},{default:s(()=>[x]),_:1})]),e("li",null,[n(o,{to:"/ranking/modding-queue-information.html"},{default:s(()=>[S]),_:1})]),e("li",null,[n(o,{to:"/ranking/scoresaber-team-information.html"},{default:s(()=>[T]),_:1})]),e("li",null,[n(o,{to:"/ranking/ranking-unban-system-and-terms.html"},{default:s(()=>[w]),_:1})])])]),e("div",q,[B,e("ul",null,[e("li",null,[n(o,{to:"/about-us.html"},{default:s(()=>[E]),_:1})])])])]),I,L,e("ul",null,[e("li",null,[e("a",C,[G,n(l)]),Q]),e("li",null,[e("a",A,[M,n(l)]),N]),e("li",null,[e("a",V,[D,n(l)]),F]),e("li",null,[e("a",J,[P,n(l)]),U]),e("li",null,[e("a",H,[O,n(l)]),W]),e("li",null,[e("a",j,[z,n(l)])])])])}const $=i(d,[["render",K],["__file","index.html.vue"]]);export{$ as default}; diff --git a/assets/index.html.6cee2b5e.js b/assets/index.html.6cee2b5e.js new file mode 100644 index 0000000..a59757d --- /dev/null +++ b/assets/index.html.6cee2b5e.js @@ -0,0 +1 @@ +import{_ as l,o as s,c,a as e,b as a,w as n,d as t,r}from"../app.e68a1260.mjs";const d={},h=e("h1",{id:"ranking-criteria",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#ranking-criteria","aria-hidden":"true"},"#"),t(" Ranking Criteria")],-1),_=e("p",null,"To achieve the ranked status on a map, you will have to make sure said map meets all of the requirements listed in the Ranking Criteria below. The purpose of the ranking criteria is to set an objective standard to follow which ensures the maps put into the rank pool are fair for players. The criteria is enforced in a way that does not take into account bias from any perspective, mapper, player, or team member.",-1),u=e("hr",null,null,-1),m=t("Mapping Criteria"),p=t("Technical Limitations Criteria"),f=t("Difficulty Spread Requirements"),k=t("Formatting and Metadata"),g=e("hr",null,null,-1),x={href:"https://docs.google.com/document/d/1K1iRlM7_kHYbMVzVoUuDmVUl53i3P1D58QapjfNX8Fc",target:"_blank",rel:"noopener noreferrer"},b=t("Mapping Criteria (Korean)");function v(w,y){const i=r("RouterLink"),o=r("ExternalLinkIcon");return s(),c("div",null,[h,_,u,e("ul",null,[e("li",null,[a(i,{to:"/ranking/criteria/mapping-criteria.html"},{default:n(()=>[m]),_:1})]),e("li",null,[a(i,{to:"/ranking/criteria/technical-limitations-criteria.html"},{default:n(()=>[p]),_:1})]),e("li",null,[a(i,{to:"/ranking/criteria/difficulty-spread-requirements.html"},{default:n(()=>[f]),_:1})]),e("li",null,[a(i,{to:"/ranking/criteria/formatting-and-metadata.html"},{default:n(()=>[k]),_:1})])]),g,e("ul",null,[e("li",null,[e("a",x,[b,a(o)])])])])}const R=l(d,[["render",v],["__file","index.html.vue"]]);export{R as default}; diff --git a/assets/index.html.d718eebb.js b/assets/index.html.d718eebb.js new file mode 100644 index 0000000..319f355 --- /dev/null +++ b/assets/index.html.d718eebb.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-8daa1a0e","path":"/","title":"","lang":"en-US","frontmatter":{"home":true,"heroText":"ScoreSaber Wiki","tagline":"Welcome to the ScoreSaber Wiki!","description":"Welcome to the ScoreSaber Wiki!","actions":[{"text":"Beginners Guide \u2192","link":"./beginners-guide.md","type":"secondary"}],"footer":"Copyright \xA9 ScoreSaber 2022 | Licensed under CC BY-NC-SA 4.0","tags":["scoresaber","beat saber","modding","wiki","help"]},"excerpt":"","headers":[],"git":{"updatedTime":1709736109000},"filePathRelative":"README.md"}');export{e as data}; diff --git a/assets/leaderboard-id-format.b736f50c.png b/assets/leaderboard-id-format.b736f50c.png new file mode 100644 index 0000000..57250c3 Binary files /dev/null and b/assets/leaderboard-id-format.b736f50c.png differ diff --git a/assets/mapping-criteria.html.142e54bb.js b/assets/mapping-criteria.html.142e54bb.js new file mode 100644 index 0000000..0582c9d --- /dev/null +++ b/assets/mapping-criteria.html.142e54bb.js @@ -0,0 +1 @@ +import{_ as h,o as l,c as d,a as e,b as a,w as n,e as o,d as t,r}from"../app.e68a1260.mjs";const c="/assets/Picture1.47f360c5.png",u="/assets/Picture2.080d8c83.png",p="/assets/Picture3.16075eab.png",m="/assets/Picture4.022b7bd0.png",f="/assets/Picture5.4df24d24.png",g="/assets/Picture6.bee9d5f8.png",b="/assets/Picture7.5c43b911.png",_="/assets/Picture8.e3dfc860.png",w={},y=o('

Mapping Criteria

About the Mapping Criteria

The mapping criteria involves two sections: one for rules, and one for guidelines.

  • Rules are criteria that must be followed for a map to be considered rankable.
  • Guidelines are criteria that should be followed for a map to be considered rankable but can be broken under proper setup or justification.

Further included in this document are a glossary, addendum, and appendix.

  • The glossary includes definitions for important terms in the criteria.
  • The addendum includes suggestions that are not explicitly about rankability but can aid a map in getting through quality checks.
  • Note that while sections in the addendum do not have to be followed explicitly, excessive abuse of the suggestions can be reason for a map to be denied.

Lastly, the appendix includes examples and clarification of issues referenced in the mapping criteria.

Formatting for referencing criteria is as follows: (Main Section).(Subsection).(Criteria). The main section designations are R for rules, G for guidelines, and A for addendum. The subsections are designated by a number underneath each main section. Each individual criteria is ordered alphabetically under the subsection to which it applies.

For any comments, questions, or concerns about material included or not included within the criteria, feel free to message a member of the Criteria Assurance Team at ScoreSaber.

Glossary

Setup

Mapset: A set of difficulty .dat files with one info.dat file that references them.
Difficulty Spread: The set of difficulty levels present in the map. An example of a mapset with a 3 difficulty spread would be a mapset consisting of a Normal, Hard, and Expert difficulty.
Gameplay Modifiers: Disappearing Arrows, Ghost Notes, Faster Song, etc.
Game Mode: 360 Degrees, 90 Degrees, Standard, One Saber, etc.
4x3 Grid: The allowed 12 spaces for note placement in Standard mode.

Timing

BPM: Beats Per Minute. Defines the tempo of the song.
Variable BPM: Describes songs which change BPM irregularly.
Offset: The time difference between the start of the sound file and the beat of the song, used in the editor to align the beat lines with the beat of the song.
Beat: 1 fraction of a minute as defined by the BPM of the song.
(Timing) Precision: Precision, measured in fractions of a beat. For example, \xBC precision refers to \xBC of a beat.
Effective BPM: The speed in which one hand is making a \xBD precision movement relative to the BPM. For example, the effective BPM of a \xBC precision 1 hand motion in a 100 BPM song would be 200 BPM.

  • Sliders: The effective bpm for a slider to the next note is defined as the distance from the last note of the slider to the next note of the same color as the slider.

Musical Element: Includes but not limited to: lyrics, sounds produced by instruments, and sounds that are part of a melody, harmony, or beat.
Overmapping: Placing notes at timings other than those of the instrument(s) that are being followed.
Undermapping: Mapping to a subset of timings of the instrument(s) that are being followed.

Patterns

Objects: Bombs, notes, or walls.
Interactive Objects: Bombs and notes, as well as walls that force you to dodge or duck.
Hitbox: An invisible box around an object that is used to detect collisions and cuts.
Swing path: The path of a swing used to hit a note. Can be divided into the Pre-cut swing and the follow-through swing.

  • Pre-cut swing: The portion of a swing before making contact with a note.
  • Follow-through swing: The portion of a swing after cutting through the note.
',19),x=e("strong",null,"On the same snap",-1),v=t(": Refers to motions that are intended to be made at the same point in time."),P=e("br",null,null,-1),T=e("strong",null,"Dot Note",-1),k=t(": The note type that can be scored on by a cut from any direction."),B=e("br",null,null,-1),M=e("strong",null,"Slider",-1),A=t(": A set of notes that follow each other at a set timing precision such that they appear at distinct timings but can still be hit with a single swing. "),S=t("EXAMPLE"),E=o("
Double directional: Two consecutive notes of the same color in the same direction.
Reset: A motion where hand/arm position or rotation are adjusted without a corresponding note for that hand.
Bomb reset: Using bombs to force a reset.
Wrist reset: A motion where hand rotation is adjusted before or during a swing to enable a note to be hit.
Pronation: The inward rotation of the arm which extends to about 90\xB0-100\xB0 from a palm down position.
Supination: The outward rotation of the arm which extends to about 180\xB0-210\xB0 from a palm down position.",18),C=o('

Rules

1. Gameplay

Maps must not require the use of any external mods or programs to play.
Maps must be designed to be played without any gameplay modifiers.
Maps must be \u2018Standard\u2019 game mode maps.

2. Patterns

A. Mismaps

A map cannot have any objects that are clearly placed or positioned unintentionally by the mapper.

B. Notes

',7),D=t("Multiple notes of the same color on the same swing must not be parallel to one another. "),R=t("EXAMPLE"),N=e("br",null,null,-1),j=t(" If there are multiple notes of the same color on the same swing, each note must lead into the expected cut direction of the next note."),L=e("br",null,null,-1),F=t(" Multiple notes of the same color on the same snap must not differ in cut direction from each other by more than 45 degrees."),I=e("br",null,null,-1),W=t(" Notes must not be placed in the pre-cut swing path of a note of the opposite color. "),G=t("EXAMPLE"),V=e("br",null,null,-1),q=t(" Notes should not be placed in the follow-through path of a note of the opposite color ("),X=t("EXAMPLE"),O=t(") unless the notes are on the same snap or there is sufficient time for the other color saber to swing clear of the note."),U=e("br",null,null,-1),H=t(" No patterns should have a swing path into the bad cut hitbox for a note of the same color in the same swing. Notes must not be placed inside walls or be completely blocked from the player\u2019s view by walls. A pattern must not induce a variation in swing speed within a single swing."),Q=e("br",null,null,-1),Y=t(" A pattern must not be at a significantly higher effective BPM than what is justified within the rest of the map."),J=e("h4",{id:"c-walls",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#c-walls","aria-hidden":"true"},"#"),t(" C. Walls")],-1),K=t("There must not be a wall or combination of walls that force the player to take damage. "),z=t("EXAMPLE"),Z=e("br",null,null,-1),$=t(" There must not be a wall or combination of walls that force the player into the outside lanes of the playfield."),ee=e("br",null,null,-1),te=t(" Walls must have positive width."),ae=e("br",null,null,-1),ie=t(" Interactive walls must have a duration of at least 15ms. That allows for 1/16 precision up to 250BPM and \u215B precision up to 500BPM."),ne=e("br",null,null,-1),oe=t(" No part of a wall can lie outside the 4x3 grid."),se=e("h4",{id:"d-bombs",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#d-bombs","aria-hidden":"true"},"#"),t(" D. Bombs")],-1),re=t("Bombs must not be placed such that they interfere with the pre-cut or follow-through swing for a note."),he=e("br",null,null,-1),le=t(" Bombs must not be placed in a way that forces a saber to stay outside the 4x3 grid in order to avoid contacting the bombs. "),de=t("EXAMPLE"),ce=e("br",null,null,-1),ue=t(" Bombs must be accompanied with an acceptable level of lighting."),pe=e("br",null,null,-1),me=t(" Bombs must not be placed inside of walls or be completely blocked from the player\u2019s view by walls."),fe=e("br",null,null,-1),ge=t(" Bombs may not overlap with other objects in game and must be placed at least 20 ms apart from other bombs in the same space. If the NJS is not too low, that allows for 1/16 precision up to 180 BPM and \u215B precision up to 360 BPM."),be=o('

3. Timing

A. Setup

The map\u2019s BPM must perfectly match one of the BPMs of the song or a multiple of one of the BPMs of the song.
A map may use the effective BPM of a section during the map as the base BPM as long as the difficulty of the section represents the overall difficulty of the map.
Maps with variable BPM timing must be timed as accurately as possible.
The map\u2019s offset must be as close to perfect as possible.

B. Notes

All notes must be perfectly on time to a distinct sound in the music.
The first note of a slider must be on time to the sound the slider is mapping. The precision of the following notes may be adjusted for playability.

C. Undermapping

Undermapped sections must not have a single note off time, and each note in an undermapped section must have a corresponding sound in the music.

D. Overmapping

Rhythmic overmapping is not allowed. A single sound cannot be represented by multiple notes unless those notes fall into a single swing.
Simplifying timing inconsistencies to match an understandable rhythm is allowed if the inconsistencies do not arise from a BPM or rhythm change.

4. Formatting and Metadata

',10),_e=t("All rules on formatting are here"),we=e("h3",{id:"_5-difficulty-spread-requirements",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#_5-difficulty-spread-requirements","aria-hidden":"true"},"#"),t(" 5. Difficulty Spread Requirements")],-1),ye=t("All rules on difficulty spread requirements are here"),xe=o('

6. Miscellaneous

A. Lighting

A map must have sufficient lighting throughout the song.

B. Intro/Outro

A map must have an intro period of at least 1.5 seconds with no interactive objects.
A map must have an outro period of more than 2 seconds, counting from the end of the last interactive object of the map.
A map must have an outro period of less than 15 seconds, counting from the point the last object disappears or the last lighting element change.

C. Audio

A map\u2019s audio must not be modified to add excessive amounts of silence anywhere in the song.
A map\u2019s audio must consist of musical elements set to an identifiable structure.
The length of the map\u2019s audio, ignoring any added silence, must be longer than 20 seconds.

D. Accompanying Text and Images

There must not be nudity, near-nudity, sexual references, extreme violence, gore, substance abuse, or any other form of explicit content anywhere in the files contained in the map.
There must not be content that harasses or denigrates any individual or group anywhere in the files contained in the map.

E. Custom Difficulty Names

For any game mode in a mapset with a difficulty going for rank:

  • Difficulty names must be clearly progressive and accurately indicative of their respective difficulties, excluding the highest difficulty.
  • Difficulty naming must follow a common theme relating to the song or map, unless the difficulty names are abbreviations of the default Beat Saber difficulty names.
  • If there are multiple difficulties with similar relative difficulty, the difficulty names must share a commonality that indicates that they are of the same relative difficulty.
  • Difficulty names must not be so long that they overlap with other UI elements.
  • Difficulty names must not exceed 30 characters in length.
  • Difficulty names must not solely consist of one or more usernames. Words that happen to be usernames are acceptable within difficulty names as long as they relate to the song.

F. DAT Editing

All difficulties in a mapset that are going for rank must not contain any form of unfair modification via editing of the .dat file manually or through external mappers. This includes any form of custom walls, map reversal, and note jumping.

Guidelines

1. Patterns

A. Resets

Resetting patterns in a map should allow an appropriate amount of time between the resetting notes, consistent with the difficulty of the map.

  • This includes any of the following: Double directionals, bomb resets, or wrist resets through extreme pronation or supination.

B. Sliders

Each note in a slider should follow the previous note in the slider with the same timing precision.
Sliders should have a speed similar to the general swing speed of the map or have a speed appropriate to the sound being mapped.
Sliders should not have direction changes of more than 45 degrees.
Sliders should not have more than one direction change.

C. Collisions

',22),ve=t("There should be no patterns where the arc of the pre-cut swing on one hand overlaps with the pre-cut swing of the other hand. "),Pe=t("EXAMPLE"),Te=e("br",null,null,-1),ke=t(" There should be no patterns where the arc of the follow-through swing on one hand overlaps with the follow-through swing of the other hand. "),Be=t("EXAMPLE"),Me=o('

D. Vision Blocks

Notes and bombs should not impede vision of other interactive objects without an indication and/or implication of where and what the blocked objects will be.

E. Emphasis

Patterns and sections of a map should not excessively overrepresent the music.
Patterns and sections of a map should not excessively exceed the difficulty of the rest of the map unless supported by the music.

2. Timing

A. Walls

Walls should correspond to a musical element.

B. Bombs

Bombs should be mapped to a musical element unless used to clarify a reset or set up for a subsequent pattern. In those cases, the bombs should be mapped to a musical element wherever possible.

Addendum

1. Consistency

Repeated sections of music should feel similar, and similar sections should not play excessively differently unless there is some change in the music.
Within a section, representation of a repeated sound with the same volume and pitch in the absence of other sounds should not excessively change.
Mapping decisions around consistent representation should be understandable.

2. Variety

Varying the mapping as the music changes is important to musical representation. Big changes in the music should correspond to a change in the mapping.
This does not require that patterns must change with every change in the music, nor does it disallow variation in sections where the music stays the same.

3. Emphasis

The patterns & lighting used should reflect the intensity level of the music being mapped.
The intensity of the mapping in each section relative to other sections should be somewhat in line with the intensity of the music. Deviation is allowed as long as a section\u2019s intensity is not excessively raised or lowered relative to the intensity of the rest of the song.

Appendix

Rule Explanations and Background

R.2.C (Walls)

Thin walls, which have close to 0 duration, are not allowed because they do not consistently damage the player.
Fake walls, which have negative width, are not allowed because they are not an intended part of the base game.
Fast walls, which have negative duration, are not allowed because they are not an intended part of the base game.

R.6.A (Lighting)

Sufficient lighting means that some form of lighting that follows the music should be present in sections of the map that contain interactive objects. Any form of automatic light generation that creates lighting that fits this criteria is allowed.

G.1.E (Vision Blocks)

When a note is vision blocked, the location should always be deducible from previous note placements.
When a note is vision blocked, the cut direction should always be deducible from previous note placements, unless the note is a dot note.

Images

Slider Examples

Slider Examples

R.2.B (Parallel Notes)

These are examples of parallel same color notes on the same snap.
Parallel Notes

R.2.B (Pre-cut Swing Path)

The blue note is in the pre-cut swing path of the red note.
Pre-cut Swing Path

R.2.C (Walls)

These walls force the player to take damage because there is no space for the player to pass through.
Walls

R.2.D (Bombs)

These bombs that force a saber to stay outside the 4x3 grid in order to avoid contact.
Bombs

G.1.C (Pre-cut Collisions)

The arcs of the pre-cut swings overlap.
Pre-cut Collisions

G.1.C (Follow-through Collisions)

The arcs of the follow-through swings overlap.
Follow-through Collisions

G.1.D (Hitboxes)

The red up note is in the follow-through path of the blue up note.
Hitboxes

',42),Ae={href:"https://docs.google.com/document/d/1yiaybXp7oLYHPLqQQfwDoNUo5cGCge0n4Jo-V4IpBmA/edit",target:"_blank",rel:"noopener noreferrer"},Se=t("Changelog"),Ee={href:"https://docs.google.com/document/d/1mtVihRO1LomyptXayoDNDTQYgX_TQPp6ZYDmtwR2jMI/edit",target:"_blank",rel:"noopener noreferrer"},Ce=t("ScoreSaber Ranking Criteria v1"),De=e("h3",{id:"translations",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#translations","aria-hidden":"true"},"#"),t(" Translations")],-1),Re={href:"https://docs.google.com/document/d/1K1iRlM7_kHYbMVzVoUuDmVUl53i3P1D58QapjfNX8Fc/edit#heading=h.3bevwybqdvva",target:"_blank",rel:"noopener noreferrer"},Ne=t("Korean Translation"),je=o('

Credits

Written by:
Uninstaller
Fern

WIth Contributions from:
OrangeW
Amanatsu
Umbranox
The ScoreSaber Ranking Team
ScoreSaber Ranking Criteria v1 Contributors

Transferred to the Wiki by riasuh

',4);function Le(Fe,Ie){const i=r("RouterLink"),s=r("ExternalLinkIcon");return l(),d("div",null,[y,e("p",null,[x,v,P,T,k,B,M,A,a(i,{to:"/ranking/criteria/mapping-criteria.html#slider-examples"},{default:n(()=>[S]),_:1}),E]),C,e("p",null,[D,a(i,{to:"/ranking/criteria/mapping-criteria.html#r-2-b-parallel-notes"},{default:n(()=>[R]),_:1}),N,j,L,F,I,W,a(i,{to:"/ranking/criteria/mapping-criteria.html#r-2-b-pre-cut-swing-path"},{default:n(()=>[G]),_:1}),V,q,a(i,{to:"/ranking/criteria/mapping-criteria.html#g-1-d-hitboxes"},{default:n(()=>[X]),_:1}),O,U,H,Q,Y]),J,e("p",null,[K,a(i,{to:"/ranking/criteria/mapping-criteria.html#r-2-c-walls-1"},{default:n(()=>[z]),_:1}),Z,$,ee,te,ae,ie,ne,oe]),se,e("p",null,[re,he,le,a(i,{to:"/ranking/criteria/mapping-criteria.html#r-2-d-bombs"},{default:n(()=>[de]),_:1}),ce,ue,pe,me,fe,ge]),be,e("p",null,[a(i,{to:"/ranking/criteria/formatting-and-metadata.html"},{default:n(()=>[_e]),_:1})]),we,e("p",null,[a(i,{to:"/ranking/criteria/difficulty-spread-requirements.html"},{default:n(()=>[ye]),_:1})]),xe,e("p",null,[ve,a(i,{to:"/ranking/criteria/mapping-criteria.html#g-1-c-pre-cut-collisions"},{default:n(()=>[Pe]),_:1}),Te,ke,a(i,{to:"/ranking/criteria/mapping-criteria.html#g-1-c-follow-through-collisions"},{default:n(()=>[Be]),_:1})]),Me,e("ul",null,[e("li",null,[e("a",Ae,[Se,a(s)])]),e("li",null,[e("a",Ee,[Ce,a(s)])])]),De,e("ul",null,[e("li",null,[e("a",Re,[Ne,a(s)])])]),je])}const Ge=h(w,[["render",Le],["__file","mapping-criteria.html.vue"]]);export{Ge as default}; diff --git a/assets/mapping-criteria.html.aaabbf24.js b/assets/mapping-criteria.html.aaabbf24.js new file mode 100644 index 0000000..e6b243d --- /dev/null +++ b/assets/mapping-criteria.html.aaabbf24.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-22a4d09d","path":"/ranking/criteria/mapping-criteria.html","title":"Mapping Criteria","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"About the Mapping Criteria","slug":"about-the-mapping-criteria","children":[]},{"level":2,"title":"Glossary","slug":"glossary","children":[{"level":3,"title":"Setup","slug":"setup","children":[]},{"level":3,"title":"Timing","slug":"timing","children":[]},{"level":3,"title":"Patterns","slug":"patterns","children":[]}]},{"level":2,"title":"Rules","slug":"rules","children":[{"level":3,"title":"1. Gameplay","slug":"_1-gameplay","children":[]},{"level":3,"title":"2. Patterns","slug":"_2-patterns","children":[]},{"level":3,"title":"3. Timing","slug":"_3-timing","children":[]},{"level":3,"title":"4. Formatting and Metadata","slug":"_4-formatting-and-metadata","children":[]},{"level":3,"title":"5. Difficulty Spread Requirements","slug":"_5-difficulty-spread-requirements","children":[]},{"level":3,"title":"6. Miscellaneous","slug":"_6-miscellaneous","children":[]}]},{"level":2,"title":"Guidelines","slug":"guidelines","children":[{"level":3,"title":"1. Patterns","slug":"_1-patterns","children":[]},{"level":3,"title":"2. Timing","slug":"_2-timing","children":[]}]},{"level":2,"title":"Addendum","slug":"addendum","children":[{"level":3,"title":"1. Consistency","slug":"_1-consistency","children":[]},{"level":3,"title":"2. Variety","slug":"_2-variety","children":[]},{"level":3,"title":"3. Emphasis","slug":"_3-emphasis","children":[]}]},{"level":2,"title":"Appendix","slug":"appendix","children":[{"level":3,"title":"Rule Explanations and Background","slug":"rule-explanations-and-background","children":[]},{"level":3,"title":"Images","slug":"images","children":[]},{"level":3,"title":"Links","slug":"links","children":[]},{"level":3,"title":"Translations","slug":"translations","children":[]}]},{"level":2,"title":"Credits","slug":"credits","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"ranking/criteria/mapping-criteria.md"}');export{e as data}; diff --git a/assets/mod-example.698338a4.png b/assets/mod-example.698338a4.png new file mode 100644 index 0000000..fe3f814 Binary files /dev/null and b/assets/mod-example.698338a4.png differ diff --git a/assets/modassistant.b36c557c.png b/assets/modassistant.b36c557c.png new file mode 100644 index 0000000..3ee0da4 Binary files /dev/null and b/assets/modassistant.b36c557c.png differ diff --git a/assets/modding-queue-information.html.2963be92.js b/assets/modding-queue-information.html.2963be92.js new file mode 100644 index 0000000..8f6f81c --- /dev/null +++ b/assets/modding-queue-information.html.2963be92.js @@ -0,0 +1 @@ +import{_ as a,o as i,c as r,a as e,b as n,e as s,d as o,r as d}from"../app.e68a1260.mjs";const l={},u=s('

Modding Queue Information

What is this about?

The Modding Queue Category on our Discord Server is a category designed to promote individual Modding queues and to advertise open mods from people willing to take them.

If you wish to request a slot from a modder, please DM them, and they'll (hopefully) get back to you on whether they decide to take your offer.

Please always make changes to your map, and if you aren't, please provide ample justification! Please respect the modders!

What is Modding?

Modding is a term borrowed from osu!. It is the process of reviewing and providing feedback for a map (for rankability or just general improvement) via editor and in-game analysis.

',7),c={href:"https://bit.ly/ScoreSaberModding",target:"_blank",rel:"noopener noreferrer"},h=o("See this guide"),m=o(" to get started with modding."),p=e("h2",{id:"requirements-rules",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#requirements-rules","aria-hidden":"true"},"#"),o(" Requirements & Rules")],-1),f=e("p",null,[o("Please send "),e("code",null,'"Dog" (AFriendlyPug#7901)'),o(" via Discord the following items when requesting a Modding queue:")],-1),g=o("A link to your "),_={href:"https://scoresaber.com",target:"_blank",rel:"noopener noreferrer"},y=o("ScoreSaber"),b=o(" account, if it exists."),w=e("li",null,"Two map links or two map files. Maps must be serious and have reasonable effort put in.",-1),v=e("div",{class:"custom-container tip"},[e("p",{class:"custom-container-title"},"We expect at least basic understanding and use of timing, consistency, and correct use of rhythm choices.")],-1),q=e("ul",null,[e("li",null,[e("p",null,"Response times can range from 1-5 days.")]),e("li",null,[e("p",null,"If you do not send at least the second item you will not be eligible for a community modding queue.")]),e("li",null,[e("p",null,"If you are a RT or QAT member or have a queue made for you before 04/01/2021 (DD/MM/YYYY), you are exempt from these requirements.")]),e("li",null,[e("p",null,"If you post anything inappropriate your channel will be removed, and you will be banned from requesting a new Modding queue.")])],-1);function k(x,M){const t=d("ExternalLinkIcon");return i(),r("div",null,[u,e("p",null,[e("a",c,[h,n(t)]),m]),p,f,e("ol",null,[e("li",null,[g,e("a",_,[y,n(t)]),b]),w]),v,q])}const S=a(l,[["render",k],["__file","modding-queue-information.html.vue"]]);export{S as default}; diff --git a/assets/modding-queue-information.html.85c17d16.js b/assets/modding-queue-information.html.85c17d16.js new file mode 100644 index 0000000..328937f --- /dev/null +++ b/assets/modding-queue-information.html.85c17d16.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-7d4771f0","path":"/ranking/modding-queue-information.html","title":"Modding Queue Information","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"What is this about?","slug":"what-is-this-about","children":[{"level":3,"title":"What is Modding?","slug":"what-is-modding","children":[]}]},{"level":2,"title":"Requirements & Rules","slug":"requirements-rules","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"ranking/modding-queue-information.md"}');export{e as data}; diff --git a/assets/pp-curve.7f289ebe.png b/assets/pp-curve.7f289ebe.png new file mode 100644 index 0000000..d18fde2 Binary files /dev/null and b/assets/pp-curve.7f289ebe.png differ diff --git a/assets/qat-guidelines.html.09739e1c.js b/assets/qat-guidelines.html.09739e1c.js new file mode 100644 index 0000000..ca9b891 --- /dev/null +++ b/assets/qat-guidelines.html.09739e1c.js @@ -0,0 +1 @@ +import{_ as o,o as s,c as n,a as e,b as a,e as r,d as t,r as h}from"../app.e68a1260.mjs";const l={},p=r('

ScoreSaber QAT Guidelines

Foreword

The goal of the QAT is to provide effective, fair feedback to mappers with the aim of curating the highest quality standard of maps in the ranked pool. While the goal is to provide objective feedback, there is no avoiding the fact that this job is subjective. Every person will hear something different in a song, and every person will feel differently about how well patterns play. To operate as a team, these guidelines list out what QAT members should consider for a map to be \u201Cquality\u201D.

Refer to this document when providing feedback on maps, and reach out to the team when you are unsure about a difficult decision.

QAT Behavior

As a member of the QAT, your actions represent the QAT and ScoreSaber as a whole. You are expected to carry yourself with respect and empathy when publicly interacting with the ranked system. Not only does kind, responsible behavior reflect well on yourself and the team- it also is far more effective at creating healthy change in a map.

It must be clear to mappers that it is \u201CUs vs. the map\u2019s problems\u201D, and not \u201CMe vs. You\u201D.

Our goal is to help mappers see the best version of their map.

This can only be done with active, direct communication with the mappers themselves. Leaving a comment and waiting for the mapper to see it and respond through #comment-response is not effective.

On the other hand, it is not the responsibility of the QAT to do the mapping for them.

QAT members can provide feedback and discuss with mappers all they want, but ultimately the mapper is the author of their work. Their solution may not be what you would choose, though it should at least improve their work. If a mapper consistently and intentionally ignores feedback, QAT downvotes serve as the consequence.

Phrasing is important for communication. The way a message is phrased can play a big role in how defensive or receptive a mapper is to your feedback. Identifying things you enjoy helps remind the mapper you are on their side. There are times for gentle suggestions, and times that call for stern feedback. For any case, remember to only criticise the work and not the mapper. Here are examples of well-phrased feedback:

  • \u201CBeat 120-121.5 plays poorly at this speed because of the sharp angle changes. You should slow down how aggressive angles change here when dealing with this speed.\u201D

  • \u201C0:30 - 0:40 in the song is less energetic than 0:40 on, but it has bigger swings due to it being on the ground. I suggest using middle-row up notes to keep the energy low.\u201D

  • \u201CThe hit at 367.25 is an extreme playability issue. At best it\u2019s hitbox abuse, at worst it\u2019s a handclap. This needs a less extreme swing.\u201D

  • \u201CThe pattern at 80 is awesome, and the section after it at 84 could use some more energy. Maybe think about repeating the pattern there to give 84 more life\u201D

Objective qualities

Nothing about mapping is truly \u201Cobjective\u201D other than things explicitly detailed in the ranking criteria- i.e. being on-time. However, there are things that are almost always better to fix than to keep.

  • Mappers must be able to justify the intensity of patterns relative to each other within the map. A map\u2019s intensity should represent the music.

  • Rhythm choices must be logical and consistent. Changes in mapped rhythm must have intent and musical justification.

  • Patterns must be reasonably connected to the song and context of the map. Cases where individual patterns are very different from the rest of the map must make sense.

  • Lower difficulties must reasonably reduce the challenge of the map while maintaining a creative identity. Lower difficulties should not be a passing thought to make the top difficulty rankable.

  • Patterns must be readable. Vision blocking should always be balanced with context and intent.

Objective issues should be strongly defended. Objective issues should be mostly independent of the creative identity of a map- there should be ways for mappers to maintain their vision of their work while improving the objective quality of the map. Ranked maps should be reasonable to grind and replay while shooting for a high score; compromises must be made for challenging maps to be ranked. Objective issues should be raised without including \u201CI\u201D, or similar personal language.

Subjective qualities

Mapping is an art form- an expression of what the mapper sees in the music in the form of a Beat Saber level. Things that make a map unique are what mappers will fight to keep most. When treading into subjective territories, be sure to understand the identity of the map: What makes this map unique?

  • Patterns should be fair and playable. Extreme reaches and angles should be reasonable to play for the map\u2019s speed, and match the intensity of the music.

  • A map should flow as well as the music justifies. Erratic music can fit an erratic map with unpredictable flow, but playability cannot be sacrificed.

  • A map should have a reasonable difficulty curve that makes for a fair level. Spikes in difficulty should be clearly connected to musical intensity.

  • A map should clearly show effort. Visibly lazy/low effort content should not be tolerated. On the other hand, not every song fits complexity- some songs can reasonably connect to a simple map.

Subjective issues should be discussed with an open mind. Individuals may have different opinions about what \u201Cplays well\u201D. Understand that subjective issues may be entirely dismissed by mappers if it conflicts with their own understanding of mapping. Use your judgement on the severity of these issues when it comes to discussions. Subjective issues may be mentioned including \u201CI\u201D and similar personal language.

Mapper\u2019s vision

Every person hears something different in music, and therefore, every person will see a different map as \u201Cfitting\u201D of a song. There may be patterns that look uncomfortable or poorly flowing, but it is possible this is a deliberate choice made by the mapper. Concepts like this should be repeated, identifiable, and thematic. Before suggesting changes to unusual patterns, first think if there is a concept the mapper is trying to convey with those patterns. If they are repeated, identifiable, and thematic- there\u2019s a good chance that it is a deliberate choice made by the mapper and that removing them would be to remove the core idea of the map.

Big Picture vs Detail-focused

Feedback can take the form of generalized advice about the map\u2019s direction, or focus on specifics of individual patterns. Both forms are legitimate and valuable feedback to provide, but keep in mind that:

  • Generalized feedback provides the mapper freedom to change things while remaining in their own creative vision.

  • Generalized feedback should still describe a direction for the mapper to take. \u201C0-end remap\u201D leaves the mapper with no direction to follow, and provides no constructive feedback. *

  • Generalized feedback is less likely to lead to the exact changes you would choose yourself.

  • Generalized feedback can be frustrating for mappers to deal with if the feedback is very negative.

  • Generalized feedback can be difficult for mappers who struggle with english.

  • Specific feedback provides the mapper small, exact changes that improve the map\u2019s quality.

  • Specific feedback should give the mapper options, rather than providing one \u201Ccorrect choice\u201D. **

  • Specific feedback is most effective when the mapper handles the list of feedback as a checklist. If you run into problems of mappers skipping comments, suggest they tell why points are skipped.

  • Specific feedback should explain why there is a problem, not just state that there is a problem.

  • Specific feedback can make mappers feel less ownership of their work.

  • Specific feedback often repeats itself. Depending on the severity of the issue it is reasonable to mention every case that needs fixing, or just the first few and mention that the problem repeats.

    • An example of direction for generalized feedback would be:
      \u201CThe map struggles to control width throughout the song. Identify which parts of the song you want to be more intense, and save wide patterns for these sections.\u201D
    • An example of providing options rather than absolute choices would be:
      \u201CThe hit at 221 will play poorly at this speed due to the sharp angle the swings make. Consider making the angle red swings at more gentle. This could be from making 221\u2019s red diagonal, or making 220.5\u2019s red horizontal.\u201D (This level of detail is not necessary for experienced mappers)

No matter what the feedback is, it must be clearly communicated why you have downvoted and what fixes are needed to have the downvote removed.

Identifying your strengths

No one is expected to be a jack-of-all-trades when it comes to skill. Everyone has strengths and weaknesses when it comes to performance, and the same is true for mapping. There is no harm in skipping a map because you are not comfortable commenting on a map of that category (i.e. downmaps, high bpm, etc.).

There can be harm in upvoting a difficulty when you do not feel confident in your ability to judge its quality- both for maps too difficult or too easy for your skill level. Feel welcome to ask fellow team members for their opinions/insights on content that you do not feel experienced with; it is possible to learn what plays well for any skill level, even outside your own.

Other Resources

Here are some links to interesting videos on the topic of mapping (in osu!, but still relates):

',32),d={href:"https://www.youtube.com/watch?v=C4v1QVJozGs",target:"_blank",rel:"noopener noreferrer"},c=t("https://www.youtube.com/watch?v=C4v1QVJozGs"),u=t(" - Good vs Fun (Very relevant)"),m={href:"https://www.youtube.com/watch?v=Z7IY0gDwSQo",target:"_blank",rel:"noopener noreferrer"},f=t("https://www.youtube.com/watch?v=Z7IY0gDwSQo"),b=t(" - Variety"),g={href:"https://www.youtube.com/watch?v=qUpdmKDo7BQ",target:"_blank",rel:"noopener noreferrer"},w=t("https://www.youtube.com/watch?v=qUpdmKDo7BQ"),y=t(" - Expectations & Context"),v={href:"https://www.youtube.com/watch?v=rAYm50d6XMw",target:"_blank",rel:"noopener noreferrer"},k=t("https://www.youtube.com/watch?v=rAYm50d6XMw"),_=t(" - Emphasis & Managing Energy");function x(j,T){const i=h("ExternalLinkIcon");return s(),n("div",null,[p,e("p",null,[e("a",d,[c,a(i)]),u]),e("p",null,[e("a",m,[f,a(i)]),b]),e("p",null,[e("a",g,[w,a(i)]),y]),e("p",null,[e("a",v,[k,a(i)]),_])])}const A=o(l,[["render",x],["__file","qat-guidelines.html.vue"]]);export{A as default}; diff --git a/assets/qat-guidelines.html.8bf99421.js b/assets/qat-guidelines.html.8bf99421.js new file mode 100644 index 0000000..b901d3a --- /dev/null +++ b/assets/qat-guidelines.html.8bf99421.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-737b7fdb","path":"/ranking/qat-guidelines.html","title":"ScoreSaber QAT Guidelines","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Foreword","slug":"foreword","children":[]},{"level":2,"title":"QAT Behavior","slug":"qat-behavior","children":[]},{"level":2,"title":"Objective qualities","slug":"objective-qualities","children":[]},{"level":2,"title":"Subjective qualities","slug":"subjective-qualities","children":[]},{"level":2,"title":"Mapper\u2019s vision","slug":"mapper-s-vision","children":[]},{"level":2,"title":"Big Picture vs Detail-focused","slug":"big-picture-vs-detail-focused","children":[]},{"level":2,"title":"Identifying your strengths","slug":"identifying-your-strengths","children":[]},{"level":2,"title":"Other Resources","slug":"other-resources","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"ranking/qat-guidelines.md"}');export{e as data}; diff --git a/assets/ranking-queue-rules.html.5a207e34.js b/assets/ranking-queue-rules.html.5a207e34.js new file mode 100644 index 0000000..4cdc883 --- /dev/null +++ b/assets/ranking-queue-rules.html.5a207e34.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-790243e7","path":"/ranking/ranking-queue-rules.html","title":"Ranking Queue Rules","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"General Information","slug":"general-information","children":[{"level":3,"title":"What is Modding?","slug":"what-is-modding","children":[]}]},{"level":2,"title":"Queuing Process at a Glance","slug":"queuing-process-at-a-glance","children":[{"level":3,"title":"How do Ranking Team votes work?","slug":"how-do-ranking-team-votes-work","children":[]},{"level":3,"title":"How do QAT votes work?","slug":"how-do-qat-votes-work","children":[]}]},{"level":2,"title":"General Queue Rules","slug":"general-queue-rules","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"ranking/ranking-queue-rules.md"}');export{e as data}; diff --git a/assets/ranking-queue-rules.html.e7dbd40d.js b/assets/ranking-queue-rules.html.e7dbd40d.js new file mode 100644 index 0000000..6a3a1c2 --- /dev/null +++ b/assets/ranking-queue-rules.html.e7dbd40d.js @@ -0,0 +1 @@ +import{_ as l,o as h,c as d,a as e,b as o,w as i,d as t,e as s,r}from"../app.e68a1260.mjs";const u={},c=e("h1",{id:"ranking-queue-rules",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#ranking-queue-rules","aria-hidden":"true"},"#"),t(" Ranking Queue Rules")],-1),m=e("h2",{id:"general-information",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#general-information","aria-hidden":"true"},"#"),t(" General Information")],-1),p=t("The current ScoreSaber ranking queue "),f={href:"https://scoresaber.com/ranking/requests",target:"_blank",rel:"noopener noreferrer"},g=t("can be found here"),_=t("."),k=s('
  • The top 6 maps in the ranking queue can be qualified with sufficient votes from the ranking team.

  • If your map is in the top 6 of the ranking queue and you receive a mod from a Ranking Team member you will have 3 days to respond to the mod, and another 4 days after that to make the necessary changes to the map.

    • If you do not respond or are unable to make the changes in the set time span then your map will be taken out of queue.

\u{1F4A1}

This process is done to both encourage mappers to respond in a timely manner to comments, as well as streamline maps through the queue without a fear of reuploading.

What is Modding?

Modding is a term borrowed from osu!. It is the process of reviewing and providing feedback for a map (for rankability or just general improvement) via editor and in-game analysis.

',4),w={href:"https://bit.ly/ScoreSaberModding",target:"_blank",rel:"noopener noreferrer"},y=t("See this guide"),b=t(" to get started with modding. \u2800"),v=e("h2",{id:"queuing-process-at-a-glance",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#queuing-process-at-a-glance","aria-hidden":"true"},"#"),t(" Queuing Process at a Glance")],-1),q=e("p",null,[e("em",null,"From the point of creating the map through ranking it, here is the process you need to follow:")],-1),T=t("Read and follow to the best of your ability the "),x=t("ranking criteria rules and guidelines"),R=t("."),I=t("Use "),Q={href:"https://www.kivalevan.me/BeatSaber-MapCheck",target:"_blank",rel:"noopener noreferrer"},A=t("Kival Evan's map checker"),S=t(" to check for common errors in your map."),M=e("li",null,"Once you are satisfied with the map, get it modded to find mistakes. Even if you cannot get a mod by a member of the Ranking Team, any mod can help your map towards rank.",-1),N=e("li",null,"Have a Ranking Team member mod your map, and make any changes deemed unrankable by the modder. Once they deem the map rankable, they will submit it to the request-feed.",-1),D=t("Stay alert to updates on your map by checking for comments in the rank request. This can be done by going to the "),E={href:"https://scoresaber.com/ranking/requests",target:"_blank",rel:"noopener noreferrer"},L=t("Rank Requests Page"),B=t(" and finding your map."),C=e("li",null,[t("Mention any response you have to comments on your map in "),e("code",null,"via Direct Message"),t(" and look to make changes quickly as if you respond to the comment within 3 days, and make the changes within 4 days, you will maintain your spot in queue.")],-1),G=t("For a more in-depth guide on how to rank your first map please read: "),H=t("How do I get my map ranked?"),V=s('

How do Ranking Team votes work?

  • If a Ranking Team member downvotes your map, the map will not be eligible for rank until the issues are resolved. Issues will be stated in the comments of the rank request, and any response to those comments should be made via Direct Message.
  • The team member who downvoted the map should also contact you, if they do not feel free to request it.
  • Once the changes are made, the map will become eligible for rank again with 3 votes qualifying the map. \u2800

How do QAT votes work?

QAT Upvotes will increase your position in queue, and QAT Downvotes will decrease your position in queue. QAT Downvotes will be accompanied with a comment explaining the reasons for the downvote.

  • In order for your map to be eligible for qualification, you must respond to, but not necessarily accept or implement, any comments associated with downvotes by QAT members.
  • If you wish to update your map in response to QAT comments or to make other map changes, you will retain queue position if you make changes within a 4 day period.

General Queue Rules

  • Queue limit of 4 maps per mapper*
    • difficulties with multiple mappers count towards the limit for each mapper.
    • Downmaps, difficulties not going for rank, and lighting do not count towards this limit.

If you currently have more than 4 maps in queue you will have to wait till you have less than 4 to get anymore maps queued

WARNING

Additional difficulties at or above the highest difficulty in the initial ranking request cannot be added to the request beyond two weeks from the initial request date without resetting to the bottom of the queue

',9),O=t("The current Technical Limitation Criteria "),F=t("can be found here");function P(U,W){const a=r("ExternalLinkIcon"),n=r("RouterLink");return h(),d("div",null,[c,m,e("p",null,[p,e("a",f,[g,o(a)]),_]),k,e("p",null,[e("a",w,[y,o(a)]),b]),v,q,e("ol",null,[e("li",null,[T,o(n,{to:"/ranking/criteria/"},{default:i(()=>[x]),_:1}),R]),e("li",null,[I,e("a",Q,[A,o(a)]),S]),M,N,e("li",null,[D,e("a",E,[L,o(a)]),B]),C]),e("p",null,[G,o(n,{to:"/ranking/how-to-rank-map.html"},{default:i(()=>[H]),_:1})]),V,e("p",null,[O,o(n,{to:"/ranking/criteria/technical-limitations-criteria.html"},{default:i(()=>[F]),_:1})])])}const K=l(u,[["render",P],["__file","ranking-queue-rules.html.vue"]]);export{K as default}; diff --git a/assets/ranking-system.html.31aa24fd.js b/assets/ranking-system.html.31aa24fd.js new file mode 100644 index 0000000..7384ccf --- /dev/null +++ b/assets/ranking-system.html.31aa24fd.js @@ -0,0 +1 @@ +import{_ as r,o as s,c as i,a,b as t,w as n,e as h,d as e,r as l}from"../app.e68a1260.mjs";const d="/assets/pp-curve.7f289ebe.png",c={},p=h('

How does ScoreSaber and the PP system work?

Earning PP

PP is awarded to players for submitting a score on ranked maps. To prevent skilled players from grinding hundreds of easier maps worth less PP to rank up, a curve is applied to your plays. This curve is available below, it shows the percentage of points you get relative to the assigned PP value of a map based on your performance on said map.

ScoreSaber calculates your total PP, which you can see next to your ScoreSaber profile, based on a weighted total of all your ranked map completions. Your highest PP play will give 100% of the PP earned from the play, but every play after that is weighted at a percentage 5% lower than the play above it. The weighting is 0.965(n-1), where n is the ranking of a specific play amongst all your PP plays. A new play will give PP at the weight based on its position in your ranked plays, but it also pushes down the weighting of plays below it. That is why your PP gains for completing ranked maps don\u2019t necessarily sum up with the numbers shown in your profile.

PP Curve

Global Ranking

A global rank will be assigned to your profile. This rank is based on comparing the total amount of pp earned to every other player from all the active players around the globe.

Country Ranking

A country rank is assigned to your profile based on your location at the moment of setting your first score. This rank, just like your global rank, is based on comparing the total amount of pp earned to every other active player from your country.

Ranking process

',10),u=e("The "),m=e("Ranking Team"),f=e(" ranks maps through a communal evaluation process. A map is first chosen by a team member to be checked; if the map seems to meet everything from the "),y=e("ranking criteria"),g=e(", it is then added to the "),_=e("ranking-queue"),b=e(" and will eventually reach the top of said queue until it is qualified with 3 upvotes. Once the map is qualified by the Nomination Assessment Team, a timer of 7 days is started for players to give feedback to the mapper. Finally, when the 7 day timer comes to an end, the map will be approved, and ranked."),k=a("p",null,[e("When a map is ranked, it is then assigned a Performance Points (commonly referred to as "),a("em",null,"PP"),e(") value based on an algorithm which determines the difficulty of said map, this is based on a variety of different factors.")],-1),w=a("h3",{id:"unranking-process",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#unranking-process","aria-hidden":"true"},"#"),e(" Unranking process")],-1),v=e("There isn't and will not be any unranking process on ScoreSaber. If you're curious as to why, please refer to this question in our "),P=e("FAQ"),S=e(". Currently, the only way maps could ever become unranked is if the mapper is banned from ScoreSaber. You can be banned for various reasons such has repeatedly breaking our "),x=e("rules"),T=e(", or making one of your ranked map unavailable to everyone. Since ScoreSaber does not support sharing custom maps between each-other, we rely on the availability of said map from the creator only."),q={class:"custom-container tip"},A=a("p",{class:"custom-container-title"},"For any question that was not answered on this page please refer to our",-1),R=e("FAQ");function C(N,F){const o=l("RouterLink");return s(),i("div",null,[p,a("p",null,[u,t(o,{to:"/ranking/scoresaber-team-information.html#ranking-team-rt"},{default:n(()=>[m]),_:1}),f,t(o,{to:"/ranking/criteria/"},{default:n(()=>[y]),_:1}),g,t(o,{to:"/ranking/ranking-queue-rules.html"},{default:n(()=>[_]),_:1}),b]),k,w,a("p",null,[v,t(o,{to:"/faq.html#why-can-a-map-not-be-unranked"},{default:n(()=>[P]),_:1}),S,t(o,{to:"/rules.html"},{default:n(()=>[x]),_:1}),T]),a("div",q,[A,a("p",null,[t(o,{to:"/faq.html"},{default:n(()=>[R]),_:1})])])])}const B=r(c,[["render",C],["__file","ranking-system.html.vue"]]);export{B as default}; diff --git a/assets/ranking-system.html.b6c86fd0.js b/assets/ranking-system.html.b6c86fd0.js new file mode 100644 index 0000000..5990e86 --- /dev/null +++ b/assets/ranking-system.html.b6c86fd0.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-0e753d4c","path":"/ranking-system.html","title":"How does ScoreSaber and the PP system work?","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Earning PP","slug":"earning-pp","children":[{"level":3,"title":"Global Ranking","slug":"global-ranking","children":[]},{"level":3,"title":"Country Ranking","slug":"country-ranking","children":[]}]},{"level":2,"title":"Ranking process","slug":"ranking-process","children":[{"level":3,"title":"Unranking process","slug":"unranking-process","children":[]}]}],"git":{"updatedTime":1709736109000},"filePathRelative":"ranking-system.md"}');export{e as data}; diff --git a/assets/ranking-unban-system-and-terms.html.603acf8c.js b/assets/ranking-unban-system-and-terms.html.603acf8c.js new file mode 100644 index 0000000..782bf7c --- /dev/null +++ b/assets/ranking-unban-system-and-terms.html.603acf8c.js @@ -0,0 +1 @@ +import{_ as t,o as r,c as s,a as e,b as o,e as i,d as a,r as h}from"../app.e68a1260.mjs";const l={},p=i('

Unban System and Terms

System

When a mapper is accepted on appeal, they will have a limit of 1 mapset in the queue at a time. This restriction will last until the mapper has successfully gotten 3 mapsets ranked, in which case the restriction will be lifted. The mapper is allowed to rank any song they choose, including ones that might have been previously deleted by the same mapper, as long as the maps are rankable by current criteria. Maps previously deleted will not automatically be ranked again.

If a mapper does not wish to be fully unbanned, but will allow other mappers to use their assets such as lighting events and timing, they may apply for a partnership unban. Rules for a partnership unban are as follows: No person unbanned through partnerships may submit their own maps for rank under their name or another. Any map submitted for rank which includes someone unbanned through partnership must not be uploaded onto an account owned by the unbanned person. Persons unbanned through partnership must not make up greater than 50% of the mappers for a map submitted for rank.

Terms

  • If a mapper commits another bannable offense during or after the appeal process, that mapper will be permanently banned from both ranking and the appeal process.

  • Submitting an appeal does not mean that you will be moved to the appeal process, the ScoreSaber staff holds the right to deny an appeal from any mapper for any reason.

  • RT/QAT feedback should be responded to within 4 days of receiving the feedback via DM barring external circumstances

',6),d={class:"custom-container tip"},m=e("p",{class:"custom-container-title"},"Info",-1),c=a("To submit a unban request, "),u={href:"https://forms.gle/mLmEpxJ25eSabX9R8",target:"_blank",rel:"noopener noreferrer"},b=a("open the following form");function f(y,_){const n=h("ExternalLinkIcon");return r(),s("div",null,[p,e("div",d,[m,e("p",null,[c,e("a",u,[b,o(n)])])])])}const k=t(l,[["render",f],["__file","ranking-unban-system-and-terms.html.vue"]]);export{k as default}; diff --git a/assets/ranking-unban-system-and-terms.html.8b520ea5.js b/assets/ranking-unban-system-and-terms.html.8b520ea5.js new file mode 100644 index 0000000..874c7b9 --- /dev/null +++ b/assets/ranking-unban-system-and-terms.html.8b520ea5.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-355e83f4","path":"/ranking/ranking-unban-system-and-terms.html","title":"Unban System and Terms","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"System","slug":"system","children":[]},{"level":2,"title":"Terms","slug":"terms","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"ranking/ranking-unban-system-and-terms.md"}');export{e as data}; diff --git a/assets/rules.html.081b5421.js b/assets/rules.html.081b5421.js new file mode 100644 index 0000000..a7e4e4f --- /dev/null +++ b/assets/rules.html.081b5421.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-56476c0a","path":"/rules.html","title":"Rules","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"General Rules","slug":"general-rules","children":[{"level":3,"title":"Mappers with Ranked Maps","slug":"mappers-with-ranked-maps","children":[]}]},{"level":2,"title":"What Happens if I Break the Rules?","slug":"what-happens-if-i-break-the-rules","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"rules.md"}');export{e as data}; diff --git a/assets/rules.html.47234536.js b/assets/rules.html.47234536.js new file mode 100644 index 0000000..5d57fb6 --- /dev/null +++ b/assets/rules.html.47234536.js @@ -0,0 +1 @@ +import{_ as n,o as t,c as o,a as e,b as r,w as s,e as i,r as l,d as c}from"../app.e68a1260.mjs";const h={},d=i('

Rules

General Rules

  1. No multiaccounting. The first account you make during login is your one and only ScoreSaber account, from the moment of its creation and forevermore. This account is YOU. It is not anyone else. Don't share your account with anyone else.

  2. Play fair. Using third-party utilities of any kind (any type of scripts, mods/plugins, applications, bots) to get any sort of advantage is not okay.

  3. Be good to each other. Harassment or other antagonism has no place within the ScoreSaber community.

  4. No 18+/NSFW Content This means 18+/NSFW content such as drug use or topics of a sexual nature are not allowed.

  5. Where the rules do not prevail, common sense shall. The administration has explicit discretion to apply their judgment on this as they see fit.

Mappers with Ranked Maps

\u26A0\uFE0F ATTENTION

You must never make your ranked maps unavailable to players. If you violate this rule, you will be banned from ranking any maps on ScoreSaber in the future.

What Happens if I Break the Rules?

You will be banned (either temporary or permanently).

',7),u={class:"custom-container warning"},p=e("p",{class:"custom-container-title"},"If you are currently banned from ScoreSaber Ranking and want to get unbanned, please read the following:",-1),m=c("Ranking Unban System and Terms");function g(f,y){const a=l("RouterLink");return t(),o("div",null,[d,e("div",u,[p,e("p",null,[r(a,{to:"/ranking/ranking-unban-system-and-terms.html"},{default:s(()=>[m]),_:1})])])])}const b=n(h,[["render",g],["__file","rules.html.vue"]]);export{b as default}; diff --git a/assets/scoresaber-team-information.html.43d159d8.js b/assets/scoresaber-team-information.html.43d159d8.js new file mode 100644 index 0000000..cb7534b --- /dev/null +++ b/assets/scoresaber-team-information.html.43d159d8.js @@ -0,0 +1 @@ +import{_ as s,o as h,c as d,a as e,b as t,w as o,e as c,d as a,r}from"../app.e68a1260.mjs";const l={},m=c('

ScoreSaber Team Information

What does each role do within ScoreSaber?

Ranking Team (RT)

They are a group of mappers which take time to mod maps in order to make sure said maps follow every point from the ranking criteria. RT members also go through the ranking-queue and vote on maps that are meeting or not the ranking criteria. If errors are to be find, they will work with the mapper in order to resolve them.

Quality Assurance Team (QAT)

They are a group of specialized players who play through the ranking-queue and vote on maps that are of high quality. Maps which have more QAT upvotes are more likely to be prioritized in the queue and get ranked faster. On the other hand, if QAT deems the map to be of "low quality", it will have a lower priority. The maps will eventually rise based on how long it has spent in the queue.

Criteria Assurance Team (CAT)

',7),u=a("As the name suggests, the people in the Criteria Assurance Team are in charge of maintaining the "),p=a("ranking criteria"),f=a(". They also essentially are the writers of the "),g=a("ranking criteria"),y=a(". Any changes which is decided by the CAT has to be approved by NAT and ScoreSaber Admins."),_=e("h3",{id:"nomination-assessment-team-nat",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#nomination-assessment-team-nat","aria-hidden":"true"},"#"),a(" Nomination Assessment Team (NAT)")],-1),b=e("p",null,"Generally apart of the Ranking Team, they are the ones in charge of processing some internal interactions with the leaderboards such as denying, replacing and qualifying them, they constantly work towards keeping everything in check. NAT is also the team that moderates RT & QAT by ensuring there is no bias or system abuse.",-1),w=e("h2",{id:"how-do-i-join-the-ranking-team",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#how-do-i-join-the-ranking-team","aria-hidden":"true"},"#"),a(" How do I join the Ranking Team?")],-1),k=a("The only way to begin the process of joining the ranking team or a higher role is to first participate in the student program. The student program involves making map mods, and having them reviewed by your mentor. Once you have proven your abilities, your mentor will recommend you for promotion and the entire ranking team will evaluate your progress and vote on your induction as a recruit. If you are interested in become a ranking team student please fill out "),T={href:"https://forms.gle/H5AZzvVKFfrBdTpt9",target:"_blank",rel:"noopener noreferrer"},v=a("this"),A=a(" form"),q=e("h2",{id:"how-do-i-join-the-quality-assurance-team",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#how-do-i-join-the-quality-assurance-team","aria-hidden":"true"},"#"),a(" How do I join the Quality Assurance Team?")],-1),x=e("p",null,"The only way to begin the process of joining the quality assurance team is to wait for applications to open. Occasionally, the QAT team members will find themselves in need of new individuals to help them assuring quality of maps in the ranking-queue, and a post will then be made with an application form for users to fill and participate in the process. You will then be contacted by one of the Head of Quality Assurance Team to being your journey into becoming a QAT member.",-1);function j(Q,I){const n=r("RouterLink"),i=r("ExternalLinkIcon");return h(),d("div",null,[m,e("p",null,[u,t(n,{to:"/ranking/criteria/"},{default:o(()=>[p]),_:1}),f,t(n,{to:"/ranking/criteria/"},{default:o(()=>[g]),_:1}),y]),_,b,w,e("p",null,[k,e("a",T,[v,t(i)]),A]),q,x])}const R=s(l,[["render",j],["__file","scoresaber-team-information.html.vue"]]);export{R as default}; diff --git a/assets/scoresaber-team-information.html.56e54911.js b/assets/scoresaber-team-information.html.56e54911.js new file mode 100644 index 0000000..cf9cec0 --- /dev/null +++ b/assets/scoresaber-team-information.html.56e54911.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-1d3a639e","path":"/ranking/scoresaber-team-information.html","title":"ScoreSaber Team Information","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"What does each role do within ScoreSaber?","slug":"what-does-each-role-do-within-scoresaber","children":[{"level":3,"title":"Ranking Team (RT)","slug":"ranking-team-rt","children":[]},{"level":3,"title":"Quality Assurance Team (QAT)","slug":"quality-assurance-team-qat","children":[]},{"level":3,"title":"Criteria Assurance Team (CAT)","slug":"criteria-assurance-team-cat","children":[]},{"level":3,"title":"Nomination Assessment Team (NAT)","slug":"nomination-assessment-team-nat","children":[]}]},{"level":2,"title":"How do I join the Ranking Team?","slug":"how-do-i-join-the-ranking-team","children":[]},{"level":2,"title":"How do I join the Quality Assurance Team?","slug":"how-do-i-join-the-quality-assurance-team","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"ranking/scoresaber-team-information.md"}');export{e as data}; diff --git a/assets/style.61a187c2.css b/assets/style.61a187c2.css new file mode 100644 index 0000000..50cff01 --- /dev/null +++ b/assets/style.61a187c2.css @@ -0,0 +1 @@ +:root{--back-to-top-z-index: 5;--back-to-top-color: #3eaf7c;--back-to-top-color-hover: #71cda3}.back-to-top{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;height:1.2rem;background-color:var(--back-to-top-color);-webkit-mask:url(/assets/back-to-top.8efcbe56.svg) no-repeat;mask:url(/assets/back-to-top.8efcbe56.svg) no-repeat;z-index:var(--back-to-top-z-index)}.back-to-top:hover{background-color:var(--back-to-top-color-hover)}@media (max-width: 959px){.back-to-top{display:none}}.back-to-top-enter-active,.back-to-top-leave-active{transition:opacity .3s}.back-to-top-enter-from,.back-to-top-leave-to{opacity:0}:root{--external-link-icon-color: #aaa}.external-link-icon{position:relative;display:inline-block;color:var(--external-link-icon-color);vertical-align:middle;top:-1px}.external-link-icon-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}:root{--nprogress-color: #29d;--nprogress-z-index: 1031}#nprogress{pointer-events:none}#nprogress .bar{background:var(--nprogress-color);position:fixed;z-index:var(--nprogress-z-index);top:0;left:0;width:100%;height:2px}:root{--c-brand: #3eaf7c;--c-brand-light: #4abf8a;--c-bg: #ffffff;--c-bg-light: #f3f4f5;--c-bg-lighter: #eeeeee;--c-bg-navbar: var(--c-bg);--c-bg-sidebar: var(--c-bg);--c-bg-arrow: #cccccc;--c-text: #2c3e50;--c-text-accent: var(--c-brand);--c-text-light: #3a5169;--c-text-lighter: #4e6e8e;--c-text-lightest: #6a8bad;--c-text-quote: #999999;--c-border: #eaecef;--c-border-dark: #dfe2e5;--c-tip: #42b983;--c-tip-bg: var(--c-bg-light);--c-tip-title: var(--c-text);--c-tip-text: var(--c-text);--c-tip-text-accent: var(--c-text-accent);--c-warning: #e7c000;--c-warning-bg: #fffae3;--c-warning-title: #ad9000;--c-warning-text: #746000;--c-warning-text-accent: var(--c-text);--c-danger: #cc0000;--c-danger-bg: #ffe0e0;--c-danger-title: #990000;--c-danger-text: #660000;--c-danger-text-accent: var(--c-text);--c-details-bg: #eeeeee;--c-badge-tip: var(--c-tip);--c-badge-warning: var(--c-warning);--c-badge-danger: var(--c-danger);--t-color: .3s ease;--t-transform: .3s ease;--code-bg-color: #282c34;--code-hl-bg-color: rgba(0, 0, 0, .66);--code-ln-color: #9e9e9e;--code-ln-wrapper-width: 3.5rem;--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--font-family-code: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--navbar-height: 3.6rem;--navbar-padding-v: .7rem;--navbar-padding-h: 1.5rem;--sidebar-width: 20rem;--sidebar-width-mobile: calc(var(--sidebar-width) * .82);--content-width: 740px;--homepage-width: 960px}.medium-zoom-overlay{--medium-zoom-bg-color: var(--c-bg)}html.dark{--c-brand: #3aa675;--c-brand-light: #349469;--c-bg: #22272e;--c-bg-light: #2b313a;--c-bg-lighter: #262c34;--c-text: #adbac7;--c-text-light: #96a7b7;--c-text-lighter: #8b9eb0;--c-text-lightest: #8094a8;--c-border: #3e4c5a;--c-border-dark: #34404c;--c-tip: #318a62;--c-warning: #ceab00;--c-warning-bg: #7e755b;--c-warning-title: #ceac03;--c-warning-text: #362e00;--c-danger: #940000;--c-danger-bg: #806161;--c-danger-title: #610000;--c-danger-text: #3a0000;--c-details-bg: #323843;--code-hl-bg-color: #363b46}html,body{padding:0;margin:0;background-color:var(--c-bg);transition:background-color var(--t-color)}html.dark{color-scheme:dark}html{font-size:16px}body{font-family:var(--font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:1rem;color:var(--c-text)}a{font-weight:500;color:var(--c-text-accent);text-decoration:none;overflow-wrap:break-word}p a code{font-weight:400;color:var(--c-text-accent)}kbd{font-family:var(--font-family-code);color:var(--c-text);background:var(--c-bg-lighter);border:solid .15rem var(--c-border-dark);border-bottom:solid .25rem var(--c-border-dark);border-radius:.15rem;padding:0 .15em}code{font-family:var(--font-family-code);color:var(--c-text-lighter);padding:.25rem .5rem;margin:0;font-size:.85em;background-color:var(--c-bg-lighter);border-radius:3px;overflow-wrap:break-word;transition:background-color var(--t-color)}blockquote{font-size:1rem;color:var(--c-text-quote);border-left:.2rem solid var(--c-border-dark);margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ul,ol{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}h1:focus-visible,h2:focus-visible,h3:focus-visible,h4:focus-visible,h5:focus-visible,h6:focus-visible{outline:none}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color)}h3{font-size:1.35rem}h4{font-size:1.15rem}h5{font-size:1.05rem}h6{font-size:1rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}a.header-anchor:hover{text-decoration:none}a.header-anchor:focus-visible{opacity:1}p,ul,ol{line-height:1.7}hr{border:0;border-top:1px solid var(--c-border)}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto;transition:border-color var(--t-color)}tr{border-top:1px solid var(--c-border-dark);transition:border-color var(--t-color)}tr:nth-child(2n){background-color:var(--c-bg-light);transition:background-color var(--t-color)}th,td{padding:.6em 1em;border:1px solid var(--c-border-dark);transition:border-color var(--t-color)}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:6px solid var(--c-bg-arrow)}.arrow.down{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid var(--c-bg-arrow)}.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:6px solid var(--c-bg-arrow)}.arrow.left{border-top:4px solid transparent;border-bottom:4px solid transparent;border-right:6px solid var(--c-bg-arrow)}.badge{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:var(--c-bg);vertical-align:top;transition:color var(--t-color),background-color var(--t-color)}.badge.tip{background-color:var(--c-badge-tip)}.badge.warning{background-color:var(--c-badge-warning)}.badge.danger{background-color:var(--c-badge-danger)}.badge+.badge{margin-left:5px}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:var(--font-family-code);font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#ec5975}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.3rem 1.5rem;margin:.85rem 0;border-radius:6px;overflow:auto}.theme-default-content pre code,.theme-default-content pre[class*=language-] code{color:#fff;padding:0;background-color:transparent;border-radius:0;overflow-wrap:unset;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.theme-default-content .line-number{font-family:var(--font-family-code)}div[class*=language-]{position:relative;background-color:var(--code-bg-color);border-radius:6px}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:var(--code-ln-color)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent!important;position:relative;z-index:1}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlight-line{background-color:var(--code-hl-bg-color)}div[class*=language-]:not(.line-numbers-mode) .line-numbers{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlight-line:before{content:" ";position:absolute;z-index:2;left:0;top:0;display:block;width:var(--code-ln-wrapper-width);height:100%}div[class*=language-].line-numbers-mode pre{margin-left:var(--code-ln-wrapper-width);padding-left:1rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers{position:absolute;top:0;width:var(--code-ln-wrapper-width);text-align:center;color:var(--code-ln-color);padding-top:1.25rem;line-height:1.4;counter-reset:line-number}div[class*=language-].line-numbers-mode .line-numbers .line-number{position:relative;z-index:3;-webkit-user-select:none;-moz-user-select:none;user-select:none;height:1.4em}div[class*=language-].line-numbers-mode .line-numbers .line-number:before{counter-increment:line-number;content:counter(line-number);font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;top:0;left:0;width:var(--code-ln-wrapper-width);height:100%;border-radius:6px 0 0 6px;border-right:1px solid var(--code-hl-bg-color)}div[class*=language-].ext-c:before{content:"c"}div[class*=language-].ext-cpp:before{content:"cpp"}div[class*=language-].ext-cs:before{content:"cs"}div[class*=language-].ext-css:before{content:"css"}div[class*=language-].ext-dart:before{content:"dart"}div[class*=language-].ext-docker:before{content:"docker"}div[class*=language-].ext-fs:before{content:"fs"}div[class*=language-].ext-go:before{content:"go"}div[class*=language-].ext-html:before{content:"html"}div[class*=language-].ext-java:before{content:"java"}div[class*=language-].ext-js:before{content:"js"}div[class*=language-].ext-json:before{content:"json"}div[class*=language-].ext-kt:before{content:"kt"}div[class*=language-].ext-less:before{content:"less"}div[class*=language-].ext-makefile:before{content:"makefile"}div[class*=language-].ext-md:before{content:"md"}div[class*=language-].ext-php:before{content:"php"}div[class*=language-].ext-py:before{content:"py"}div[class*=language-].ext-rb:before{content:"rb"}div[class*=language-].ext-rs:before{content:"rs"}div[class*=language-].ext-sass:before{content:"sass"}div[class*=language-].ext-scss:before{content:"scss"}div[class*=language-].ext-sh:before{content:"sh"}div[class*=language-].ext-styl:before{content:"styl"}div[class*=language-].ext-ts:before{content:"ts"}div[class*=language-].ext-toml:before{content:"toml"}div[class*=language-].ext-vue:before{content:"vue"}div[class*=language-].ext-yml:before{content:"yml"}@media (max-width: 419px){.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.code-group__nav{margin-top:.85rem;margin-bottom:calc(-1.7rem - 6px);padding-bottom:calc(1.7rem - 6px);padding-left:10px;padding-top:10px;border-top-left-radius:6px;border-top-right-radius:6px;background-color:var(--code-bg-color)}.code-group__ul{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.code-group__nav-tab{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:#ffffffe6;font-weight:600}.code-group__nav-tab:focus{outline:none}.code-group__nav-tab:focus-visible{outline:1px solid rgba(255,255,255,.9)}.code-group__nav-tab-active{border-bottom:var(--c-brand) 1px solid}@media (max-width: 419px){.code-group__nav{margin-left:-1.5rem;margin-right:-1.5rem;border-radius:0}}.code-group-item{display:none}.code-group-item__active{display:block}.code-group-item>pre{background-color:orange}.custom-container{transition:color var(--t-color),border-color var(--t-color),background-color var(--t-color)}.custom-container .custom-container-title{font-weight:600}.custom-container .custom-container-title:not(:only-child){margin-bottom:-.4rem}.custom-container.tip,.custom-container.warning,.custom-container.danger{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-container.tip{border-color:var(--c-tip);background-color:var(--c-tip-bg);color:var(--c-tip-text)}.custom-container.tip .custom-container-title{color:var(--c-tip-title)}.custom-container.tip a{color:var(--c-tip-text-accent)}.custom-container.warning{border-color:var(--c-warning);background-color:var(--c-warning-bg);color:var(--c-warning-text)}.custom-container.warning .custom-container-title{color:var(--c-warning-title)}.custom-container.warning a{color:var(--c-warning-text-accent)}.custom-container.danger{border-color:var(--c-danger);background-color:var(--c-danger-bg);color:var(--c-danger-text)}.custom-container.danger .custom-container-title{color:var(--c-danger-title)}.custom-container.danger a{color:var(--c-danger-text-accent)}.custom-container.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:var(--c-details-bg)}.custom-container.details h4{margin-top:0}.custom-container.details figure:last-child,.custom-container.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-container.details summary{outline:none;cursor:pointer}.home{padding:var(--navbar-height) 2rem 0;max-width:var(--homepage-width);margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero h1,.home .hero .description,.home .hero .actions{margin:1.8rem auto}.home .hero .actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:var(--c-text-lightest)}.home .hero .action-button{display:inline-block;font-size:1.2rem;padding:.8rem 1.6rem;border-width:2px;border-style:solid;border-radius:4px;transition:background-color var(--t-color);box-sizing:border-box}.home .hero .action-button.primary{color:var(--c-bg);background-color:var(--c-brand);border-color:var(--c-brand)}.home .hero .action-button.primary:hover{background-color:var(--c-brand-light)}.home .hero .action-button.secondary{color:var(--c-brand);background-color:var(--c-bg);border-color:var(--c-brand)}.home .hero .action-button.secondary:hover{color:var(--c-bg);background-color:var(--c-brand-light)}.home .features{border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:var(--c-text-light)}.home .feature p{color:var(--c-text-lighter)}.home .theme-default-content{padding:0;margin:0}.home .footer{padding:2.5rem;border-top:1px solid var(--c-border);text-align:center;color:var(--c-text-lighter);transition:border-color var(--t-color)}@media (max-width: 719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width: 419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero h1,.home .hero .description,.home .hero .actions{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.page{padding-top:var(--navbar-height);padding-left:var(--sidebar-width)}.navbar{position:fixed;z-index:20;top:0;left:0;right:0;height:var(--navbar-height);box-sizing:border-box;border-bottom:1px solid var(--c-border);background-color:var(--c-bg-navbar);transition:background-color var(--t-color),border-color var(--t-color)}.sidebar{font-size:16px;width:var(--sidebar-width);position:fixed;z-index:10;margin:0;top:var(--navbar-height);left:0;bottom:0;box-sizing:border-box;border-right:1px solid var(--c-border);overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--c-brand) var(--c-border);background-color:var(--c-bg-sidebar);transition:transform var(--t-transform),background-color var(--t-color),border-color var(--t-color)}.sidebar::-webkit-scrollbar{width:7px}.sidebar::-webkit-scrollbar-track{background-color:var(--c-border)}.sidebar::-webkit-scrollbar-thumb{background-color:var(--c-brand)}.sidebar-mask{position:fixed;z-index:9;top:0;left:0;width:100vw;height:100vh;display:none}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1){transform:rotate(45deg) translate3d(5.5px,5.5px,0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(2){transform:scale3d(0,1,1)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform:rotate(-45deg) translate3d(6px,-6px,0)}.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(1),.theme-container.sidebar-open .navbar>.toggle-sidebar-button .icon span:nth-child(3){transform-origin:center}.theme-container.no-navbar .theme-default-content h1,.theme-container.no-navbar .theme-default-content h2,.theme-container.no-navbar .theme-default-content h3,.theme-container.no-navbar .theme-default-content h4,.theme-container.no-navbar .theme-default-content h5,.theme-container.no-navbar .theme-default-content h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .page{padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width: 720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}.theme-default-content a:hover{text-decoration:underline}.theme-default-content img{max-width:100%}.theme-default-content h1,.theme-default-content h2,.theme-default-content h3,.theme-default-content h4,.theme-default-content h5,.theme-default-content h6{margin-top:calc(.5rem - var(--navbar-height));padding-top:calc(1rem + var(--navbar-height));margin-bottom:0}.theme-default-content h1:first-child,.theme-default-content h2:first-child,.theme-default-content h3:first-child,.theme-default-content h4:first-child,.theme-default-content h5:first-child,.theme-default-content h6:first-child{margin-bottom:1rem}.theme-default-content h1:first-child+p,.theme-default-content h1:first-child+pre,.theme-default-content h1:first-child+.custom-container,.theme-default-content h2:first-child+p,.theme-default-content h2:first-child+pre,.theme-default-content h2:first-child+.custom-container,.theme-default-content h3:first-child+p,.theme-default-content h3:first-child+pre,.theme-default-content h3:first-child+.custom-container,.theme-default-content h4:first-child+p,.theme-default-content h4:first-child+pre,.theme-default-content h4:first-child+.custom-container,.theme-default-content h5:first-child+p,.theme-default-content h5:first-child+pre,.theme-default-content h5:first-child+.custom-container,.theme-default-content h6:first-child+p,.theme-default-content h6:first-child+pre,.theme-default-content h6:first-child+.custom-container{margin-top:2rem}@media (max-width: 959px){.sidebar{font-size:15px;width:var(--sidebar-width-mobile)}.page{padding-left:var(--sidebar-width-mobile)}}@media (max-width: 719px){.sidebar{top:0;padding-top:var(--navbar-height);transform:translate(-100%)}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translate(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width: 419px){h1{font-size:1.9rem}}.navbar{--navbar-line-height: calc( var(--navbar-height) - 2 * var(--navbar-padding-v) );padding:var(--navbar-padding-v) var(--navbar-padding-h);line-height:var(--navbar-line-height)}.navbar .logo{height:var(--navbar-line-height);margin-right:var(--navbar-padding-v);vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:var(--c-text);position:relative}.navbar .navbar-items-wrapper{display:flex;position:absolute;box-sizing:border-box;top:var(--navbar-padding-v);right:var(--navbar-padding-h);height:var(--navbar-line-height);padding-left:var(--navbar-padding-h);white-space:nowrap;font-size:.9rem}.navbar .navbar-items-wrapper .search-box{flex:0 0 auto;vertical-align:top}@media (max-width: 719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.navbar-items{display:inline-block}.navbar-items a{display:inline-block;line-height:1.4rem;color:inherit}.navbar-items a:hover,.navbar-items a.router-link-active{color:var(--c-text-accent)}.navbar-items .navbar-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:var(--navbar-line-height)}.navbar-items .navbar-item:first-child{margin-left:0}@media (max-width: 719px){.navbar-items .navbar-item{margin-left:0}}@media (min-width: 719px){.navbar-items a:hover,.navbar-items a.router-link-active{color:var(--c-text)}.navbar-item>a:hover,.navbar-item>a.router-link-active{margin-bottom:-2px;border-bottom:2px solid var(--c-text-accent)}}.toggle-sidebar-button{position:absolute;top:.6rem;left:1rem;display:none;padding:.6rem;cursor:pointer}.toggle-sidebar-button .icon{display:flex;flex-direction:column;justify-content:center;align-items:center;width:1.25rem;height:1.25rem;cursor:inherit}.toggle-sidebar-button .icon span{display:inline-block;width:100%;height:2px;border-radius:2px;background-color:var(--c-text);transition:transform var(--t-transform)}.toggle-sidebar-button .icon span:nth-child(2){margin:6px 0}@media screen and (max-width: 719px){.toggle-sidebar-button{display:block}}.toggle-color-mode-button{display:flex;margin:auto;margin-left:1rem;border:0;background:none;color:var(--c-text);opacity:.8;cursor:pointer}.toggle-color-mode-button:hover{opacity:1}.toggle-color-mode-button .icon{width:1.25rem;height:1.25rem}.DocSearch{transition:background-color var(--t-color)}.navbar-dropdown-wrapper{cursor:pointer}.navbar-dropdown-wrapper .navbar-dropdown-title,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:var(--c-text)}.navbar-dropdown-wrapper .navbar-dropdown-title:hover,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover{border-color:transparent}.navbar-dropdown-wrapper .navbar-dropdown-title .arrow,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:none;font-weight:600;font-size:inherit}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile:hover{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item{color:inherit;line-height:1.7rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{margin:.45rem 0 0;border-top:1px solid var(--c-border);padding:1rem 0 .45rem;font-size:.9rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>span{padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a{font-weight:inherit}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle>a.router-link-active:after{display:none}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper{padding:0;list-style:none}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem-wrapper .navbar-dropdown-subitem{font-size:.9em}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a:hover,.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active{color:var(--c-text-accent)}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid var(--c-text-accent);border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item:first-child .navbar-dropdown-subtitle{margin-top:0;padding-top:0;border-top:0}@media (max-width: 719px){.navbar-dropdown-wrapper.open .navbar-dropdown-title,.navbar-dropdown-wrapper.open .navbar-dropdown-title-mobile{margin-bottom:.5rem}.navbar-dropdown-wrapper .navbar-dropdown-title,.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:none}.navbar-dropdown-wrapper .navbar-dropdown-title-mobile{display:block}.navbar-dropdown-wrapper .navbar-dropdown{transition:height .1s ease-out;overflow:hidden}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle{border-top:0;margin-top:0;padding-top:0;padding-bottom:0}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subtitle,.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item>a{font-size:15px;line-height:2rem}.navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item .navbar-dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width: 720px){.navbar-dropdown-wrapper{height:1.8rem}.navbar-dropdown-wrapper:hover .navbar-dropdown,.navbar-dropdown-wrapper.open .navbar-dropdown{display:block!important}.navbar-dropdown-wrapper.open:blur{display:none}.navbar-dropdown-wrapper .navbar-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:var(--c-bg-navbar);padding:.6rem 0;border:1px solid var(--c-border);border-bottom-color:var(--c-border-dark);text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.page{padding-bottom:2rem;display:block}.page .theme-default-content{max-width:var(--content-width);margin:0 auto;padding:2rem 2.5rem;padding-top:0}@media (max-width: 959px){.page .theme-default-content{padding:2rem}}@media (max-width: 419px){.page .theme-default-content{padding:1.5rem}}.page-meta{max-width:var(--content-width);margin:0 auto;padding:1rem 2.5rem;overflow:auto}@media (max-width: 959px){.page-meta{padding:2rem}}@media (max-width: 419px){.page-meta{padding:1.5rem}}.page-meta .meta-item{cursor:default;margin-top:.8rem}.page-meta .meta-item .meta-item-label{font-weight:500;color:var(--c-text-lighter)}.page-meta .meta-item .meta-item-info{font-weight:400;color:var(--c-text-quote)}.page-meta .edit-link{display:inline-block;margin-right:.25rem}.page-meta .last-updated{float:right}@media (max-width: 719px){.page-meta .last-updated{font-size:.8em;float:none}.page-meta .contributors{font-size:.8em}}.page-nav{max-width:var(--content-width);margin:0 auto;padding:1rem 2.5rem 2rem;padding-bottom:0}@media (max-width: 959px){.page-nav{padding:2rem}}@media (max-width: 419px){.page-nav{padding:1.5rem}}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid var(--c-border);transition:border-color var(--t-color);padding-top:1rem;overflow:auto}.page-nav .prev a:before{content:"\2190"}.page-nav .next{float:right}.page-nav .next a:after{content:"\2192"}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .navbar-items{display:none;border-bottom:1px solid var(--c-border);transition:border-color var(--t-color);padding:.5rem 0 .75rem}.sidebar .navbar-items a{font-weight:600}.sidebar .navbar-items .navbar-item{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar .sidebar-items{padding:1.5rem 0}@media (max-width: 719px){.sidebar .navbar-items{display:block}.sidebar .navbar-items .navbar-dropdown-wrapper .navbar-dropdown .navbar-dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar .sidebar-items{padding:1rem 0}}.sidebar-item{cursor:default;border-left:.25rem solid transparent;color:var(--c-text)}.sidebar-item:focus-visible{outline-width:1px;outline-offset:-1px}.sidebar-item.active:not(p.sidebar-heading){font-weight:600;color:var(--c-text-accent);border-left-color:var(--c-text-accent)}.sidebar-item.sidebar-heading{transition:color .15s ease;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0}.sidebar-item.sidebar-heading+.sidebar-item-children{transition:height .1s ease-out;overflow:hidden;margin-bottom:.75rem}.sidebar-item.sidebar-heading.collapsible{cursor:pointer}.sidebar-item.sidebar-heading.collapsible .arrow{position:relative;top:-.12em;left:.5em}.sidebar-item:not(.sidebar-heading){font-size:1em;font-weight:400;display:inline-block;margin:0;padding:.35rem 1rem .35rem 2rem;line-height:1.4;width:100%;box-sizing:border-box}.sidebar-item:not(.sidebar-heading)+.sidebar-item-children{padding-left:1rem;font-size:.95em}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading){padding:.25rem 1rem .25rem 1.75rem}.sidebar-item-children .sidebar-item-children .sidebar-item:not(.sidebar-heading).active{font-weight:500;border-left-color:transparent}a.sidebar-heading+.sidebar-item-children .sidebar-item:not(.sidebar-heading).active{border-left-color:transparent}a.sidebar-item{cursor:pointer}a.sidebar-item:hover{color:var(--c-text-accent)}.table-of-contents .badge{vertical-align:middle}.dropdown-enter-from,.dropdown-leave-to{height:0!important}.fade-slide-y-enter-active{transition:all .2s ease}.fade-slide-y-leave-active{transition:all .2s cubic-bezier(1,.5,.8,1)}.fade-slide-y-enter-from,.fade-slide-y-leave-to{transform:translateY(10px);opacity:0}:root{--c-brand: #296AE5;--c-brand-light: #4276d8;--c-bg: #ffffff;--c-bg-light: #f3f4f5;--c-bg-lighter: #eeeeee;--c-bg-navbar: var(--c-bg);--c-bg-sidebar: var(--c-bg);--c-bg-arrow: #cccccc;--c-text: #2c3e50;--c-text-accent: var(--c-brand);--c-text-light: #3a5169;--c-text-lighter: #4e6e8e;--c-text-lightest: #6a8bad;--c-text-quote: #999999;--c-border: #eaecef;--c-border-dark: #dfe2e5;--c-tip: #42b983;--c-tip-bg: var(--c-bg-light);--c-tip-title: var(--c-text);--c-tip-text: var(--c-text);--c-tip-text-accent: var(--c-text-accent);--c-warning: #e7c000;--c-warning-bg: #fffae3;--c-warning-title: #ad9000;--c-warning-text: #746000;--c-warning-text-accent: var(--c-text);--c-danger: #cc0000;--c-danger-bg: #ffe0e0;--c-danger-title: #990000;--c-danger-text: #660000;--c-danger-text-accent: var(--c-text);--c-details-bg: #eeeeee;--c-badge-tip: var(--c-tip);--c-badge-warning: var(--c-warning);--c-badge-danger: var(--c-danger);--t-color: .3s ease;--t-transform: .3s ease;--code-bg-color: #282c34;--code-hl-bg-color: rgba(0, 0, 0, .66);--code-ln-color: #9e9e9e;--code-ln-wrapper-width: 3.5rem;--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--font-family-code: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace;--navbar-height: 3.6rem;--navbar-padding-v: .7rem;--navbar-padding-h: 1.5rem;--sidebar-width: 20rem;--sidebar-width-mobile: calc(var(--sidebar-width) * .82);--content-width: 920px;--homepage-width: 960px}.back-to-top{--back-to-top-color: var(--c-brand);--back-to-top-color-hover: var(--c-brand-light)}.DocSearch{--docsearch-primary-color: var(--c-brand);--docsearch-text-color: var(--c-text);--docsearch-highlight-color: var(--c-brand);--docsearch-muted-color: var(--c-text-quote);--docsearch-container-background: rgba(9, 10, 17, .8);--docsearch-modal-background: var(--c-bg-light);--docsearch-searchbox-background: var(--c-bg-lighter);--docsearch-searchbox-focus-background: var(--c-bg);--docsearch-searchbox-shadow: inset 0 0 0 2px var(--c-brand);--docsearch-hit-color: var(--c-text-light);--docsearch-hit-active-color: var(--c-bg);--docsearch-hit-background: var(--c-bg);--docsearch-hit-shadow: 0 1px 3px 0 var(--c-border-dark);--docsearch-footer-background: var(--c-bg)}.external-link-icon{--external-link-icon-color: var(--c-text-quote)}.medium-zoom-overlay{--medium-zoom-bg-color: var(--c-bg);--medium-zoom-opacity: .65}#nprogress{--nprogress-color: var(--c-brand)}.pwa-popup{--pwa-popup-text-color: var(--c-text);--pwa-popup-bg-color: var(--c-bg);--pwa-popup-border-color: var(--c-brand);--pwa-popup-shadow: 0 4px 16px var(--c-brand);--pwa-popup-btn-text-color: var(--c-bg);--pwa-popup-btn-bg-color: var(--c-brand);--pwa-popup-btn-hover-bg-color: var(--c-brand-light)}.search-box{--search-bg-color: var(--c-bg);--search-accent-color: var(--c-brand);--search-text-color: var(--c-text);--search-border-color: var(--c-border);--search-item-text-color: var(--c-text-lighter);--search-item-focus-bg-color: var(--c-bg-light)}html.dark{--c-brand: #FDD85E;--c-brand-light: #FFF77D;--c-bg:#202020;--c-bg-light: #252525;--c-bg-lighter:#333333;--c-text: rgb(234, 234, 234);--c-text-light: rgb(237, 237, 237);--c-text-lighter: rgb(240, 240, 240);--c-text-lightest: rgb(243, 243, 243);--c-border: rgba(255, 255, 255, .1);--c-border-dark: rgba(255, 255, 255, .05);--c-tip: #318a62;--c-warning: #e7c000;--c-warning-bg: rgba(255, 229, 100, .25);--c-warning-title: #ffd91d;--c-warning-text: #ffefa2;--c-danger: #cc0100;--c-danger-bg: rgba(204, 0, 0, .25);--c-danger-title: #ff2929;--c-danger-text: #f66;--c-details-bg: #323843;--code-hl-bg-color: #363b46}html.dark .DocSearch{--docsearch-logo-color: var(--c-text);--docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;--docsearch-key-shadow: inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, 0 2px 2px 0 rgba(3, 4, 9, .3);--docsearch-key-gradient: linear-gradient(-225deg, #444950, #1c1e21);--docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, .5), 0 -4px 8px 0 rgba(0, 0, 0, .2)}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}svg.external-link-icon{margin-left:2px}h1.noborder,h2.noborder,h3.noborder,h4.noborder,h5.noborder,h6.noborder{border:0}:root{--medium-zoom-z-index: 100;--medium-zoom-bg-color: #ffffff;--medium-zoom-opacity: 1}.medium-zoom-overlay{background-color:var(--medium-zoom-bg-color)!important;z-index:var(--medium-zoom-z-index)}.medium-zoom-overlay~img{z-index:calc(var(--medium-zoom-z-index) + 1)}.medium-zoom--opened .medium-zoom-overlay{opacity:var(--medium-zoom-opacity)} diff --git a/assets/technical-limitations-criteria.html.70c0536c.js b/assets/technical-limitations-criteria.html.70c0536c.js new file mode 100644 index 0000000..c59a94d --- /dev/null +++ b/assets/technical-limitations-criteria.html.70c0536c.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as l,a as e,b as a,w as r,d as t,e as o,r as c}from"../app.e68a1260.mjs";const d={},u=e("h1",{id:"technical-limitations-criteria",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#technical-limitations-criteria","aria-hidden":"true"},"#"),t(" Technical Limitations Criteria")],-1),h=t("Looking for the Mapping Criteria? The ScoreSaber Mapping Criteria "),m=t("can be found here"),p=o('

Current Limits

\u26A0\uFE0F

Until further notice the new map format will be unrankable. This will stay in place until we have adjusted the criteria and made/updated tools for the new format.

  • Maps must not break 350 BPM sustained
  • Maps must not break 13.5\u2B50difficulty
  • Maps must not break 11.5\u2B50difficulty without a QAT upvote on all ranked difficulties and receive 2/3 approval by RT and QAT
  • Current limit for map length is 10 minutes

Burst Criteria

Burst rules (Beats are defined at EBPM)

  • 350-375 6 beats
  • 376-400 2 beats

Break rules

  • 2x length of burst OR minimum 2 beat, whichever is longer

Disallowed Mapping Objects/Patterns in Bursts

  • Dots
  • Stacks / Multinote hits / Sliders
  • Bombs
  • Parity breaks
  • Two or more consecutive notes of the same color at over 350 BPM that may be possible to be hit with a single straight swing
  • Bursts exceeding 400 BPM
',10),b={class:"custom-container tip"},f=e("p",{class:"custom-container-title"},"Tip",-1),_=t("The current Ranking Queue Process and Rules "),g=t("can be found here");function k(w,B){const i=c("RouterLink");return n(),l("div",null,[u,e("blockquote",null,[e("p",null,[h,a(i,{to:"/ranking/criteria/mapping-criteria.html"},{default:r(()=>[m]),_:1})])]),p,e("div",b,[f,e("p",null,[_,a(i,{to:"/ranking/ranking-queue-rules.html"},{default:r(()=>[g]),_:1})])])])}const x=s(d,[["render",k],["__file","technical-limitations-criteria.html.vue"]]);export{x as default}; diff --git a/assets/technical-limitations-criteria.html.b01f3119.js b/assets/technical-limitations-criteria.html.b01f3119.js new file mode 100644 index 0000000..46dba7a --- /dev/null +++ b/assets/technical-limitations-criteria.html.b01f3119.js @@ -0,0 +1 @@ +const i=JSON.parse('{"key":"v-3e479638","path":"/ranking/criteria/technical-limitations-criteria.html","title":"Technical Limitations Criteria","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Current Limits","slug":"current-limits","children":[]},{"level":2,"title":"Burst Criteria","slug":"burst-criteria","children":[]}],"git":{"updatedTime":1709736109000},"filePathRelative":"ranking/criteria/technical-limitations-criteria.md"}');export{i as data}; diff --git a/beginners-guide.html b/beginners-guide.html new file mode 100644 index 0000000..44efa64 --- /dev/null +++ b/beginners-guide.html @@ -0,0 +1,33 @@ + + + + + + + + + Beginners Guide | ScoreSaber Wiki + + + + +

Beginners Guide

Installing ScoreSaber

PC

Installing ScoreSaber on Beat Saber is relatively quick and easy. You need to install the mod onto your game, but before you go and install any mod, make sure to run the game at least once. This applies to reinstalling your game too.

Next, it is strongly recommended to use the ModAssistant installer, available hereopen in new window to get the ScoreSaber mod up and running.

💡 For safety, only install mods from this application since they are approved and verified mods.

Mod Assistant

When this is done installing, you can go ahead and launch Beat Saber.

Need help with Plugins/Mods?

Please head over to the BSMG Wikiopen in new window for a detailed guide on Modding.


After the game is loaded, head over to Solo. If everything went well, you should see a new banner on the top of the leaderboards with the ScoreSaber logo, like so: Logged In

Congratulations! You are now fully ready to use the ScoreSaber mod and submit scores onto custom maps!

Head over to Using ScoreSaber to learn more about ScoreSaber's website, mod, and all their functions.

ScoreSaber for Quest

Make sure you're on the exact version ScoreSaber was made for otherwise it will not work!
⚠️ Do not put your Steam/Oculus login information into anything that isn't Steam/Oculus!


Installing ScoreSaber for Quest

If you are on a supported game version for using ScoreSaber on Quest and your game has BMBF ready, please head over to the ScoreSaber for Quest Pageopen in new window on how to install ScoreSaber for Quest.

Your Quest Beat Saber is not modded or first time using Modded Beat Saber for native Quest?
Please head over to the BSMG Wikiopen in new window for a detailed guide on "Quest Modding"

Using ScoreSaber

The ScoreSaber website is available at https://scoresaber.com/open in new window

In-Game Song Leaderboards

Leaderboard_full

With the ScoreSaber mod, you have access to various leaderboards within maps. This is to help players identify with ease how they compete with others around the world. You can use the icons on the left of each leaderboard to filter the scores that are shown:

  • Global - Global leaderboard of selected map
  • Around You - The scores around yours
  • Friends - The scores from your friends
  • Country - The scores from your local country

On each leaderboard, you can use the Up and Down arrow on top and bottom of the icon list to scroll through the different shown score pages.

leaderboard_detail


You can also click on an individual Score, via the button at the right side to see more information about the score, such as:

Score_info


On the Top right of the newly opened Window, you can also open the Users Profile, indicated by the card icon:

Profile


In-Game ScoreSaber Overview

by pressing on the big yellow ScoreSaber button right at the top of the leaderboard:

Lb_top

You can find our in-game dashboard:

SS_Info

Here you can see a in-game view of our Team Page as well as the Global Leaderboards and links to our socials.

ScoreSaber Profile

To be able to see and edit your ScoreSaber profile, you must first submit a score on a custom map. Doing so will automatically create your profile based on your Steam or Oculus information, and add you onto the leaderboards.

On your profile, you should be able to see the following: Your username, profile picture, total amount of pp earned, global & local ranking and various other statistics about the scores you submitted to ScoreSaber.

If you would like more stats or features added to ScoreSaber and to profiles, make sure to first check if this wasn't already suggested hereopen in new window, and create a request about said feature.

Badges and Biography

While browsing on various ScoreSaber profiles, you may come across profiles which look like this: Profile badges

All the icons that are seen on this profile header are badges. You can earn a badge by either achieving a rewarding rank during a community event such as a tournament, or by simply becoming a ScoreSaber supporter on patreon. Doing so will also add the possibility to have and edit a biography in order to personalize your ScoreSaber profile even more.

💡 TIP

For more information on the perks given to supporters, please check our patreon pageopen in new window.

Whats next?

Now that you're all set-up and ready to go, you can start using ScoreSaber and compete with everyone else!
If you wish to learn more about the ranking process and how are things calculated, there is a more in depth guide from our wiki available here.

+ + + diff --git a/faq.html b/faq.html new file mode 100644 index 0000000..91ee5b2 --- /dev/null +++ b/faq.html @@ -0,0 +1,33 @@ + + + + + + + + + Frequently asked questions | ScoreSaber Wiki + + + + +

Frequently asked questions

What is PPv3, and when is it coming?

PPv3 is essentially the new algorithm which is aimed to be used to assign star rating to ranked maps. It is currently being developed by Umbranox and his PPv3 team. Considering the complexity of various elements slowing down the process of making PPv3 available, there is currently no ETA as to when it will come into place.

Why are the OST maps not ranked?

Scores which are submitted to the Beat Saber original soundtracks are not submitted to ScoreSaber for various reasons. This makes them ineligible for ranking as no ScoreSaber leaderboard is available for them to be a part of ranked maps.

Why are replays only available on ranked maps?

Replays over time take up a very considerable amount of storage space and ScoreSaber only has so much of it in its current state. There are too many maps available and storing all of them would be unhealthy for the well-being of ScoreSaber servers.

How do modifiers work with ScoreSaber?

Positive modifiers (Ghost Notes, Disappearing Arrows, Faster Song) are only enabled on both ranked Overkills. You can still set scores on other songs with modifiers, but only your base score is considered for scoring and PP calculations. Negative modifiers (No Fail, Slower Song, etc.), always apply.

Why not autorank every map?

There are many reasons as to this is a bad idea. It was attempted in the past and failed. It took almost a year to clean up all the unplayable and mistimed maps that got auto-ranked. In addition, ScoreSaber’s servers would not be able to handle the processing load of auto-ranking all maps, this goes along the replays being only available to ranked maps.

I played all these maps but they give 0pp?

That means the map is most likely not ranked. If you would like to see those maps ranked in order to gain PP from them, please reach out to the mapper and ask if it could be a possibility for them to push their map for rank via the ranking process.

Why can a map not be unranked?

There are three main reasons why a map cannot be unranked, one benefiting each of the player, mapper, and team. The first reason is because players have to put time into a map to get a good score, and would be discouraged from doing that if there is a threat of the map being unranked. The second is because mappers would likely be less inclined to spend the time pushing a map for rank if their map could be unranked. The last reason is because the ranking team would have to check over every map for every new issue outlined in criteria. This would be a large use of resources which would be better spent ranking new maps, which eventually will make the map pool large enough for players to be able to pick which maps to play.

How can I get unbanned from ranking maps?

To get unbanned read the terms and conditions stated here and submit an unban request in the following form hereopen in new window

I have feedback that I'd like to give on a map what do I do?

Most mappers are open to feedback, so don't hesitate to DM them through their available socials. Please keep criticism constructive. Try to follow the QAT Guidelines here in order to write constructive and actionable feedback.

Why is there so much Japanese music on ScoreSaber?

Japan has a long history of rhythm games, thus has many music producers that make music influenced by rhythm games and/or specifically for rhythm games a lot of the times. These songs tend to be high-tempo and include a variety of rhythms to map, which makes them generally more appealing to mappers since they are better and easier to work with. If you're dissatisfied about the current state of the available map pool, be the change you want to see and map the songs of the genres you feel are lacking for ranked.

Where can I request a new feature or report a bug?

Please open our canny pageopen in new window for submitting Feature Requests, Website Bug Reports or in-game Bug Reports.

+ + + diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000..4a35d1e Binary files /dev/null and b/favicon.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..35c0edb --- /dev/null +++ b/index.html @@ -0,0 +1,33 @@ + + + + + + + + + ScoreSaber Wiki + + + + + + + + diff --git a/ranking-system.html b/ranking-system.html new file mode 100644 index 0000000..208a971 --- /dev/null +++ b/ranking-system.html @@ -0,0 +1,33 @@ + + + + + + + + + How does ScoreSaber and the PP system work? | ScoreSaber Wiki + + + + +

How does ScoreSaber and the PP system work?

Earning PP

PP is awarded to players for submitting a score on ranked maps. To prevent skilled players from grinding hundreds of easier maps worth less PP to rank up, a curve is applied to your plays. This curve is available below, it shows the percentage of points you get relative to the assigned PP value of a map based on your performance on said map.

ScoreSaber calculates your total PP, which you can see next to your ScoreSaber profile, based on a weighted total of all your ranked map completions. Your highest PP play will give 100% of the PP earned from the play, but every play after that is weighted at a percentage 5% lower than the play above it. The weighting is 0.965(n-1), where n is the ranking of a specific play amongst all your PP plays. A new play will give PP at the weight based on its position in your ranked plays, but it also pushes down the weighting of plays below it. That is why your PP gains for completing ranked maps don’t necessarily sum up with the numbers shown in your profile.

PP Curve

Global Ranking

A global rank will be assigned to your profile. This rank is based on comparing the total amount of pp earned to every other player from all the active players around the globe.

Country Ranking

A country rank is assigned to your profile based on your location at the moment of setting your first score. This rank, just like your global rank, is based on comparing the total amount of pp earned to every other active player from your country.

Ranking process

The Ranking Team ranks maps through a communal evaluation process. A map is first chosen by a team member to be checked; if the map seems to meet everything from the ranking criteria, it is then added to the ranking-queue and will eventually reach the top of said queue until it is qualified with 3 upvotes. Once the map is qualified by the Nomination Assessment Team, a timer of 7 days is started for players to give feedback to the mapper. Finally, when the 7 day timer comes to an end, the map will be approved, and ranked.

When a map is ranked, it is then assigned a Performance Points (commonly referred to as PP) value based on an algorithm which determines the difficulty of said map, this is based on a variety of different factors.

Unranking process

There isn't and will not be any unranking process on ScoreSaber. If you're curious as to why, please refer to this question in our FAQ. Currently, the only way maps could ever become unranked is if the mapper is banned from ScoreSaber. You can be banned for various reasons such has repeatedly breaking our rules, or making one of your ranked map unavailable to everyone. Since ScoreSaber does not support sharing custom maps between each-other, we rely on the availability of said map from the creator only.

For any question that was not answered on this page please refer to our

FAQ

+ + + diff --git a/ranking/criteria/difficulty-spread-requirements.html b/ranking/criteria/difficulty-spread-requirements.html new file mode 100644 index 0000000..49e5845 --- /dev/null +++ b/ranking/criteria/difficulty-spread-requirements.html @@ -0,0 +1,33 @@ + + + + + + + + + Difficulty Spread Requirements | ScoreSaber Wiki + + + + +

Difficulty Spread Requirements

Looking for the Mapping Criteria? The ScoreSaber Mapping Criteria can be found here

Explanation

A mapset must contain a reasonable difficulty progression starting from the highest difficulty level submitted for rank and ending at or below the lowest difficulty level required for the song's length, following the rules outlined in Progression Requirements.

  • Difficulty is measured in Swings per Second (SPS) with the Swings per Second Calculatoropen in new window. Place the calculator inside the map folder or a folder containing the zipped map files and run, or run the calculator on the command line with “--help” to see more options. The overall combined SPS is considered the SPS for the map.
    • If it does not print, it is likely because there are special characters in the info.dat. Workaround: Run the calculator on the zipped files instead.
    • Source Codeopen in new window if you would like to build it yourself or run on a non-Windows platform.
  • Song length is defined as the length listed in the official metadata of the song, or the time difference between the start of the first significant musical element and the end of the last significant musical element if the official metadata is not available.

Lowest Required Difficulty Level

Starting from the highest SPS difficulty submitted for rank, there must be a difficulty or difficulties following the progression requirements until either the SPS Requirements or the Total Downmap Requirements are met.

SPS Requirements

  • If the song length is less than 2:00.0, the lowest difficulty submitted for rank must have less than 3.20 SPS.
  • If the song length is 2:00.0 to 3:59.99, the lowest difficulty submitted for rank must have less than 4.20 SPS.
  • If the song length is 4:00.0 to 5:59.99:
    • If the top difficulty submitted for rank has 5.20 SPS or more, there must be at least one lower difficulty that follows the progression requirements.
    • If the top difficulty submitted for rank has less than 5.20 SPS, the mapset is exempt from difficulty and progression requirements. However, mapping multiple difficulties is still encouraged.
  • If the song length is 6:00.0 or more, the mapset is exempt from difficulty and progression requirements. However, mapping multiple difficulties is still encouraged.

OR

Total Downmap Requirements

  • If the song length is less than 4:00.0, the lowest difficulty submitted for rank must have a minimum SPS reduction of 60% from the highest SPS difficulty submitted for rank.
  • If the song length is 4:00.0 to 5:59.99, the SPS Requirements should be applied instead.
  • If the song length is 6:00.0 or greater, the mapset is exempt from difficulty and progression requirements. However, mapping multiple difficulties is still encouraged.

Progression Requirements

As one progresses down from the highest difficulty in the mapset, these rules should be followed:

  • The overall swings per second in the interactive portion of the map must be decreased by 10.00-40.00% from the previous difficulty.
    • An exception can be made if the SPS decreases by less than 10% but the effective BPM of the highest effective BPM sections decreases by more than 40%. This primarily concerns cases where high effective BPM one-handed sections are converted into lower effective BPM sections that utilize both hands.
  • The mapping in periods of peak difficulty must be made easier.
  • The average effective BPM in the hardest section(s) must decrease OR the hardest sections should be made significantly shorter.
  • The average effective BPM must decrease.
  • Complexity, the difficulty involved in reading and executing the movements required to hit the notes, must not increase, unless justified by a large decrease in other components of difficulty.
  • The duration of the period(s) of peak difficulty must not significantly increase, unless justified by a large decrease in other components of difficulty.
  • The overall interactive object density should decrease.
  • Spacing, the distance between successive notes of the same color on the 4x3 grid, should not increase within a section if the average effective BPM remains the same in that section.

Miscellaneous

  • If the spread causes the mapset to exceed the 5 difficulty limit, the easiest or hardest additional levels should be placed in a separate mapset.
  • All difficulty labels must be appropriately named in relation to the difficulty of the map they represent.
  • Difficulty labels must not contain obscene content including derogatory terms, sexual content, or other explicit terminology.
  • Having multiple guest difficulties of the same relative difficulty is okay, as long as all difficulties are appropriately named to reflect their difficulty.
  • All difficulties in the mapset going for rank must go through the ranking process at the same time, and all decisions are final once any difficulties in the mapset are ranked.
  • Any difficulties which are not going for rank must not be inserted between difficulties going for rank. This includes lightshows, challenge difficulties, difficulties that require external mods, etc.
+ + + diff --git a/ranking/criteria/formatting-and-metadata.html b/ranking/criteria/formatting-and-metadata.html new file mode 100644 index 0000000..cb2df0c --- /dev/null +++ b/ranking/criteria/formatting-and-metadata.html @@ -0,0 +1,107 @@ + + + + + + + + + Formatting and Metadata Criteria | ScoreSaber Wiki + + + + +

Formatting and Metadata Criteria

Looking for the Mapping Criteria? The ScoreSaber Mapping Criteria can be found here

Rules

💡

The data on external sources do not have to abide by these rules, but should be kept relevant to the song and artist. You may add additional tags and other information. The metadata rules in this document are for in-game purposes.

Official metadata should be used in all fields, then follow the formatting as explained below. In the case of a contradiction, follow the official metadata. In the case that the official metadata uses unsearchable characters (anything besides A-Z, 0-9) then please refer to Unsearchable characters, translations, and romanization below.

Regular Use Case

In the vast majority of cases, song metadata should follow this format:

levelAuthorName: Mapper
+songAuthorName: Artist of the song
+songName: Song name
+songSubName: All following tags: (Short Ver.), (ft. Hatsune Miku), etc.
+

If there are multiple tags, then put them alongside each other in the songSubName in any order. Do not add any tags that are not specified in this document or the official metadata. The type(s) of brackets and other typographical marks used in tags, if used, should follow the official metadata if available.

Example:

levelAuthorName: Uninstaller
+songAuthorName: Camellia
+songName: Bassline Yatteru? w
+songSubName: feat. Nanahira (Cranky Remix) (Short Ver.)
+

Track is a remix or other musical modification of the original

The remix, bootleg, etc. tag must go into songSubName in brackets regardless of official or source metadata.

Example:

songAuthorName: DJ'TEKINA//SOMETHING
+songName: Internet Bitch
+songSubName: (P*Light Remix)
+

Track is a cover

The cover artist, followed by “Cover”, must go into songSubName in brackets regardless of official or source metadata.

Example:

songAuthorName: 150p
+songName: Kodoku no Kakurenbo
+songSubName: (Himeringo Cover)
+

Track has an official length modification

If the track is an official length modification, the source metadata should be followed.

Example:

songAuthorName: Camellia as "fluX Xroise"
+songName: Xronier
+songSubName: (”geneXe” Long ver.)
+

Track has an unofficial length modification

If the track is modified in such a way that it is similar enough to an official version of the track, the source metadata of that version of the track should be used.

If the track is a shortened version of the full version of the track for the purpose of animation openings or endings, then (TV Size) must be added to the songSubName.

Example:

songAuthorName: PENGUIN RESEARCH
+songName: HETENA
+songSubName: (TV Size)
+

If the track is simply shortened, then (Short Edit) or (Short Ver.) must be added to the songSubName. If the original track metadata already has a length designation, (Short Edit) or (Short Ver.) must replace the original length designation.

Example:

songAuthorName: VINXIS
+songName: Sidetracked Day
+songSubName: (Short Edit)
+

If the track is extended in some way, (Extended Edit) or (Extended Ver.) must be added to the songSubName. If the original track metadata already has a length designation, (Extended Edit) or (Extended Ver.) must replace the original length designation.

Example:

songAuthorName: ExileLord
+songName: Soulless 5
+songSubName: (Extended Edit)
+

Track is a mashup

Use the information provided by the artist.

Examples:

songAuthorName: gmtn. vs. kozato (fw. LUZE) & gmtn. (witch’s slave)
+songName: squartatrice vs disperagioia
+
+songAuthorName: Kove x Perfume
+songName: Stellar x Polyrhythm
+songSubName: (TANUKI Mashup)
+

Track has vocals from a Vocaloid

Vocaloids are rarely the sole artist for a song. The producer or artist must be placed in the songAuthorName, and the Vocaloid featured must be added to the songSubName.

Example:

songAuthorName: Rasen Hikou
+songName: Omoi
+songSubName: [ft. Hatsune Miku]
+

Track has multiple artists

Comma separation

Source metadata must be used, and the artist names should be separated by a whitespace.

Example:

songAuthorName: TEA, ginkiha
+songName: Luvin’Epoch
+

vs. (Versus)

vs., VS, and Versus are commonly used to indicate a collaboration between two artists. The source metadata should be followed as is.

Example:

songAuthorName: C-Show vs. DJ Genki
+songName: BLACK LABEL
+

With

With is commonly used to indicate a collaboration between two artists. The source metadata should be followed as is.

Example:

songAuthorName: Minazuki Airi with Atsushi
+songName: Daisuki, Evolution
+

And (or &)

And (or &) is commonly used to indicate a collaboration between the two artists. The source metadata should be followed as is. Do not replace an ampersand with “and” or vice versa.

Example:

songAuthorName: Draw The Emotional & Foreground Eclipse
+songName: Sad Spring
+

Feat (or ft.)

Featuring (aka. feat. / ft.) is commonly used to indicate a collaboration between the two artists. This can appear in both the artist name and the title name. Always put the feat/ft. Sections inside songSubName.

Example:

songAuthorName: The Black Eyed Peas
+songName: DOPENESS
+songSubName: (feat. CL)
+

CV (Character Voice)

Character Voice (CV) is typically used when the vocalist is singing under the alias of a character from a show. This is rarely consistent so is enforced as such, in spite of official metadata.

The correct way to format CV designations is to use the romanised name of the character within brackets, followed by the romanised name of the vocalist with CV: as a prefix, in brackets.

Examples:

songAuthorName: Emilia (CV: Rie Takahashi)
+songName: Stay Alive
+
+songAuthorName: Tanya Degurechaff (CV: Yuki Aoi)
+songName: Los! Los! Los!
+

Track has 3 or more artists

When 3 or more artists are involved with a track, Various Artists should be used instead.

Example:

songAuthorName: Various Artists
+songName: Songs Compilation
+

Map has multiple contributors

When there are two or more contributors, each contributor can be named individually as long as the in-game character limit is not exceeded; in doing so, all contributor names must be present and separated with the correct punctuation.

Should the character limit be exceeded, the levelAuthorName must be replaced with "Various Mappers" or an alternative group name, and all contributors must be credited on the relevant beatmap source pages or listed inside custom DAT file fields.

Alternative group names are allowed for a collaboration of 2 contributors or more. A group name must not exceed the character limit unless the group name is 15 characters or less.

Example:

levelAuthorName: Amanatsu & Kikis  
+songAuthorName: Camellia  
+songName: finorza  
+songSubName: feat.Nanahira  
+
+levelAuthorName: DE125, Skeelie, & Vilawes
+songAuthorName: ReeK
+songName: Possesed By The Blood Moon
+

Unsearchable characters, translations, and romanization

Official metadata should be used in all fields, even if it contains unsearchable characters, as long as there is a significant string of searchable characters in each field. In all cases, official translations of metadata, as well as romanization, can both be used at the mapper's discretion. "Significant string" will be defined on a case-by-case basis where searchability of the string is prioritized.

Example of acceptable, searchable metadata:

levelAuthorName: Uninstaller
+songAuthorName: KIVΛ
+songName: Code:11
+

Other examples of searchable metadata:

XHRONOXAPSULΞ, t+pazolite, ΩΩPARTS, †:OLPHEUX:†, +ERABY+E CONNEC+10N, AμreoLe ~for Triumph~, \frac{\textup{sig}=\frac{821}{149}}{bpm\approx533}, 嚮導BRING+瞳EYES=死DEATH+齎INVITE
+

If the official metadata for any field does not contain any searchable characters, then official translations or romanization should be used. We will use "ヒアソビ" by かめりあ as an example here.

Example of official translation:

levelAuthorName: Amanatsu
+songAuthorName: Camellia
+songName: Play with Fire
+

Example of romanization:

levelAuthorName: Amanatsu
+songAuthorName: Camellia
+songName: Hiasobi
+

All cases where a map would break any metadata criteria, but cannot be changed in a way that would adhere to the metadata criteria for any reason, will be handled on a case-by-case basis.

Example:

levelAuthorName: Skeelie
+songAuthorName: x0o0x_
+songName: / / // / /
+
+ + + diff --git a/ranking/criteria/index.html b/ranking/criteria/index.html new file mode 100644 index 0000000..9d5f339 --- /dev/null +++ b/ranking/criteria/index.html @@ -0,0 +1,33 @@ + + + + + + + + + Ranking Criteria | ScoreSaber Wiki + + + + +

Ranking Criteria

To achieve the ranked status on a map, you will have to make sure said map meets all of the requirements listed in the Ranking Criteria below. The purpose of the ranking criteria is to set an objective standard to follow which ensures the maps put into the rank pool are fair for players. The criteria is enforced in a way that does not take into account bias from any perspective, mapper, player, or team member.



+ + + diff --git a/ranking/criteria/mapping-criteria.html b/ranking/criteria/mapping-criteria.html new file mode 100644 index 0000000..88d71f0 --- /dev/null +++ b/ranking/criteria/mapping-criteria.html @@ -0,0 +1,33 @@ + + + + + + + + + Mapping Criteria | ScoreSaber Wiki + + + + +

Mapping Criteria

About the Mapping Criteria

The mapping criteria involves two sections: one for rules, and one for guidelines.

  • Rules are criteria that must be followed for a map to be considered rankable.
  • Guidelines are criteria that should be followed for a map to be considered rankable but can be broken under proper setup or justification.

Further included in this document are a glossary, addendum, and appendix.

  • The glossary includes definitions for important terms in the criteria.
  • The addendum includes suggestions that are not explicitly about rankability but can aid a map in getting through quality checks.
  • Note that while sections in the addendum do not have to be followed explicitly, excessive abuse of the suggestions can be reason for a map to be denied.

Lastly, the appendix includes examples and clarification of issues referenced in the mapping criteria.

Formatting for referencing criteria is as follows: (Main Section).(Subsection).(Criteria). The main section designations are R for rules, G for guidelines, and A for addendum. The subsections are designated by a number underneath each main section. Each individual criteria is ordered alphabetically under the subsection to which it applies.

For any comments, questions, or concerns about material included or not included within the criteria, feel free to message a member of the Criteria Assurance Team at ScoreSaber.

Glossary

Setup

Mapset: A set of difficulty .dat files with one info.dat file that references them.
Difficulty Spread: The set of difficulty levels present in the map. An example of a mapset with a 3 difficulty spread would be a mapset consisting of a Normal, Hard, and Expert difficulty.
Gameplay Modifiers: Disappearing Arrows, Ghost Notes, Faster Song, etc.
Game Mode: 360 Degrees, 90 Degrees, Standard, One Saber, etc.
4x3 Grid: The allowed 12 spaces for note placement in Standard mode.

Timing

BPM: Beats Per Minute. Defines the tempo of the song.
Variable BPM: Describes songs which change BPM irregularly.
Offset: The time difference between the start of the sound file and the beat of the song, used in the editor to align the beat lines with the beat of the song.
Beat: 1 fraction of a minute as defined by the BPM of the song.
(Timing) Precision: Precision, measured in fractions of a beat. For example, ¼ precision refers to ¼ of a beat.
Effective BPM: The speed in which one hand is making a ½ precision movement relative to the BPM. For example, the effective BPM of a ¼ precision 1 hand motion in a 100 BPM song would be 200 BPM.

  • Sliders: The effective bpm for a slider to the next note is defined as the distance from the last note of the slider to the next note of the same color as the slider.

Musical Element: Includes but not limited to: lyrics, sounds produced by instruments, and sounds that are part of a melody, harmony, or beat.
Overmapping: Placing notes at timings other than those of the instrument(s) that are being followed.
Undermapping: Mapping to a subset of timings of the instrument(s) that are being followed.

Patterns

Objects: Bombs, notes, or walls.
Interactive Objects: Bombs and notes, as well as walls that force you to dodge or duck.
Hitbox: An invisible box around an object that is used to detect collisions and cuts.
Swing path: The path of a swing used to hit a note. Can be divided into the Pre-cut swing and the follow-through swing.

  • Pre-cut swing: The portion of a swing before making contact with a note.
  • Follow-through swing: The portion of a swing after cutting through the note.

On the same snap: Refers to motions that are intended to be made at the same point in time.
Dot Note: The note type that can be scored on by a cut from any direction.
Slider: A set of notes that follow each other at a set timing precision such that they appear at distinct timings but can still be hit with a single swing. EXAMPLE
Double directional: Two consecutive notes of the same color in the same direction.
Reset: A motion where hand/arm position or rotation are adjusted without a corresponding note for that hand.
Bomb reset: Using bombs to force a reset.
Wrist reset: A motion where hand rotation is adjusted before or during a swing to enable a note to be hit.
Pronation: The inward rotation of the arm which extends to about 90°-100° from a palm down position.
Supination: The outward rotation of the arm which extends to about 180°-210° from a palm down position.

Rules

1. Gameplay

Maps must not require the use of any external mods or programs to play.
Maps must be designed to be played without any gameplay modifiers.
Maps must be ‘Standard’ game mode maps.

2. Patterns

A. Mismaps

A map cannot have any objects that are clearly placed or positioned unintentionally by the mapper.

B. Notes

Multiple notes of the same color on the same swing must not be parallel to one another. EXAMPLE
If there are multiple notes of the same color on the same swing, each note must lead into the expected cut direction of the next note.
Multiple notes of the same color on the same snap must not differ in cut direction from each other by more than 45 degrees.
Notes must not be placed in the pre-cut swing path of a note of the opposite color. EXAMPLE
Notes should not be placed in the follow-through path of a note of the opposite color (EXAMPLE) unless the notes are on the same snap or there is sufficient time for the other color saber to swing clear of the note.
No patterns should have a swing path into the bad cut hitbox for a note of the same color in the same swing. Notes must not be placed inside walls or be completely blocked from the player’s view by walls. A pattern must not induce a variation in swing speed within a single swing.
A pattern must not be at a significantly higher effective BPM than what is justified within the rest of the map.

C. Walls

There must not be a wall or combination of walls that force the player to take damage. EXAMPLE
There must not be a wall or combination of walls that force the player into the outside lanes of the playfield.
Walls must have positive width.
Interactive walls must have a duration of at least 15ms. That allows for 1/16 precision up to 250BPM and ⅛ precision up to 500BPM.
No part of a wall can lie outside the 4x3 grid.

D. Bombs

Bombs must not be placed such that they interfere with the pre-cut or follow-through swing for a note.
Bombs must not be placed in a way that forces a saber to stay outside the 4x3 grid in order to avoid contacting the bombs. EXAMPLE
Bombs must be accompanied with an acceptable level of lighting.
Bombs must not be placed inside of walls or be completely blocked from the player’s view by walls.
Bombs may not overlap with other objects in game and must be placed at least 20 ms apart from other bombs in the same space. If the NJS is not too low, that allows for 1/16 precision up to 180 BPM and ⅛ precision up to 360 BPM.

3. Timing

A. Setup

The map’s BPM must perfectly match one of the BPMs of the song or a multiple of one of the BPMs of the song.
A map may use the effective BPM of a section during the map as the base BPM as long as the difficulty of the section represents the overall difficulty of the map.
Maps with variable BPM timing must be timed as accurately as possible.
The map’s offset must be as close to perfect as possible.

B. Notes

All notes must be perfectly on time to a distinct sound in the music.
The first note of a slider must be on time to the sound the slider is mapping. The precision of the following notes may be adjusted for playability.

C. Undermapping

Undermapped sections must not have a single note off time, and each note in an undermapped section must have a corresponding sound in the music.

D. Overmapping

Rhythmic overmapping is not allowed. A single sound cannot be represented by multiple notes unless those notes fall into a single swing.
Simplifying timing inconsistencies to match an understandable rhythm is allowed if the inconsistencies do not arise from a BPM or rhythm change.

4. Formatting and Metadata

All rules on formatting are here

5. Difficulty Spread Requirements

All rules on difficulty spread requirements are here

6. Miscellaneous

A. Lighting

A map must have sufficient lighting throughout the song.

B. Intro/Outro

A map must have an intro period of at least 1.5 seconds with no interactive objects.
A map must have an outro period of more than 2 seconds, counting from the end of the last interactive object of the map.
A map must have an outro period of less than 15 seconds, counting from the point the last object disappears or the last lighting element change.

C. Audio

A map’s audio must not be modified to add excessive amounts of silence anywhere in the song.
A map’s audio must consist of musical elements set to an identifiable structure.
The length of the map’s audio, ignoring any added silence, must be longer than 20 seconds.

D. Accompanying Text and Images

There must not be nudity, near-nudity, sexual references, extreme violence, gore, substance abuse, or any other form of explicit content anywhere in the files contained in the map.
There must not be content that harasses or denigrates any individual or group anywhere in the files contained in the map.

E. Custom Difficulty Names

For any game mode in a mapset with a difficulty going for rank:

  • Difficulty names must be clearly progressive and accurately indicative of their respective difficulties, excluding the highest difficulty.
  • Difficulty naming must follow a common theme relating to the song or map, unless the difficulty names are abbreviations of the default Beat Saber difficulty names.
  • If there are multiple difficulties with similar relative difficulty, the difficulty names must share a commonality that indicates that they are of the same relative difficulty.
  • Difficulty names must not be so long that they overlap with other UI elements.
  • Difficulty names must not exceed 30 characters in length.
  • Difficulty names must not solely consist of one or more usernames. Words that happen to be usernames are acceptable within difficulty names as long as they relate to the song.

F. DAT Editing

All difficulties in a mapset that are going for rank must not contain any form of unfair modification via editing of the .dat file manually or through external mappers. This includes any form of custom walls, map reversal, and note jumping.

Guidelines

1. Patterns

A. Resets

Resetting patterns in a map should allow an appropriate amount of time between the resetting notes, consistent with the difficulty of the map.

  • This includes any of the following: Double directionals, bomb resets, or wrist resets through extreme pronation or supination.

B. Sliders

Each note in a slider should follow the previous note in the slider with the same timing precision.
Sliders should have a speed similar to the general swing speed of the map or have a speed appropriate to the sound being mapped.
Sliders should not have direction changes of more than 45 degrees.
Sliders should not have more than one direction change.

C. Collisions

There should be no patterns where the arc of the pre-cut swing on one hand overlaps with the pre-cut swing of the other hand. EXAMPLE
There should be no patterns where the arc of the follow-through swing on one hand overlaps with the follow-through swing of the other hand. EXAMPLE

D. Vision Blocks

Notes and bombs should not impede vision of other interactive objects without an indication and/or implication of where and what the blocked objects will be.

E. Emphasis

Patterns and sections of a map should not excessively overrepresent the music.
Patterns and sections of a map should not excessively exceed the difficulty of the rest of the map unless supported by the music.

2. Timing

A. Walls

Walls should correspond to a musical element.

B. Bombs

Bombs should be mapped to a musical element unless used to clarify a reset or set up for a subsequent pattern. In those cases, the bombs should be mapped to a musical element wherever possible.

Addendum

1. Consistency

Repeated sections of music should feel similar, and similar sections should not play excessively differently unless there is some change in the music.
Within a section, representation of a repeated sound with the same volume and pitch in the absence of other sounds should not excessively change.
Mapping decisions around consistent representation should be understandable.

2. Variety

Varying the mapping as the music changes is important to musical representation. Big changes in the music should correspond to a change in the mapping.
This does not require that patterns must change with every change in the music, nor does it disallow variation in sections where the music stays the same.

3. Emphasis

The patterns & lighting used should reflect the intensity level of the music being mapped.
The intensity of the mapping in each section relative to other sections should be somewhat in line with the intensity of the music. Deviation is allowed as long as a section’s intensity is not excessively raised or lowered relative to the intensity of the rest of the song.

Appendix

Rule Explanations and Background

R.2.C (Walls)

Thin walls, which have close to 0 duration, are not allowed because they do not consistently damage the player.
Fake walls, which have negative width, are not allowed because they are not an intended part of the base game.
Fast walls, which have negative duration, are not allowed because they are not an intended part of the base game.

R.6.A (Lighting)

Sufficient lighting means that some form of lighting that follows the music should be present in sections of the map that contain interactive objects. Any form of automatic light generation that creates lighting that fits this criteria is allowed.

G.1.E (Vision Blocks)

When a note is vision blocked, the location should always be deducible from previous note placements.
When a note is vision blocked, the cut direction should always be deducible from previous note placements, unless the note is a dot note.

Images

Slider Examples

Slider Examples

R.2.B (Parallel Notes)

These are examples of parallel same color notes on the same snap.
Parallel Notes

R.2.B (Pre-cut Swing Path)

The blue note is in the pre-cut swing path of the red note.
Pre-cut Swing Path

R.2.C (Walls)

These walls force the player to take damage because there is no space for the player to pass through.
Walls

R.2.D (Bombs)

These bombs that force a saber to stay outside the 4x3 grid in order to avoid contact.
Bombs

G.1.C (Pre-cut Collisions)

The arcs of the pre-cut swings overlap.
Pre-cut Collisions

G.1.C (Follow-through Collisions)

The arcs of the follow-through swings overlap.
Follow-through Collisions

G.1.D (Hitboxes)

The red up note is in the follow-through path of the blue up note.
Hitboxes

Translations

Credits

Written by:
Uninstaller
Fern

WIth Contributions from:
OrangeW
Amanatsu
Umbranox
The ScoreSaber Ranking Team
ScoreSaber Ranking Criteria v1 Contributors

Transferred to the Wiki by riasuh

+ + + diff --git a/ranking/criteria/technical-limitations-criteria.html b/ranking/criteria/technical-limitations-criteria.html new file mode 100644 index 0000000..8f9d089 --- /dev/null +++ b/ranking/criteria/technical-limitations-criteria.html @@ -0,0 +1,33 @@ + + + + + + + + + Technical Limitations Criteria | ScoreSaber Wiki + + + + +

Technical Limitations Criteria

Looking for the Mapping Criteria? The ScoreSaber Mapping Criteria can be found here

Current Limits

⚠️

Until further notice the new map format will be unrankable. This will stay in place until we have adjusted the criteria and made/updated tools for the new format.

  • Maps must not break 350 BPM sustained
  • Maps must not break 13.5⭐difficulty
  • Maps must not break 11.5⭐difficulty without a QAT upvote on all ranked difficulties and receive 2/3 approval by RT and QAT
  • Current limit for map length is 10 minutes

Burst Criteria

Burst rules (Beats are defined at EBPM)

  • 350-375 6 beats
  • 376-400 2 beats

Break rules

  • 2x length of burst OR minimum 2 beat, whichever is longer

Disallowed Mapping Objects/Patterns in Bursts

  • Dots
  • Stacks / Multinote hits / Sliders
  • Bombs
  • Parity breaks
  • Two or more consecutive notes of the same color at over 350 BPM that may be possible to be hit with a single straight swing
  • Bursts exceeding 400 BPM

Tip

The current Ranking Queue Process and Rules can be found here

+ + + diff --git a/ranking/how-to-rank-map.html b/ranking/how-to-rank-map.html new file mode 100644 index 0000000..d6637ab --- /dev/null +++ b/ranking/how-to-rank-map.html @@ -0,0 +1,33 @@ + + + + + + + + + How do I get my map ranked? | ScoreSaber Wiki + + + + +

How do I get my map ranked?

Before you consider pushing your first map for ranked, make sure to first fulfill these basic pre-requisitions:

  1. The map is made and fully finished
  2. The map seems to meet every point from the ranking criteria
  3. The map was play-tested by players and appear to not have any issues

TIP

Once all the above-mentioned points are met, you can go ahead and read the rest of this page on on how to get your map modded and eventually ranked.

What is "modding"?

Modding is a term borrowed from osu!. It is the process of reviewing and providing feedback for a map via editor and/or in-game analysis. Maps have to go through this process to eventually end up ranked in ScoreSaber. See thisopen in new window guide to get started with modding maps.

Get a mod from a Ranking Team member

Before you contact a ranking team member in order to have your map ranked, please pay attention to their queue rules. A mod is a list of changes to make in a map that are issues within said map. It can range anywhere from playability issues to rank-ability issues with the ranking criteria. This step can generally take anywhere from an hour to a month depending on ranking team activity and song of choice. You work with the RT member to fix all the ranked issues with the maps and work through any listed playability issues. Generally requests are handled by looking for open ranking queues in ScoreSaber's Discord server. The green circles indicate queues that are open for maps.

Discord Modding Example

Once you read the rules of the modder and made sure that your map matches said rules, send them a direct message asking for a spot in queue. Generally, having information like the song title, song artist, BPM, length of the song, number of difficulties going for rank, are helpful to include in your message since they can make team members more interested in choosing your maps. If a person from the team accepts your map, they will explicitly tell you they have. You shouldn't have multiple people modding your map at the same time to avoid having overlapping mods and wasting someone's time.

(Optional) Get a mod from a Student

Student modding queues are from people who are working towards becoming a member of the ranking team. They have their mods checked by a member of the ranking team which acts as their mentor.

Attention

Student mods are a great way of getting ranking team eyes on a map, however this process takes extra time compared to a direct mod from a ranking team member. This doesn't guarantee the map will enter queue, it will depend on the student's mentor to decide if they want to help you ranking your map.

Work on the map when you get the mod

Once you have received the mod, acknowledge it and work to fix the map in a timely manner. Don't rush for fixes, but remember that fixing it when the map is still fresh in both you and the modder's mind can be beneficial in working towards a better map.

A mod will generally be a line by line list of issues with the map. Sorted by beat number, issue severity, and the issue itself. Example of a mod:

Mod Example

While everyone's system for making a mod is different, anything labeled as "Unrankable" or "Questionable" requires justification on the mapper's part as to why it is not fixed or why is it that way.

The mapper will make changes to their map and justify what they didn't change. While it is not required to make changes based on suggestions, doing so will generally make your map better, and the modder will appreciate his efforts being rewarded.

TIP

If a modder doesn't respond in a week or so feel free to remind them unless they have explicitly stated a timeframe they will be unavailable. Modder's have other obligations that require their time but things are occasionally forgotten.

Put the map in the ranking-queue

Once all of the above is done, it is now time for the ranking team member to add your map into the ranking-queue. This doesn't mean your map will be ranked as is, but it will eventually end up ranked. The ranking team member should in the end be asking you for the leaderboard IDs.

Example of a leaderboard ID:

Leaderboard ID Example

If your map consists of more than one difficulties, you will need to provide the ID of each difficulty, preferably in the following format:

Leaderboard ID Format

Wait for the map to go through the ranking-queue

At this point the mapper (you) may receive feedback in the form of a QAT downvote indicating that said map should be fixed. QAT votes affect queue position so having a positive rating is beneficial. If a map is re-uploaded, the initial modder who put the map in queue should be notified. Every new upload requires a new set of leaderboards so it is advised to take feedback in batches and upload when only needed. You should always reupload after fixing a map with ranking team or QAT.

Once the map reaches the top of queue, other ranking team members will mod through the map and find any issues within it. If you are sent a DM by someone on the ranking team, you should fix any issues with the map and reupload it. The new leaderboards should be sent to the last person who sent you a mod.

At 3 RT upvotes and 0 downvotes your map gets qualified. The map gets increased attention due to its qualified status and issues are generally presented to the mapper. The mapper can then reupload the map as necessary before the map is officially ranked. This period is of 7 days. If the map is reuploaded then the 7 day period is reset.

Your map is now ranked

Congratulations! The 7 days of qualified period has passed, and your map is now considered ranked.

⚠️ ATTENTION

You must never make your ranked maps unavailable to players. If you violate this rule, you will be banned from ranking any maps on ScoreSaber in the future.

+ + + diff --git a/ranking/modding-queue-information.html b/ranking/modding-queue-information.html new file mode 100644 index 0000000..7978289 --- /dev/null +++ b/ranking/modding-queue-information.html @@ -0,0 +1,33 @@ + + + + + + + + + Modding Queue Information | ScoreSaber Wiki + + + + +

Modding Queue Information

What is this about?

The Modding Queue Category on our Discord Server is a category designed to promote individual Modding queues and to advertise open mods from people willing to take them.

If you wish to request a slot from a modder, please DM them, and they'll (hopefully) get back to you on whether they decide to take your offer.

Please always make changes to your map, and if you aren't, please provide ample justification! Please respect the modders!

What is Modding?

Modding is a term borrowed from osu!. It is the process of reviewing and providing feedback for a map (for rankability or just general improvement) via editor and in-game analysis.

See this guideopen in new window to get started with modding.

Requirements & Rules

Please send "Dog" (AFriendlyPug#7901) via Discord the following items when requesting a Modding queue:

  1. A link to your ScoreSaberopen in new window account, if it exists.
  2. Two map links or two map files. Maps must be serious and have reasonable effort put in.

We expect at least basic understanding and use of timing, consistency, and correct use of rhythm choices.

  • Response times can range from 1-5 days.

  • If you do not send at least the second item you will not be eligible for a community modding queue.

  • If you are a RT or QAT member or have a queue made for you before 04/01/2021 (DD/MM/YYYY), you are exempt from these requirements.

  • If you post anything inappropriate your channel will be removed, and you will be banned from requesting a new Modding queue.

+ + + diff --git a/ranking/qat-guidelines.html b/ranking/qat-guidelines.html new file mode 100644 index 0000000..0ba9749 --- /dev/null +++ b/ranking/qat-guidelines.html @@ -0,0 +1,33 @@ + + + + + + + + + ScoreSaber QAT Guidelines | ScoreSaber Wiki + + + + +

ScoreSaber QAT Guidelines

Foreword

The goal of the QAT is to provide effective, fair feedback to mappers with the aim of curating the highest quality standard of maps in the ranked pool. While the goal is to provide objective feedback, there is no avoiding the fact that this job is subjective. Every person will hear something different in a song, and every person will feel differently about how well patterns play. To operate as a team, these guidelines list out what QAT members should consider for a map to be “quality”.

Refer to this document when providing feedback on maps, and reach out to the team when you are unsure about a difficult decision.

QAT Behavior

As a member of the QAT, your actions represent the QAT and ScoreSaber as a whole. You are expected to carry yourself with respect and empathy when publicly interacting with the ranked system. Not only does kind, responsible behavior reflect well on yourself and the team- it also is far more effective at creating healthy change in a map.

It must be clear to mappers that it is “Us vs. the map’s problems”, and not “Me vs. You”.

Our goal is to help mappers see the best version of their map.

This can only be done with active, direct communication with the mappers themselves. Leaving a comment and waiting for the mapper to see it and respond through #comment-response is not effective.

On the other hand, it is not the responsibility of the QAT to do the mapping for them.

QAT members can provide feedback and discuss with mappers all they want, but ultimately the mapper is the author of their work. Their solution may not be what you would choose, though it should at least improve their work. If a mapper consistently and intentionally ignores feedback, QAT downvotes serve as the consequence.

Phrasing is important for communication. The way a message is phrased can play a big role in how defensive or receptive a mapper is to your feedback. Identifying things you enjoy helps remind the mapper you are on their side. There are times for gentle suggestions, and times that call for stern feedback. For any case, remember to only criticise the work and not the mapper. Here are examples of well-phrased feedback:

  • “Beat 120-121.5 plays poorly at this speed because of the sharp angle changes. You should slow down how aggressive angles change here when dealing with this speed.”

  • “0:30 - 0:40 in the song is less energetic than 0:40 on, but it has bigger swings due to it being on the ground. I suggest using middle-row up notes to keep the energy low.”

  • “The hit at 367.25 is an extreme playability issue. At best it’s hitbox abuse, at worst it’s a handclap. This needs a less extreme swing.”

  • “The pattern at 80 is awesome, and the section after it at 84 could use some more energy. Maybe think about repeating the pattern there to give 84 more life”

Objective qualities

Nothing about mapping is truly “objective” other than things explicitly detailed in the ranking criteria- i.e. being on-time. However, there are things that are almost always better to fix than to keep.

  • Mappers must be able to justify the intensity of patterns relative to each other within the map. A map’s intensity should represent the music.

  • Rhythm choices must be logical and consistent. Changes in mapped rhythm must have intent and musical justification.

  • Patterns must be reasonably connected to the song and context of the map. Cases where individual patterns are very different from the rest of the map must make sense.

  • Lower difficulties must reasonably reduce the challenge of the map while maintaining a creative identity. Lower difficulties should not be a passing thought to make the top difficulty rankable.

  • Patterns must be readable. Vision blocking should always be balanced with context and intent.

Objective issues should be strongly defended. Objective issues should be mostly independent of the creative identity of a map- there should be ways for mappers to maintain their vision of their work while improving the objective quality of the map. Ranked maps should be reasonable to grind and replay while shooting for a high score; compromises must be made for challenging maps to be ranked. Objective issues should be raised without including “I”, or similar personal language.

Subjective qualities

Mapping is an art form- an expression of what the mapper sees in the music in the form of a Beat Saber level. Things that make a map unique are what mappers will fight to keep most. When treading into subjective territories, be sure to understand the identity of the map: What makes this map unique?

  • Patterns should be fair and playable. Extreme reaches and angles should be reasonable to play for the map’s speed, and match the intensity of the music.

  • A map should flow as well as the music justifies. Erratic music can fit an erratic map with unpredictable flow, but playability cannot be sacrificed.

  • A map should have a reasonable difficulty curve that makes for a fair level. Spikes in difficulty should be clearly connected to musical intensity.

  • A map should clearly show effort. Visibly lazy/low effort content should not be tolerated. On the other hand, not every song fits complexity- some songs can reasonably connect to a simple map.

Subjective issues should be discussed with an open mind. Individuals may have different opinions about what “plays well”. Understand that subjective issues may be entirely dismissed by mappers if it conflicts with their own understanding of mapping. Use your judgement on the severity of these issues when it comes to discussions. Subjective issues may be mentioned including “I” and similar personal language.

Mapper’s vision

Every person hears something different in music, and therefore, every person will see a different map as “fitting” of a song. There may be patterns that look uncomfortable or poorly flowing, but it is possible this is a deliberate choice made by the mapper. Concepts like this should be repeated, identifiable, and thematic. Before suggesting changes to unusual patterns, first think if there is a concept the mapper is trying to convey with those patterns. If they are repeated, identifiable, and thematic- there’s a good chance that it is a deliberate choice made by the mapper and that removing them would be to remove the core idea of the map.

Big Picture vs Detail-focused

Feedback can take the form of generalized advice about the map’s direction, or focus on specifics of individual patterns. Both forms are legitimate and valuable feedback to provide, but keep in mind that:

  • Generalized feedback provides the mapper freedom to change things while remaining in their own creative vision.

  • Generalized feedback should still describe a direction for the mapper to take. “0-end remap” leaves the mapper with no direction to follow, and provides no constructive feedback. *

  • Generalized feedback is less likely to lead to the exact changes you would choose yourself.

  • Generalized feedback can be frustrating for mappers to deal with if the feedback is very negative.

  • Generalized feedback can be difficult for mappers who struggle with english.

  • Specific feedback provides the mapper small, exact changes that improve the map’s quality.

  • Specific feedback should give the mapper options, rather than providing one “correct choice”. **

  • Specific feedback is most effective when the mapper handles the list of feedback as a checklist. If you run into problems of mappers skipping comments, suggest they tell why points are skipped.

  • Specific feedback should explain why there is a problem, not just state that there is a problem.

  • Specific feedback can make mappers feel less ownership of their work.

  • Specific feedback often repeats itself. Depending on the severity of the issue it is reasonable to mention every case that needs fixing, or just the first few and mention that the problem repeats.

    • An example of direction for generalized feedback would be:
      “The map struggles to control width throughout the song. Identify which parts of the song you want to be more intense, and save wide patterns for these sections.”
    • An example of providing options rather than absolute choices would be:
      “The hit at 221 will play poorly at this speed due to the sharp angle the swings make. Consider making the angle red swings at more gentle. This could be from making 221’s red diagonal, or making 220.5’s red horizontal.” (This level of detail is not necessary for experienced mappers)

No matter what the feedback is, it must be clearly communicated why you have downvoted and what fixes are needed to have the downvote removed.

Identifying your strengths

No one is expected to be a jack-of-all-trades when it comes to skill. Everyone has strengths and weaknesses when it comes to performance, and the same is true for mapping. There is no harm in skipping a map because you are not comfortable commenting on a map of that category (i.e. downmaps, high bpm, etc.).

There can be harm in upvoting a difficulty when you do not feel confident in your ability to judge its quality- both for maps too difficult or too easy for your skill level. Feel welcome to ask fellow team members for their opinions/insights on content that you do not feel experienced with; it is possible to learn what plays well for any skill level, even outside your own.

Other Resources

Here are some links to interesting videos on the topic of mapping (in osu!, but still relates):

https://www.youtube.com/watch?v=C4v1QVJozGsopen in new window - Good vs Fun (Very relevant)

https://www.youtube.com/watch?v=Z7IY0gDwSQoopen in new window - Variety

https://www.youtube.com/watch?v=qUpdmKDo7BQopen in new window - Expectations & Context

https://www.youtube.com/watch?v=rAYm50d6XMwopen in new window - Emphasis & Managing Energy

+ + + diff --git a/ranking/ranking-queue-rules.html b/ranking/ranking-queue-rules.html new file mode 100644 index 0000000..f4e2a1f --- /dev/null +++ b/ranking/ranking-queue-rules.html @@ -0,0 +1,33 @@ + + + + + + + + + Ranking Queue Rules | ScoreSaber Wiki + + + + +

Ranking Queue Rules

General Information

The current ScoreSaber ranking queue can be found hereopen in new window.

  • The top 6 maps in the ranking queue can be qualified with sufficient votes from the ranking team.

  • If your map is in the top 6 of the ranking queue and you receive a mod from a Ranking Team member you will have 3 days to respond to the mod, and another 4 days after that to make the necessary changes to the map.

    • If you do not respond or are unable to make the changes in the set time span then your map will be taken out of queue.

💡

This process is done to both encourage mappers to respond in a timely manner to comments, as well as streamline maps through the queue without a fear of reuploading.

What is Modding?

Modding is a term borrowed from osu!. It is the process of reviewing and providing feedback for a map (for rankability or just general improvement) via editor and in-game analysis.

See this guideopen in new window to get started with modding. ⠀

Queuing Process at a Glance

From the point of creating the map through ranking it, here is the process you need to follow:

  1. Read and follow to the best of your ability the ranking criteria rules and guidelines.
  2. Use Kival Evan's map checkeropen in new window to check for common errors in your map.
  3. Once you are satisfied with the map, get it modded to find mistakes. Even if you cannot get a mod by a member of the Ranking Team, any mod can help your map towards rank.
  4. Have a Ranking Team member mod your map, and make any changes deemed unrankable by the modder. Once they deem the map rankable, they will submit it to the request-feed.
  5. Stay alert to updates on your map by checking for comments in the rank request. This can be done by going to the Rank Requests Pageopen in new window and finding your map.
  6. Mention any response you have to comments on your map in via Direct Message and look to make changes quickly as if you respond to the comment within 3 days, and make the changes within 4 days, you will maintain your spot in queue.

For a more in-depth guide on how to rank your first map please read: How do I get my map ranked?

How do Ranking Team votes work?

  • If a Ranking Team member downvotes your map, the map will not be eligible for rank until the issues are resolved. Issues will be stated in the comments of the rank request, and any response to those comments should be made via Direct Message.
  • The team member who downvoted the map should also contact you, if they do not feel free to request it.
  • Once the changes are made, the map will become eligible for rank again with 3 votes qualifying the map. ⠀

How do QAT votes work?

QAT Upvotes will increase your position in queue, and QAT Downvotes will decrease your position in queue. QAT Downvotes will be accompanied with a comment explaining the reasons for the downvote.

  • In order for your map to be eligible for qualification, you must respond to, but not necessarily accept or implement, any comments associated with downvotes by QAT members.
  • If you wish to update your map in response to QAT comments or to make other map changes, you will retain queue position if you make changes within a 4 day period.

General Queue Rules

  • Queue limit of 4 maps per mapper*
    • difficulties with multiple mappers count towards the limit for each mapper.
    • Downmaps, difficulties not going for rank, and lighting do not count towards this limit.

If you currently have more than 4 maps in queue you will have to wait till you have less than 4 to get anymore maps queued

WARNING

Additional difficulties at or above the highest difficulty in the initial ranking request cannot be added to the request beyond two weeks from the initial request date without resetting to the bottom of the queue

The current Technical Limitation Criteria can be found here

+ + + diff --git a/ranking/ranking-unban-system-and-terms.html b/ranking/ranking-unban-system-and-terms.html new file mode 100644 index 0000000..1a15e7f --- /dev/null +++ b/ranking/ranking-unban-system-and-terms.html @@ -0,0 +1,33 @@ + + + + + + + + + Unban System and Terms | ScoreSaber Wiki + + + + +

Unban System and Terms

System

When a mapper is accepted on appeal, they will have a limit of 1 mapset in the queue at a time. This restriction will last until the mapper has successfully gotten 3 mapsets ranked, in which case the restriction will be lifted. The mapper is allowed to rank any song they choose, including ones that might have been previously deleted by the same mapper, as long as the maps are rankable by current criteria. Maps previously deleted will not automatically be ranked again.

If a mapper does not wish to be fully unbanned, but will allow other mappers to use their assets such as lighting events and timing, they may apply for a partnership unban. Rules for a partnership unban are as follows: No person unbanned through partnerships may submit their own maps for rank under their name or another. Any map submitted for rank which includes someone unbanned through partnership must not be uploaded onto an account owned by the unbanned person. Persons unbanned through partnership must not make up greater than 50% of the mappers for a map submitted for rank.

Terms

  • If a mapper commits another bannable offense during or after the appeal process, that mapper will be permanently banned from both ranking and the appeal process.

  • Submitting an appeal does not mean that you will be moved to the appeal process, the ScoreSaber staff holds the right to deny an appeal from any mapper for any reason.

  • RT/QAT feedback should be responded to within 4 days of receiving the feedback via DM barring external circumstances

Info

To submit a unban request, open the following formopen in new window

+ + + diff --git a/ranking/scoresaber-team-information.html b/ranking/scoresaber-team-information.html new file mode 100644 index 0000000..09c8dda --- /dev/null +++ b/ranking/scoresaber-team-information.html @@ -0,0 +1,33 @@ + + + + + + + + + ScoreSaber Team Information | ScoreSaber Wiki + + + + +

ScoreSaber Team Information

What does each role do within ScoreSaber?

Ranking Team (RT)

They are a group of mappers which take time to mod maps in order to make sure said maps follow every point from the ranking criteria. RT members also go through the ranking-queue and vote on maps that are meeting or not the ranking criteria. If errors are to be find, they will work with the mapper in order to resolve them.

Quality Assurance Team (QAT)

They are a group of specialized players who play through the ranking-queue and vote on maps that are of high quality. Maps which have more QAT upvotes are more likely to be prioritized in the queue and get ranked faster. On the other hand, if QAT deems the map to be of "low quality", it will have a lower priority. The maps will eventually rise based on how long it has spent in the queue.

Criteria Assurance Team (CAT)

As the name suggests, the people in the Criteria Assurance Team are in charge of maintaining the ranking criteria. They also essentially are the writers of the ranking criteria. Any changes which is decided by the CAT has to be approved by NAT and ScoreSaber Admins.

Nomination Assessment Team (NAT)

Generally apart of the Ranking Team, they are the ones in charge of processing some internal interactions with the leaderboards such as denying, replacing and qualifying them, they constantly work towards keeping everything in check. NAT is also the team that moderates RT & QAT by ensuring there is no bias or system abuse.

How do I join the Ranking Team?

The only way to begin the process of joining the ranking team or a higher role is to first participate in the student program. The student program involves making map mods, and having them reviewed by your mentor. Once you have proven your abilities, your mentor will recommend you for promotion and the entire ranking team will evaluate your progress and vote on your induction as a recruit. If you are interested in become a ranking team student please fill out thisopen in new window form

How do I join the Quality Assurance Team?

The only way to begin the process of joining the quality assurance team is to wait for applications to open. Occasionally, the QAT team members will find themselves in need of new individuals to help them assuring quality of maps in the ranking-queue, and a post will then be made with an application form for users to fill and participate in the process. You will then be contacted by one of the Head of Quality Assurance Team to being your journey into becoming a QAT member.

+ + + diff --git a/rules.html b/rules.html new file mode 100644 index 0000000..04ae742 --- /dev/null +++ b/rules.html @@ -0,0 +1,33 @@ + + + + + + + + + Rules | ScoreSaber Wiki + + + + +

Rules

General Rules

  1. No multiaccounting. The first account you make during login is your one and only ScoreSaber account, from the moment of its creation and forevermore. This account is YOU. It is not anyone else. Don't share your account with anyone else.

  2. Play fair. Using third-party utilities of any kind (any type of scripts, mods/plugins, applications, bots) to get any sort of advantage is not okay.

  3. Be good to each other. Harassment or other antagonism has no place within the ScoreSaber community.

  4. No 18+/NSFW Content This means 18+/NSFW content such as drug use or topics of a sexual nature are not allowed.

  5. Where the rules do not prevail, common sense shall. The administration has explicit discretion to apply their judgment on this as they see fit.

Mappers with Ranked Maps

⚠️ ATTENTION

You must never make your ranked maps unavailable to players. If you violate this rule, you will be banned from ranking any maps on ScoreSaber in the future.

What Happens if I Break the Rules?

You will be banned (either temporary or permanently).

If you are currently banned from ScoreSaber Ranking and want to get unbanned, please read the following:

Ranking Unban System and Terms

+ + +