diff --git a/404.html b/404.html index e193eb8..83dfbc8 100644 --- a/404.html +++ b/404.html @@ -7,14 +7,14 @@ - +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
- + \ No newline at end of file diff --git a/api.html b/api.html index a6aa528..82078f8 100644 --- a/api.html +++ b/api.html @@ -7,17 +7,17 @@ - + - - - + + + -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/assets/api.md.b2e5592a.js b/assets/api.md.7fbd8f8d.js similarity index 83% rename from assets/api.md.b2e5592a.js rename to assets/api.md.7fbd8f8d.js index c7c2b88..8d54ce0 100644 --- a/assets/api.md.b2e5592a.js +++ b/assets/api.md.7fbd8f8d.js @@ -1 +1 @@ -import{_ as e,o as t,c as o}from"./chunks/framework.a5027060.js";typeof window<"u"&&(window.location="https://soundworks.dev/soundworks/");const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"api.md","filePath":"api.md"}'),a={name:"api.md"};function n(s,r,i,d,p,c){return t(),o("div")}const m=e(a,[["render",n]]);export{_ as __pageData,m as default}; +import{_ as e,o as t,c as o}from"./chunks/framework.22f5e90d.js";typeof window<"u"&&(window.location="https://soundworks.dev/soundworks/");const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"api.md","filePath":"api.md"}'),a={name:"api.md"};function n(s,r,i,d,p,c){return t(),o("div")}const m=e(a,[["render",n]]);export{_ as __pageData,m as default}; diff --git a/assets/api.md.b2e5592a.lean.js b/assets/api.md.7fbd8f8d.lean.js similarity index 83% rename from assets/api.md.b2e5592a.lean.js rename to assets/api.md.7fbd8f8d.lean.js index c7c2b88..8d54ce0 100644 --- a/assets/api.md.b2e5592a.lean.js +++ b/assets/api.md.7fbd8f8d.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as o}from"./chunks/framework.a5027060.js";typeof window<"u"&&(window.location="https://soundworks.dev/soundworks/");const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"api.md","filePath":"api.md"}'),a={name:"api.md"};function n(s,r,i,d,p,c){return t(),o("div")}const m=e(a,[["render",n]]);export{_ as __pageData,m as default}; +import{_ as e,o as t,c as o}from"./chunks/framework.22f5e90d.js";typeof window<"u"&&(window.location="https://soundworks.dev/soundworks/");const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"api.md","filePath":"api.md"}'),a={name:"api.md"};function n(s,r,i,d,p,c){return t(),o("div")}const m=e(a,[["render",n]]);export{_ as __pageData,m as default}; diff --git a/assets/app.9302769a.js b/assets/app.479ed490.js similarity index 90% rename from assets/app.9302769a.js rename to assets/app.479ed490.js index 4bc6cb2..d932b1c 100644 --- a/assets/app.9302769a.js +++ b/assets/app.479ed490.js @@ -1 +1 @@ -import{s,a3 as i,a4 as u,a5 as c,a6 as l,a7 as d,a8 as f,a9 as m,aa as h,ab as A,ac as g,S as P,d as v,u as y,j as C,y as w,ad as _,ae as b,af as E,ag as R}from"./chunks/framework.a5027060.js";import{t as D}from"./chunks/theme.f416749a.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const o=p(D),S=v({name:"VitePressApp",setup(){const{site:e}=y();return C(()=>{w(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),_(),b(),E(),o.setup&&o.setup(),()=>R(o.Layout)}});async function j(){const e=T(),a=O();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",d),a.component("ClientOnly",f),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),o.enhanceApp&&await o.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function O(){return h(S)}function T(){let e=s,a;return A(t=>{let n=g(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=P(()=>import(n),[])),s&&(e=!1),r},o.NotFound)}s&&j().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{j as createApp}; +import{s,a3 as i,a4 as u,a5 as c,a6 as l,a7 as d,a8 as f,a9 as m,aa as h,ab as A,ac as g,S as P,d as v,u as y,j as C,y as w,ad as _,ae as b,af as E,ag as R}from"./chunks/framework.22f5e90d.js";import{t as D}from"./chunks/theme.f4c1baac.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const o=p(D),S=v({name:"VitePressApp",setup(){const{site:e}=y();return C(()=>{w(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),_(),b(),E(),o.setup&&o.setup(),()=>R(o.Layout)}});async function j(){const e=T(),a=O();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",d),a.component("ClientOnly",f),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),o.enhanceApp&&await o.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function O(){return h(S)}function T(){let e=s,a;return A(t=>{let n=g(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=P(()=>import(n),[])),s&&(e=!1),r},o.NotFound)}s&&j().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{j as createApp}; diff --git a/assets/architecture.0ef77bdd.png b/assets/architecture.0ef77bdd.png new file mode 100644 index 0000000..2e44e5a Binary files /dev/null and b/assets/architecture.0ef77bdd.png differ diff --git a/assets/chunks/framework.a5027060.js b/assets/chunks/framework.22f5e90d.js similarity index 81% rename from assets/chunks/framework.a5027060.js rename to assets/chunks/framework.22f5e90d.js index bd9359e..cc3fabd 100644 --- a/assets/chunks/framework.a5027060.js +++ b/assets/chunks/framework.22f5e90d.js @@ -1,2 +1,2 @@ -function gr(e,t){const n=Object.create(null),r=e.split(",");for(let s=0;s!!n[s.toLowerCase()]:s=>!!n[s]}const te={},gt=[],Re=()=>{},fi=()=>!1,ui=/^on[^a-z]/,Vt=e=>ui.test(e),mr=e=>e.startsWith("onUpdate:"),ie=Object.assign,yr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},di=Object.prototype.hasOwnProperty,X=(e,t)=>di.call(e,t),B=Array.isArray,mt=e=>xn(e)==="[object Map]",ks=e=>xn(e)==="[object Set]",V=e=>typeof e=="function",ne=e=>typeof e=="string",En=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",Us=e=>(ee(e)||V(e))&&V(e.then)&&V(e.catch),Ks=Object.prototype.toString,xn=e=>Ks.call(e),hi=e=>xn(e).slice(8,-1),Ws=e=>xn(e)==="[object Object]",_r=e=>ne(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,It=gr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Tn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},pi=/-(\w)/g,Le=Tn(e=>e.replace(pi,(t,n)=>n?n.toUpperCase():"")),gi=/\B([A-Z])/g,ft=Tn(e=>e.replace(gi,"-$1").toLowerCase()),An=Tn(e=>e.charAt(0).toUpperCase()+e.slice(1)),an=Tn(e=>e?`on${An(e)}`:""),at=(e,t)=>!Object.is(e,t),fn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Gn=e=>{const t=parseFloat(e);return isNaN(t)?e:t},mi=e=>{const t=ne(e)?Number(e):NaN;return isNaN(t)?e:t};let Wr;const er=()=>Wr||(Wr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function br(e){if(B(e)){const t={};for(let n=0;n{if(n){const r=n.split(_i);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function vr(e){let t="";if(ne(e))t=e;else if(B(e))for(let n=0;nne(e)?e:e==null?"":B(e)||ee(e)&&(e.toString===Ks||!V(e.toString))?JSON.stringify(e,qs,2):String(e),qs=(e,t)=>t&&t.__v_isRef?qs(e,t.value):mt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s])=>(n[`${r} =>`]=s,n),{})}:ks(t)?{[`Set(${t.size})`]:[...t.values()]}:ee(t)&&!B(t)&&!Ws(t)?String(t):t;let be;class Ei{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=be,!t&&be&&(this.index=(be.scopes||(be.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=be;try{return be=this,t()}finally{be=n}}}on(){be=this}off(){be=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},Ys=e=>(e.w&Je)>0,Js=e=>(e.n&Je)>0,Ai=({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{(d==="length"||!En(d)&&d>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":B(e)?_r(n)&&l.push(i.get("length")):(l.push(i.get(ot)),mt(e)&&l.push(i.get(nr)));break;case"delete":B(e)||(l.push(i.get(ot)),mt(e)&&l.push(i.get(nr)));break;case"set":mt(e)&&l.push(i.get(ot));break}if(l.length===1)l[0]&&rr(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);rr(wr(c))}}function rr(e,t){const n=B(e)?e:[...e];for(const r of n)r.computed&&qr(r);for(const r of n)r.computed||qr(r)}function qr(e,t){(e!==Se||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function Oi(e,t){var n;return(n=pn.get(e))==null?void 0:n.get(t)}const Ri=gr("__proto__,__v_isRef,__isVue"),Zs=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(En)),zr=Mi();function Mi(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=Q(this);for(let o=0,i=this.length;o{e[t]=function(...n){Tt();const r=Q(this)[t].apply(this,n);return At(),r}}),e}function Fi(e){const t=Q(this);return ye(t,"has",e),t.hasOwnProperty(e)}class Gs{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,r){const s=this._isReadonly,o=this._shallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return o;if(n==="__v_raw"&&r===(s?o?Wi:ro:o?no:to).get(t))return t;const i=B(t);if(!s){if(i&&X(zr,n))return Reflect.get(zr,n,r);if(n==="hasOwnProperty")return Fi}const l=Reflect.get(t,n,r);return(En(n)?Zs.has(n):Ri(n))||(s||ye(t,"get",n),o)?l:ce(l)?i&&_r(n)?l:l.value:ee(l)?s?Rn(l):On(l):l}}class eo extends Gs{constructor(t=!1){super(!1,t)}set(t,n,r,s){let o=t[n];if(wt(o)&&ce(o)&&!ce(r))return!1;if(!this._shallow&&(!gn(r)&&!wt(r)&&(o=Q(o),r=Q(r)),!B(t)&&ce(o)&&!ce(r)))return o.value=r,!0;const i=B(t)&&_r(n)?Number(n)e,Sn=e=>Reflect.getPrototypeOf(e);function Yt(e,t,n=!1,r=!1){e=e.__v_raw;const s=Q(e),o=Q(t);n||(at(t,o)&&ye(s,"get",t),ye(s,"get",o));const{has:i}=Sn(s),l=r?Er:n?Ar:jt;if(i.call(s,t))return l(e.get(t));if(i.call(s,o))return l(e.get(o));e!==s&&e.get(t)}function Jt(e,t=!1){const n=this.__v_raw,r=Q(n),s=Q(e);return t||(at(e,s)&&ye(r,"has",e),ye(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function Xt(e,t=!1){return e=e.__v_raw,!t&&ye(Q(e),"iterate",ot),Reflect.get(e,"size",e)}function Yr(e){e=Q(e);const t=Q(this);return Sn(t).has.call(t,e)||(t.add(e),De(t,"add",e,e)),this}function Jr(e,t){t=Q(t);const n=Q(this),{has:r,get:s}=Sn(n);let o=r.call(n,e);o||(e=Q(e),o=r.call(n,e));const i=s.call(n,e);return n.set(e,t),o?at(t,i)&&De(n,"set",e,t):De(n,"add",e,t),this}function Xr(e){const t=Q(this),{has:n,get:r}=Sn(t);let s=n.call(t,e);s||(e=Q(e),s=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return s&&De(t,"delete",e,void 0),o}function Qr(){const e=Q(this),t=e.size!==0,n=e.clear();return t&&De(e,"clear",void 0,void 0),n}function Qt(e,t){return function(r,s){const o=this,i=o.__v_raw,l=Q(i),c=t?Er:e?Ar:jt;return!e&&ye(l,"iterate",ot),i.forEach((a,d)=>r.call(s,c(a),c(d),o))}}function Zt(e,t,n){return function(...r){const s=this.__v_raw,o=Q(s),i=mt(o),l=e==="entries"||e===Symbol.iterator&&i,c=e==="keys"&&i,a=s[e](...r),d=n?Er:t?Ar:jt;return!t&&ye(o,"iterate",c?nr:ot),{next(){const{value:h,done:y}=a.next();return y?{value:h,done:y}:{value:l?[d(h[0]),d(h[1])]:d(h),done:y}},[Symbol.iterator](){return this}}}}function Be(e){return function(...t){return e==="delete"?!1:this}}function Hi(){const e={get(o){return Yt(this,o)},get size(){return Xt(this)},has:Jt,add:Yr,set:Jr,delete:Xr,clear:Qr,forEach:Qt(!1,!1)},t={get(o){return Yt(this,o,!1,!0)},get size(){return Xt(this)},has:Jt,add:Yr,set:Jr,delete:Xr,clear:Qr,forEach:Qt(!1,!0)},n={get(o){return Yt(this,o,!0)},get size(){return Xt(this,!0)},has(o){return Jt.call(this,o,!0)},add:Be("add"),set:Be("set"),delete:Be("delete"),clear:Be("clear"),forEach:Qt(!0,!1)},r={get(o){return Yt(this,o,!0,!0)},get size(){return Xt(this,!0)},has(o){return Jt.call(this,o,!0)},add:Be("add"),set:Be("set"),delete:Be("delete"),clear:Be("clear"),forEach:Qt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=Zt(o,!1,!1),n[o]=Zt(o,!0,!1),t[o]=Zt(o,!1,!0),r[o]=Zt(o,!0,!0)}),[e,n,t,r]}const[$i,Di,ji,Bi]=Hi();function xr(e,t){const n=t?e?Bi:ji:e?Di:$i;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(X(n,s)&&s in r?n:r,s,o)}const ki={get:xr(!1,!1)},Ui={get:xr(!1,!0)},Ki={get:xr(!0,!1)},to=new WeakMap,no=new WeakMap,ro=new WeakMap,Wi=new WeakMap;function Vi(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function qi(e){return e.__v_skip||!Object.isExtensible(e)?0:Vi(hi(e))}function On(e){return wt(e)?e:Tr(e,!1,Ii,ki,to)}function zi(e){return Tr(e,!1,Ni,Ui,no)}function Rn(e){return Tr(e,!0,Li,Ki,ro)}function Tr(e,t,n,r,s){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=qi(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function yt(e){return wt(e)?yt(e.__v_raw):!!(e&&e.__v_isReactive)}function wt(e){return!!(e&&e.__v_isReadonly)}function gn(e){return!!(e&&e.__v_isShallow)}function so(e){return yt(e)||wt(e)}function Q(e){const t=e&&e.__v_raw;return t?Q(t):e}function Lt(e){return hn(e,"__v_skip",!0),e}const jt=e=>ee(e)?On(e):e,Ar=e=>ee(e)?Rn(e):e;function Sr(e){qe&&Se&&(e=Q(e),Qs(e.dep||(e.dep=wr())))}function Or(e,t){e=Q(e);const n=e.dep;n&&rr(n)}function ce(e){return!!(e&&e.__v_isRef===!0)}function me(e){return io(e,!1)}function oo(e){return io(e,!0)}function io(e,t){return ce(e)?e:new Yi(e,t)}class Yi{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Q(t),this._value=n?t:jt(t)}get value(){return Sr(this),this._value}set value(t){const n=this.__v_isShallow||gn(t)||wt(t);t=n?t:Q(t),at(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:jt(t),Or(this))}}function lo(e){return ce(e)?e.value:e}const Ji={get:(e,t,n)=>lo(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return ce(s)&&!ce(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function co(e){return yt(e)?e:new Proxy(e,Ji)}class Xi{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Sr(this),()=>Or(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function Qi(e){return new Xi(e)}class Zi{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}get dep(){return Oi(Q(this._object),this._key)}}class Gi{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function el(e,t,n){return ce(e)?e:V(e)?new Gi(e):ee(e)&&arguments.length>1?tl(e,t,n):me(e)}function tl(e,t,n){const r=e[t];return ce(r)?r:new Zi(e,t,n)}class nl{constructor(t,n,r,s){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new Cr(t,()=>{this._dirty||(this._dirty=!0,Or(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=Q(this);return Sr(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function rl(e,t,n=!1){let r,s;const o=V(e);return o?(r=e,s=Re):(r=e.get,s=e.set),new nl(r,s,o||!s,n)}function ze(e,t,n,r){let s;try{s=r?e(...r):e()}catch(o){Mn(o,t,n)}return s}function xe(e,t,n,r){if(V(e)){const o=ze(e,t,n,r);return o&&Us(o)&&o.catch(i=>{Mn(i,t,n)}),o}const s=[];for(let o=0;o>>1,s=de[r],o=kt(s);oIe&&de.splice(t,1)}function ll(e){B(e)?_t.push(...e):(!$e||!$e.includes(e,e.allowRecurse?tt+1:tt))&&_t.push(e),fo()}function Zr(e,t=Bt?Ie+1:0){for(;tkt(n)-kt(r)),tt=0;tt<$e.length;tt++)$e[tt]();$e=null,tt=0}}const kt=e=>e.id==null?1/0:e.id,cl=(e,t)=>{const n=kt(e)-kt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function uo(e){sr=!1,Bt=!0,de.sort(cl);const t=Re;try{for(Ie=0;Iene(C)?C.trim():C)),h&&(s=n.map(Gn))}let l,c=r[l=an(t)]||r[l=an(Le(t))];!c&&o&&(c=r[l=an(ft(t))]),c&&xe(c,e,6,s);const a=r[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,xe(a,e,6,s)}}function ho(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},l=!1;if(!V(e)){const c=a=>{const d=ho(a,t,!0);d&&(l=!0,ie(i,d))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!l?(ee(e)&&r.set(e,null),null):(B(o)?o.forEach(c=>i[c]=null):ie(i,o),ee(e)&&r.set(e,i),i)}function Pn(e,t){return!e||!Vt(t)?!1:(t=t.slice(2).replace(/Once$/,""),X(e,t[0].toLowerCase()+t.slice(1))||X(e,ft(t))||X(e,t))}let fe=null,In=null;function yn(e){const t=fe;return fe=e,In=e&&e.type.__scopeId||null,t}function Pa(e){In=e}function Ia(){In=null}function fl(e,t=fe,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&us(-1);const o=yn(t);let i;try{i=e(...s)}finally{yn(o),r._d&&us(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Kn(e){const{type:t,vnode:n,proxy:r,withProxy:s,props:o,propsOptions:[i],slots:l,attrs:c,emit:a,render:d,renderCache:h,data:y,setupState:C,ctx:F,inheritAttrs:O}=e;let D,W;const q=yn(e);try{if(n.shapeFlag&4){const p=s||r;D=Ae(d.call(p,p,h,o,C,y,F)),W=c}else{const p=t;D=Ae(p.length>1?p(o,{attrs:c,slots:l,emit:a}):p(o,null)),W=t.props?c:ul(c)}}catch(p){Dt.length=0,Mn(p,e,1),D=ue(ve)}let m=D;if(W&&O!==!1){const p=Object.keys(W),{shapeFlag:P}=m;p.length&&P&7&&(i&&p.some(mr)&&(W=dl(W,i)),m=Xe(m,W))}return n.dirs&&(m=Xe(m),m.dirs=m.dirs?m.dirs.concat(n.dirs):n.dirs),n.transition&&(m.transition=n.transition),D=m,yn(q),D}const ul=e=>{let t;for(const n in e)(n==="class"||n==="style"||Vt(n))&&((t||(t={}))[n]=e[n]);return t},dl=(e,t)=>{const n={};for(const r in e)(!mr(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function hl(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:c}=t,a=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?Gr(r,i,a):!!i;if(c&8){const d=t.dynamicProps;for(let h=0;he.__isSuspense;function mo(e,t){t&&t.pendingBranch?B(e)?t.effects.push(...e):t.effects.push(e):ll(e)}function yo(e,t){return Ln(e,null,t)}function Ha(e,t){return Ln(e,null,{flush:"post"})}const Gt={};function Ye(e,t,n){return Ln(e,t,n)}function Ln(e,t,{immediate:n,deep:r,flush:s,onTrack:o,onTrigger:i}=te){var l;const c=zs()===((l=le)==null?void 0:l.scope)?le:null;let a,d=!1,h=!1;if(ce(e)?(a=()=>e.value,d=gn(e)):yt(e)?(a=()=>e,r=!0):B(e)?(h=!0,d=e.some(p=>yt(p)||gn(p)),a=()=>e.map(p=>{if(ce(p))return p.value;if(yt(p))return st(p);if(V(p))return ze(p,c,2)})):V(e)?t?a=()=>ze(e,c,2):a=()=>{if(!(c&&c.isUnmounted))return y&&y(),xe(e,c,3,[C])}:a=Re,t&&r){const p=a;a=()=>st(p())}let y,C=p=>{y=q.onStop=()=>{ze(p,c,4)}},F;if(Kt)if(C=Re,t?n&&xe(t,c,3,[a(),h?[]:void 0,C]):a(),s==="sync"){const p=uc();F=p.__watcherHandles||(p.__watcherHandles=[])}else return Re;let O=h?new Array(e.length).fill(Gt):Gt;const D=()=>{if(q.active)if(t){const p=q.run();(r||d||(h?p.some((P,k)=>at(P,O[k])):at(p,O)))&&(y&&y(),xe(t,c,3,[p,O===Gt?void 0:h&&O[0]===Gt?[]:O,C]),O=p)}else q.run()};D.allowRecurse=!!t;let W;s==="sync"?W=D:s==="post"?W=()=>pe(D,c&&c.suspense):(D.pre=!0,c&&(D.id=c.uid),W=()=>Mr(D));const q=new Cr(a,W);t?n?D():O=q.run():s==="post"?pe(q.run.bind(q),c&&c.suspense):q.run();const m=()=>{q.stop(),c&&c.scope&&yr(c.scope.effects,q)};return F&&F.push(m),m}function ml(e,t,n){const r=this.proxy,s=ne(e)?e.includes(".")?_o(r,e):()=>r[e]:e.bind(r,r);let o;V(t)?o=t:(o=t.handler,n=t);const i=le;Et(this);const l=Ln(s,o.bind(r),n);return i?Et(i):it(),l}function _o(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{st(n,t)});else if(Ws(e))for(const n in e)st(e[n],t);return e}function $a(e,t){const n=fe;if(n===null)return e;const r=Bn(n)||n.proxy,s=e.dirs||(e.dirs=[]);for(let o=0;o{e.isMounted=!0}),xo(()=>{e.isUnmounting=!0}),e}const we=[Function,Array],bo={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:we,onEnter:we,onAfterEnter:we,onEnterCancelled:we,onBeforeLeave:we,onLeave:we,onAfterLeave:we,onLeaveCancelled:we,onBeforeAppear:we,onAppear:we,onAfterAppear:we,onAppearCancelled:we},_l={name:"BaseTransition",props:bo,setup(e,{slots:t}){const n=jn(),r=yl();let s;return()=>{const o=t.default&&wo(t.default(),!0);if(!o||!o.length)return;let i=o[0];if(o.length>1){for(const O of o)if(O.type!==ve){i=O;break}}const l=Q(e),{mode:c}=l;if(r.isLeaving)return Wn(i);const a=ts(i);if(!a)return Wn(i);const d=or(a,l,r,n);ir(a,d);const h=n.subTree,y=h&&ts(h);let C=!1;const{getTransitionKey:F}=a.type;if(F){const O=F();s===void 0?s=O:O!==s&&(s=O,C=!0)}if(y&&y.type!==ve&&(!nt(a,y)||C)){const O=or(y,l,r,n);if(ir(y,O),c==="out-in")return r.isLeaving=!0,O.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&n.update()},Wn(i);c==="in-out"&&a.type!==ve&&(O.delayLeave=(D,W,q)=>{const m=vo(r,y);m[String(y.key)]=y,D[We]=()=>{W(),D[We]=void 0,delete d.delayedLeave},d.delayedLeave=q})}return i}}},bl=_l;function vo(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 or(e,t,n,r){const{appear:s,mode:o,persisted:i=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:d,onBeforeLeave:h,onLeave:y,onAfterLeave:C,onLeaveCancelled:F,onBeforeAppear:O,onAppear:D,onAfterAppear:W,onAppearCancelled:q}=t,m=String(e.key),p=vo(n,e),P=(S,E)=>{S&&xe(S,r,9,E)},k=(S,E)=>{const T=E[1];P(S,E),B(S)?S.every(U=>U.length<=1)&&T():S.length<=1&&T()},$={mode:o,persisted:i,beforeEnter(S){let E=l;if(!n.isMounted)if(s)E=O||l;else return;S[We]&&S[We](!0);const T=p[m];T&&nt(e,T)&&T.el[We]&&T.el[We](),P(E,[S])},enter(S){let E=c,T=a,U=d;if(!n.isMounted)if(s)E=D||c,T=W||a,U=q||d;else return;let R=!1;const z=S[en]=se=>{R||(R=!0,se?P(U,[S]):P(T,[S]),$.delayedLeave&&$.delayedLeave(),S[en]=void 0)};E?k(E,[S,z]):z()},leave(S,E){const T=String(e.key);if(S[en]&&S[en](!0),n.isUnmounting)return E();P(h,[S]);let U=!1;const R=S[We]=z=>{U||(U=!0,E(),z?P(F,[S]):P(C,[S]),S[We]=void 0,p[T]===e&&delete p[T])};p[T]=e,y?k(y,[S,R]):R()},clone(S){return or(S,t,n,r)}};return $}function Wn(e){if(Nn(e))return e=Xe(e),e.children=null,e}function ts(e){return Nn(e)?e.children?e.children[0]:void 0:e}function ir(e,t){e.shapeFlag&6&&e.component?ir(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 wo(e,t=!1,n){let r=[],s=0;for(let o=0;o1)for(let o=0;oie({name:e.name},t,{setup:e}))():e}const bt=e=>!!e.type.__asyncLoader,Nn=e=>e.type.__isKeepAlive;function vl(e,t){Eo(e,"a",t)}function wl(e,t){Eo(e,"da",t)}function Eo(e,t,n=le){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Hn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)Nn(s.parent.vnode)&&Cl(r,t,n,s),s=s.parent}}function Cl(e,t,n,r){const s=Hn(t,e,r,!0);$n(()=>{yr(r[t],s)},n)}function Hn(e,t,n=le,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;Tt(),Et(n);const l=xe(t,n,e,i);return it(),At(),l});return r?s.unshift(o):s.push(o),o}}const je=e=>(t,n=le)=>(!Kt||e==="sp")&&Hn(e,(...r)=>t(...r),n),El=je("bm"),St=je("m"),xl=je("bu"),Tl=je("u"),xo=je("bum"),$n=je("um"),Al=je("sp"),Sl=je("rtg"),Ol=je("rtc");function Rl(e,t=le){Hn("ec",e,t)}function Da(e,t,n,r){let s;const o=n&&n[r];if(B(e)||ne(e)){s=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,o&&o[l]));else{const i=Object.keys(e);s=new Array(i.length);for(let l=0,c=i.length;lwn(t)?!(t.type===ve||t.type===ge&&!To(t.children)):!0)?e:null}function Ba(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:an(r)]=e[r];return n}const lr=e=>e?ko(e)?Bn(e)||e.proxy:lr(e.parent):null,Nt=ie(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=>lr(e.parent),$root:e=>lr(e.root),$emit:e=>e.emit,$options:e=>Pr(e),$forceUpdate:e=>e.f||(e.f=()=>Mr(e.update)),$nextTick:e=>e.n||(e.n=Fn.bind(e.proxy)),$watch:e=>ml.bind(e)}),Vn=(e,t)=>e!==te&&!e.__isScriptSetup&&X(e,t),Ml={get({_:e},t){const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const C=i[t];if(C!==void 0)switch(C){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(Vn(r,t))return i[t]=1,r[t];if(s!==te&&X(s,t))return i[t]=2,s[t];if((a=e.propsOptions[0])&&X(a,t))return i[t]=3,o[t];if(n!==te&&X(n,t))return i[t]=4,n[t];cr&&(i[t]=0)}}const d=Nt[t];let h,y;if(d)return t==="$attrs"&&ye(e,"get",t),d(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==te&&X(n,t))return i[t]=4,n[t];if(y=c.config.globalProperties,X(y,t))return y[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return Vn(s,t)?(s[t]=n,!0):r!==te&&X(r,t)?(r[t]=n,!0):X(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let l;return!!n[i]||e!==te&&X(e,i)||Vn(t,i)||(l=o[0])&&X(l,i)||X(r,i)||X(Nt,i)||X(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:X(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function ka(){return Fl().slots}function Fl(){const e=jn();return e.setupContext||(e.setupContext=Ko(e))}function ns(e){return B(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let cr=!0;function Pl(e){const t=Pr(e),n=e.proxy,r=e.ctx;cr=!1,t.beforeCreate&&rs(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:c,inject:a,created:d,beforeMount:h,mounted:y,beforeUpdate:C,updated:F,activated:O,deactivated:D,beforeDestroy:W,beforeUnmount:q,destroyed:m,unmounted:p,render:P,renderTracked:k,renderTriggered:$,errorCaptured:S,serverPrefetch:E,expose:T,inheritAttrs:U,components:R,directives:z,filters:se}=t;if(a&&Il(a,r,null),i)for(const J in i){const j=i[J];V(j)&&(r[J]=j.bind(n))}if(s){const J=s.call(n,n);ee(J)&&(e.data=On(J))}if(cr=!0,o)for(const J in o){const j=o[J],Ne=V(j)?j.bind(n,n):V(j.get)?j.get.bind(n,n):Re,qt=!V(j)&&V(j.set)?j.set.bind(n):Re,Qe=oe({get:Ne,set:qt});Object.defineProperty(r,J,{enumerable:!0,configurable:!0,get:()=>Qe.value,set:Me=>Qe.value=Me})}if(l)for(const J in l)Ao(l[J],r,n,J);if(c){const J=V(c)?c.call(n):c;Reflect.ownKeys(J).forEach(j=>{jl(j,J[j])})}d&&rs(d,e,"c");function L(J,j){B(j)?j.forEach(Ne=>J(Ne.bind(n))):j&&J(j.bind(n))}if(L(El,h),L(St,y),L(xl,C),L(Tl,F),L(vl,O),L(wl,D),L(Rl,S),L(Ol,k),L(Sl,$),L(xo,q),L($n,p),L(Al,E),B(T))if(T.length){const J=e.exposed||(e.exposed={});T.forEach(j=>{Object.defineProperty(J,j,{get:()=>n[j],set:Ne=>n[j]=Ne})})}else e.exposed||(e.exposed={});P&&e.render===Re&&(e.render=P),U!=null&&(e.inheritAttrs=U),R&&(e.components=R),z&&(e.directives=z)}function Il(e,t,n=Re){B(e)&&(e=ar(e));for(const r in e){const s=e[r];let o;ee(s)?"default"in s?o=vt(s.from||r,s.default,!0):o=vt(s.from||r):o=vt(s),ce(o)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[r]=o}}function rs(e,t,n){xe(B(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ao(e,t,n,r){const s=r.includes(".")?_o(n,r):()=>n[r];if(ne(e)){const o=t[e];V(o)&&Ye(s,o)}else if(V(e))Ye(s,e.bind(n));else if(ee(e))if(B(e))e.forEach(o=>Ao(o,t,n,r));else{const o=V(e.handler)?e.handler.bind(n):t[e.handler];V(o)&&Ye(s,o,e)}}function Pr(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(a=>_n(c,a,i,!0)),_n(c,t,i)),ee(t)&&o.set(t,c),c}function _n(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&_n(e,o,n,!0),s&&s.forEach(i=>_n(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=Ll[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Ll={data:ss,props:os,emits:os,methods:Pt,computed:Pt,beforeCreate:he,created:he,beforeMount:he,mounted:he,beforeUpdate:he,updated:he,beforeDestroy:he,beforeUnmount:he,destroyed:he,unmounted:he,activated:he,deactivated:he,errorCaptured:he,serverPrefetch:he,components:Pt,directives:Pt,watch:Hl,provide:ss,inject:Nl};function ss(e,t){return t?e?function(){return ie(V(e)?e.call(this,this):e,V(t)?t.call(this,this):t)}:t:e}function Nl(e,t){return Pt(ar(e),ar(t))}function ar(e){if(B(e)){const t={};for(let n=0;n1)return n&&V(t)?t.call(r&&r.proxy):t}}function Bl(e,t,n,r=!1){const s={},o={};hn(o,Dn,1),e.propsDefaults=Object.create(null),Oo(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:zi(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function kl(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,l=Q(s),[c]=e.propsOptions;let a=!1;if((r||i>0)&&!(i&16)){if(i&8){const d=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[y,C]=Ro(h,t,!0);ie(i,y),C&&l.push(...C)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!o&&!c)return ee(e)&&r.set(e,gt),gt;if(B(o))for(let d=0;d-1,C[1]=O<0||F-1||X(C,"default"))&&l.push(h)}}}const a=[i,l];return ee(e)&&r.set(e,a),a}function is(e){return e[0]!=="$"}function ls(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function cs(e,t){return ls(e)===ls(t)}function as(e,t){return B(t)?t.findIndex(n=>cs(n,e)):V(t)&&cs(t,e)?0:-1}const Mo=e=>e[0]==="_"||e==="$stable",Ir=e=>B(e)?e.map(Ae):[Ae(e)],Ul=(e,t,n)=>{if(t._n)return t;const r=fl((...s)=>Ir(t(...s)),n);return r._c=!1,r},Fo=(e,t,n)=>{const r=e._ctx;for(const s in e){if(Mo(s))continue;const o=e[s];if(V(o))t[s]=Ul(s,o,r);else if(o!=null){const i=Ir(o);t[s]=()=>i}}},Po=(e,t)=>{const n=Ir(t);e.slots.default=()=>n},Kl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=Q(t),hn(t,"_",n)):Fo(t,e.slots={})}else e.slots={},t&&Po(e,t);hn(e.slots,Dn,1)},Wl=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=te;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:(ie(s,t),!n&&l===1&&delete s._):(o=!t.$stable,Fo(t,s)),i=t}else t&&(Po(e,t),i={default:1});if(o)for(const l in s)!Mo(l)&&i[l]==null&&delete s[l]};function vn(e,t,n,r,s=!1){if(B(e)){e.forEach((y,C)=>vn(y,t&&(B(t)?t[C]:t),n,r,s));return}if(bt(r)&&!s)return;const o=r.shapeFlag&4?Bn(r.component)||r.component.proxy:r.el,i=s?null:o,{i:l,r:c}=e,a=t&&t.r,d=l.refs===te?l.refs={}:l.refs,h=l.setupState;if(a!=null&&a!==c&&(ne(a)?(d[a]=null,X(h,a)&&(h[a]=null)):ce(a)&&(a.value=null)),V(c))ze(c,l,12,[i,d]);else{const y=ne(c),C=ce(c);if(y||C){const F=()=>{if(e.f){const O=y?X(h,c)?h[c]:d[c]:c.value;s?B(O)&&yr(O,o):B(O)?O.includes(o)||O.push(o):y?(d[c]=[o],X(h,c)&&(h[c]=d[c])):(c.value=[o],e.k&&(d[e.k]=c.value))}else y?(d[c]=i,X(h,c)&&(h[c]=i)):C&&(c.value=i,e.k&&(d[e.k]=i))};i?(F.id=-1,pe(F,n)):F()}}}let ke=!1;const tn=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",nn=e=>e.nodeType===8;function Vl(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:o,parentNode:i,remove:l,insert:c,createComment:a}}=e,d=(m,p)=>{if(!p.hasChildNodes()){n(null,m,p),mn(),p._vnode=m;return}ke=!1,h(p.firstChild,m,null,null,null),mn(),p._vnode=m,ke&&console.error("Hydration completed but contains mismatches.")},h=(m,p,P,k,$,S=!1)=>{const E=nn(m)&&m.data==="[",T=()=>O(m,p,P,k,$,E),{type:U,ref:R,shapeFlag:z,patchFlag:se}=p;let ae=m.nodeType;p.el=m,se===-2&&(S=!1,p.dynamicChildren=null);let L=null;switch(U){case Ct:ae!==3?p.children===""?(c(p.el=s(""),i(m),m),L=m):L=T():(m.data!==p.children&&(ke=!0,m.data=p.children),L=o(m));break;case ve:q(m)?(L=o(m),W(p.el=m.content.firstChild,m,P)):ae!==8||E?L=T():L=o(m);break;case $t:if(E&&(m=o(m),ae=m.nodeType),ae===1||ae===3){L=m;const J=!p.children.length;for(let j=0;j{S=S||!!p.dynamicChildren;const{type:E,props:T,patchFlag:U,shapeFlag:R,dirs:z,transition:se}=p,ae=E==="input"&&z||E==="option";if(ae||U!==-1){if(z&&Pe(p,null,P,"created"),T)if(ae||!S||U&48)for(const j in T)(ae&&j.endsWith("value")||Vt(j)&&!It(j))&&r(m,j,null,T[j],!1,void 0,P);else T.onClick&&r(m,"onClick",null,T.onClick,!1,void 0,P);let L;(L=T&&T.onVnodeBeforeMount)&&Ce(L,P,p);let J=!1;if(q(m)){J=Io(k,se)&&P&&P.vnode.props&&P.vnode.props.appear;const j=m.content.firstChild;J&&se.beforeEnter(j),W(j,m,P),p.el=m=j}if(z&&Pe(p,null,P,"beforeMount"),((L=T&&T.onVnodeMounted)||z||J)&&mo(()=>{L&&Ce(L,P,p),J&&se.enter(m),z&&Pe(p,null,P,"mounted")},k),R&16&&!(T&&(T.innerHTML||T.textContent))){let j=C(m.firstChild,p,m,P,k,$,S);for(;j;){ke=!0;const Ne=j;j=j.nextSibling,l(Ne)}}else R&8&&m.textContent!==p.children&&(ke=!0,m.textContent=p.children)}return m.nextSibling},C=(m,p,P,k,$,S,E)=>{E=E||!!p.dynamicChildren;const T=p.children,U=T.length;for(let R=0;R{const{slotScopeIds:E}=p;E&&($=$?$.concat(E):E);const T=i(m),U=C(o(m),p,T,P,k,$,S);return U&&nn(U)&&U.data==="]"?o(p.anchor=U):(ke=!0,c(p.anchor=a("]"),T,U),U)},O=(m,p,P,k,$,S)=>{if(ke=!0,p.el=null,S){const U=D(m);for(;;){const R=o(m);if(R&&R!==U)l(R);else break}}const E=o(m),T=i(m);return l(m),n(null,p,T,E,P,k,tn(T),$),E},D=(m,p="[",P="]")=>{let k=0;for(;m;)if(m=o(m),m&&nn(m)&&(m.data===p&&k++,m.data===P)){if(k===0)return o(m);k--}return m},W=(m,p,P)=>{const k=p.parentNode;k&&k.replaceChild(m,p);let $=P;for(;$;)$.vnode.el===p&&($.vnode.el=$.subTree.el=m),$=$.parent},q=m=>m.nodeType===1&&m.tagName.toLowerCase()==="template";return[d,h]}const pe=mo;function ql(e){return zl(e,Vl)}function zl(e,t){const n=er();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:c,setText:a,setElementText:d,parentNode:h,nextSibling:y,setScopeId:C=Re,insertStaticContent:F}=e,O=(f,u,g,_=null,b=null,x=null,M=!1,w=null,A=!!u.dynamicChildren)=>{if(f===u)return;f&&!nt(f,u)&&(_=zt(f),Me(f,b,x,!0),f=null),u.patchFlag===-2&&(A=!1,u.dynamicChildren=null);const{type:v,ref:N,shapeFlag:I}=u;switch(v){case Ct:D(f,u,g,_);break;case ve:W(f,u,g,_);break;case $t:f==null&&q(u,g,_,M);break;case ge:R(f,u,g,_,b,x,M,w,A);break;default:I&1?P(f,u,g,_,b,x,M,w,A):I&6?z(f,u,g,_,b,x,M,w,A):(I&64||I&128)&&v.process(f,u,g,_,b,x,M,w,A,ut)}N!=null&&b&&vn(N,f&&f.ref,x,u||f,!u)},D=(f,u,g,_)=>{if(f==null)r(u.el=l(u.children),g,_);else{const b=u.el=f.el;u.children!==f.children&&a(b,u.children)}},W=(f,u,g,_)=>{f==null?r(u.el=c(u.children||""),g,_):u.el=f.el},q=(f,u,g,_)=>{[f.el,f.anchor]=F(f.children,u,g,_,f.el,f.anchor)},m=({el:f,anchor:u},g,_)=>{let b;for(;f&&f!==u;)b=y(f),r(f,g,_),f=b;r(u,g,_)},p=({el:f,anchor:u})=>{let g;for(;f&&f!==u;)g=y(f),s(f),f=g;s(u)},P=(f,u,g,_,b,x,M,w,A)=>{M=M||u.type==="svg",f==null?k(u,g,_,b,x,M,w,A):E(f,u,b,x,M,w,A)},k=(f,u,g,_,b,x,M,w)=>{let A,v;const{type:N,props:I,shapeFlag:H,transition:K,dirs:Y}=f;if(A=f.el=i(f.type,x,I&&I.is,I),H&8?d(A,f.children):H&16&&S(f.children,A,null,_,b,x&&N!=="foreignObject",M,w),Y&&Pe(f,null,_,"created"),$(A,f,f.scopeId,M,_),I){for(const Z in I)Z!=="value"&&!It(Z)&&o(A,Z,null,I[Z],x,f.children,_,b,He);"value"in I&&o(A,"value",null,I.value),(v=I.onVnodeBeforeMount)&&Ce(v,_,f)}Y&&Pe(f,null,_,"beforeMount");const G=Io(b,K);G&&K.beforeEnter(A),r(A,u,g),((v=I&&I.onVnodeMounted)||G||Y)&&pe(()=>{v&&Ce(v,_,f),G&&K.enter(A),Y&&Pe(f,null,_,"mounted")},b)},$=(f,u,g,_,b)=>{if(g&&C(f,g),_)for(let x=0;x<_.length;x++)C(f,_[x]);if(b){let x=b.subTree;if(u===x){const M=b.vnode;$(f,M,M.scopeId,M.slotScopeIds,b.parent)}}},S=(f,u,g,_,b,x,M,w,A=0)=>{for(let v=A;v{const w=u.el=f.el;let{patchFlag:A,dynamicChildren:v,dirs:N}=u;A|=f.patchFlag&16;const I=f.props||te,H=u.props||te;let K;g&&Ze(g,!1),(K=H.onVnodeBeforeUpdate)&&Ce(K,g,u,f),N&&Pe(u,f,g,"beforeUpdate"),g&&Ze(g,!0);const Y=b&&u.type!=="foreignObject";if(v?T(f.dynamicChildren,v,w,g,_,Y,x):M||j(f,u,w,null,g,_,Y,x,!1),A>0){if(A&16)U(w,u,I,H,g,_,b);else if(A&2&&I.class!==H.class&&o(w,"class",null,H.class,b),A&4&&o(w,"style",I.style,H.style,b),A&8){const G=u.dynamicProps;for(let Z=0;Z{K&&Ce(K,g,u,f),N&&Pe(u,f,g,"updated")},_)},T=(f,u,g,_,b,x,M)=>{for(let w=0;w{if(g!==_){if(g!==te)for(const w in g)!It(w)&&!(w in _)&&o(f,w,g[w],null,M,u.children,b,x,He);for(const w in _){if(It(w))continue;const A=_[w],v=g[w];A!==v&&w!=="value"&&o(f,w,v,A,M,u.children,b,x,He)}"value"in _&&o(f,"value",g.value,_.value)}},R=(f,u,g,_,b,x,M,w,A)=>{const v=u.el=f?f.el:l(""),N=u.anchor=f?f.anchor:l("");let{patchFlag:I,dynamicChildren:H,slotScopeIds:K}=u;K&&(w=w?w.concat(K):K),f==null?(r(v,g,_),r(N,g,_),S(u.children,g,N,b,x,M,w,A)):I>0&&I&64&&H&&f.dynamicChildren?(T(f.dynamicChildren,H,g,b,x,M,w),(u.key!=null||b&&u===b.subTree)&&Lr(f,u,!0)):j(f,u,g,N,b,x,M,w,A)},z=(f,u,g,_,b,x,M,w,A)=>{u.slotScopeIds=w,f==null?u.shapeFlag&512?b.ctx.activate(u,g,_,M,A):se(u,g,_,b,x,M,A):ae(f,u,A)},se=(f,u,g,_,b,x,M)=>{const w=f.component=sc(f,_,b);if(Nn(f)&&(w.ctx.renderer=ut),oc(w),w.asyncDep){if(b&&b.registerDep(w,L),!f.el){const A=w.subTree=ue(ve);W(null,A,u,g)}return}L(w,f,u,g,b,x,M)},ae=(f,u,g)=>{const _=u.component=f.component;if(hl(f,u,g))if(_.asyncDep&&!_.asyncResolved){J(_,u,g);return}else _.next=u,il(_.update),_.update();else u.el=f.el,_.vnode=u},L=(f,u,g,_,b,x,M)=>{const w=()=>{if(f.isMounted){let{next:N,bu:I,u:H,parent:K,vnode:Y}=f,G=N,Z;Ze(f,!1),N?(N.el=Y.el,J(f,N,M)):N=Y,I&&fn(I),(Z=N.props&&N.props.onVnodeBeforeUpdate)&&Ce(Z,K,N,Y),Ze(f,!0);const re=Kn(f),Te=f.subTree;f.subTree=re,O(Te,re,h(Te.el),zt(Te),f,b,x),N.el=re.el,G===null&&pl(f,re.el),H&&pe(H,b),(Z=N.props&&N.props.onVnodeUpdated)&&pe(()=>Ce(Z,K,N,Y),b)}else{let N;const{el:I,props:H}=u,{bm:K,m:Y,parent:G}=f,Z=bt(u);if(Ze(f,!1),K&&fn(K),!Z&&(N=H&&H.onVnodeBeforeMount)&&Ce(N,G,u),Ze(f,!0),I&&Un){const re=()=>{f.subTree=Kn(f),Un(I,f.subTree,f,b,null)};Z?u.type.__asyncLoader().then(()=>!f.isUnmounted&&re()):re()}else{const re=f.subTree=Kn(f);O(null,re,g,_,f,b,x),u.el=re.el}if(Y&&pe(Y,b),!Z&&(N=H&&H.onVnodeMounted)){const re=u;pe(()=>Ce(N,G,re),b)}(u.shapeFlag&256||G&&bt(G.vnode)&&G.vnode.shapeFlag&256)&&f.a&&pe(f.a,b),f.isMounted=!0,u=g=_=null}},A=f.effect=new Cr(w,()=>Mr(v),f.scope),v=f.update=()=>A.run();v.id=f.uid,Ze(f,!0),v()},J=(f,u,g)=>{u.component=f;const _=f.vnode.props;f.vnode=u,f.next=null,kl(f,u.props,_,g),Wl(f,u.children,g),Tt(),Zr(),At()},j=(f,u,g,_,b,x,M,w,A=!1)=>{const v=f&&f.children,N=f?f.shapeFlag:0,I=u.children,{patchFlag:H,shapeFlag:K}=u;if(H>0){if(H&128){qt(v,I,g,_,b,x,M,w,A);return}else if(H&256){Ne(v,I,g,_,b,x,M,w,A);return}}K&8?(N&16&&He(v,b,x),I!==v&&d(g,I)):N&16?K&16?qt(v,I,g,_,b,x,M,w,A):He(v,b,x,!0):(N&8&&d(g,""),K&16&&S(I,g,_,b,x,M,w,A))},Ne=(f,u,g,_,b,x,M,w,A)=>{f=f||gt,u=u||gt;const v=f.length,N=u.length,I=Math.min(v,N);let H;for(H=0;HN?He(f,b,x,!0,!1,I):S(u,g,_,b,x,M,w,A,I)},qt=(f,u,g,_,b,x,M,w,A)=>{let v=0;const N=u.length;let I=f.length-1,H=N-1;for(;v<=I&&v<=H;){const K=f[v],Y=u[v]=A?Ve(u[v]):Ae(u[v]);if(nt(K,Y))O(K,Y,g,null,b,x,M,w,A);else break;v++}for(;v<=I&&v<=H;){const K=f[I],Y=u[H]=A?Ve(u[H]):Ae(u[H]);if(nt(K,Y))O(K,Y,g,null,b,x,M,w,A);else break;I--,H--}if(v>I){if(v<=H){const K=H+1,Y=KH)for(;v<=I;)Me(f[v],b,x,!0),v++;else{const K=v,Y=v,G=new Map;for(v=Y;v<=H;v++){const _e=u[v]=A?Ve(u[v]):Ae(u[v]);_e.key!=null&&G.set(_e.key,v)}let Z,re=0;const Te=H-Y+1;let dt=!1,kr=0;const Ot=new Array(Te);for(v=0;v=Te){Me(_e,b,x,!0);continue}let Fe;if(_e.key!=null)Fe=G.get(_e.key);else for(Z=Y;Z<=H;Z++)if(Ot[Z-Y]===0&&nt(_e,u[Z])){Fe=Z;break}Fe===void 0?Me(_e,b,x,!0):(Ot[Fe-Y]=v+1,Fe>=kr?kr=Fe:dt=!0,O(_e,u[Fe],g,null,b,x,M,w,A),re++)}const Ur=dt?Yl(Ot):gt;for(Z=Ur.length-1,v=Te-1;v>=0;v--){const _e=Y+v,Fe=u[_e],Kr=_e+1{const{el:x,type:M,transition:w,children:A,shapeFlag:v}=f;if(v&6){Qe(f.component.subTree,u,g,_);return}if(v&128){f.suspense.move(u,g,_);return}if(v&64){M.move(f,u,g,ut);return}if(M===ge){r(x,u,g);for(let I=0;Iw.enter(x),b);else{const{leave:I,delayLeave:H,afterLeave:K}=w,Y=()=>r(x,u,g),G=()=>{I(x,()=>{Y(),K&&K()})};H?H(x,Y,G):G()}else r(x,u,g)},Me=(f,u,g,_=!1,b=!1)=>{const{type:x,props:M,ref:w,children:A,dynamicChildren:v,shapeFlag:N,patchFlag:I,dirs:H}=f;if(w!=null&&vn(w,null,g,f,!0),N&256){u.ctx.deactivate(f);return}const K=N&1&&H,Y=!bt(f);let G;if(Y&&(G=M&&M.onVnodeBeforeUnmount)&&Ce(G,u,f),N&6)ai(f.component,g,_);else{if(N&128){f.suspense.unmount(g,_);return}K&&Pe(f,null,u,"beforeUnmount"),N&64?f.type.remove(f,u,g,b,ut,_):v&&(x!==ge||I>0&&I&64)?He(v,u,g,!1,!0):(x===ge&&I&384||!b&&N&16)&&He(A,u,g),_&&jr(f)}(Y&&(G=M&&M.onVnodeUnmounted)||K)&&pe(()=>{G&&Ce(G,u,f),K&&Pe(f,null,u,"unmounted")},g)},jr=f=>{const{type:u,el:g,anchor:_,transition:b}=f;if(u===ge){ci(g,_);return}if(u===$t){p(f);return}const x=()=>{s(g),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(f.shapeFlag&1&&b&&!b.persisted){const{leave:M,delayLeave:w}=b,A=()=>M(g,x);w?w(f.el,x,A):A()}else x()},ci=(f,u)=>{let g;for(;f!==u;)g=y(f),s(f),f=g;s(u)},ai=(f,u,g)=>{const{bum:_,scope:b,update:x,subTree:M,um:w}=f;_&&fn(_),b.stop(),x&&(x.active=!1,Me(M,f,u,g)),w&&pe(w,u),pe(()=>{f.isUnmounted=!0},u),u&&u.pendingBranch&&!u.isUnmounted&&f.asyncDep&&!f.asyncResolved&&f.suspenseId===u.pendingId&&(u.deps--,u.deps===0&&u.resolve())},He=(f,u,g,_=!1,b=!1,x=0)=>{for(let M=x;Mf.shapeFlag&6?zt(f.component.subTree):f.shapeFlag&128?f.suspense.next():y(f.anchor||f.el),Br=(f,u,g)=>{f==null?u._vnode&&Me(u._vnode,null,null,!0):O(u._vnode||null,f,u,null,null,null,g),Zr(),mn(),u._vnode=f},ut={p:O,um:Me,m:Qe,r:jr,mt:se,mc:S,pc:j,pbc:T,n:zt,o:e};let kn,Un;return t&&([kn,Un]=t(ut)),{render:Br,hydrate:kn,createApp:Dl(Br,kn)}}function Ze({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Io(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Lr(e,t,n=!1){const r=e.children,s=t.children;if(B(r)&&B(s))for(let o=0;o>1,e[n[l]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}const Jl=e=>e.__isTeleport,Ht=e=>e&&(e.disabled||e.disabled===""),fs=e=>typeof SVGElement<"u"&&e instanceof SVGElement,ur=(e,t)=>{const n=e&&e.to;return ne(n)?t?t(n):null:n},Xl={__isTeleport:!0,process(e,t,n,r,s,o,i,l,c,a){const{mc:d,pc:h,pbc:y,o:{insert:C,querySelector:F,createText:O,createComment:D}}=a,W=Ht(t.props);let{shapeFlag:q,children:m,dynamicChildren:p}=t;if(e==null){const P=t.el=O(""),k=t.anchor=O("");C(P,n,r),C(k,n,r);const $=t.target=ur(t.props,F),S=t.targetAnchor=O("");$&&(C(S,$),i=i||fs($));const E=(T,U)=>{q&16&&d(m,T,U,s,o,i,l,c)};W?E(n,k):$&&E($,S)}else{t.el=e.el;const P=t.anchor=e.anchor,k=t.target=e.target,$=t.targetAnchor=e.targetAnchor,S=Ht(e.props),E=S?n:k,T=S?P:$;if(i=i||fs(k),p?(y(e.dynamicChildren,p,E,s,o,i,l),Lr(e,t,!0)):c||h(e,t,E,T,s,o,i,l,!1),W)S?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):rn(t,n,P,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const U=t.target=ur(t.props,F);U&&rn(t,U,null,a,0)}else S&&rn(t,k,$,a,1)}Lo(t)},remove(e,t,n,r,{um:s,o:{remove:o}},i){const{shapeFlag:l,children:c,anchor:a,targetAnchor:d,target:h,props:y}=e;if(h&&o(d),i&&o(a),l&16){const C=i||!Ht(y);for(let F=0;F0?Oe||gt:null,Zl(),Ut>0&&Oe&&Oe.push(e),e}function Ka(e,t,n,r,s,o){return Ho(jo(e,t,n,r,s,o,!0))}function $o(e,t,n,r,s){return Ho(ue(e,t,n,r,s,!0))}function wn(e){return e?e.__v_isVNode===!0:!1}function nt(e,t){return e.type===t.type&&e.key===t.key}const Dn="__vInternal",Do=({key:e})=>e??null,un=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ne(e)||ce(e)||V(e)?{i:fe,r:e,k:t,f:!!n}:e:null);function jo(e,t=null,n=null,r=0,s=null,o=e===ge?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Do(t),ref:t&&un(t),scopeId:In,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:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:fe};return l?(Nr(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=ne(n)?8:16),Ut>0&&!i&&Oe&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Oe.push(c),c}const ue=Gl;function Gl(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===po)&&(e=ve),wn(e)){const l=Xe(e,t,!0);return n&&Nr(l,n),Ut>0&&!o&&Oe&&(l.shapeFlag&6?Oe[Oe.indexOf(e)]=l:Oe.push(l)),l.patchFlag|=-2,l}if(ac(e)&&(e=e.__vccOpts),t){t=ec(t);let{class:l,style:c}=t;l&&!ne(l)&&(t.class=vr(l)),ee(c)&&(so(c)&&!B(c)&&(c=ie({},c)),t.style=br(c))}const i=ne(e)?1:gl(e)?128:Jl(e)?64:ee(e)?4:V(e)?2:0;return jo(e,t,n,r,s,i,o,!0)}function ec(e){return e?so(e)||Dn in e?ie({},e):e:null}function Xe(e,t,n=!1){const{props:r,ref:s,patchFlag:o,children:i}=e,l=t?tc(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Do(l),ref:t&&t.ref?n&&s?B(s)?s.concat(un(t)):[s,un(t)]:un(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ge?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Xe(e.ssContent),ssFallback:e.ssFallback&&Xe(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Bo(e=" ",t=0){return ue(Ct,null,e,t)}function Wa(e,t){const n=ue($t,null,e);return n.staticCount=t,n}function Va(e="",t=!1){return t?(No(),$o(ve,null,e)):ue(ve,null,e)}function Ae(e){return e==null||typeof e=="boolean"?ue(ve):B(e)?ue(ge,null,e.slice()):typeof e=="object"?Ve(e):ue(Ct,null,String(e))}function Ve(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Xe(e)}function Nr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(B(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),Nr(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!(Dn in t)?t._ctx=fe:s===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else V(t)?(t={default:t,_ctx:fe},n=32):(t=String(t),r&64?(n=16,t=[Bo(t)]):n=8);e.children=t,e.shapeFlag|=n}function tc(...e){const t={};for(let n=0;nle||fe;let Hr,ht,ds="__VUE_INSTANCE_SETTERS__";(ht=er()[ds])||(ht=er()[ds]=[]),ht.push(e=>le=e),Hr=e=>{ht.length>1?ht.forEach(t=>t(e)):ht[0](e)};const Et=e=>{Hr(e),e.scope.on()},it=()=>{le&&le.scope.off(),Hr(null)};function ko(e){return e.vnode.shapeFlag&4}let Kt=!1;function oc(e,t=!1){Kt=t;const{props:n,children:r}=e.vnode,s=ko(e);Bl(e,n,s,t),Kl(e,r);const o=s?ic(e,t):void 0;return Kt=!1,o}function ic(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Lt(new Proxy(e.ctx,Ml));const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?Ko(e):null;Et(e),Tt();const o=ze(r,e,0,[e.props,s]);if(At(),it(),Us(o)){if(o.then(it,it),t)return o.then(i=>{hs(e,i,t)}).catch(i=>{Mn(i,e,0)});e.asyncDep=o}else hs(e,o,t)}else Uo(e,t)}function hs(e,t,n){V(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=co(t)),Uo(e,n)}let ps;function Uo(e,t,n){const r=e.type;if(!e.render){if(!t&&ps&&!r.render){const s=r.template||Pr(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,a=ie(ie({isCustomElement:o,delimiters:l},i),c);r.render=ps(s,a)}}e.render=r.render||Re}{Et(e),Tt();try{Pl(e)}finally{At(),it()}}}function lc(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return ye(e,"get","$attrs"),t[n]}}))}function Ko(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return lc(e)},slots:e.slots,emit:e.emit,expose:t}}function Bn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(co(Lt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Nt)return Nt[n](e)},has(t,n){return n in t||n in Nt}}))}function cc(e,t=!0){return V(e)?e.displayName||e.name:e.name||t&&e.__name}function ac(e){return V(e)&&"__vccOpts"in e}const oe=(e,t)=>rl(e,t,Kt);function dr(e,t,n){const r=arguments.length;return r===2?ee(t)&&!B(t)?wn(t)?ue(e,null,[t]):ue(e,t):ue(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&wn(n)&&(n=[n]),ue(e,t,n))}const fc=Symbol.for("v-scx"),uc=()=>vt(fc),dc="3.3.8",hc="http://www.w3.org/2000/svg",rt=typeof document<"u"?document:null,gs=rt&&rt.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 s=t?rt.createElementNS(hc,e):rt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>rt.createTextNode(e),createComment:e=>rt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>rt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{gs.innerHTML=r?`${e}`:e;const l=gs.content;if(r){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ue="transition",Rt="animation",Wt=Symbol("_vtc"),Wo=(e,{slots:t})=>dr(bl,gc(e),t);Wo.displayName="Transition";const Vo={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};Wo.props=ie({},bo,Vo);const Ge=(e,t=[])=>{B(e)?e.forEach(n=>n(...t)):e&&e(...t)},ms=e=>e?B(e)?e.some(t=>t.length>1):e.length>1:!1;function gc(e){const t={};for(const R in e)R in Vo||(t[R]=e[R]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:a=i,appearToClass:d=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:y=`${n}-leave-active`,leaveToClass:C=`${n}-leave-to`}=e,F=mc(s),O=F&&F[0],D=F&&F[1],{onBeforeEnter:W,onEnter:q,onEnterCancelled:m,onLeave:p,onLeaveCancelled:P,onBeforeAppear:k=W,onAppear:$=q,onAppearCancelled:S=m}=t,E=(R,z,se)=>{et(R,z?d:l),et(R,z?a:i),se&&se()},T=(R,z)=>{R._isLeaving=!1,et(R,h),et(R,C),et(R,y),z&&z()},U=R=>(z,se)=>{const ae=R?$:q,L=()=>E(z,R,se);Ge(ae,[z,L]),ys(()=>{et(z,R?c:o),Ke(z,R?d:l),ms(ae)||_s(z,r,O,L)})};return ie(t,{onBeforeEnter(R){Ge(W,[R]),Ke(R,o),Ke(R,i)},onBeforeAppear(R){Ge(k,[R]),Ke(R,c),Ke(R,a)},onEnter:U(!1),onAppear:U(!0),onLeave(R,z){R._isLeaving=!0;const se=()=>T(R,z);Ke(R,h),bc(),Ke(R,y),ys(()=>{R._isLeaving&&(et(R,h),Ke(R,C),ms(p)||_s(R,r,D,se))}),Ge(p,[R,se])},onEnterCancelled(R){E(R,!1),Ge(m,[R])},onAppearCancelled(R){E(R,!0),Ge(S,[R])},onLeaveCancelled(R){T(R),Ge(P,[R])}})}function mc(e){if(e==null)return null;if(ee(e))return[qn(e.enter),qn(e.leave)];{const t=qn(e);return[t,t]}}function qn(e){return mi(e)}function Ke(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Wt]||(e[Wt]=new Set)).add(t)}function et(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Wt];n&&(n.delete(t),n.size||(e[Wt]=void 0))}function ys(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let yc=0;function _s(e,t,n,r){const s=e._endId=++yc,o=()=>{s===e._endId&&r()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=_c(e,t);if(!i)return r();const a=i+"end";let d=0;const h=()=>{e.removeEventListener(a,y),o()},y=C=>{C.target===e&&++d>=c&&h()};setTimeout(()=>{d(n[F]||"").split(", "),s=r(`${Ue}Delay`),o=r(`${Ue}Duration`),i=bs(s,o),l=r(`${Rt}Delay`),c=r(`${Rt}Duration`),a=bs(l,c);let d=null,h=0,y=0;t===Ue?i>0&&(d=Ue,h=i,y=o.length):t===Rt?a>0&&(d=Rt,h=a,y=c.length):(h=Math.max(i,a),d=h>0?i>a?Ue:Rt:null,y=d?d===Ue?o.length:c.length:0);const C=d===Ue&&/\b(transform|all)(,|$)/.test(r(`${Ue}Property`).toString());return{type:d,timeout:h,propCount:y,hasTransform:C}}function bs(e,t){for(;e.lengthvs(n)+vs(e[r])))}function vs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function bc(){return document.body.offsetHeight}function vc(e,t,n){const r=e[Wt];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const $r=Symbol("_vod"),qa={beforeMount(e,{value:t},{transition:n}){e[$r]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Mt(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),Mt(e,!0),r.enter(e)):r.leave(e,()=>{Mt(e,!1)}):Mt(e,t))},beforeUnmount(e,{value:t}){Mt(e,t)}};function Mt(e,t){e.style.display=t?e[$r]:"none"}function wc(e,t,n){const r=e.style,s=ne(n);if(n&&!s){if(t&&!ne(t))for(const o in t)n[o]==null&&hr(r,o,"");for(const o in n)hr(r,o,n[o])}else{const o=r.display;s?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),$r in e&&(r.display=o)}}const ws=/\s*!important$/;function hr(e,t,n){if(B(n))n.forEach(r=>hr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Cc(e,t);ws.test(n)?e.setProperty(ft(r),n.replace(ws,""),"important"):e[r]=n}}const Cs=["Webkit","Moz","ms"],zn={};function Cc(e,t){const n=zn[t];if(n)return n;let r=Le(t);if(r!=="filter"&&r in e)return zn[t]=r;r=An(r);for(let s=0;sYn||(Oc.then(()=>Yn=0),Yn=Date.now());function Mc(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;xe(Fc(r,n.value),t,5,[r])};return n.value=e,n.attached=Rc(),n}function Fc(e,t){if(B(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const As=/^on[a-z]/,Pc=(e,t,n,r,s=!1,o,i,l,c)=>{t==="class"?vc(e,r,s):t==="style"?wc(e,n,r):Vt(t)?mr(t)||Ac(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ic(e,t,r,s))?xc(e,t,r,o,i,l,c):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Ec(e,t,r,s))};function Ic(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&As.test(t)&&V(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||As.test(t)&&ne(n)?!1:t in e}const Ss=e=>{const t=e.props["onUpdate:modelValue"]||!1;return B(t)?n=>fn(t,n):t};function Lc(e){e.target.composing=!0}function Os(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Jn=Symbol("_assign"),za={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[Jn]=Ss(s);const o=r||s.props&&s.props.type==="number";pt(e,t?"change":"input",i=>{if(i.target.composing)return;let l=e.value;n&&(l=l.trim()),o&&(l=Gn(l)),e[Jn](l)}),n&&pt(e,"change",()=>{e.value=e.value.trim()}),t||(pt(e,"compositionstart",Lc),pt(e,"compositionend",Os),pt(e,"change",Os))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:s}},o){if(e[Jn]=Ss(o),e.composing||document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===t||(s||e.type==="number")&&Gn(e.value)===t))return;const i=t??"";e.value!==i&&(e.value=i)}},Nc=["ctrl","shift","alt","meta"],Hc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Nc.some(n=>e[`${n}Key`]&&!t.includes(n))},Ya=(e,t)=>(n,...r)=>{for(let s=0;sn=>{if(!("key"in n))return;const r=ft(n.key);if(t.some(s=>s===r||$c[s]===r))return e(n)},Dc=ie({patchProp:Pc},pc);let Xn,Rs=!1;function jc(){return Xn=Rs?Xn:ql(Dc),Rs=!0,Xn}const Xa=(...e)=>{const t=jc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Bc(r);if(s)return n(s,!0,s instanceof SVGElement)},t};function Bc(e){return ne(e)?document.querySelector(e):e}const Qa=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},kc="modulepreload",Uc=function(e){return"/"+e},Ms={},Za=function(t,n,r){if(!n||n.length===0)return t();const s=document.getElementsByTagName("link");return Promise.all(n.map(o=>{if(o=Uc(o),o in Ms)return;Ms[o]=!0;const i=o.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(!!r)for(let d=s.length-1;d>=0;d--){const h=s[d];if(h.href===o&&(!i||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${l}`))return;const a=document.createElement("link");if(a.rel=i?"stylesheet":kc,i||(a.as="script",a.crossOrigin=""),a.href=o,document.head.appendChild(a),i)return new Promise((d,h)=>{a.addEventListener("load",d),a.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},Kc=window.__VP_SITE_DATA__;function Dr(e){return zs()?(Ti(e),!0):!1}function lt(e){return typeof e=="function"?e():lo(e)}const qo=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Wc=Object.prototype.toString,Vc=e=>Wc.call(e)==="[object Object]",zo=()=>{},Fs=qc();function qc(){var e;return qo&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent)}function zc(e,t){function n(...r){return new Promise((s,o)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(o)})}return n}const Yo=e=>e();function Yc(e=Yo){const t=me(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...o)=>{t.value&&e(...o)};return{isActive:Rn(t),pause:n,resume:r,eventFilter:s}}function Jo(...e){if(e.length!==1)return el(...e);const t=e[0];return typeof t=="function"?Rn(Qi(()=>({get:t,set:zo}))):me(t)}function Jc(e,t,n={}){const{eventFilter:r=Yo,...s}=n;return Ye(e,zc(r,t),s)}function Xc(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=Yc(r);return{stop:Jc(e,t,{...s,eventFilter:o}),pause:i,resume:l,isActive:c}}function Xo(e,t=!0){jn()?St(e):t?e():Fn(e)}function Qo(e){var t;const n=lt(e);return(t=n==null?void 0:n.$el)!=null?t:n}const xt=qo?window:void 0;function Cn(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=xt):[t,n,r,s]=e,!t)return zo;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const o=[],i=()=>{o.forEach(d=>d()),o.length=0},l=(d,h,y,C)=>(d.addEventListener(h,y,C),()=>d.removeEventListener(h,y,C)),c=Ye(()=>[Qo(t),lt(s)],([d,h])=>{if(i(),!d)return;const y=Vc(h)?{...h}:h;o.push(...n.flatMap(C=>r.map(F=>l(d,C,F,y))))},{immediate:!0,flush:"post"}),a=()=>{c(),i()};return Dr(a),a}function Qc(){const e=me(!1);return jn()&&St(()=>{e.value=!0}),e}function Zc(e){const t=Qc();return oe(()=>(t.value,!!e()))}function Gc(e,t={}){const{window:n=xt}=t,r=Zc(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const o=me(!1),i=a=>{o.value=a.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",i):s.removeListener(i))},c=yo(()=>{r.value&&(l(),s=n.matchMedia(lt(e)),"addEventListener"in s?s.addEventListener("change",i):s.addListener(i),o.value=s.matches)});return Dr(()=>{c(),l(),s=void 0}),o}const sn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},on="__vueuse_ssr_handlers__",ea=ta();function ta(){return on in sn||(sn[on]=sn[on]||{}),sn[on]}function Zo(e,t){return ea[e]||t}function na(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"?"object":Number.isNaN(e)?"any":"number"}const ra={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()}},Ps="vueuse-storage";function sa(e,t,n,r={}){var s;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:a=!1,shallow:d,window:h=xt,eventFilter:y,onError:C=E=>{console.error(E)},initOnMounted:F}=r,O=(d?oo:me)(typeof t=="function"?t():t);if(!n)try{n=Zo("getDefaultStorage",()=>{var E;return(E=xt)==null?void 0:E.localStorage})()}catch(E){C(E)}if(!n)return O;const D=lt(t),W=na(D),q=(s=r.serializer)!=null?s:ra[W],{pause:m,resume:p}=Xc(O,()=>P(O.value),{flush:o,deep:i,eventFilter:y});return h&&l&&Xo(()=>{Cn(h,"storage",S),Cn(h,Ps,$),F&&S()}),F||S(),O;function P(E){try{if(E==null)n.removeItem(e);else{const T=q.write(E),U=n.getItem(e);U!==T&&(n.setItem(e,T),h&&h.dispatchEvent(new CustomEvent(Ps,{detail:{key:e,oldValue:U,newValue:T,storageArea:n}})))}}catch(T){C(T)}}function k(E){const T=E?E.newValue:n.getItem(e);if(T==null)return c&&D!==null&&n.setItem(e,q.write(D)),D;if(!E&&a){const U=q.read(T);return typeof a=="function"?a(U,D):W==="object"&&!Array.isArray(U)?{...D,...U}:U}else return typeof T!="string"?T:q.read(T)}function $(E){S(E.detail)}function S(E){if(!(E&&E.storageArea!==n)){if(E&&E.key==null){O.value=D;return}if(!(E&&E.key!==e)){m();try{(E==null?void 0:E.newValue)!==q.write(O.value)&&(O.value=k(E))}catch(T){C(T)}finally{E?Fn(p):p()}}}}}function oa(e){return Gc("(prefers-color-scheme: dark)",e)}function ia(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=xt,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:a,disableTransition:d=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},y=oa({window:s}),C=oe(()=>y.value?"dark":"light"),F=c||(i==null?Jo(r):sa(i,r,o,{window:s,listenToStorageChanges:l})),O=oe(()=>F.value==="auto"?C.value:F.value),D=Zo("updateHTMLAttrs",(p,P,k)=>{const $=typeof p=="string"?s==null?void 0:s.document.querySelector(p):Qo(p);if(!$)return;let S;if(d){S=s.document.createElement("style");const E="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";S.appendChild(document.createTextNode(E)),s.document.head.appendChild(S)}if(P==="class"){const E=k.split(/\s/g);Object.values(h).flatMap(T=>(T||"").split(/\s/g)).filter(Boolean).forEach(T=>{E.includes(T)?$.classList.add(T):$.classList.remove(T)})}else $.setAttribute(P,k);d&&(s.getComputedStyle(S).opacity,document.head.removeChild(S))});function W(p){var P;D(t,n,(P=h[p])!=null?P:p)}function q(p){e.onChanged?e.onChanged(p,W):W(p)}Ye(O,q,{flush:"post",immediate:!0}),Xo(()=>q(O.value));const m=oe({get(){return a?F.value:O.value},set(p){F.value=p}});try{return Object.assign(m,{store:F,system:C,state:O})}catch{return m}}function la(e={}){const{valueDark:t="dark",valueLight:n=""}=e,r=ia({...e,onChanged:(o,i)=>{var l;e.onChanged?(l=e.onChanged)==null||l.call(e,o==="dark",i,o):i(o)},modes:{dark:t,light:n}});return oe({get(){return r.value==="dark"},set(o){const i=o?"dark":"light";r.system.value===i?r.value="auto":r.value=i}})}function Qn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Go(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const ln=new WeakMap;function Ga(e,t=!1){const n=me(t);let r=null,s;Ye(Jo(e),l=>{const c=Qn(lt(l));if(c){const a=c;ln.get(a)||ln.set(a,s),n.value&&(a.style.overflow="hidden")}},{immediate:!0});const o=()=>{const l=Qn(lt(e));!l||n.value||(Fs&&(r=Cn(l,"touchmove",c=>{ca(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{var l;const c=Qn(lt(e));!c||!n.value||(Fs&&(r==null||r()),c.style.overflow=(l=ln.get(c))!=null?l:"",ln.delete(c),n.value=!1)};return Dr(i),oe({get(){return n.value},set(l){l?o():i()}})}function ef(e={}){const{window:t=xt,behavior:n="auto"}=e;if(!t)return{x:me(0),y:me(0)};const r=me(t.scrollX),s=me(t.scrollY),o=oe({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),i=oe({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return Cn(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:o,y:i}}const ei=/^(?:[a-z]+:|\/\/)/i,aa="vitepress-theme-appearance",ti=/#.*$/,fa=/(index)?\.(md|html)$/,Ee=typeof document<"u",ni={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function ua(e,t,n=!1){if(t===void 0)return!1;if(e=Is(`/${e}`),n)return new RegExp(t).test(e);if(Is(t)!==e)return!1;const r=t.match(ti);return r?(Ee?location.hash:"")===r[0]:!0}function Is(e){return decodeURI(e).replace(ti,"").replace(fa,"")}function da(e){return ei.test(e)}function ha(e,t){var r,s,o,i,l,c,a;const n=Object.keys(e.locales).find(d=>d!=="root"&&!da(d)&&ua(t,`/${d}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:si(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function ri(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=pa(e.title,r);return`${n}${s}`}function pa(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function ga(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([o,i])=>o===n&&i[s[0]]===s[1])}function si(e,t){return[...e.filter(n=>!ga(t,n)),...t]}const ma=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ya=/^[a-z]:/i;function Ls(e){const t=ya.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(ma,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const _a=Symbol(),ct=oo(Kc);function tf(e){const t=oe(()=>ha(ct.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?me(!0):n?la({storageKey:aa,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):me(!1);return{site:t,theme:oe(()=>t.value.themeConfig),page:oe(()=>e.data),frontmatter:oe(()=>e.data.frontmatter),params:oe(()=>e.data.params),lang:oe(()=>t.value.lang),dir:oe(()=>t.value.dir),localeIndex:oe(()=>t.value.localeIndex||"root"),title:oe(()=>ri(t.value,e.data)),description:oe(()=>e.data.description||t.value.description),isDark:r}}function ba(){const e=vt(_a);if(!e)throw new Error("vitepress data not properly injected in app");return e}function va(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Ns(e){return ei.test(e)||!e.startsWith("/")?e:va(ct.value.base,e)}function wa(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ee){const n="/";t=Ls(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${Ls(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let dn=[];function nf(e){dn.push(e),$n(()=>{dn=dn.filter(t=>t!==e)})}const Ca=Symbol(),oi="http://a.com",Ea=()=>({path:"/",component:null,data:ni});function rf(e,t){const n=On(Ea()),r={route:n,go:s};async function s(l=Ee?location.href:"/"){var c,a;l=pr(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(Ds(l),await i(l),await((a=r.onAfterRouteChanged)==null?void 0:a.call(r,l)))}let o=null;async function i(l,c=0,a=!1){var y;if(await((y=r.onBeforePageLoad)==null?void 0:y.call(r,l))===!1)return;const d=new URL(l,oi),h=o=d.pathname;try{let C=await e(h);if(!C)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:F,__pageData:O}=C;if(!F)throw new Error(`Invalid route component: ${F}`);n.path=Ee?h:Ns(h),n.component=Lt(F),n.data=Lt(O),Ee&&Fn(()=>{let D=ct.value.base+O.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ct.value.cleanUrls&&!D.endsWith("/")&&(D+=".html"),D!==d.pathname&&(d.pathname=D,l=D+d.search+d.hash,history.replaceState(null,"",l)),d.hash&&!c){let W=null;try{W=document.getElementById(decodeURIComponent(d.hash).slice(1))}catch(q){console.warn(q)}if(W){Hs(W,d.hash);return}}window.scrollTo(0,c)})}}catch(C){if(!/fetch|Page not found/.test(C.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(C),!a)try{const F=await fetch(ct.value.base+"hashmap.json");window.__VP_HASH_MAP__=await F.json(),await i(l,c,!0);return}catch{}o===h&&(o=null,n.path=Ee?h:Ns(h),n.component=t?Lt(t):null,n.data=ni)}}return Ee&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:d}=a,{href:h,origin:y,pathname:C,hash:F,search:O}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),D=window.location,W=C.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!d&&y===D.origin&&!(W&&W[0]!==".html")&&(l.preventDefault(),C===D.pathname&&O===D.search?(F!==D.hash&&(history.pushState(null,"",F),window.dispatchEvent(new Event("hashchange"))),F?Hs(a,F,a.classList.contains("header-anchor")):(Ds(h),window.scrollTo(0,0))):s(h))}},{capture:!0}),window.addEventListener("popstate",l=>{i(pr(location.href),l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function xa(){const e=vt(Ca);if(!e)throw new Error("useRouter() is called without provider.");return e}function ii(){return xa().route}function Hs(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let a=function(){!n||Math.abs(c-window.scrollY)>window.innerHeight?window.scrollTo(0,c):window.scrollTo({left:0,top:c,behavior:"smooth"})},s=ct.value.scrollOffset,o=0,i=24;if(typeof s=="object"&&"padding"in s&&(i=s.padding,s=s.selector),typeof s=="number")o=s;else if(typeof s=="string")o=$s(s,i);else if(Array.isArray(s))for(const d of s){const h=$s(d,i);if(h){o=h;break}}const l=parseInt(window.getComputedStyle(r).paddingTop,10),c=window.scrollY+r.getBoundingClientRect().top-o+l;requestAnimationFrame(a)}}function $s(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}function Ds(e){Ee&&e!==pr(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function pr(e){const t=new URL(e,oi);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ct.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const js=()=>dn.forEach(e=>e()),sf=Co({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=ii(),{site:n}=ba();return()=>dr(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?dr(t.component,{onVnodeMounted:js,onVnodeUpdated:js}):"404 Page Not Found"])}}),of=Co({setup(e,{slots:t}){const n=me(!1);return St(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function lf(){Ee&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const o=r.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(a=>a.classList.contains("active"));if(!i)return;const l=o.children[s];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function cf(){if(Ee){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,o=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className);let l="";o.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` -`),l=l.slice(0,-1),i&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),Ta(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function Ta(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function af(e,t){let n=[],r=!0;const s=o=>{if(r){r=!1;return}const i=o.map(Bs);n.forEach((l,c)=>{const a=i.findIndex(d=>d==null?void 0:d.isEqualNode(l??null));a!==-1?delete i[a]:(l==null||l.remove(),delete n[c])}),i.forEach(l=>l&&document.head.appendChild(l)),n=[...n,...i].filter(Boolean)};yo(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[],a=ri(i,o);a!==document.title&&(document.title=a);const d=l||i.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==d&&h.setAttribute("content",d):Bs(["meta",{name:"description",content:d}]),s(si(i.head,Sa(c)))})}function Bs([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function Aa(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Sa(e){return e.filter(t=>!Aa(t))}const Zn=new Set,li=()=>document.createElement("link"),Oa=e=>{const t=li();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Ra=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let cn;const Ma=Ee&&(cn=li())&&cn.relList&&cn.relList.supports&&cn.relList.supports("prefetch")?Oa:Ra;function ff(){if(!Ee||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const r=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!Zn.has(c)){Zn.add(c);const a=wa(c);a&&Ma(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):Zn.add(l))})})};St(r);const s=ii();Ye(()=>s.path,r),$n(()=>{n&&n.disconnect()})}export{jl as $,Ha as A,Tl as B,La as C,Da as D,oo as E,ge as F,nf as G,ue as H,Na as I,ei as J,ii as K,tc as L,vt as M,br as N,Fn as O,ef as P,Wa as Q,Rn as R,Za as S,Wo as T,$a as U,qa as V,Ya as W,za as X,Ua as Y,Ga as Z,Qa as _,Bo as a,Ja as a0,Ba as a1,ka as a2,af as a3,Ca as a4,tf as a5,_a as a6,sf as a7,of as a8,ct as a9,Xa as aa,rf as ab,wa as ac,ff as ad,cf as ae,lf as af,dr as ag,$o as b,Ka as c,Co as d,Va as e,Ns as f,oe as g,me as h,da as i,St as j,jo as k,lo as l,Ia as m,vr as n,No as o,Pa as p,ua as q,ja as r,Ee as s,Fa as t,ba as u,Gc as v,fl as w,Ye as x,yo as y,$n as z}; +function gr(e,t){const n=Object.create(null),r=e.split(",");for(let s=0;s!!n[s.toLowerCase()]:s=>!!n[s]}const te={},gt=[],Re=()=>{},fi=()=>!1,ui=/^on[^a-z]/,Vt=e=>ui.test(e),mr=e=>e.startsWith("onUpdate:"),ie=Object.assign,yr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},di=Object.prototype.hasOwnProperty,X=(e,t)=>di.call(e,t),B=Array.isArray,mt=e=>xn(e)==="[object Map]",ks=e=>xn(e)==="[object Set]",V=e=>typeof e=="function",ne=e=>typeof e=="string",En=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",Us=e=>(ee(e)||V(e))&&V(e.then)&&V(e.catch),Ks=Object.prototype.toString,xn=e=>Ks.call(e),hi=e=>xn(e).slice(8,-1),Ws=e=>xn(e)==="[object Object]",_r=e=>ne(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,It=gr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Tn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},pi=/-(\w)/g,Le=Tn(e=>e.replace(pi,(t,n)=>n?n.toUpperCase():"")),gi=/\B([A-Z])/g,ft=Tn(e=>e.replace(gi,"-$1").toLowerCase()),An=Tn(e=>e.charAt(0).toUpperCase()+e.slice(1)),an=Tn(e=>e?`on${An(e)}`:""),at=(e,t)=>!Object.is(e,t),fn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Gn=e=>{const t=parseFloat(e);return isNaN(t)?e:t},mi=e=>{const t=ne(e)?Number(e):NaN;return isNaN(t)?e:t};let Wr;const er=()=>Wr||(Wr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function br(e){if(B(e)){const t={};for(let n=0;n{if(n){const r=n.split(_i);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function vr(e){let t="";if(ne(e))t=e;else if(B(e))for(let n=0;nne(e)?e:e==null?"":B(e)||ee(e)&&(e.toString===Ks||!V(e.toString))?JSON.stringify(e,qs,2):String(e),qs=(e,t)=>t&&t.__v_isRef?qs(e,t.value):mt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s])=>(n[`${r} =>`]=s,n),{})}:ks(t)?{[`Set(${t.size})`]:[...t.values()]}:ee(t)&&!B(t)&&!Ws(t)?String(t):t;let be;class Ei{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=be,!t&&be&&(this.index=(be.scopes||(be.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=be;try{return be=this,t()}finally{be=n}}}on(){be=this}off(){be=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},Ys=e=>(e.w&Je)>0,Js=e=>(e.n&Je)>0,Ai=({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{(d==="length"||!En(d)&&d>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":B(e)?_r(n)&&l.push(i.get("length")):(l.push(i.get(ot)),mt(e)&&l.push(i.get(nr)));break;case"delete":B(e)||(l.push(i.get(ot)),mt(e)&&l.push(i.get(nr)));break;case"set":mt(e)&&l.push(i.get(ot));break}if(l.length===1)l[0]&&rr(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);rr(wr(c))}}function rr(e,t){const n=B(e)?e:[...e];for(const r of n)r.computed&&qr(r);for(const r of n)r.computed||qr(r)}function qr(e,t){(e!==Se||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function Oi(e,t){var n;return(n=pn.get(e))==null?void 0:n.get(t)}const Ri=gr("__proto__,__v_isRef,__isVue"),Zs=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(En)),zr=Mi();function Mi(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=Q(this);for(let o=0,i=this.length;o{e[t]=function(...n){Tt();const r=Q(this)[t].apply(this,n);return At(),r}}),e}function Fi(e){const t=Q(this);return ye(t,"has",e),t.hasOwnProperty(e)}class Gs{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,r){const s=this._isReadonly,o=this._shallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return o;if(n==="__v_raw"&&r===(s?o?Wi:ro:o?no:to).get(t))return t;const i=B(t);if(!s){if(i&&X(zr,n))return Reflect.get(zr,n,r);if(n==="hasOwnProperty")return Fi}const l=Reflect.get(t,n,r);return(En(n)?Zs.has(n):Ri(n))||(s||ye(t,"get",n),o)?l:ce(l)?i&&_r(n)?l:l.value:ee(l)?s?Rn(l):On(l):l}}class eo extends Gs{constructor(t=!1){super(!1,t)}set(t,n,r,s){let o=t[n];if(wt(o)&&ce(o)&&!ce(r))return!1;if(!this._shallow&&(!gn(r)&&!wt(r)&&(o=Q(o),r=Q(r)),!B(t)&&ce(o)&&!ce(r)))return o.value=r,!0;const i=B(t)&&_r(n)?Number(n)e,Sn=e=>Reflect.getPrototypeOf(e);function Yt(e,t,n=!1,r=!1){e=e.__v_raw;const s=Q(e),o=Q(t);n||(at(t,o)&&ye(s,"get",t),ye(s,"get",o));const{has:i}=Sn(s),l=r?Er:n?Ar:jt;if(i.call(s,t))return l(e.get(t));if(i.call(s,o))return l(e.get(o));e!==s&&e.get(t)}function Jt(e,t=!1){const n=this.__v_raw,r=Q(n),s=Q(e);return t||(at(e,s)&&ye(r,"has",e),ye(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function Xt(e,t=!1){return e=e.__v_raw,!t&&ye(Q(e),"iterate",ot),Reflect.get(e,"size",e)}function Yr(e){e=Q(e);const t=Q(this);return Sn(t).has.call(t,e)||(t.add(e),De(t,"add",e,e)),this}function Jr(e,t){t=Q(t);const n=Q(this),{has:r,get:s}=Sn(n);let o=r.call(n,e);o||(e=Q(e),o=r.call(n,e));const i=s.call(n,e);return n.set(e,t),o?at(t,i)&&De(n,"set",e,t):De(n,"add",e,t),this}function Xr(e){const t=Q(this),{has:n,get:r}=Sn(t);let s=n.call(t,e);s||(e=Q(e),s=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return s&&De(t,"delete",e,void 0),o}function Qr(){const e=Q(this),t=e.size!==0,n=e.clear();return t&&De(e,"clear",void 0,void 0),n}function Qt(e,t){return function(r,s){const o=this,i=o.__v_raw,l=Q(i),c=t?Er:e?Ar:jt;return!e&&ye(l,"iterate",ot),i.forEach((a,d)=>r.call(s,c(a),c(d),o))}}function Zt(e,t,n){return function(...r){const s=this.__v_raw,o=Q(s),i=mt(o),l=e==="entries"||e===Symbol.iterator&&i,c=e==="keys"&&i,a=s[e](...r),d=n?Er:t?Ar:jt;return!t&&ye(o,"iterate",c?nr:ot),{next(){const{value:h,done:y}=a.next();return y?{value:h,done:y}:{value:l?[d(h[0]),d(h[1])]:d(h),done:y}},[Symbol.iterator](){return this}}}}function Be(e){return function(...t){return e==="delete"?!1:this}}function Hi(){const e={get(o){return Yt(this,o)},get size(){return Xt(this)},has:Jt,add:Yr,set:Jr,delete:Xr,clear:Qr,forEach:Qt(!1,!1)},t={get(o){return Yt(this,o,!1,!0)},get size(){return Xt(this)},has:Jt,add:Yr,set:Jr,delete:Xr,clear:Qr,forEach:Qt(!1,!0)},n={get(o){return Yt(this,o,!0)},get size(){return Xt(this,!0)},has(o){return Jt.call(this,o,!0)},add:Be("add"),set:Be("set"),delete:Be("delete"),clear:Be("clear"),forEach:Qt(!0,!1)},r={get(o){return Yt(this,o,!0,!0)},get size(){return Xt(this,!0)},has(o){return Jt.call(this,o,!0)},add:Be("add"),set:Be("set"),delete:Be("delete"),clear:Be("clear"),forEach:Qt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=Zt(o,!1,!1),n[o]=Zt(o,!0,!1),t[o]=Zt(o,!1,!0),r[o]=Zt(o,!0,!0)}),[e,n,t,r]}const[$i,Di,ji,Bi]=Hi();function xr(e,t){const n=t?e?Bi:ji:e?Di:$i;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(X(n,s)&&s in r?n:r,s,o)}const ki={get:xr(!1,!1)},Ui={get:xr(!1,!0)},Ki={get:xr(!0,!1)},to=new WeakMap,no=new WeakMap,ro=new WeakMap,Wi=new WeakMap;function Vi(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function qi(e){return e.__v_skip||!Object.isExtensible(e)?0:Vi(hi(e))}function On(e){return wt(e)?e:Tr(e,!1,Ii,ki,to)}function zi(e){return Tr(e,!1,Ni,Ui,no)}function Rn(e){return Tr(e,!0,Li,Ki,ro)}function Tr(e,t,n,r,s){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=qi(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function yt(e){return wt(e)?yt(e.__v_raw):!!(e&&e.__v_isReactive)}function wt(e){return!!(e&&e.__v_isReadonly)}function gn(e){return!!(e&&e.__v_isShallow)}function so(e){return yt(e)||wt(e)}function Q(e){const t=e&&e.__v_raw;return t?Q(t):e}function Lt(e){return hn(e,"__v_skip",!0),e}const jt=e=>ee(e)?On(e):e,Ar=e=>ee(e)?Rn(e):e;function Sr(e){qe&&Se&&(e=Q(e),Qs(e.dep||(e.dep=wr())))}function Or(e,t){e=Q(e);const n=e.dep;n&&rr(n)}function ce(e){return!!(e&&e.__v_isRef===!0)}function me(e){return io(e,!1)}function oo(e){return io(e,!0)}function io(e,t){return ce(e)?e:new Yi(e,t)}class Yi{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Q(t),this._value=n?t:jt(t)}get value(){return Sr(this),this._value}set value(t){const n=this.__v_isShallow||gn(t)||wt(t);t=n?t:Q(t),at(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:jt(t),Or(this))}}function lo(e){return ce(e)?e.value:e}const Ji={get:(e,t,n)=>lo(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return ce(s)&&!ce(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function co(e){return yt(e)?e:new Proxy(e,Ji)}class Xi{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Sr(this),()=>Or(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function Qi(e){return new Xi(e)}class Zi{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}get dep(){return Oi(Q(this._object),this._key)}}class Gi{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function el(e,t,n){return ce(e)?e:V(e)?new Gi(e):ee(e)&&arguments.length>1?tl(e,t,n):me(e)}function tl(e,t,n){const r=e[t];return ce(r)?r:new Zi(e,t,n)}class nl{constructor(t,n,r,s){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new Cr(t,()=>{this._dirty||(this._dirty=!0,Or(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=Q(this);return Sr(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function rl(e,t,n=!1){let r,s;const o=V(e);return o?(r=e,s=Re):(r=e.get,s=e.set),new nl(r,s,o||!s,n)}function ze(e,t,n,r){let s;try{s=r?e(...r):e()}catch(o){Mn(o,t,n)}return s}function xe(e,t,n,r){if(V(e)){const o=ze(e,t,n,r);return o&&Us(o)&&o.catch(i=>{Mn(i,t,n)}),o}const s=[];for(let o=0;o>>1,s=de[r],o=kt(s);oIe&&de.splice(t,1)}function ll(e){B(e)?_t.push(...e):(!$e||!$e.includes(e,e.allowRecurse?tt+1:tt))&&_t.push(e),fo()}function Zr(e,t=Bt?Ie+1:0){for(;tkt(n)-kt(r)),tt=0;tt<$e.length;tt++)$e[tt]();$e=null,tt=0}}const kt=e=>e.id==null?1/0:e.id,cl=(e,t)=>{const n=kt(e)-kt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function uo(e){sr=!1,Bt=!0,de.sort(cl);const t=Re;try{for(Ie=0;Iene(C)?C.trim():C)),h&&(s=n.map(Gn))}let l,c=r[l=an(t)]||r[l=an(Le(t))];!c&&o&&(c=r[l=an(ft(t))]),c&&xe(c,e,6,s);const a=r[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,xe(a,e,6,s)}}function ho(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},l=!1;if(!V(e)){const c=a=>{const d=ho(a,t,!0);d&&(l=!0,ie(i,d))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!l?(ee(e)&&r.set(e,null),null):(B(o)?o.forEach(c=>i[c]=null):ie(i,o),ee(e)&&r.set(e,i),i)}function Pn(e,t){return!e||!Vt(t)?!1:(t=t.slice(2).replace(/Once$/,""),X(e,t[0].toLowerCase()+t.slice(1))||X(e,ft(t))||X(e,t))}let fe=null,In=null;function yn(e){const t=fe;return fe=e,In=e&&e.type.__scopeId||null,t}function Pa(e){In=e}function Ia(){In=null}function fl(e,t=fe,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&us(-1);const o=yn(t);let i;try{i=e(...s)}finally{yn(o),r._d&&us(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Kn(e){const{type:t,vnode:n,proxy:r,withProxy:s,props:o,propsOptions:[i],slots:l,attrs:c,emit:a,render:d,renderCache:h,data:y,setupState:C,ctx:F,inheritAttrs:O}=e;let D,W;const q=yn(e);try{if(n.shapeFlag&4){const p=s||r;D=Ae(d.call(p,p,h,o,C,y,F)),W=c}else{const p=t;D=Ae(p.length>1?p(o,{attrs:c,slots:l,emit:a}):p(o,null)),W=t.props?c:ul(c)}}catch(p){Dt.length=0,Mn(p,e,1),D=ue(ve)}let m=D;if(W&&O!==!1){const p=Object.keys(W),{shapeFlag:P}=m;p.length&&P&7&&(i&&p.some(mr)&&(W=dl(W,i)),m=Xe(m,W))}return n.dirs&&(m=Xe(m),m.dirs=m.dirs?m.dirs.concat(n.dirs):n.dirs),n.transition&&(m.transition=n.transition),D=m,yn(q),D}const ul=e=>{let t;for(const n in e)(n==="class"||n==="style"||Vt(n))&&((t||(t={}))[n]=e[n]);return t},dl=(e,t)=>{const n={};for(const r in e)(!mr(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function hl(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:c}=t,a=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?Gr(r,i,a):!!i;if(c&8){const d=t.dynamicProps;for(let h=0;he.__isSuspense;function mo(e,t){t&&t.pendingBranch?B(e)?t.effects.push(...e):t.effects.push(e):ll(e)}function yo(e,t){return Ln(e,null,t)}function Ha(e,t){return Ln(e,null,{flush:"post"})}const Gt={};function Ye(e,t,n){return Ln(e,t,n)}function Ln(e,t,{immediate:n,deep:r,flush:s,onTrack:o,onTrigger:i}=te){var l;const c=zs()===((l=le)==null?void 0:l.scope)?le:null;let a,d=!1,h=!1;if(ce(e)?(a=()=>e.value,d=gn(e)):yt(e)?(a=()=>e,r=!0):B(e)?(h=!0,d=e.some(p=>yt(p)||gn(p)),a=()=>e.map(p=>{if(ce(p))return p.value;if(yt(p))return st(p);if(V(p))return ze(p,c,2)})):V(e)?t?a=()=>ze(e,c,2):a=()=>{if(!(c&&c.isUnmounted))return y&&y(),xe(e,c,3,[C])}:a=Re,t&&r){const p=a;a=()=>st(p())}let y,C=p=>{y=q.onStop=()=>{ze(p,c,4)}},F;if(Kt)if(C=Re,t?n&&xe(t,c,3,[a(),h?[]:void 0,C]):a(),s==="sync"){const p=uc();F=p.__watcherHandles||(p.__watcherHandles=[])}else return Re;let O=h?new Array(e.length).fill(Gt):Gt;const D=()=>{if(q.active)if(t){const p=q.run();(r||d||(h?p.some((P,k)=>at(P,O[k])):at(p,O)))&&(y&&y(),xe(t,c,3,[p,O===Gt?void 0:h&&O[0]===Gt?[]:O,C]),O=p)}else q.run()};D.allowRecurse=!!t;let W;s==="sync"?W=D:s==="post"?W=()=>pe(D,c&&c.suspense):(D.pre=!0,c&&(D.id=c.uid),W=()=>Mr(D));const q=new Cr(a,W);t?n?D():O=q.run():s==="post"?pe(q.run.bind(q),c&&c.suspense):q.run();const m=()=>{q.stop(),c&&c.scope&&yr(c.scope.effects,q)};return F&&F.push(m),m}function ml(e,t,n){const r=this.proxy,s=ne(e)?e.includes(".")?_o(r,e):()=>r[e]:e.bind(r,r);let o;V(t)?o=t:(o=t.handler,n=t);const i=le;Et(this);const l=Ln(s,o.bind(r),n);return i?Et(i):it(),l}function _o(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{st(n,t)});else if(Ws(e))for(const n in e)st(e[n],t);return e}function $a(e,t){const n=fe;if(n===null)return e;const r=Bn(n)||n.proxy,s=e.dirs||(e.dirs=[]);for(let o=0;o{e.isMounted=!0}),xo(()=>{e.isUnmounting=!0}),e}const we=[Function,Array],bo={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:we,onEnter:we,onAfterEnter:we,onEnterCancelled:we,onBeforeLeave:we,onLeave:we,onAfterLeave:we,onLeaveCancelled:we,onBeforeAppear:we,onAppear:we,onAfterAppear:we,onAppearCancelled:we},_l={name:"BaseTransition",props:bo,setup(e,{slots:t}){const n=jn(),r=yl();let s;return()=>{const o=t.default&&wo(t.default(),!0);if(!o||!o.length)return;let i=o[0];if(o.length>1){for(const O of o)if(O.type!==ve){i=O;break}}const l=Q(e),{mode:c}=l;if(r.isLeaving)return Wn(i);const a=ts(i);if(!a)return Wn(i);const d=or(a,l,r,n);ir(a,d);const h=n.subTree,y=h&&ts(h);let C=!1;const{getTransitionKey:F}=a.type;if(F){const O=F();s===void 0?s=O:O!==s&&(s=O,C=!0)}if(y&&y.type!==ve&&(!nt(a,y)||C)){const O=or(y,l,r,n);if(ir(y,O),c==="out-in")return r.isLeaving=!0,O.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&n.update()},Wn(i);c==="in-out"&&a.type!==ve&&(O.delayLeave=(D,W,q)=>{const m=vo(r,y);m[String(y.key)]=y,D[We]=()=>{W(),D[We]=void 0,delete d.delayedLeave},d.delayedLeave=q})}return i}}},bl=_l;function vo(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 or(e,t,n,r){const{appear:s,mode:o,persisted:i=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:d,onBeforeLeave:h,onLeave:y,onAfterLeave:C,onLeaveCancelled:F,onBeforeAppear:O,onAppear:D,onAfterAppear:W,onAppearCancelled:q}=t,m=String(e.key),p=vo(n,e),P=(S,E)=>{S&&xe(S,r,9,E)},k=(S,E)=>{const T=E[1];P(S,E),B(S)?S.every(U=>U.length<=1)&&T():S.length<=1&&T()},$={mode:o,persisted:i,beforeEnter(S){let E=l;if(!n.isMounted)if(s)E=O||l;else return;S[We]&&S[We](!0);const T=p[m];T&&nt(e,T)&&T.el[We]&&T.el[We](),P(E,[S])},enter(S){let E=c,T=a,U=d;if(!n.isMounted)if(s)E=D||c,T=W||a,U=q||d;else return;let R=!1;const z=S[en]=se=>{R||(R=!0,se?P(U,[S]):P(T,[S]),$.delayedLeave&&$.delayedLeave(),S[en]=void 0)};E?k(E,[S,z]):z()},leave(S,E){const T=String(e.key);if(S[en]&&S[en](!0),n.isUnmounting)return E();P(h,[S]);let U=!1;const R=S[We]=z=>{U||(U=!0,E(),z?P(F,[S]):P(C,[S]),S[We]=void 0,p[T]===e&&delete p[T])};p[T]=e,y?k(y,[S,R]):R()},clone(S){return or(S,t,n,r)}};return $}function Wn(e){if(Nn(e))return e=Xe(e),e.children=null,e}function ts(e){return Nn(e)?e.children?e.children[0]:void 0:e}function ir(e,t){e.shapeFlag&6&&e.component?ir(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 wo(e,t=!1,n){let r=[],s=0;for(let o=0;o1)for(let o=0;oie({name:e.name},t,{setup:e}))():e}const bt=e=>!!e.type.__asyncLoader,Nn=e=>e.type.__isKeepAlive;function vl(e,t){Eo(e,"a",t)}function wl(e,t){Eo(e,"da",t)}function Eo(e,t,n=le){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Hn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)Nn(s.parent.vnode)&&Cl(r,t,n,s),s=s.parent}}function Cl(e,t,n,r){const s=Hn(t,e,r,!0);$n(()=>{yr(r[t],s)},n)}function Hn(e,t,n=le,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;Tt(),Et(n);const l=xe(t,n,e,i);return it(),At(),l});return r?s.unshift(o):s.push(o),o}}const je=e=>(t,n=le)=>(!Kt||e==="sp")&&Hn(e,(...r)=>t(...r),n),El=je("bm"),St=je("m"),xl=je("bu"),Tl=je("u"),xo=je("bum"),$n=je("um"),Al=je("sp"),Sl=je("rtg"),Ol=je("rtc");function Rl(e,t=le){Hn("ec",e,t)}function Da(e,t,n,r){let s;const o=n&&n[r];if(B(e)||ne(e)){s=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,o&&o[l]));else{const i=Object.keys(e);s=new Array(i.length);for(let l=0,c=i.length;lwn(t)?!(t.type===ve||t.type===ge&&!To(t.children)):!0)?e:null}function Ba(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:an(r)]=e[r];return n}const lr=e=>e?ko(e)?Bn(e)||e.proxy:lr(e.parent):null,Nt=ie(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=>lr(e.parent),$root:e=>lr(e.root),$emit:e=>e.emit,$options:e=>Pr(e),$forceUpdate:e=>e.f||(e.f=()=>Mr(e.update)),$nextTick:e=>e.n||(e.n=Fn.bind(e.proxy)),$watch:e=>ml.bind(e)}),Vn=(e,t)=>e!==te&&!e.__isScriptSetup&&X(e,t),Ml={get({_:e},t){const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const C=i[t];if(C!==void 0)switch(C){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(Vn(r,t))return i[t]=1,r[t];if(s!==te&&X(s,t))return i[t]=2,s[t];if((a=e.propsOptions[0])&&X(a,t))return i[t]=3,o[t];if(n!==te&&X(n,t))return i[t]=4,n[t];cr&&(i[t]=0)}}const d=Nt[t];let h,y;if(d)return t==="$attrs"&&ye(e,"get",t),d(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==te&&X(n,t))return i[t]=4,n[t];if(y=c.config.globalProperties,X(y,t))return y[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return Vn(s,t)?(s[t]=n,!0):r!==te&&X(r,t)?(r[t]=n,!0):X(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let l;return!!n[i]||e!==te&&X(e,i)||Vn(t,i)||(l=o[0])&&X(l,i)||X(r,i)||X(Nt,i)||X(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:X(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function ka(){return Fl().slots}function Fl(){const e=jn();return e.setupContext||(e.setupContext=Ko(e))}function ns(e){return B(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let cr=!0;function Pl(e){const t=Pr(e),n=e.proxy,r=e.ctx;cr=!1,t.beforeCreate&&rs(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:c,inject:a,created:d,beforeMount:h,mounted:y,beforeUpdate:C,updated:F,activated:O,deactivated:D,beforeDestroy:W,beforeUnmount:q,destroyed:m,unmounted:p,render:P,renderTracked:k,renderTriggered:$,errorCaptured:S,serverPrefetch:E,expose:T,inheritAttrs:U,components:R,directives:z,filters:se}=t;if(a&&Il(a,r,null),i)for(const J in i){const j=i[J];V(j)&&(r[J]=j.bind(n))}if(s){const J=s.call(n,n);ee(J)&&(e.data=On(J))}if(cr=!0,o)for(const J in o){const j=o[J],Ne=V(j)?j.bind(n,n):V(j.get)?j.get.bind(n,n):Re,qt=!V(j)&&V(j.set)?j.set.bind(n):Re,Qe=oe({get:Ne,set:qt});Object.defineProperty(r,J,{enumerable:!0,configurable:!0,get:()=>Qe.value,set:Me=>Qe.value=Me})}if(l)for(const J in l)Ao(l[J],r,n,J);if(c){const J=V(c)?c.call(n):c;Reflect.ownKeys(J).forEach(j=>{jl(j,J[j])})}d&&rs(d,e,"c");function L(J,j){B(j)?j.forEach(Ne=>J(Ne.bind(n))):j&&J(j.bind(n))}if(L(El,h),L(St,y),L(xl,C),L(Tl,F),L(vl,O),L(wl,D),L(Rl,S),L(Ol,k),L(Sl,$),L(xo,q),L($n,p),L(Al,E),B(T))if(T.length){const J=e.exposed||(e.exposed={});T.forEach(j=>{Object.defineProperty(J,j,{get:()=>n[j],set:Ne=>n[j]=Ne})})}else e.exposed||(e.exposed={});P&&e.render===Re&&(e.render=P),U!=null&&(e.inheritAttrs=U),R&&(e.components=R),z&&(e.directives=z)}function Il(e,t,n=Re){B(e)&&(e=ar(e));for(const r in e){const s=e[r];let o;ee(s)?"default"in s?o=vt(s.from||r,s.default,!0):o=vt(s.from||r):o=vt(s),ce(o)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[r]=o}}function rs(e,t,n){xe(B(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ao(e,t,n,r){const s=r.includes(".")?_o(n,r):()=>n[r];if(ne(e)){const o=t[e];V(o)&&Ye(s,o)}else if(V(e))Ye(s,e.bind(n));else if(ee(e))if(B(e))e.forEach(o=>Ao(o,t,n,r));else{const o=V(e.handler)?e.handler.bind(n):t[e.handler];V(o)&&Ye(s,o,e)}}function Pr(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(a=>_n(c,a,i,!0)),_n(c,t,i)),ee(t)&&o.set(t,c),c}function _n(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&_n(e,o,n,!0),s&&s.forEach(i=>_n(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=Ll[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Ll={data:ss,props:os,emits:os,methods:Pt,computed:Pt,beforeCreate:he,created:he,beforeMount:he,mounted:he,beforeUpdate:he,updated:he,beforeDestroy:he,beforeUnmount:he,destroyed:he,unmounted:he,activated:he,deactivated:he,errorCaptured:he,serverPrefetch:he,components:Pt,directives:Pt,watch:Hl,provide:ss,inject:Nl};function ss(e,t){return t?e?function(){return ie(V(e)?e.call(this,this):e,V(t)?t.call(this,this):t)}:t:e}function Nl(e,t){return Pt(ar(e),ar(t))}function ar(e){if(B(e)){const t={};for(let n=0;n1)return n&&V(t)?t.call(r&&r.proxy):t}}function Bl(e,t,n,r=!1){const s={},o={};hn(o,Dn,1),e.propsDefaults=Object.create(null),Oo(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:zi(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function kl(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,l=Q(s),[c]=e.propsOptions;let a=!1;if((r||i>0)&&!(i&16)){if(i&8){const d=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[y,C]=Ro(h,t,!0);ie(i,y),C&&l.push(...C)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!o&&!c)return ee(e)&&r.set(e,gt),gt;if(B(o))for(let d=0;d-1,C[1]=O<0||F-1||X(C,"default"))&&l.push(h)}}}const a=[i,l];return ee(e)&&r.set(e,a),a}function is(e){return e[0]!=="$"}function ls(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function cs(e,t){return ls(e)===ls(t)}function as(e,t){return B(t)?t.findIndex(n=>cs(n,e)):V(t)&&cs(t,e)?0:-1}const Mo=e=>e[0]==="_"||e==="$stable",Ir=e=>B(e)?e.map(Ae):[Ae(e)],Ul=(e,t,n)=>{if(t._n)return t;const r=fl((...s)=>Ir(t(...s)),n);return r._c=!1,r},Fo=(e,t,n)=>{const r=e._ctx;for(const s in e){if(Mo(s))continue;const o=e[s];if(V(o))t[s]=Ul(s,o,r);else if(o!=null){const i=Ir(o);t[s]=()=>i}}},Po=(e,t)=>{const n=Ir(t);e.slots.default=()=>n},Kl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=Q(t),hn(t,"_",n)):Fo(t,e.slots={})}else e.slots={},t&&Po(e,t);hn(e.slots,Dn,1)},Wl=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=te;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:(ie(s,t),!n&&l===1&&delete s._):(o=!t.$stable,Fo(t,s)),i=t}else t&&(Po(e,t),i={default:1});if(o)for(const l in s)!Mo(l)&&i[l]==null&&delete s[l]};function vn(e,t,n,r,s=!1){if(B(e)){e.forEach((y,C)=>vn(y,t&&(B(t)?t[C]:t),n,r,s));return}if(bt(r)&&!s)return;const o=r.shapeFlag&4?Bn(r.component)||r.component.proxy:r.el,i=s?null:o,{i:l,r:c}=e,a=t&&t.r,d=l.refs===te?l.refs={}:l.refs,h=l.setupState;if(a!=null&&a!==c&&(ne(a)?(d[a]=null,X(h,a)&&(h[a]=null)):ce(a)&&(a.value=null)),V(c))ze(c,l,12,[i,d]);else{const y=ne(c),C=ce(c);if(y||C){const F=()=>{if(e.f){const O=y?X(h,c)?h[c]:d[c]:c.value;s?B(O)&&yr(O,o):B(O)?O.includes(o)||O.push(o):y?(d[c]=[o],X(h,c)&&(h[c]=d[c])):(c.value=[o],e.k&&(d[e.k]=c.value))}else y?(d[c]=i,X(h,c)&&(h[c]=i)):C&&(c.value=i,e.k&&(d[e.k]=i))};i?(F.id=-1,pe(F,n)):F()}}}let ke=!1;const tn=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",nn=e=>e.nodeType===8;function Vl(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:o,parentNode:i,remove:l,insert:c,createComment:a}}=e,d=(m,p)=>{if(!p.hasChildNodes()){n(null,m,p),mn(),p._vnode=m;return}ke=!1,h(p.firstChild,m,null,null,null),mn(),p._vnode=m,ke&&console.error("Hydration completed but contains mismatches.")},h=(m,p,P,k,$,S=!1)=>{const E=nn(m)&&m.data==="[",T=()=>O(m,p,P,k,$,E),{type:U,ref:R,shapeFlag:z,patchFlag:se}=p;let ae=m.nodeType;p.el=m,se===-2&&(S=!1,p.dynamicChildren=null);let L=null;switch(U){case Ct:ae!==3?p.children===""?(c(p.el=s(""),i(m),m),L=m):L=T():(m.data!==p.children&&(ke=!0,m.data=p.children),L=o(m));break;case ve:q(m)?(L=o(m),W(p.el=m.content.firstChild,m,P)):ae!==8||E?L=T():L=o(m);break;case $t:if(E&&(m=o(m),ae=m.nodeType),ae===1||ae===3){L=m;const J=!p.children.length;for(let j=0;j{S=S||!!p.dynamicChildren;const{type:E,props:T,patchFlag:U,shapeFlag:R,dirs:z,transition:se}=p,ae=E==="input"&&z||E==="option";if(ae||U!==-1){if(z&&Pe(p,null,P,"created"),T)if(ae||!S||U&48)for(const j in T)(ae&&j.endsWith("value")||Vt(j)&&!It(j))&&r(m,j,null,T[j],!1,void 0,P);else T.onClick&&r(m,"onClick",null,T.onClick,!1,void 0,P);let L;(L=T&&T.onVnodeBeforeMount)&&Ce(L,P,p);let J=!1;if(q(m)){J=Io(k,se)&&P&&P.vnode.props&&P.vnode.props.appear;const j=m.content.firstChild;J&&se.beforeEnter(j),W(j,m,P),p.el=m=j}if(z&&Pe(p,null,P,"beforeMount"),((L=T&&T.onVnodeMounted)||z||J)&&mo(()=>{L&&Ce(L,P,p),J&&se.enter(m),z&&Pe(p,null,P,"mounted")},k),R&16&&!(T&&(T.innerHTML||T.textContent))){let j=C(m.firstChild,p,m,P,k,$,S);for(;j;){ke=!0;const Ne=j;j=j.nextSibling,l(Ne)}}else R&8&&m.textContent!==p.children&&(ke=!0,m.textContent=p.children)}return m.nextSibling},C=(m,p,P,k,$,S,E)=>{E=E||!!p.dynamicChildren;const T=p.children,U=T.length;for(let R=0;R{const{slotScopeIds:E}=p;E&&($=$?$.concat(E):E);const T=i(m),U=C(o(m),p,T,P,k,$,S);return U&&nn(U)&&U.data==="]"?o(p.anchor=U):(ke=!0,c(p.anchor=a("]"),T,U),U)},O=(m,p,P,k,$,S)=>{if(ke=!0,p.el=null,S){const U=D(m);for(;;){const R=o(m);if(R&&R!==U)l(R);else break}}const E=o(m),T=i(m);return l(m),n(null,p,T,E,P,k,tn(T),$),E},D=(m,p="[",P="]")=>{let k=0;for(;m;)if(m=o(m),m&&nn(m)&&(m.data===p&&k++,m.data===P)){if(k===0)return o(m);k--}return m},W=(m,p,P)=>{const k=p.parentNode;k&&k.replaceChild(m,p);let $=P;for(;$;)$.vnode.el===p&&($.vnode.el=$.subTree.el=m),$=$.parent},q=m=>m.nodeType===1&&m.tagName.toLowerCase()==="template";return[d,h]}const pe=mo;function ql(e){return zl(e,Vl)}function zl(e,t){const n=er();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:c,setText:a,setElementText:d,parentNode:h,nextSibling:y,setScopeId:C=Re,insertStaticContent:F}=e,O=(f,u,g,_=null,b=null,x=null,M=!1,w=null,A=!!u.dynamicChildren)=>{if(f===u)return;f&&!nt(f,u)&&(_=zt(f),Me(f,b,x,!0),f=null),u.patchFlag===-2&&(A=!1,u.dynamicChildren=null);const{type:v,ref:N,shapeFlag:I}=u;switch(v){case Ct:D(f,u,g,_);break;case ve:W(f,u,g,_);break;case $t:f==null&&q(u,g,_,M);break;case ge:R(f,u,g,_,b,x,M,w,A);break;default:I&1?P(f,u,g,_,b,x,M,w,A):I&6?z(f,u,g,_,b,x,M,w,A):(I&64||I&128)&&v.process(f,u,g,_,b,x,M,w,A,ut)}N!=null&&b&&vn(N,f&&f.ref,x,u||f,!u)},D=(f,u,g,_)=>{if(f==null)r(u.el=l(u.children),g,_);else{const b=u.el=f.el;u.children!==f.children&&a(b,u.children)}},W=(f,u,g,_)=>{f==null?r(u.el=c(u.children||""),g,_):u.el=f.el},q=(f,u,g,_)=>{[f.el,f.anchor]=F(f.children,u,g,_,f.el,f.anchor)},m=({el:f,anchor:u},g,_)=>{let b;for(;f&&f!==u;)b=y(f),r(f,g,_),f=b;r(u,g,_)},p=({el:f,anchor:u})=>{let g;for(;f&&f!==u;)g=y(f),s(f),f=g;s(u)},P=(f,u,g,_,b,x,M,w,A)=>{M=M||u.type==="svg",f==null?k(u,g,_,b,x,M,w,A):E(f,u,b,x,M,w,A)},k=(f,u,g,_,b,x,M,w)=>{let A,v;const{type:N,props:I,shapeFlag:H,transition:K,dirs:Y}=f;if(A=f.el=i(f.type,x,I&&I.is,I),H&8?d(A,f.children):H&16&&S(f.children,A,null,_,b,x&&N!=="foreignObject",M,w),Y&&Pe(f,null,_,"created"),$(A,f,f.scopeId,M,_),I){for(const Z in I)Z!=="value"&&!It(Z)&&o(A,Z,null,I[Z],x,f.children,_,b,He);"value"in I&&o(A,"value",null,I.value),(v=I.onVnodeBeforeMount)&&Ce(v,_,f)}Y&&Pe(f,null,_,"beforeMount");const G=Io(b,K);G&&K.beforeEnter(A),r(A,u,g),((v=I&&I.onVnodeMounted)||G||Y)&&pe(()=>{v&&Ce(v,_,f),G&&K.enter(A),Y&&Pe(f,null,_,"mounted")},b)},$=(f,u,g,_,b)=>{if(g&&C(f,g),_)for(let x=0;x<_.length;x++)C(f,_[x]);if(b){let x=b.subTree;if(u===x){const M=b.vnode;$(f,M,M.scopeId,M.slotScopeIds,b.parent)}}},S=(f,u,g,_,b,x,M,w,A=0)=>{for(let v=A;v{const w=u.el=f.el;let{patchFlag:A,dynamicChildren:v,dirs:N}=u;A|=f.patchFlag&16;const I=f.props||te,H=u.props||te;let K;g&&Ze(g,!1),(K=H.onVnodeBeforeUpdate)&&Ce(K,g,u,f),N&&Pe(u,f,g,"beforeUpdate"),g&&Ze(g,!0);const Y=b&&u.type!=="foreignObject";if(v?T(f.dynamicChildren,v,w,g,_,Y,x):M||j(f,u,w,null,g,_,Y,x,!1),A>0){if(A&16)U(w,u,I,H,g,_,b);else if(A&2&&I.class!==H.class&&o(w,"class",null,H.class,b),A&4&&o(w,"style",I.style,H.style,b),A&8){const G=u.dynamicProps;for(let Z=0;Z{K&&Ce(K,g,u,f),N&&Pe(u,f,g,"updated")},_)},T=(f,u,g,_,b,x,M)=>{for(let w=0;w{if(g!==_){if(g!==te)for(const w in g)!It(w)&&!(w in _)&&o(f,w,g[w],null,M,u.children,b,x,He);for(const w in _){if(It(w))continue;const A=_[w],v=g[w];A!==v&&w!=="value"&&o(f,w,v,A,M,u.children,b,x,He)}"value"in _&&o(f,"value",g.value,_.value)}},R=(f,u,g,_,b,x,M,w,A)=>{const v=u.el=f?f.el:l(""),N=u.anchor=f?f.anchor:l("");let{patchFlag:I,dynamicChildren:H,slotScopeIds:K}=u;K&&(w=w?w.concat(K):K),f==null?(r(v,g,_),r(N,g,_),S(u.children,g,N,b,x,M,w,A)):I>0&&I&64&&H&&f.dynamicChildren?(T(f.dynamicChildren,H,g,b,x,M,w),(u.key!=null||b&&u===b.subTree)&&Lr(f,u,!0)):j(f,u,g,N,b,x,M,w,A)},z=(f,u,g,_,b,x,M,w,A)=>{u.slotScopeIds=w,f==null?u.shapeFlag&512?b.ctx.activate(u,g,_,M,A):se(u,g,_,b,x,M,A):ae(f,u,A)},se=(f,u,g,_,b,x,M)=>{const w=f.component=sc(f,_,b);if(Nn(f)&&(w.ctx.renderer=ut),oc(w),w.asyncDep){if(b&&b.registerDep(w,L),!f.el){const A=w.subTree=ue(ve);W(null,A,u,g)}return}L(w,f,u,g,b,x,M)},ae=(f,u,g)=>{const _=u.component=f.component;if(hl(f,u,g))if(_.asyncDep&&!_.asyncResolved){J(_,u,g);return}else _.next=u,il(_.update),_.update();else u.el=f.el,_.vnode=u},L=(f,u,g,_,b,x,M)=>{const w=()=>{if(f.isMounted){let{next:N,bu:I,u:H,parent:K,vnode:Y}=f,G=N,Z;Ze(f,!1),N?(N.el=Y.el,J(f,N,M)):N=Y,I&&fn(I),(Z=N.props&&N.props.onVnodeBeforeUpdate)&&Ce(Z,K,N,Y),Ze(f,!0);const re=Kn(f),Te=f.subTree;f.subTree=re,O(Te,re,h(Te.el),zt(Te),f,b,x),N.el=re.el,G===null&&pl(f,re.el),H&&pe(H,b),(Z=N.props&&N.props.onVnodeUpdated)&&pe(()=>Ce(Z,K,N,Y),b)}else{let N;const{el:I,props:H}=u,{bm:K,m:Y,parent:G}=f,Z=bt(u);if(Ze(f,!1),K&&fn(K),!Z&&(N=H&&H.onVnodeBeforeMount)&&Ce(N,G,u),Ze(f,!0),I&&Un){const re=()=>{f.subTree=Kn(f),Un(I,f.subTree,f,b,null)};Z?u.type.__asyncLoader().then(()=>!f.isUnmounted&&re()):re()}else{const re=f.subTree=Kn(f);O(null,re,g,_,f,b,x),u.el=re.el}if(Y&&pe(Y,b),!Z&&(N=H&&H.onVnodeMounted)){const re=u;pe(()=>Ce(N,G,re),b)}(u.shapeFlag&256||G&&bt(G.vnode)&&G.vnode.shapeFlag&256)&&f.a&&pe(f.a,b),f.isMounted=!0,u=g=_=null}},A=f.effect=new Cr(w,()=>Mr(v),f.scope),v=f.update=()=>A.run();v.id=f.uid,Ze(f,!0),v()},J=(f,u,g)=>{u.component=f;const _=f.vnode.props;f.vnode=u,f.next=null,kl(f,u.props,_,g),Wl(f,u.children,g),Tt(),Zr(),At()},j=(f,u,g,_,b,x,M,w,A=!1)=>{const v=f&&f.children,N=f?f.shapeFlag:0,I=u.children,{patchFlag:H,shapeFlag:K}=u;if(H>0){if(H&128){qt(v,I,g,_,b,x,M,w,A);return}else if(H&256){Ne(v,I,g,_,b,x,M,w,A);return}}K&8?(N&16&&He(v,b,x),I!==v&&d(g,I)):N&16?K&16?qt(v,I,g,_,b,x,M,w,A):He(v,b,x,!0):(N&8&&d(g,""),K&16&&S(I,g,_,b,x,M,w,A))},Ne=(f,u,g,_,b,x,M,w,A)=>{f=f||gt,u=u||gt;const v=f.length,N=u.length,I=Math.min(v,N);let H;for(H=0;HN?He(f,b,x,!0,!1,I):S(u,g,_,b,x,M,w,A,I)},qt=(f,u,g,_,b,x,M,w,A)=>{let v=0;const N=u.length;let I=f.length-1,H=N-1;for(;v<=I&&v<=H;){const K=f[v],Y=u[v]=A?Ve(u[v]):Ae(u[v]);if(nt(K,Y))O(K,Y,g,null,b,x,M,w,A);else break;v++}for(;v<=I&&v<=H;){const K=f[I],Y=u[H]=A?Ve(u[H]):Ae(u[H]);if(nt(K,Y))O(K,Y,g,null,b,x,M,w,A);else break;I--,H--}if(v>I){if(v<=H){const K=H+1,Y=KH)for(;v<=I;)Me(f[v],b,x,!0),v++;else{const K=v,Y=v,G=new Map;for(v=Y;v<=H;v++){const _e=u[v]=A?Ve(u[v]):Ae(u[v]);_e.key!=null&&G.set(_e.key,v)}let Z,re=0;const Te=H-Y+1;let dt=!1,kr=0;const Ot=new Array(Te);for(v=0;v=Te){Me(_e,b,x,!0);continue}let Fe;if(_e.key!=null)Fe=G.get(_e.key);else for(Z=Y;Z<=H;Z++)if(Ot[Z-Y]===0&&nt(_e,u[Z])){Fe=Z;break}Fe===void 0?Me(_e,b,x,!0):(Ot[Fe-Y]=v+1,Fe>=kr?kr=Fe:dt=!0,O(_e,u[Fe],g,null,b,x,M,w,A),re++)}const Ur=dt?Yl(Ot):gt;for(Z=Ur.length-1,v=Te-1;v>=0;v--){const _e=Y+v,Fe=u[_e],Kr=_e+1{const{el:x,type:M,transition:w,children:A,shapeFlag:v}=f;if(v&6){Qe(f.component.subTree,u,g,_);return}if(v&128){f.suspense.move(u,g,_);return}if(v&64){M.move(f,u,g,ut);return}if(M===ge){r(x,u,g);for(let I=0;Iw.enter(x),b);else{const{leave:I,delayLeave:H,afterLeave:K}=w,Y=()=>r(x,u,g),G=()=>{I(x,()=>{Y(),K&&K()})};H?H(x,Y,G):G()}else r(x,u,g)},Me=(f,u,g,_=!1,b=!1)=>{const{type:x,props:M,ref:w,children:A,dynamicChildren:v,shapeFlag:N,patchFlag:I,dirs:H}=f;if(w!=null&&vn(w,null,g,f,!0),N&256){u.ctx.deactivate(f);return}const K=N&1&&H,Y=!bt(f);let G;if(Y&&(G=M&&M.onVnodeBeforeUnmount)&&Ce(G,u,f),N&6)ai(f.component,g,_);else{if(N&128){f.suspense.unmount(g,_);return}K&&Pe(f,null,u,"beforeUnmount"),N&64?f.type.remove(f,u,g,b,ut,_):v&&(x!==ge||I>0&&I&64)?He(v,u,g,!1,!0):(x===ge&&I&384||!b&&N&16)&&He(A,u,g),_&&jr(f)}(Y&&(G=M&&M.onVnodeUnmounted)||K)&&pe(()=>{G&&Ce(G,u,f),K&&Pe(f,null,u,"unmounted")},g)},jr=f=>{const{type:u,el:g,anchor:_,transition:b}=f;if(u===ge){ci(g,_);return}if(u===$t){p(f);return}const x=()=>{s(g),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(f.shapeFlag&1&&b&&!b.persisted){const{leave:M,delayLeave:w}=b,A=()=>M(g,x);w?w(f.el,x,A):A()}else x()},ci=(f,u)=>{let g;for(;f!==u;)g=y(f),s(f),f=g;s(u)},ai=(f,u,g)=>{const{bum:_,scope:b,update:x,subTree:M,um:w}=f;_&&fn(_),b.stop(),x&&(x.active=!1,Me(M,f,u,g)),w&&pe(w,u),pe(()=>{f.isUnmounted=!0},u),u&&u.pendingBranch&&!u.isUnmounted&&f.asyncDep&&!f.asyncResolved&&f.suspenseId===u.pendingId&&(u.deps--,u.deps===0&&u.resolve())},He=(f,u,g,_=!1,b=!1,x=0)=>{for(let M=x;Mf.shapeFlag&6?zt(f.component.subTree):f.shapeFlag&128?f.suspense.next():y(f.anchor||f.el),Br=(f,u,g)=>{f==null?u._vnode&&Me(u._vnode,null,null,!0):O(u._vnode||null,f,u,null,null,null,g),Zr(),mn(),u._vnode=f},ut={p:O,um:Me,m:Qe,r:jr,mt:se,mc:S,pc:j,pbc:T,n:zt,o:e};let kn,Un;return t&&([kn,Un]=t(ut)),{render:Br,hydrate:kn,createApp:Dl(Br,kn)}}function Ze({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Io(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Lr(e,t,n=!1){const r=e.children,s=t.children;if(B(r)&&B(s))for(let o=0;o>1,e[n[l]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}const Jl=e=>e.__isTeleport,Ht=e=>e&&(e.disabled||e.disabled===""),fs=e=>typeof SVGElement<"u"&&e instanceof SVGElement,ur=(e,t)=>{const n=e&&e.to;return ne(n)?t?t(n):null:n},Xl={__isTeleport:!0,process(e,t,n,r,s,o,i,l,c,a){const{mc:d,pc:h,pbc:y,o:{insert:C,querySelector:F,createText:O,createComment:D}}=a,W=Ht(t.props);let{shapeFlag:q,children:m,dynamicChildren:p}=t;if(e==null){const P=t.el=O(""),k=t.anchor=O("");C(P,n,r),C(k,n,r);const $=t.target=ur(t.props,F),S=t.targetAnchor=O("");$&&(C(S,$),i=i||fs($));const E=(T,U)=>{q&16&&d(m,T,U,s,o,i,l,c)};W?E(n,k):$&&E($,S)}else{t.el=e.el;const P=t.anchor=e.anchor,k=t.target=e.target,$=t.targetAnchor=e.targetAnchor,S=Ht(e.props),E=S?n:k,T=S?P:$;if(i=i||fs(k),p?(y(e.dynamicChildren,p,E,s,o,i,l),Lr(e,t,!0)):c||h(e,t,E,T,s,o,i,l,!1),W)S?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):rn(t,n,P,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const U=t.target=ur(t.props,F);U&&rn(t,U,null,a,0)}else S&&rn(t,k,$,a,1)}Lo(t)},remove(e,t,n,r,{um:s,o:{remove:o}},i){const{shapeFlag:l,children:c,anchor:a,targetAnchor:d,target:h,props:y}=e;if(h&&o(d),i&&o(a),l&16){const C=i||!Ht(y);for(let F=0;F0?Oe||gt:null,Zl(),Ut>0&&Oe&&Oe.push(e),e}function Ka(e,t,n,r,s,o){return Ho(jo(e,t,n,r,s,o,!0))}function $o(e,t,n,r,s){return Ho(ue(e,t,n,r,s,!0))}function wn(e){return e?e.__v_isVNode===!0:!1}function nt(e,t){return e.type===t.type&&e.key===t.key}const Dn="__vInternal",Do=({key:e})=>e??null,un=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ne(e)||ce(e)||V(e)?{i:fe,r:e,k:t,f:!!n}:e:null);function jo(e,t=null,n=null,r=0,s=null,o=e===ge?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Do(t),ref:t&&un(t),scopeId:In,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:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:fe};return l?(Nr(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=ne(n)?8:16),Ut>0&&!i&&Oe&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Oe.push(c),c}const ue=Gl;function Gl(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===po)&&(e=ve),wn(e)){const l=Xe(e,t,!0);return n&&Nr(l,n),Ut>0&&!o&&Oe&&(l.shapeFlag&6?Oe[Oe.indexOf(e)]=l:Oe.push(l)),l.patchFlag|=-2,l}if(ac(e)&&(e=e.__vccOpts),t){t=ec(t);let{class:l,style:c}=t;l&&!ne(l)&&(t.class=vr(l)),ee(c)&&(so(c)&&!B(c)&&(c=ie({},c)),t.style=br(c))}const i=ne(e)?1:gl(e)?128:Jl(e)?64:ee(e)?4:V(e)?2:0;return jo(e,t,n,r,s,i,o,!0)}function ec(e){return e?so(e)||Dn in e?ie({},e):e:null}function Xe(e,t,n=!1){const{props:r,ref:s,patchFlag:o,children:i}=e,l=t?tc(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Do(l),ref:t&&t.ref?n&&s?B(s)?s.concat(un(t)):[s,un(t)]:un(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ge?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Xe(e.ssContent),ssFallback:e.ssFallback&&Xe(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Bo(e=" ",t=0){return ue(Ct,null,e,t)}function Wa(e,t){const n=ue($t,null,e);return n.staticCount=t,n}function Va(e="",t=!1){return t?(No(),$o(ve,null,e)):ue(ve,null,e)}function Ae(e){return e==null||typeof e=="boolean"?ue(ve):B(e)?ue(ge,null,e.slice()):typeof e=="object"?Ve(e):ue(Ct,null,String(e))}function Ve(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Xe(e)}function Nr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(B(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),Nr(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!(Dn in t)?t._ctx=fe:s===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else V(t)?(t={default:t,_ctx:fe},n=32):(t=String(t),r&64?(n=16,t=[Bo(t)]):n=8);e.children=t,e.shapeFlag|=n}function tc(...e){const t={};for(let n=0;nle||fe;let Hr,ht,ds="__VUE_INSTANCE_SETTERS__";(ht=er()[ds])||(ht=er()[ds]=[]),ht.push(e=>le=e),Hr=e=>{ht.length>1?ht.forEach(t=>t(e)):ht[0](e)};const Et=e=>{Hr(e),e.scope.on()},it=()=>{le&&le.scope.off(),Hr(null)};function ko(e){return e.vnode.shapeFlag&4}let Kt=!1;function oc(e,t=!1){Kt=t;const{props:n,children:r}=e.vnode,s=ko(e);Bl(e,n,s,t),Kl(e,r);const o=s?ic(e,t):void 0;return Kt=!1,o}function ic(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Lt(new Proxy(e.ctx,Ml));const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?Ko(e):null;Et(e),Tt();const o=ze(r,e,0,[e.props,s]);if(At(),it(),Us(o)){if(o.then(it,it),t)return o.then(i=>{hs(e,i,t)}).catch(i=>{Mn(i,e,0)});e.asyncDep=o}else hs(e,o,t)}else Uo(e,t)}function hs(e,t,n){V(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=co(t)),Uo(e,n)}let ps;function Uo(e,t,n){const r=e.type;if(!e.render){if(!t&&ps&&!r.render){const s=r.template||Pr(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,a=ie(ie({isCustomElement:o,delimiters:l},i),c);r.render=ps(s,a)}}e.render=r.render||Re}{Et(e),Tt();try{Pl(e)}finally{At(),it()}}}function lc(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return ye(e,"get","$attrs"),t[n]}}))}function Ko(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return lc(e)},slots:e.slots,emit:e.emit,expose:t}}function Bn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(co(Lt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Nt)return Nt[n](e)},has(t,n){return n in t||n in Nt}}))}function cc(e,t=!0){return V(e)?e.displayName||e.name:e.name||t&&e.__name}function ac(e){return V(e)&&"__vccOpts"in e}const oe=(e,t)=>rl(e,t,Kt);function dr(e,t,n){const r=arguments.length;return r===2?ee(t)&&!B(t)?wn(t)?ue(e,null,[t]):ue(e,t):ue(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&wn(n)&&(n=[n]),ue(e,t,n))}const fc=Symbol.for("v-scx"),uc=()=>vt(fc),dc="3.3.8",hc="http://www.w3.org/2000/svg",rt=typeof document<"u"?document:null,gs=rt&&rt.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 s=t?rt.createElementNS(hc,e):rt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>rt.createTextNode(e),createComment:e=>rt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>rt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{gs.innerHTML=r?`${e}`:e;const l=gs.content;if(r){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ue="transition",Rt="animation",Wt=Symbol("_vtc"),Wo=(e,{slots:t})=>dr(bl,gc(e),t);Wo.displayName="Transition";const Vo={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};Wo.props=ie({},bo,Vo);const Ge=(e,t=[])=>{B(e)?e.forEach(n=>n(...t)):e&&e(...t)},ms=e=>e?B(e)?e.some(t=>t.length>1):e.length>1:!1;function gc(e){const t={};for(const R in e)R in Vo||(t[R]=e[R]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:a=i,appearToClass:d=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:y=`${n}-leave-active`,leaveToClass:C=`${n}-leave-to`}=e,F=mc(s),O=F&&F[0],D=F&&F[1],{onBeforeEnter:W,onEnter:q,onEnterCancelled:m,onLeave:p,onLeaveCancelled:P,onBeforeAppear:k=W,onAppear:$=q,onAppearCancelled:S=m}=t,E=(R,z,se)=>{et(R,z?d:l),et(R,z?a:i),se&&se()},T=(R,z)=>{R._isLeaving=!1,et(R,h),et(R,C),et(R,y),z&&z()},U=R=>(z,se)=>{const ae=R?$:q,L=()=>E(z,R,se);Ge(ae,[z,L]),ys(()=>{et(z,R?c:o),Ke(z,R?d:l),ms(ae)||_s(z,r,O,L)})};return ie(t,{onBeforeEnter(R){Ge(W,[R]),Ke(R,o),Ke(R,i)},onBeforeAppear(R){Ge(k,[R]),Ke(R,c),Ke(R,a)},onEnter:U(!1),onAppear:U(!0),onLeave(R,z){R._isLeaving=!0;const se=()=>T(R,z);Ke(R,h),bc(),Ke(R,y),ys(()=>{R._isLeaving&&(et(R,h),Ke(R,C),ms(p)||_s(R,r,D,se))}),Ge(p,[R,se])},onEnterCancelled(R){E(R,!1),Ge(m,[R])},onAppearCancelled(R){E(R,!0),Ge(S,[R])},onLeaveCancelled(R){T(R),Ge(P,[R])}})}function mc(e){if(e==null)return null;if(ee(e))return[qn(e.enter),qn(e.leave)];{const t=qn(e);return[t,t]}}function qn(e){return mi(e)}function Ke(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Wt]||(e[Wt]=new Set)).add(t)}function et(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Wt];n&&(n.delete(t),n.size||(e[Wt]=void 0))}function ys(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let yc=0;function _s(e,t,n,r){const s=e._endId=++yc,o=()=>{s===e._endId&&r()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=_c(e,t);if(!i)return r();const a=i+"end";let d=0;const h=()=>{e.removeEventListener(a,y),o()},y=C=>{C.target===e&&++d>=c&&h()};setTimeout(()=>{d(n[F]||"").split(", "),s=r(`${Ue}Delay`),o=r(`${Ue}Duration`),i=bs(s,o),l=r(`${Rt}Delay`),c=r(`${Rt}Duration`),a=bs(l,c);let d=null,h=0,y=0;t===Ue?i>0&&(d=Ue,h=i,y=o.length):t===Rt?a>0&&(d=Rt,h=a,y=c.length):(h=Math.max(i,a),d=h>0?i>a?Ue:Rt:null,y=d?d===Ue?o.length:c.length:0);const C=d===Ue&&/\b(transform|all)(,|$)/.test(r(`${Ue}Property`).toString());return{type:d,timeout:h,propCount:y,hasTransform:C}}function bs(e,t){for(;e.lengthvs(n)+vs(e[r])))}function vs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function bc(){return document.body.offsetHeight}function vc(e,t,n){const r=e[Wt];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const $r=Symbol("_vod"),qa={beforeMount(e,{value:t},{transition:n}){e[$r]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Mt(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),Mt(e,!0),r.enter(e)):r.leave(e,()=>{Mt(e,!1)}):Mt(e,t))},beforeUnmount(e,{value:t}){Mt(e,t)}};function Mt(e,t){e.style.display=t?e[$r]:"none"}function wc(e,t,n){const r=e.style,s=ne(n);if(n&&!s){if(t&&!ne(t))for(const o in t)n[o]==null&&hr(r,o,"");for(const o in n)hr(r,o,n[o])}else{const o=r.display;s?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),$r in e&&(r.display=o)}}const ws=/\s*!important$/;function hr(e,t,n){if(B(n))n.forEach(r=>hr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Cc(e,t);ws.test(n)?e.setProperty(ft(r),n.replace(ws,""),"important"):e[r]=n}}const Cs=["Webkit","Moz","ms"],zn={};function Cc(e,t){const n=zn[t];if(n)return n;let r=Le(t);if(r!=="filter"&&r in e)return zn[t]=r;r=An(r);for(let s=0;sYn||(Oc.then(()=>Yn=0),Yn=Date.now());function Mc(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;xe(Fc(r,n.value),t,5,[r])};return n.value=e,n.attached=Rc(),n}function Fc(e,t){if(B(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const As=/^on[a-z]/,Pc=(e,t,n,r,s=!1,o,i,l,c)=>{t==="class"?vc(e,r,s):t==="style"?wc(e,n,r):Vt(t)?mr(t)||Ac(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ic(e,t,r,s))?xc(e,t,r,o,i,l,c):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Ec(e,t,r,s))};function Ic(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&As.test(t)&&V(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||As.test(t)&&ne(n)?!1:t in e}const Ss=e=>{const t=e.props["onUpdate:modelValue"]||!1;return B(t)?n=>fn(t,n):t};function Lc(e){e.target.composing=!0}function Os(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Jn=Symbol("_assign"),za={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[Jn]=Ss(s);const o=r||s.props&&s.props.type==="number";pt(e,t?"change":"input",i=>{if(i.target.composing)return;let l=e.value;n&&(l=l.trim()),o&&(l=Gn(l)),e[Jn](l)}),n&&pt(e,"change",()=>{e.value=e.value.trim()}),t||(pt(e,"compositionstart",Lc),pt(e,"compositionend",Os),pt(e,"change",Os))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:s}},o){if(e[Jn]=Ss(o),e.composing||document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===t||(s||e.type==="number")&&Gn(e.value)===t))return;const i=t??"";e.value!==i&&(e.value=i)}},Nc=["ctrl","shift","alt","meta"],Hc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Nc.some(n=>e[`${n}Key`]&&!t.includes(n))},Ya=(e,t)=>(n,...r)=>{for(let s=0;sn=>{if(!("key"in n))return;const r=ft(n.key);if(t.some(s=>s===r||$c[s]===r))return e(n)},Dc=ie({patchProp:Pc},pc);let Xn,Rs=!1;function jc(){return Xn=Rs?Xn:ql(Dc),Rs=!0,Xn}const Xa=(...e)=>{const t=jc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Bc(r);if(s)return n(s,!0,s instanceof SVGElement)},t};function Bc(e){return ne(e)?document.querySelector(e):e}const Qa=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},kc=window.__VP_SITE_DATA__;function Dr(e){return zs()?(Ti(e),!0):!1}function lt(e){return typeof e=="function"?e():lo(e)}const qo=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Uc=Object.prototype.toString,Kc=e=>Uc.call(e)==="[object Object]",zo=()=>{},Ms=Wc();function Wc(){var e;return qo&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent)}function Vc(e,t){function n(...r){return new Promise((s,o)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(o)})}return n}const Yo=e=>e();function qc(e=Yo){const t=me(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...o)=>{t.value&&e(...o)};return{isActive:Rn(t),pause:n,resume:r,eventFilter:s}}function Jo(...e){if(e.length!==1)return el(...e);const t=e[0];return typeof t=="function"?Rn(Qi(()=>({get:t,set:zo}))):me(t)}function zc(e,t,n={}){const{eventFilter:r=Yo,...s}=n;return Ye(e,Vc(r,t),s)}function Yc(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=qc(r);return{stop:zc(e,t,{...s,eventFilter:o}),pause:i,resume:l,isActive:c}}function Xo(e,t=!0){jn()?St(e):t?e():Fn(e)}function Qo(e){var t;const n=lt(e);return(t=n==null?void 0:n.$el)!=null?t:n}const xt=qo?window:void 0;function Cn(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=xt):[t,n,r,s]=e,!t)return zo;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const o=[],i=()=>{o.forEach(d=>d()),o.length=0},l=(d,h,y,C)=>(d.addEventListener(h,y,C),()=>d.removeEventListener(h,y,C)),c=Ye(()=>[Qo(t),lt(s)],([d,h])=>{if(i(),!d)return;const y=Kc(h)?{...h}:h;o.push(...n.flatMap(C=>r.map(F=>l(d,C,F,y))))},{immediate:!0,flush:"post"}),a=()=>{c(),i()};return Dr(a),a}function Jc(){const e=me(!1);return jn()&&St(()=>{e.value=!0}),e}function Xc(e){const t=Jc();return oe(()=>(t.value,!!e()))}function Qc(e,t={}){const{window:n=xt}=t,r=Xc(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const o=me(!1),i=a=>{o.value=a.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",i):s.removeListener(i))},c=yo(()=>{r.value&&(l(),s=n.matchMedia(lt(e)),"addEventListener"in s?s.addEventListener("change",i):s.addListener(i),o.value=s.matches)});return Dr(()=>{c(),l(),s=void 0}),o}const sn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},on="__vueuse_ssr_handlers__",Zc=Gc();function Gc(){return on in sn||(sn[on]=sn[on]||{}),sn[on]}function Zo(e,t){return Zc[e]||t}function ea(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"?"object":Number.isNaN(e)?"any":"number"}const ta={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()}},Fs="vueuse-storage";function na(e,t,n,r={}){var s;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:a=!1,shallow:d,window:h=xt,eventFilter:y,onError:C=E=>{console.error(E)},initOnMounted:F}=r,O=(d?oo:me)(typeof t=="function"?t():t);if(!n)try{n=Zo("getDefaultStorage",()=>{var E;return(E=xt)==null?void 0:E.localStorage})()}catch(E){C(E)}if(!n)return O;const D=lt(t),W=ea(D),q=(s=r.serializer)!=null?s:ta[W],{pause:m,resume:p}=Yc(O,()=>P(O.value),{flush:o,deep:i,eventFilter:y});return h&&l&&Xo(()=>{Cn(h,"storage",S),Cn(h,Fs,$),F&&S()}),F||S(),O;function P(E){try{if(E==null)n.removeItem(e);else{const T=q.write(E),U=n.getItem(e);U!==T&&(n.setItem(e,T),h&&h.dispatchEvent(new CustomEvent(Fs,{detail:{key:e,oldValue:U,newValue:T,storageArea:n}})))}}catch(T){C(T)}}function k(E){const T=E?E.newValue:n.getItem(e);if(T==null)return c&&D!==null&&n.setItem(e,q.write(D)),D;if(!E&&a){const U=q.read(T);return typeof a=="function"?a(U,D):W==="object"&&!Array.isArray(U)?{...D,...U}:U}else return typeof T!="string"?T:q.read(T)}function $(E){S(E.detail)}function S(E){if(!(E&&E.storageArea!==n)){if(E&&E.key==null){O.value=D;return}if(!(E&&E.key!==e)){m();try{(E==null?void 0:E.newValue)!==q.write(O.value)&&(O.value=k(E))}catch(T){C(T)}finally{E?Fn(p):p()}}}}}function ra(e){return Qc("(prefers-color-scheme: dark)",e)}function sa(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=xt,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:a,disableTransition:d=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},y=ra({window:s}),C=oe(()=>y.value?"dark":"light"),F=c||(i==null?Jo(r):na(i,r,o,{window:s,listenToStorageChanges:l})),O=oe(()=>F.value==="auto"?C.value:F.value),D=Zo("updateHTMLAttrs",(p,P,k)=>{const $=typeof p=="string"?s==null?void 0:s.document.querySelector(p):Qo(p);if(!$)return;let S;if(d){S=s.document.createElement("style");const E="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";S.appendChild(document.createTextNode(E)),s.document.head.appendChild(S)}if(P==="class"){const E=k.split(/\s/g);Object.values(h).flatMap(T=>(T||"").split(/\s/g)).filter(Boolean).forEach(T=>{E.includes(T)?$.classList.add(T):$.classList.remove(T)})}else $.setAttribute(P,k);d&&(s.getComputedStyle(S).opacity,document.head.removeChild(S))});function W(p){var P;D(t,n,(P=h[p])!=null?P:p)}function q(p){e.onChanged?e.onChanged(p,W):W(p)}Ye(O,q,{flush:"post",immediate:!0}),Xo(()=>q(O.value));const m=oe({get(){return a?F.value:O.value},set(p){F.value=p}});try{return Object.assign(m,{store:F,system:C,state:O})}catch{return m}}function oa(e={}){const{valueDark:t="dark",valueLight:n=""}=e,r=sa({...e,onChanged:(o,i)=>{var l;e.onChanged?(l=e.onChanged)==null||l.call(e,o==="dark",i,o):i(o)},modes:{dark:t,light:n}});return oe({get(){return r.value==="dark"},set(o){const i=o?"dark":"light";r.system.value===i?r.value="auto":r.value=i}})}function Qn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Go(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const ln=new WeakMap;function Za(e,t=!1){const n=me(t);let r=null,s;Ye(Jo(e),l=>{const c=Qn(lt(l));if(c){const a=c;ln.get(a)||ln.set(a,s),n.value&&(a.style.overflow="hidden")}},{immediate:!0});const o=()=>{const l=Qn(lt(e));!l||n.value||(Ms&&(r=Cn(l,"touchmove",c=>{ia(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{var l;const c=Qn(lt(e));!c||!n.value||(Ms&&(r==null||r()),c.style.overflow=(l=ln.get(c))!=null?l:"",ln.delete(c),n.value=!1)};return Dr(i),oe({get(){return n.value},set(l){l?o():i()}})}function Ga(e={}){const{window:t=xt,behavior:n="auto"}=e;if(!t)return{x:me(0),y:me(0)};const r=me(t.scrollX),s=me(t.scrollY),o=oe({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),i=oe({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return Cn(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:o,y:i}}const ei=/^(?:[a-z]+:|\/\/)/i,la="vitepress-theme-appearance",ti=/#.*$/,ca=/(index)?\.(md|html)$/,Ee=typeof document<"u",ni={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function aa(e,t,n=!1){if(t===void 0)return!1;if(e=Ps(`/${e}`),n)return new RegExp(t).test(e);if(Ps(t)!==e)return!1;const r=t.match(ti);return r?(Ee?location.hash:"")===r[0]:!0}function Ps(e){return decodeURI(e).replace(ti,"").replace(ca,"")}function fa(e){return ei.test(e)}function ua(e,t){var r,s,o,i,l,c,a;const n=Object.keys(e.locales).find(d=>d!=="root"&&!fa(d)&&aa(t,`/${d}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:si(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function ri(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=da(e.title,r);return`${n}${s}`}function da(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function ha(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([o,i])=>o===n&&i[s[0]]===s[1])}function si(e,t){return[...e.filter(n=>!ha(t,n)),...t]}const pa=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ga=/^[a-z]:/i;function Is(e){const t=ga.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(pa,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const ma=Symbol(),ct=oo(kc);function ef(e){const t=oe(()=>ua(ct.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?me(!0):n?oa({storageKey:la,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):me(!1);return{site:t,theme:oe(()=>t.value.themeConfig),page:oe(()=>e.data),frontmatter:oe(()=>e.data.frontmatter),params:oe(()=>e.data.params),lang:oe(()=>t.value.lang),dir:oe(()=>t.value.dir),localeIndex:oe(()=>t.value.localeIndex||"root"),title:oe(()=>ri(t.value,e.data)),description:oe(()=>e.data.description||t.value.description),isDark:r}}function ya(){const e=vt(ma);if(!e)throw new Error("vitepress data not properly injected in app");return e}function _a(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Ls(e){return ei.test(e)||!e.startsWith("/")?e:_a(ct.value.base,e)}function ba(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ee){const n="/";t=Is(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${Is(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let dn=[];function tf(e){dn.push(e),$n(()=>{dn=dn.filter(t=>t!==e)})}const va=Symbol(),oi="http://a.com",wa=()=>({path:"/",component:null,data:ni});function nf(e,t){const n=On(wa()),r={route:n,go:s};async function s(l=Ee?location.href:"/"){var c,a;l=pr(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&($s(l),await i(l),await((a=r.onAfterRouteChanged)==null?void 0:a.call(r,l)))}let o=null;async function i(l,c=0,a=!1){var y;if(await((y=r.onBeforePageLoad)==null?void 0:y.call(r,l))===!1)return;const d=new URL(l,oi),h=o=d.pathname;try{let C=await e(h);if(!C)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:F,__pageData:O}=C;if(!F)throw new Error(`Invalid route component: ${F}`);n.path=Ee?h:Ls(h),n.component=Lt(F),n.data=Lt(O),Ee&&Fn(()=>{let D=ct.value.base+O.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ct.value.cleanUrls&&!D.endsWith("/")&&(D+=".html"),D!==d.pathname&&(d.pathname=D,l=D+d.search+d.hash,history.replaceState(null,"",l)),d.hash&&!c){let W=null;try{W=document.getElementById(decodeURIComponent(d.hash).slice(1))}catch(q){console.warn(q)}if(W){Ns(W,d.hash);return}}window.scrollTo(0,c)})}}catch(C){if(!/fetch|Page not found/.test(C.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(C),!a)try{const F=await fetch(ct.value.base+"hashmap.json");window.__VP_HASH_MAP__=await F.json(),await i(l,c,!0);return}catch{}o===h&&(o=null,n.path=Ee?h:Ls(h),n.component=t?Lt(t):null,n.data=ni)}}return Ee&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:d}=a,{href:h,origin:y,pathname:C,hash:F,search:O}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),D=window.location,W=C.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!d&&y===D.origin&&!(W&&W[0]!==".html")&&(l.preventDefault(),C===D.pathname&&O===D.search?(F!==D.hash&&(history.pushState(null,"",F),window.dispatchEvent(new Event("hashchange"))),F?Ns(a,F,a.classList.contains("header-anchor")):($s(h),window.scrollTo(0,0))):s(h))}},{capture:!0}),window.addEventListener("popstate",l=>{i(pr(location.href),l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function Ca(){const e=vt(va);if(!e)throw new Error("useRouter() is called without provider.");return e}function ii(){return Ca().route}function Ns(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let a=function(){!n||Math.abs(c-window.scrollY)>window.innerHeight?window.scrollTo(0,c):window.scrollTo({left:0,top:c,behavior:"smooth"})},s=ct.value.scrollOffset,o=0,i=24;if(typeof s=="object"&&"padding"in s&&(i=s.padding,s=s.selector),typeof s=="number")o=s;else if(typeof s=="string")o=Hs(s,i);else if(Array.isArray(s))for(const d of s){const h=Hs(d,i);if(h){o=h;break}}const l=parseInt(window.getComputedStyle(r).paddingTop,10),c=window.scrollY+r.getBoundingClientRect().top-o+l;requestAnimationFrame(a)}}function Hs(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}function $s(e){Ee&&e!==pr(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function pr(e){const t=new URL(e,oi);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ct.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const Ds=()=>dn.forEach(e=>e()),rf=Co({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=ii(),{site:n}=ya();return()=>dr(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?dr(t.component,{onVnodeMounted:Ds,onVnodeUpdated:Ds}):"404 Page Not Found"])}}),Ea="modulepreload",xa=function(e){return"/"+e},js={},sf=function(t,n,r){if(!n||n.length===0)return t();const s=document.getElementsByTagName("link");return Promise.all(n.map(o=>{if(o=xa(o),o in js)return;js[o]=!0;const i=o.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(!!r)for(let d=s.length-1;d>=0;d--){const h=s[d];if(h.href===o&&(!i||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${l}`))return;const a=document.createElement("link");if(a.rel=i?"stylesheet":Ea,i||(a.as="script",a.crossOrigin=""),a.href=o,document.head.appendChild(a),i)return new Promise((d,h)=>{a.addEventListener("load",d),a.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},of=Co({setup(e,{slots:t}){const n=me(!1);return St(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function lf(){Ee&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const o=r.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(a=>a.classList.contains("active"));if(!i)return;const l=o.children[s];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function cf(){if(Ee){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,o=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className);let l="";o.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` +`),l=l.slice(0,-1),i&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),Ta(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function Ta(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function af(e,t){let n=[],r=!0;const s=o=>{if(r){r=!1;return}const i=o.map(Bs);n.forEach((l,c)=>{const a=i.findIndex(d=>d==null?void 0:d.isEqualNode(l??null));a!==-1?delete i[a]:(l==null||l.remove(),delete n[c])}),i.forEach(l=>l&&document.head.appendChild(l)),n=[...n,...i].filter(Boolean)};yo(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[],a=ri(i,o);a!==document.title&&(document.title=a);const d=l||i.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==d&&h.setAttribute("content",d):Bs(["meta",{name:"description",content:d}]),s(si(i.head,Sa(c)))})}function Bs([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function Aa(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Sa(e){return e.filter(t=>!Aa(t))}const Zn=new Set,li=()=>document.createElement("link"),Oa=e=>{const t=li();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Ra=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let cn;const Ma=Ee&&(cn=li())&&cn.relList&&cn.relList.supports&&cn.relList.supports("prefetch")?Oa:Ra;function ff(){if(!Ee||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const r=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!Zn.has(c)){Zn.add(c);const a=ba(c);a&&Ma(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):Zn.add(l))})})};St(r);const s=ii();Ye(()=>s.path,r),$n(()=>{n&&n.disconnect()})}export{jl as $,Ha as A,Tl as B,La as C,Da as D,oo as E,ge as F,tf as G,ue as H,Na as I,ei as J,ii as K,tc as L,vt as M,br as N,Fn as O,Ga as P,Wa as Q,Rn as R,sf as S,Wo as T,$a as U,qa as V,Ya as W,za as X,Ua as Y,Za as Z,Qa as _,Bo as a,Ja as a0,Ba as a1,ka as a2,af as a3,va as a4,ef as a5,ma as a6,rf as a7,of as a8,ct as a9,Xa as aa,nf as ab,ba as ac,ff as ad,cf as ae,lf as af,dr as ag,$o as b,Ka as c,Co as d,Va as e,Ls as f,oe as g,me as h,fa as i,St as j,jo as k,lo as l,Ia as m,vr as n,No as o,Pa as p,aa as q,ja as r,Ee as s,Fa as t,ya as u,Qc as v,fl as w,Ye as x,yo as y,$n as z}; diff --git a/assets/chunks/theme.f416749a.js b/assets/chunks/theme.f4c1baac.js similarity index 99% rename from assets/chunks/theme.f416749a.js rename to assets/chunks/theme.f4c1baac.js index e867c10..77392e2 100644 --- a/assets/chunks/theme.f416749a.js +++ b/assets/chunks/theme.f4c1baac.js @@ -1 +1 @@ -import{d as $,o as r,c,r as h,n as B,a as j,t as x,_ as k,b as V,w as v,T as Se,e as g,u as Ue,i as it,f as he,g as L,h as M,j as Z,k as d,l,p as q,m as R,q as X,s as ee,v as $e,x as Q,y as ve,z as Le,A as qe,B as rt,C as W,F as A,D,E as Me,G as se,H as f,I as Y,J as Re,K as pe,L as re,M as fe,N as lt,O as ct,P as Ke,Q as ut,R as dt,S as _t,U as ze,V as ht,W as We,X as vt,Y as pt,Z as Je,$ as Ye,a0 as ft,a1 as mt,a2 as gt}from"./framework.a5027060.js";const kt=$({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,s)=>(r(),c("span",{class:B(["VPBadge",t.type])},[h(t.$slots,"default",{},()=>[j(x(t.text),1)],!0)],2))}});const bt=k(kt,[["__scopeId","data-v-ea5b2908"]]),yt={key:0,class:"VPBackdrop"},$t=$({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,s)=>(r(),V(Se,{name:"fade"},{default:v(()=>[t.show?(r(),c("div",yt)):g("",!0)]),_:1}))}});const Pt=k($t,[["__scopeId","data-v-54a304ca"]]),C=Ue;function Vt(e,t){let s,n=!1;return()=>{s&&clearTimeout(s),n?s=setTimeout(e,t):(e(),(n=!0)&&setTimeout(()=>n=!1,t))}}function Pe(e){return/^\//.test(e)?e:`/${e}`}function ne(e){const{pathname:t,search:s,hash:n,protocol:o}=new URL(e,"http://a.com");if(it(e)||e.startsWith("#")||!o.startsWith("http")||/\.(?!html|md)\w+($|\?)/i.test(e))return e;const{site:a}=C(),i=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,a.value.cleanUrls?"":".html")}${s}${n}`);return he(i)}function oe({removeCurrent:e=!0,correspondingLink:t=!1}={}){const{site:s,localeIndex:n,page:o,theme:a}=C(),i=L(()=>{var _,p;return{label:(_=s.value.locales[n.value])==null?void 0:_.label,link:((p=s.value.locales[n.value])==null?void 0:p.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:L(()=>Object.entries(s.value.locales).flatMap(([_,p])=>e&&i.value.label===p.label?[]:{text:p.label,link:wt(p.link||(_==="root"?"/":`/${_}/`),a.value.i18nRouting!==!1&&t,o.value.relativePath.slice(i.value.link.length-1),!s.value.cleanUrls)})),currentLang:i}}function wt(e,t,s,n){return t?e.replace(/\/$/,"")+Pe(s.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):e}const St=e=>(q("data-v-b9c0c15a"),e=e(),R(),e),Lt={class:"NotFound"},Mt={class:"code"},xt={class:"title"},Ct=St(()=>d("div",{class:"divider"},null,-1)),It={class:"quote"},Tt={class:"action"},Nt=["href","aria-label"],At=$({__name:"NotFound",setup(e){const{site:t,theme:s}=C(),{localeLinks:n}=oe({removeCurrent:!1}),o=M("/");return Z(()=>{var i;const a=window.location.pathname.replace(t.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((i=n.value.find(({link:u})=>u.startsWith(a)))==null?void 0:i.link)||n.value[0].link)}),(a,i)=>{var u,_,p,m,b;return r(),c("div",Lt,[d("p",Mt,x(((u=l(s).notFound)==null?void 0:u.code)??"404"),1),d("h1",xt,x(((_=l(s).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),Ct,d("blockquote",It,x(((p=l(s).notFound)==null?void 0:p.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",Tt,[d("a",{class:"link",href:l(he)(o.value),"aria-label":((m=l(s).notFound)==null?void 0:m.linkLabel)??"go to home"},x(((b=l(s).notFound)==null?void 0:b.linkText)??"Take me home"),9,Nt)])])}}});const Bt=k(At,[["__scopeId","data-v-b9c0c15a"]]);function Xe(e,t){if(Array.isArray(e))return le(e);if(e==null)return[];t=Pe(t);const s=Object.keys(e).sort((o,a)=>a.split("/").length-o.split("/").length).find(o=>t.startsWith(Pe(o))),n=s?e[s]:[];return Array.isArray(n)?le(n):le(n.items,n.base)}function Ht(e){const t=[];let s=0;for(const n in e){const o=e[n];if(o.items){s=t.push(o);continue}t[s]||t.push({items:[]}),t[s].items.push(o)}return t}function zt(e){const t=[];function s(n){for(const o of n)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&s(o.items)}return s(e),t}function Ve(e,t){return Array.isArray(t)?t.some(s=>Ve(e,s)):X(e,t.link)?!0:t.items?Ve(e,t.items):!1}function le(e,t){return[...e].map(s=>{const n={...s},o=n.base||t;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=le(n.items,o)),n})}function K(){const{frontmatter:e,page:t,theme:s}=C(),n=$e("(min-width: 960px)"),o=M(!1),a=L(()=>{const I=s.value.sidebar,S=t.value.relativePath;return I?Xe(I,S):[]}),i=M(a.value);Q(a,(I,S)=>{JSON.stringify(I)!==JSON.stringify(S)&&(i.value=a.value)});const u=L(()=>e.value.sidebar!==!1&&i.value.length>0&&e.value.layout!=="home"),_=L(()=>p?e.value.aside==null?s.value.aside==="left":e.value.aside==="left":!1),p=L(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:s.value.aside!==!1),m=L(()=>u.value&&n.value),b=L(()=>u.value?Ht(i.value):[]);function w(){o.value=!0}function y(){o.value=!1}function P(){o.value?y():w()}return{isOpen:o,sidebar:i,sidebarGroups:b,hasSidebar:u,hasAside:p,leftAside:_,isSidebarEnabled:m,open:w,close:y,toggle:P}}function Dt(e,t){let s;ve(()=>{s=e.value?document.activeElement:void 0}),Z(()=>{window.addEventListener("keyup",n)}),Le(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&e.value&&(t(),s==null||s.focus())}}const Ze=M(ee?location.hash:"");ee&&window.addEventListener("hashchange",()=>{Ze.value=location.hash});function Et(e){const{page:t}=C(),s=M(!1),n=L(()=>e.value.collapsed!=null),o=L(()=>!!e.value.link),a=M(!1),i=()=>{a.value=X(t.value.relativePath,e.value.link)};Q([t,e,Ze],i),Z(i);const u=L(()=>a.value?!0:e.value.items?Ve(t.value.relativePath,e.value.items):!1),_=L(()=>!!(e.value.items&&e.value.items.length));ve(()=>{s.value=!!(n.value&&e.value.collapsed)}),qe(()=>{(a.value||u.value)&&(s.value=!1)});function p(){n.value&&(s.value=!s.value)}return{collapsed:s,collapsible:n,isLink:o,isActiveLink:a,hasActiveLink:u,hasChildren:_,toggle:p}}function Ot(){const{hasSidebar:e}=K(),t=$e("(min-width: 960px)"),s=$e("(min-width: 1280px)");return{isAsideEnabled:L(()=>!s.value&&!t.value?!1:e.value?s.value:t.value)}}const Ft=71;function xe(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function Ce(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(s=>s.id&&s.hasChildNodes()).map(s=>{const n=Number(s.tagName[1]);return{title:jt(s),link:"#"+s.id,level:n}});return Gt(t,e)}function jt(e){let t="";for(const s of e.childNodes)if(s.nodeType===1){if(s.classList.contains("VPBadge")||s.classList.contains("header-anchor"))continue;t+=s.textContent}else s.nodeType===3&&(t+=s.textContent);return t.trim()}function Gt(e,t){if(t===!1)return[];const s=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[n,o]=typeof s=="number"?[s,s]:s==="deep"?[2,6]:s;e=e.filter(i=>i.level>=n&&i.level<=o);const a=[];e:for(let i=0;i=0;_--){const p=e[_];if(p.level{requestAnimationFrame(a),window.addEventListener("scroll",n)}),rt(()=>{i(location.hash)}),Le(()=>{window.removeEventListener("scroll",n)});function a(){if(!s.value)return;const u=[].slice.call(e.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(y=>u.some(P=>P.hash===y.hash&&y.offsetParent!==null)),p=window.scrollY,m=window.innerHeight,b=document.body.offsetHeight,w=Math.abs(p+m-b)<1;if(_.length&&w){i(_[_.length-1].hash);return}for(let y=0;y<_.length;y++){const P=_[y],I=_[y+1],[S,E]=qt(y,P,I);if(S){i(E);return}}}function i(u){o&&o.classList.remove("active"),u==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(u)}"]`);const _=o;_?(_.classList.add("active"),t.value.style.top=_.offsetTop+33+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function De(e){return e.parentElement.offsetTop-Ft}function qt(e,t,s){const n=window.scrollY;return e===0&&n===0?[!0,null]:n{const o=W("VPDocOutlineItem",!0);return r(),c("ul",{class:B(s.root?"root":"nested")},[(r(!0),c(A,null,D(s.headers,({children:a,link:i,title:u})=>(r(),c("li",null,[d("a",{class:"outline-link",href:i,onClick:t,title:u},x(u),9,Rt),a!=null&&a.length?(r(),V(o,{key:0,headers:a},null,8,["headers"])):g("",!0)]))),256))],2)}}});const Ie=k(Kt,[["__scopeId","data-v-463da30f"]]),Wt=e=>(q("data-v-3a6c4994"),e=e(),R(),e),Jt={class:"content"},Yt={class:"outline-title",role:"heading","aria-level":"2"},Xt={"aria-labelledby":"doc-outline-aria-label"},Zt=Wt(()=>d("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Qt=$({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:s}=C(),n=Me([]);se(()=>{n.value=Ce(t.value.outline??s.value.outline)});const o=M(),a=M();return Ut(o,a),(i,u)=>(r(),c("div",{class:B(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[d("div",Jt,[d("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),d("div",Yt,x(l(xe)(l(s))),1),d("nav",Xt,[Zt,f(Ie,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const es=k(Qt,[["__scopeId","data-v-3a6c4994"]]),ts={class:"VPDocAsideCarbonAds"},ss=$({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(s,n)=>(r(),c("div",ts,[f(l(t),{"carbon-ads":s.carbonAds},null,8,["carbon-ads"])]))}}),ns=e=>(q("data-v-cb998dce"),e=e(),R(),e),os={class:"VPDocAside"},as=ns(()=>d("div",{class:"spacer"},null,-1)),is=$({__name:"VPDocAside",setup(e){const{theme:t}=C();return(s,n)=>(r(),c("div",os,[h(s.$slots,"aside-top",{},void 0,!0),h(s.$slots,"aside-outline-before",{},void 0,!0),f(es),h(s.$slots,"aside-outline-after",{},void 0,!0),as,h(s.$slots,"aside-ads-before",{},void 0,!0),l(t).carbonAds?(r(),V(ss,{key:0,"carbon-ads":l(t).carbonAds},null,8,["carbon-ads"])):g("",!0),h(s.$slots,"aside-ads-after",{},void 0,!0),h(s.$slots,"aside-bottom",{},void 0,!0)]))}});const rs=k(is,[["__scopeId","data-v-cb998dce"]]);function ls(){const{theme:e,page:t}=C();return L(()=>{const{text:s="Edit this page",pattern:n=""}=e.value.editLink||{};let o;return typeof n=="function"?o=n(t.value):o=n.replace(/:path/g,t.value.filePath),{url:o,text:s}})}function cs(){const{page:e,theme:t,frontmatter:s}=C();return L(()=>{var _,p,m,b,w,y,P,I;const n=Xe(t.value.sidebar,e.value.relativePath),o=zt(n),a=o.findIndex(S=>X(e.value.relativePath,S.link)),i=((_=t.value.docFooter)==null?void 0:_.prev)===!1&&!s.value.prev||s.value.prev===!1,u=((p=t.value.docFooter)==null?void 0:p.next)===!1&&!s.value.next||s.value.next===!1;return{prev:i?void 0:{text:(typeof s.value.prev=="string"?s.value.prev:typeof s.value.prev=="object"?s.value.prev.text:void 0)??((m=o[a-1])==null?void 0:m.docFooterText)??((b=o[a-1])==null?void 0:b.text),link:(typeof s.value.prev=="object"?s.value.prev.link:void 0)??((w=o[a-1])==null?void 0:w.link)},next:u?void 0:{text:(typeof s.value.next=="string"?s.value.next:typeof s.value.next=="object"?s.value.next.text:void 0)??((y=o[a+1])==null?void 0:y.docFooterText)??((P=o[a+1])==null?void 0:P.text),link:(typeof s.value.next=="object"?s.value.next.link:void 0)??((I=o[a+1])==null?void 0:I.link)}}})}const us={},ds={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},_s=d("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),hs=d("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),vs=[_s,hs];function ps(e,t){return r(),c("svg",ds,vs)}const fs=k(us,[["render",ps]]),J=$({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,s=L(()=>t.tag??(t.href?"a":"span")),n=L(()=>t.href&&Re.test(t.href));return(o,a)=>(r(),V(Y(s.value),{class:B(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?l(ne)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[h(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),ms={class:"VPLastUpdated"},gs=["datetime"],ks=$({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:s,frontmatter:n,lang:o}=C(),a=L(()=>new Date(n.value.lastUpdated??s.value.lastUpdated)),i=L(()=>a.value.toISOString()),u=M("");return Z(()=>{ve(()=>{var _,p,m;u.value=new Intl.DateTimeFormat((p=(_=t.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&p.forceLocale?o.value:void 0,((m=t.value.lastUpdated)==null?void 0:m.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(a.value)})}),(_,p)=>{var m;return r(),c("p",ms,[j(x(((m=l(t).lastUpdated)==null?void 0:m.text)||l(t).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:i.value},x(u.value),9,gs)])}}});const bs=k(ks,[["__scopeId","data-v-19a7ae4e"]]),ys={key:0,class:"VPDocFooter"},$s={key:0,class:"edit-info"},Ps={key:0,class:"edit-link"},Vs={key:1,class:"last-updated"},ws={key:1,class:"prev-next"},Ss={class:"pager"},Ls=["href"],Ms=["innerHTML"],xs=["innerHTML"],Cs={class:"pager"},Is=["href"],Ts=["innerHTML"],Ns=["innerHTML"],As=$({__name:"VPDocFooter",setup(e){const{theme:t,page:s,frontmatter:n}=C(),o=ls(),a=cs(),i=L(()=>t.value.editLink&&n.value.editLink!==!1),u=L(()=>s.value.lastUpdated&&n.value.lastUpdated!==!1),_=L(()=>i.value||u.value||a.value.prev||a.value.next);return(p,m)=>{var b,w,y,P,I,S;return _.value?(r(),c("footer",ys,[h(p.$slots,"doc-footer-before",{},void 0,!0),i.value||u.value?(r(),c("div",$s,[i.value?(r(),c("div",Ps,[f(J,{class:"edit-link-button",href:l(o).url,"no-icon":!0},{default:v(()=>[f(fs,{class:"edit-link-icon","aria-label":"edit icon"}),j(" "+x(l(o).text),1)]),_:1},8,["href"])])):g("",!0),u.value?(r(),c("div",Vs,[f(bs)])):g("",!0)])):g("",!0),(b=l(a).prev)!=null&&b.link||(w=l(a).next)!=null&&w.link?(r(),c("nav",ws,[d("div",Ss,[(y=l(a).prev)!=null&&y.link?(r(),c("a",{key:0,class:"pager-link prev",href:l(ne)(l(a).prev.link)},[d("span",{class:"desc",innerHTML:((P=l(t).docFooter)==null?void 0:P.prev)||"Previous page"},null,8,Ms),d("span",{class:"title",innerHTML:l(a).prev.text},null,8,xs)],8,Ls)):g("",!0)]),d("div",Cs,[(I=l(a).next)!=null&&I.link?(r(),c("a",{key:0,class:"pager-link next",href:l(ne)(l(a).next.link)},[d("span",{class:"desc",innerHTML:((S=l(t).docFooter)==null?void 0:S.next)||"Next page"},null,8,Ts),d("span",{class:"title",innerHTML:l(a).next.text},null,8,Ns)],8,Is)):g("",!0)])])):g("",!0)])):g("",!0)}}});const Bs=k(As,[["__scopeId","data-v-a2d931e4"]]),Hs={},zs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ds=d("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),Es=[Ds];function Os(e,t){return r(),c("svg",zs,Es)}const Te=k(Hs,[["render",Os]]),Fs={key:0,class:"VPDocOutlineDropdown"},js={key:0,class:"items"},Gs=$({__name:"VPDocOutlineDropdown",setup(e){const{frontmatter:t,theme:s}=C(),n=M(!1);se(()=>{n.value=!1});const o=Me([]);return se(()=>{o.value=Ce(t.value.outline??s.value.outline)}),(a,i)=>o.value.length>0?(r(),c("div",Fs,[d("button",{onClick:i[0]||(i[0]=u=>n.value=!n.value),class:B({open:n.value})},[j(x(l(xe)(l(s)))+" ",1),f(Te,{class:"icon"})],2),n.value?(r(),c("div",js,[f(Ie,{headers:o.value},null,8,["headers"])])):g("",!0)])):g("",!0)}});const Us=k(Gs,[["__scopeId","data-v-95bb0785"]]),qs=e=>(q("data-v-a3c25e27"),e=e(),R(),e),Rs={class:"container"},Ks=qs(()=>d("div",{class:"aside-curtain"},null,-1)),Ws={class:"aside-container"},Js={class:"aside-content"},Ys={class:"content"},Xs={class:"content-container"},Zs={class:"main"},Qs=$({__name:"VPDoc",setup(e){const{theme:t}=C(),s=pe(),{hasSidebar:n,hasAside:o,leftAside:a}=K(),i=L(()=>s.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(u,_)=>{const p=W("Content");return r(),c("div",{class:B(["VPDoc",{"has-sidebar":l(n),"has-aside":l(o)}])},[h(u.$slots,"doc-top",{},void 0,!0),d("div",Rs,[l(o)?(r(),c("div",{key:0,class:B(["aside",{"left-aside":l(a)}])},[Ks,d("div",Ws,[d("div",Js,[f(rs,null,{"aside-top":v(()=>[h(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[h(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[h(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[h(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[h(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[h(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):g("",!0),d("div",Ys,[d("div",Xs,[h(u.$slots,"doc-before",{},void 0,!0),f(Us),d("main",Zs,[f(p,{class:B(["vp-doc",[i.value,l(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),f(Bs,null,{"doc-footer-before":v(()=>[h(u.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),h(u.$slots,"doc-after",{},void 0,!0)])])]),h(u.$slots,"doc-bottom",{},void 0,!0)],2)}}});const en=k(Qs,[["__scopeId","data-v-a3c25e27"]]),tn=$({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(e){const t=e,s=L(()=>t.href&&Re.test(t.href)),n=L(()=>t.tag||t.href?"a":"button");return(o,a)=>(r(),V(Y(n.value),{class:B(["VPButton",[o.size,o.theme]]),href:o.href?l(ne)(o.href):void 0,target:s.value?"_blank":void 0,rel:s.value?"noreferrer":void 0},{default:v(()=>[j(x(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const sn=k(tn,[["__scopeId","data-v-1e76fe75"]]),nn=["src","alt"],on=$({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,s)=>{const n=W("VPImage",!0);return t.image?(r(),c(A,{key:0},[typeof t.image=="string"||"src"in t.image?(r(),c("img",re({key:0,class:"VPImage"},typeof t.image=="string"?t.$attrs:{...t.image,...t.$attrs},{src:l(he)(typeof t.image=="string"?t.image:t.image.src),alt:t.alt??(typeof t.image=="string"?"":t.image.alt||"")}),null,16,nn)):(r(),c(A,{key:1},[f(n,re({class:"dark",image:t.image.dark,alt:t.image.alt},t.$attrs),null,16,["image","alt"]),f(n,re({class:"light",image:t.image.light,alt:t.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}});const ue=k(on,[["__scopeId","data-v-ab19afbb"]]),an=e=>(q("data-v-5a3e9999"),e=e(),R(),e),rn={class:"container"},ln={class:"main"},cn={key:0,class:"name"},un=["innerHTML"],dn=["innerHTML"],_n=["innerHTML"],hn={key:0,class:"actions"},vn={key:0,class:"image"},pn={class:"image-container"},fn=an(()=>d("div",{class:"image-bg"},null,-1)),mn=$({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=fe("hero-image-slot-exists");return(s,n)=>(r(),c("div",{class:B(["VPHero",{"has-image":s.image||l(t)}])},[d("div",rn,[d("div",ln,[h(s.$slots,"home-hero-info",{},()=>[s.name?(r(),c("h1",cn,[d("span",{innerHTML:s.name,class:"clip"},null,8,un)])):g("",!0),s.text?(r(),c("p",{key:1,innerHTML:s.text,class:"text"},null,8,dn)):g("",!0),s.tagline?(r(),c("p",{key:2,innerHTML:s.tagline,class:"tagline"},null,8,_n)):g("",!0)],!0),s.actions?(r(),c("div",hn,[(r(!0),c(A,null,D(s.actions,o=>(r(),c("div",{key:o.link,class:"action"},[f(sn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):g("",!0)]),s.image||l(t)?(r(),c("div",vn,[d("div",pn,[fn,h(s.$slots,"home-hero-image",{},()=>[s.image?(r(),V(ue,{key:0,class:"image-src",image:s.image},null,8,["image"])):g("",!0)],!0)])])):g("",!0)])],2))}});const gn=k(mn,[["__scopeId","data-v-5a3e9999"]]),kn=$({__name:"VPHomeHero",setup(e){const{frontmatter:t}=C();return(s,n)=>l(t).hero?(r(),V(gn,{key:0,class:"VPHomeHero",name:l(t).hero.name,text:l(t).hero.text,tagline:l(t).hero.tagline,image:l(t).hero.image,actions:l(t).hero.actions},{"home-hero-info":v(()=>[h(s.$slots,"home-hero-info")]),"home-hero-image":v(()=>[h(s.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):g("",!0)}}),bn={},yn={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},$n=d("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Pn=[$n];function Vn(e,t){return r(),c("svg",yn,Pn)}const wn=k(bn,[["render",Vn]]),Sn={class:"box"},Ln={key:0,class:"icon"},Mn=["innerHTML"],xn=["innerHTML"],Cn=["innerHTML"],In={key:4,class:"link-text"},Tn={class:"link-text-value"},Nn=$({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,s)=>(r(),V(J,{class:"VPFeature",href:t.link,rel:t.rel,target:t.target,"no-icon":!0,tag:t.link?"a":"div"},{default:v(()=>[d("article",Sn,[typeof t.icon=="object"&&t.icon.wrap?(r(),c("div",Ln,[f(ue,{image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])])):typeof t.icon=="object"?(r(),V(ue,{key:1,image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])):t.icon?(r(),c("div",{key:2,class:"icon",innerHTML:t.icon},null,8,Mn)):g("",!0),d("h2",{class:"title",innerHTML:t.title},null,8,xn),t.details?(r(),c("p",{key:3,class:"details",innerHTML:t.details},null,8,Cn)):g("",!0),t.linkText?(r(),c("div",In,[d("p",Tn,[j(x(t.linkText)+" ",1),f(wn,{class:"link-text-icon"})])])):g("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const An=k(Nn,[["__scopeId","data-v-ee984185"]]),Bn={key:0,class:"VPFeatures"},Hn={class:"container"},zn={class:"items"},Dn=$({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,s=L(()=>{const n=t.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,o)=>n.features?(r(),c("div",Bn,[d("div",Hn,[d("div",zn,[(r(!0),c(A,null,D(n.features,a=>(r(),c("div",{key:a.title,class:B(["item",[s.value]])},[f(An,{icon:a.icon,title:a.title,details:a.details,link:a.link,"link-text":a.linkText,rel:a.rel,target:a.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):g("",!0)}});const En=k(Dn,[["__scopeId","data-v-b1eea84a"]]),On=$({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=C();return(s,n)=>l(t).features?(r(),V(En,{key:0,class:"VPHomeFeatures",features:l(t).features},null,8,["features"])):g("",!0)}}),Fn={class:"VPHome"},jn=$({__name:"VPHome",setup(e){return(t,s)=>{const n=W("Content");return r(),c("div",Fn,[h(t.$slots,"home-hero-before",{},void 0,!0),f(kn,null,{"home-hero-info":v(()=>[h(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[h(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),h(t.$slots,"home-hero-after",{},void 0,!0),h(t.$slots,"home-features-before",{},void 0,!0),f(On),h(t.$slots,"home-features-after",{},void 0,!0),f(n)])}}});const Gn=k(jn,[["__scopeId","data-v-20eabd3a"]]),Un={},qn={class:"VPPage"};function Rn(e,t){const s=W("Content");return r(),c("div",qn,[h(e.$slots,"page-top"),f(s),h(e.$slots,"page-bottom")])}const Kn=k(Un,[["render",Rn]]),Wn=$({__name:"VPContent",setup(e){const{page:t,frontmatter:s}=C(),{hasSidebar:n}=K();return(o,a)=>(r(),c("div",{class:B(["VPContent",{"has-sidebar":l(n),"is-home":l(s).layout==="home"}]),id:"VPContent"},[l(t).isNotFound?h(o.$slots,"not-found",{key:0},()=>[f(Bt)],!0):l(s).layout==="page"?(r(),V(Kn,{key:1},{"page-top":v(()=>[h(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[h(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(s).layout==="home"?(r(),V(Gn,{key:2},{"home-hero-before":v(()=>[h(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[h(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[h(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[h(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[h(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[h(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(s).layout&&l(s).layout!=="doc"?(r(),V(Y(l(s).layout),{key:3})):(r(),V(en,{key:4},{"doc-top":v(()=>[h(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[h(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[h(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[h(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[h(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[h(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[h(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[h(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[h(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[h(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[h(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Jn=k(Wn,[["__scopeId","data-v-3cf691b6"]]),Yn={class:"container"},Xn=["innerHTML"],Zn=["innerHTML"],Qn=$({__name:"VPFooter",setup(e){const{theme:t,frontmatter:s}=C(),{hasSidebar:n}=K();return(o,a)=>l(t).footer&&l(s).footer!==!1?(r(),c("footer",{key:0,class:B(["VPFooter",{"has-sidebar":l(n)}])},[d("div",Yn,[l(t).footer.message?(r(),c("p",{key:0,class:"message",innerHTML:l(t).footer.message},null,8,Xn)):g("",!0),l(t).footer.copyright?(r(),c("p",{key:1,class:"copyright",innerHTML:l(t).footer.copyright},null,8,Zn)):g("",!0)])],2)):g("",!0)}});const eo=k(Qn,[["__scopeId","data-v-e4279f1c"]]),to={class:"header"},so={class:"outline"},no=$({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:s}=C(),n=M(!1),o=M(0),a=M();se(()=>{n.value=!1});function i(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function u(p){p.target.classList.contains("outline-link")&&(a.value&&(a.value.style.transition="none"),ct(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(p,m)=>(r(),c("div",{class:"VPLocalNavOutlineDropdown",style:lt({"--vp-vh":o.value+"px"})},[p.headers.length>0?(r(),c("button",{key:0,onClick:i,class:B({open:n.value})},[j(x(l(xe)(l(s)))+" ",1),f(Te,{class:"icon"})],2)):(r(),c("button",{key:1,onClick:_},x(l(s).returnToTopLabel||"Return to top"),1)),f(Se,{name:"flyout"},{default:v(()=>[n.value?(r(),c("div",{key:0,ref_key:"items",ref:a,class:"items",onClick:u},[d("div",to,[d("a",{class:"top-link",href:"#",onClick:_},x(l(s).returnToTopLabel||"Return to top"),1)]),d("div",so,[f(Ie,{headers:p.headers},null,8,["headers"])])],512)):g("",!0)]),_:1})],4))}});const oo=k(no,[["__scopeId","data-v-24251f6f"]]),ao={},io={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ro=d("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),lo=d("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),co=d("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),uo=d("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),_o=[ro,lo,co,uo];function ho(e,t){return r(),c("svg",io,_o)}const vo=k(ao,[["render",ho]]),po=["aria-expanded"],fo={class:"menu-text"},mo=$({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:s}=C(),{hasSidebar:n}=K(),{y:o}=Ke(),a=Me([]),i=M(0);Z(()=>{i.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),se(()=>{a.value=Ce(s.value.outline??t.value.outline)});const u=L(()=>a.value.length===0&&!n.value),_=L(()=>({VPLocalNav:!0,fixed:u.value,"reached-top":o.value>=i.value}));return(p,m)=>l(s).layout!=="home"&&(!u.value||l(o)>=i.value)?(r(),c("div",{key:0,class:B(_.value)},[l(n)?(r(),c("button",{key:0,class:"menu","aria-expanded":p.open,"aria-controls":"VPSidebarNav",onClick:m[0]||(m[0]=b=>p.$emit("open-menu"))},[f(vo,{class:"menu-icon"}),d("span",fo,x(l(t).sidebarMenuLabel||"Menu"),1)],8,po)):g("",!0),f(oo,{headers:a.value,navHeight:i.value},null,8,["headers","navHeight"])],2)):g("",!0)}});const go=k(mo,[["__scopeId","data-v-9e669cc1"]]);function ko(){const e=M(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function s(){e.value=!1,window.removeEventListener("resize",o)}function n(){e.value?s():t()}function o(){window.outerWidth>=768&&s()}const a=pe();return Q(()=>a.path,s),{isScreenOpen:e,openScreen:t,closeScreen:s,toggleScreen:n}}const bo={},yo={class:"VPSwitch",type:"button",role:"switch"},$o={class:"check"},Po={key:0,class:"icon"};function Vo(e,t){return r(),c("button",yo,[d("span",$o,[e.$slots.default?(r(),c("span",Po,[h(e.$slots,"default",{},void 0,!0)])):g("",!0)])])}const wo=k(bo,[["render",Vo],["__scopeId","data-v-1c29e291"]]),So={},Lo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Mo=d("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),xo=[Mo];function Co(e,t){return r(),c("svg",Lo,xo)}const Io=k(So,[["render",Co]]),To={},No={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ao=ut('',9),Bo=[Ao];function Ho(e,t){return r(),c("svg",No,Bo)}const zo=k(To,[["render",Ho]]),Do=$({__name:"VPSwitchAppearance",setup(e){const{isDark:t}=C(),s=fe("toggle-appearance",()=>{t.value=!t.value});return(n,o)=>(r(),V(wo,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":l(t),onClick:l(s)},{default:v(()=>[f(zo,{class:"sun"}),f(Io,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const Ne=k(Do,[["__scopeId","data-v-3329432d"]]),Eo={key:0,class:"VPNavBarAppearance"},Oo=$({__name:"VPNavBarAppearance",setup(e){const{site:t}=C();return(s,n)=>l(t).appearance&&l(t).appearance!=="force-dark"?(r(),c("div",Eo,[f(Ne)])):g("",!0)}});const Fo=k(Oo,[["__scopeId","data-v-283b26e9"]]),Ae=M();let Qe=!1,ke=0;function jo(e){const t=M(!1);if(ee){!Qe&&Go(),ke++;const s=Q(Ae,n=>{var o,a,i;n===e.el.value||(o=e.el.value)!=null&&o.contains(n)?(t.value=!0,(a=e.onFocus)==null||a.call(e)):(t.value=!1,(i=e.onBlur)==null||i.call(e))});Le(()=>{s(),ke--,ke||Uo()})}return dt(t)}function Go(){document.addEventListener("focusin",et),Qe=!0,Ae.value=document.activeElement}function Uo(){document.removeEventListener("focusin",et)}function et(){Ae.value=document.activeElement}const qo={},Ro={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ko=d("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Wo=[Ko];function Jo(e,t){return r(),c("svg",Ro,Wo)}const tt=k(qo,[["render",Jo]]),Yo={},Xo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Zo=d("circle",{cx:"12",cy:"12",r:"2"},null,-1),Qo=d("circle",{cx:"19",cy:"12",r:"2"},null,-1),ea=d("circle",{cx:"5",cy:"12",r:"2"},null,-1),ta=[Zo,Qo,ea];function sa(e,t){return r(),c("svg",Xo,ta)}const na=k(Yo,[["render",sa]]),oa={class:"VPMenuLink"},aa=$({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=C();return(s,n)=>(r(),c("div",oa,[f(J,{class:B({active:l(X)(l(t).relativePath,s.item.activeMatch||s.item.link,!!s.item.activeMatch)}),href:s.item.link,target:s.item.target,rel:s.item.rel},{default:v(()=>[j(x(s.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const me=k(aa,[["__scopeId","data-v-f51f088d"]]),ia={class:"VPMenuGroup"},ra={key:0,class:"title"},la=$({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,s)=>(r(),c("div",ia,[t.text?(r(),c("p",ra,x(t.text),1)):g("",!0),(r(!0),c(A,null,D(t.items,n=>(r(),c(A,null,["link"in n?(r(),V(me,{key:0,item:n},null,8,["item"])):g("",!0)],64))),256))]))}});const ca=k(la,[["__scopeId","data-v-a6b0397c"]]),ua={class:"VPMenu"},da={key:0,class:"items"},_a=$({__name:"VPMenu",props:{items:{}},setup(e){return(t,s)=>(r(),c("div",ua,[t.items?(r(),c("div",da,[(r(!0),c(A,null,D(t.items,n=>(r(),c(A,{key:n.text},["link"in n?(r(),V(me,{key:0,item:n},null,8,["item"])):(r(),V(ca,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):g("",!0),h(t.$slots,"default",{},void 0,!0)]))}});const ha=k(_a,[["__scopeId","data-v-e42ed9b3"]]),va=["aria-expanded","aria-label"],pa={key:0,class:"text"},fa=["innerHTML"],ma={class:"menu"},ga=$({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=M(!1),s=M();jo({el:s,onBlur:n});function n(){t.value=!1}return(o,a)=>(r(),c("div",{class:"VPFlyout",ref_key:"el",ref:s,onMouseenter:a[1]||(a[1]=i=>t.value=!0),onMouseleave:a[2]||(a[2]=i=>t.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":o.label,onClick:a[0]||(a[0]=i=>t.value=!t.value)},[o.button||o.icon?(r(),c("span",pa,[o.icon?(r(),V(Y(o.icon),{key:0,class:"option-icon"})):g("",!0),o.button?(r(),c("span",{key:1,innerHTML:o.button},null,8,fa)):g("",!0),f(tt,{class:"text-icon"})])):(r(),V(na,{key:1,class:"icon"}))],8,va),d("div",ma,[f(ha,{items:o.items},{default:v(()=>[h(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const Be=k(ga,[["__scopeId","data-v-aa8de344"]]),ka={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},ba=["href","aria-label","innerHTML"],ya=$({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,s=L(()=>typeof t.icon=="object"?t.icon.svg:ka[t.icon]);return(n,o)=>(r(),c("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:s.value},null,8,ba))}});const $a=k(ya,[["__scopeId","data-v-16cf740a"]]),Pa={class:"VPSocialLinks"},Va=$({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,s)=>(r(),c("div",Pa,[(r(!0),c(A,null,D(t.links,({link:n,icon:o,ariaLabel:a})=>(r(),V($a,{key:n,icon:o,link:n,ariaLabel:a},null,8,["icon","link","ariaLabel"]))),128))]))}});const He=k(Va,[["__scopeId","data-v-e71e869c"]]),wa={key:0,class:"group translations"},Sa={class:"trans-title"},La={key:1,class:"group"},Ma={class:"item appearance"},xa={class:"label"},Ca={class:"appearance-action"},Ia={key:2,class:"group"},Ta={class:"item social-links"},Na=$({__name:"VPNavBarExtra",setup(e){const{site:t,theme:s}=C(),{localeLinks:n,currentLang:o}=oe({correspondingLink:!0}),a=L(()=>n.value.length&&o.value.label||t.value.appearance||s.value.socialLinks);return(i,u)=>a.value?(r(),V(Be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[l(n).length&&l(o).label?(r(),c("div",wa,[d("p",Sa,x(l(o).label),1),(r(!0),c(A,null,D(l(n),_=>(r(),V(me,{key:_.link,item:_},null,8,["item"]))),128))])):g("",!0),l(t).appearance&&l(t).appearance!=="force-dark"?(r(),c("div",La,[d("div",Ma,[d("p",xa,x(l(s).darkModeSwitchLabel||"Appearance"),1),d("div",Ca,[f(Ne)])])])):g("",!0),l(s).socialLinks?(r(),c("div",Ia,[d("div",Ta,[f(He,{class:"social-links-list",links:l(s).socialLinks},null,8,["links"])])])):g("",!0)]),_:1})):g("",!0)}});const Aa=k(Na,[["__scopeId","data-v-8e87c032"]]),Ba=e=>(q("data-v-6bee1efd"),e=e(),R(),e),Ha=["aria-expanded"],za=Ba(()=>d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)),Da=[za],Ea=$({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,s)=>(r(),c("button",{type:"button",class:B(["VPNavBarHamburger",{active:t.active}]),"aria-label":"mobile navigation","aria-expanded":t.active,"aria-controls":"VPNavScreen",onClick:s[0]||(s[0]=n=>t.$emit("click"))},Da,10,Ha))}});const Oa=k(Ea,[["__scopeId","data-v-6bee1efd"]]),Fa=["innerHTML"],ja=$({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=C();return(s,n)=>(r(),V(J,{class:B({VPNavBarMenuLink:!0,active:l(X)(l(t).relativePath,s.item.activeMatch||s.item.link,!!s.item.activeMatch)}),href:s.item.link,target:s.item.target,rel:s.item.rel,tabindex:"0"},{default:v(()=>[d("span",{innerHTML:s.item.text},null,8,Fa)]),_:1},8,["class","href","target","rel"]))}});const Ga=k(ja,[["__scopeId","data-v-cb318fec"]]),Ua=$({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:s}=C(),n=a=>"link"in a?X(s.value.relativePath,a.link,!!t.item.activeMatch):a.items.some(n),o=L(()=>n(t.item));return(a,i)=>(r(),V(Be,{class:B({VPNavBarMenuGroup:!0,active:l(X)(l(s).relativePath,a.item.activeMatch,!!a.item.activeMatch)||o.value}),button:a.item.text,items:a.item.items},null,8,["class","button","items"]))}}),qa=e=>(q("data-v-f732b5d0"),e=e(),R(),e),Ra={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Ka=qa(()=>d("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Wa=$({__name:"VPNavBarMenu",setup(e){const{theme:t}=C();return(s,n)=>l(t).nav?(r(),c("nav",Ra,[Ka,(r(!0),c(A,null,D(l(t).nav,o=>(r(),c(A,{key:o.text},["link"in o?(r(),V(Ga,{key:0,item:o},null,8,["item"])):(r(),V(Ua,{key:1,item:o},null,8,["item"]))],64))),128))])):g("",!0)}});const Ja=k(Wa,[["__scopeId","data-v-f732b5d0"]]),Ya="/assets/flex-logo.2489261b.svg";function be(e,t){return typeof e>"u"?t:e}function Ee(e){const t=Array(e);for(let s=0;s=this.minlength&&(u||!i[m])){let w=ie(_,o,p),y="";switch(this.tokenize){case"full":if(3P;I--)if(I-P>=this.minlength){const S=ie(_,o,p,b,P);y=m.substring(P,I),this.push_index(i,y,S,e,s)}break}case"reverse":if(2=this.minlength){const I=ie(_,o,p,b,P);this.push_index(i,y,I,e,s)}y=""}case"forward":if(1=this.minlength&&this.push_index(i,y,w,e,s);break}default:if(this.boost&&(w=Math.min(0|w/this.boost(t,m,p),_-1)),this.push_index(i,m,w,e,s),u&&1=this.minlength&&!P[m]){P[m]=1;const T=ie(I+(o/2>I?0:1),o,p,E-1,N-1),H=this.bidirectional&&m>S;this.push_index(a,H?S:m,T,e,s,H?m:S)}}}}}this.fastupdate||(this.register[e]=1)}}return this};function ie(e,t,s,n,o){return s&&1=this.minlength&&!b[y]){if(!this.optimize&&!a&&!this.map[y])return i;w[I++]=y,b[y]=1}e=w,n=e.length}if(!n)return i;t||(t=100);let _,p=this.depth&&1=s)))));y++);if(p)return o?je(u,s,0):void(e[e.length]=u)}return!t&&u};function je(e,t,s){return e=e.length===1?e[0]:Za(e),s||e.length>t?e.slice(s,s+t):e}function Ge(e,t,s,n){if(s){const o=n&&t>s;e=e[o?t:s],e=e&&e[o?s:t]}else e=e[t];return e}O.prototype.contain=function(e){return!!this.register[e]},O.prototype.update=function(e,t){return this.remove(e).add(e,t)},O.prototype.remove=function(e,t){const s=this.register[e];if(s){if(this.fastupdate)for(let n,o=0;o{if(a.value){for(var N=b.value.search(a.value,{enrich:!0}),T=[],H=0;H!N||!N.length?[]:N.reduce((H,z)=>(H[T(z)]||(H[T(z)]=[]),H[T(z)].push(z),H),{}),S=()=>{setTimeout(()=>{u.value&&u.value.focus()},100),E(),o.value=!0};Z(async()=>{var z,U;const N=await _t(()=>import("./virtual_search-data.49d7e173.js"),[]);_.value=N.default.INDEX_DATA,p.value=N.default.PREVIEW_LOOKUP,m.value=N.default.Options,i.value=window.location.origin+he(s.value==="root"?"/":s.value),w.value=((z=m.value)==null?void 0:z.buttonLabel)||w.value,y.value=((U=m.value)==null?void 0:U.placeholder)||y.value;var T=new O(m.value);T.import("reg",_.value.reg),T.import("cfg",_.value.cfg),T.import("map",_.value.map),T.import("ctx",_.value.ctx),b.value=T,n.value.innerHTML=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"⌘":"Ctrl";const H=G=>{var ae;G.key==="k"&&(G.ctrlKey||G.metaKey)&&(G.preventDefault(),S()),G.key==="Escape"&&((ae=a.value)==null?void 0:ae.length)==0&&o.value&&(o.value=!1)};window.addEventListener("keydown",H)});function E(){o.value=!1,a.value=""}return(N,T)=>{const H=W("ClientOnly");return r(),c("div",gi,[f(H,null,{default:v(()=>[(r(),V(pt,{to:"body"},[ze(d("div",{class:"VPPluginSearch-modal-back",onClick:T[2]||(T[2]=z=>o.value=!1)},[d("div",{class:"VPPluginSearch-modal",onClick:T[1]||(T[1]=We(()=>{},["stop"]))},[d("form",ki,[bi,ze(d("input",{class:"DocSearch-Input","aria-autocomplete":"both","aria-labelledby":"docsearch-label",id:"docsearch-input",autocomplete:"off",autocorrect:"off",autocapitalize:"off",enterkeyhint:"search",spellcheck:"false",autofocus:"true","onUpdate:modelValue":T[0]||(T[0]=z=>a.value=z),placeholder:y.value,maxlength:"64",type:"search",ref_key:"input",ref:u},null,8,yi),[[vt,a.value]])]),d("div",$i,[(r(!0),c(A,null,D(I(P.value,z=>z.link.split("/").slice(0,-1).join("-")),(z,U)=>(r(),c("div",{key:U},[d("span",Pi,x(U?U.toString()[0].toUpperCase()+U.toString().slice(1):"Home"),1),(r(!0),c(A,null,D(z,G=>(r(),c("a",{href:i.value+G.link,key:G.id,onClick:E},[d("div",wi,[d("span",Si,x(G.link.includes("#")?"#":"▤"),1),d("div",Li,[d("h3",null,x(G.title),1),d("p",null,[d("div",{innerHTML:G.preview},null,8,Mi)])]),xi])],8,Vi))),128))]))),128))]),Ci])],512),[[ht,o.value]])]))]),_:1}),d("div",{id:"docsearch",onClick:T[3]||(T[3]=z=>S())},[d("button",Ii,[d("span",Ti,[Ni,d("span",Ai,x(w.value),1)]),d("span",Bi,[d("span",{class:"DocSearch-Button-Key",ref_key:"metaKey",ref:n},"Meta",512),Hi])])])])}}});const Di=$({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=C();return(s,n)=>l(t).socialLinks?(r(),V(He,{key:0,class:"VPNavBarSocialLinks",links:l(t).socialLinks},null,8,["links"])):g("",!0)}});const Ei=k(Di,[["__scopeId","data-v-ef6192dc"]]),Oi=["href"],Fi=$({__name:"VPNavBarTitle",setup(e){const{site:t,theme:s}=C(),{hasSidebar:n}=K(),{currentLang:o}=oe();return(a,i)=>(r(),c("div",{class:B(["VPNavBarTitle",{"has-sidebar":l(n)}])},[d("a",{class:"title",href:l(s).logoLink??l(ne)(l(o).link)},[h(a.$slots,"nav-bar-title-before",{},void 0,!0),l(s).logo?(r(),V(ue,{key:0,class:"logo",image:l(s).logo},null,8,["image"])):g("",!0),l(s).siteTitle?(r(),c(A,{key:1},[j(x(l(s).siteTitle),1)],64)):l(s).siteTitle===void 0?(r(),c(A,{key:2},[j(x(l(t).title),1)],64)):g("",!0),h(a.$slots,"nav-bar-title-after",{},void 0,!0)],8,Oi)],2))}});const ji=k(Fi,[["__scopeId","data-v-2973dbb4"]]),Gi={},Ui={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},qi=d("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ri=d("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Ki=[qi,Ri];function Wi(e,t){return r(),c("svg",Ui,Ki)}const st=k(Gi,[["render",Wi]]),Ji={class:"items"},Yi={class:"title"},Xi=$({__name:"VPNavBarTranslations",setup(e){const{theme:t}=C(),{localeLinks:s,currentLang:n}=oe({correspondingLink:!0});return(o,a)=>l(s).length&&l(n).label?(r(),V(Be,{key:0,class:"VPNavBarTranslations",icon:st,label:l(t).langMenuLabel||"Change language"},{default:v(()=>[d("div",Ji,[d("p",Yi,x(l(n).label),1),(r(!0),c(A,null,D(l(s),i=>(r(),V(me,{key:i.link,item:i},null,8,["item"]))),128))])]),_:1},8,["label"])):g("",!0)}});const Zi=k(Xi,[["__scopeId","data-v-ff4524ae"]]),Qi=e=>(q("data-v-f1abbc6e"),e=e(),R(),e),er={class:"container"},tr={class:"title"},sr={class:"content"},nr=Qi(()=>d("div",{class:"curtain"},null,-1)),or={class:"content-body"},ar=$({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{y:t}=Ke(),{hasSidebar:s}=K(),{frontmatter:n}=C(),o=M({});return qe(()=>{o.value={"has-sidebar":s.value,top:n.value.layout==="home"&&t.value===0}}),(a,i)=>(r(),c("div",{class:B(["VPNavBar",o.value])},[d("div",er,[d("div",tr,[f(ji,null,{"nav-bar-title-before":v(()=>[h(a.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[h(a.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",sr,[nr,d("div",or,[h(a.$slots,"nav-bar-content-before",{},void 0,!0),f(zi,{class:"search"}),f(Ja,{class:"menu"}),f(Zi,{class:"translations"}),f(Fo,{class:"appearance"}),f(Ei,{class:"social-links"}),f(Aa,{class:"extra"}),h(a.$slots,"nav-bar-content-after",{},void 0,!0),f(Oa,{class:"hamburger",active:a.isScreenOpen,onClick:i[0]||(i[0]=u=>a.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const ir=k(ar,[["__scopeId","data-v-f1abbc6e"]]),rr={key:0,class:"VPNavScreenAppearance"},lr={class:"text"},cr=$({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:s}=C();return(n,o)=>l(t).appearance&&l(t).appearance!=="force-dark"?(r(),c("div",rr,[d("p",lr,x(l(s).darkModeSwitchLabel||"Appearance"),1),f(Ne)])):g("",!0)}});const ur=k(cr,[["__scopeId","data-v-338d9b48"]]),dr=$({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=fe("close-screen");return(s,n)=>(r(),V(J,{class:"VPNavScreenMenuLink",href:s.item.link,target:s.item.target,rel:s.item.rel,onClick:l(t)},{default:v(()=>[j(x(s.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const _r=k(dr,[["__scopeId","data-v-fe523e3d"]]),hr={},vr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},pr=d("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),fr=[pr];function mr(e,t){return r(),c("svg",vr,fr)}const gr=k(hr,[["render",mr]]),kr=$({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=fe("close-screen");return(s,n)=>(r(),V(J,{class:"VPNavScreenMenuGroupLink",href:s.item.link,target:s.item.target,rel:s.item.rel,onClick:l(t)},{default:v(()=>[j(x(s.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const nt=k(kr,[["__scopeId","data-v-aea78dd1"]]),br={class:"VPNavScreenMenuGroupSection"},yr={key:0,class:"title"},$r=$({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,s)=>(r(),c("div",br,[t.text?(r(),c("p",yr,x(t.text),1)):g("",!0),(r(!0),c(A,null,D(t.items,n=>(r(),V(nt,{key:n.text,item:n},null,8,["item"]))),128))]))}});const Pr=k($r,[["__scopeId","data-v-f60dbfa7"]]),Vr=["aria-controls","aria-expanded"],wr={class:"button-text"},Sr=["id"],Lr={key:1,class:"group"},Mr=$({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,s=M(!1),n=L(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){s.value=!s.value}return(a,i)=>(r(),c("div",{class:B(["VPNavScreenMenuGroup",{open:s.value}])},[d("button",{class:"button","aria-controls":n.value,"aria-expanded":s.value,onClick:o},[d("span",wr,x(a.text),1),f(gr,{class:"button-icon"})],8,Vr),d("div",{id:n.value,class:"items"},[(r(!0),c(A,null,D(a.items,u=>(r(),c(A,{key:u.text},["link"in u?(r(),c("div",{key:u.text,class:"item"},[f(nt,{item:u},null,8,["item"])])):(r(),c("div",Lr,[f(Pr,{text:u.text,items:u.items},null,8,["text","items"])]))],64))),128))],8,Sr)],2))}});const xr=k(Mr,[["__scopeId","data-v-c2c554ed"]]),Cr={key:0,class:"VPNavScreenMenu"},Ir=$({__name:"VPNavScreenMenu",setup(e){const{theme:t}=C();return(s,n)=>l(t).nav?(r(),c("nav",Cr,[(r(!0),c(A,null,D(l(t).nav,o=>(r(),c(A,{key:o.text},["link"in o?(r(),V(_r,{key:0,item:o},null,8,["item"])):(r(),V(xr,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):g("",!0)}}),Tr=$({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=C();return(s,n)=>l(t).socialLinks?(r(),V(He,{key:0,class:"VPNavScreenSocialLinks",links:l(t).socialLinks},null,8,["links"])):g("",!0)}}),Nr={class:"list"},Ar=$({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:s}=oe({correspondingLink:!0}),n=M(!1);function o(){n.value=!n.value}return(a,i)=>l(t).length&&l(s).label?(r(),c("div",{key:0,class:B(["VPNavScreenTranslations",{open:n.value}])},[d("button",{class:"title",onClick:o},[f(st,{class:"icon lang"}),j(" "+x(l(s).label)+" ",1),f(tt,{class:"icon chevron"})]),d("ul",Nr,[(r(!0),c(A,null,D(l(t),u=>(r(),c("li",{key:u.link,class:"item"},[f(J,{class:"link",href:u.link},{default:v(()=>[j(x(u.text),1)]),_:2},1032,["href"])]))),128))])],2)):g("",!0)}});const Br=k(Ar,[["__scopeId","data-v-41505286"]]),Hr={class:"container"},zr=$({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=M(null),s=Je(ee?document.body:null);return(n,o)=>(r(),V(Se,{name:"fade",onEnter:o[0]||(o[0]=a=>s.value=!0),onAfterLeave:o[1]||(o[1]=a=>s.value=!1)},{default:v(()=>[n.open?(r(),c("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[d("div",Hr,[h(n.$slots,"nav-screen-content-before",{},void 0,!0),f(Ir,{class:"menu"}),f(Br,{class:"translations"}),f(ur,{class:"appearance"}),f(Tr,{class:"social-links"}),h(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):g("",!0)]),_:3}))}});const Dr=k(zr,[["__scopeId","data-v-57cce842"]]),Er={key:0,class:"VPNav"},Or=$({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:s,toggleScreen:n}=ko(),{frontmatter:o}=C(),a=L(()=>o.value.navbar!==!1);return Ye("close-screen",s),ve(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!a.value)}),(i,u)=>a.value?(r(),c("header",Er,[f(ir,{"is-screen-open":l(t),onToggleScreen:l(n)},{"nav-bar-title-before":v(()=>[h(i.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[h(i.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[h(i.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[h(i.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),f(Dr,{open:l(t)},{"nav-screen-content-before":v(()=>[h(i.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[h(i.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):g("",!0)}});const Fr=k(Or,[["__scopeId","data-v-7ad780c2"]]),jr=e=>(q("data-v-bd01e0d5"),e=e(),R(),e),Gr=["role","tabindex"],Ur=jr(()=>d("div",{class:"indicator"},null,-1)),qr=["onKeydown"],Rr={key:1,class:"items"},Kr=$({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:s,collapsible:n,isLink:o,isActiveLink:a,hasActiveLink:i,hasChildren:u,toggle:_}=Et(L(()=>t.item)),p=L(()=>u.value?"section":"div"),m=L(()=>o.value?"a":"div"),b=L(()=>u.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),w=L(()=>o.value?void 0:"button"),y=L(()=>[[`level-${t.depth}`],{collapsible:n.value},{collapsed:s.value},{"is-link":o.value},{"is-active":a.value},{"has-active":i.value}]);function P(S){"key"in S&&S.key!=="Enter"||!t.item.link&&_()}function I(){t.item.link&&_()}return(S,E)=>{const N=W("VPSidebarItem",!0);return r(),V(Y(p.value),{class:B(["VPSidebarItem",y.value])},{default:v(()=>[S.item.text?(r(),c("div",re({key:0,class:"item",role:w.value},mt(S.item.items?{click:P,keydown:P}:{},!0),{tabindex:S.item.items&&0}),[Ur,S.item.link?(r(),V(J,{key:0,tag:m.value,class:"link",href:S.item.link,rel:S.item.rel,target:S.item.target},{default:v(()=>[(r(),V(Y(b.value),{class:"text",innerHTML:S.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(r(),V(Y(b.value),{key:1,class:"text",innerHTML:S.item.text},null,8,["innerHTML"])),S.item.collapsed!=null?(r(),c("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:I,onKeydown:ft(I,["enter"]),tabindex:"0"},[f(Te,{class:"caret-icon"})],40,qr)):g("",!0)],16,Gr)):g("",!0),S.item.items&&S.item.items.length?(r(),c("div",Rr,[S.depth<5?(r(!0),c(A,{key:0},D(S.item.items,T=>(r(),V(N,{key:T.text,item:T,depth:S.depth+1},null,8,["item","depth"]))),128)):g("",!0)])):g("",!0)]),_:1},8,["class"])}}});const Wr=k(Kr,[["__scopeId","data-v-bd01e0d5"]]),ot=e=>(q("data-v-ee2efba5"),e=e(),R(),e),Jr=ot(()=>d("div",{class:"curtain"},null,-1)),Yr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Xr=ot(()=>d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Zr=$({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:s}=K(),n=e,o=M(null),a=Je(ee?document.body:null);return Q([n,o],()=>{var i;n.open?(a.value=!0,(i=o.value)==null||i.focus()):a.value=!1},{immediate:!0,flush:"post"}),(i,u)=>l(s)?(r(),c("aside",{key:0,class:B(["VPSidebar",{open:i.open}]),ref_key:"navEl",ref:o,onClick:u[0]||(u[0]=We(()=>{},["stop"]))},[Jr,d("nav",Yr,[Xr,h(i.$slots,"sidebar-nav-before",{},void 0,!0),(r(!0),c(A,null,D(l(t),_=>(r(),c("div",{key:_.text,class:"group"},[f(Wr,{item:_,depth:0},null,8,["item"])]))),128)),h(i.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):g("",!0)}});const Qr=k(Zr,[["__scopeId","data-v-ee2efba5"]]),el=$({__name:"VPSkipLink",setup(e){const t=pe(),s=M();Q(()=>t.path,()=>s.value.focus());function n({target:o}){const a=document.getElementById(decodeURIComponent(o.hash).slice(1));if(a){const i=()=>{a.removeAttribute("tabindex"),a.removeEventListener("blur",i)};a.setAttribute("tabindex","-1"),a.addEventListener("blur",i),a.focus(),window.scrollTo(0,0)}}return(o,a)=>(r(),c(A,null,[d("span",{ref_key:"backToTop",ref:s,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const tl=k(el,[["__scopeId","data-v-c8291ffa"]]),sl=$({__name:"Layout",setup(e){const{isOpen:t,open:s,close:n}=K(),o=pe();Q(()=>o.path,n),Dt(t,n);const{frontmatter:a}=C(),i=gt(),u=L(()=>!!i["home-hero-image"]);return Ye("hero-image-slot-exists",u),(_,p)=>{const m=W("Content");return l(a).layout!==!1?(r(),c("div",{key:0,class:B(["Layout",l(a).pageClass])},[h(_.$slots,"layout-top",{},void 0,!0),f(tl),f(Pt,{class:"backdrop",show:l(t),onClick:l(n)},null,8,["show","onClick"]),f(Fr,null,{"nav-bar-title-before":v(()=>[h(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[h(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[h(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[h(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[h(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[h(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),f(go,{open:l(t),onOpenMenu:l(s)},null,8,["open","onOpenMenu"]),f(Qr,{open:l(t)},{"sidebar-nav-before":v(()=>[h(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[h(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),f(Jn,null,{"page-top":v(()=>[h(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[h(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[h(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[h(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[h(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[h(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[h(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[h(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[h(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[h(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[h(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[h(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[h(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[h(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[h(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[h(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[h(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[h(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[h(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[h(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),f(eo),h(_.$slots,"layout-bottom",{},void 0,!0)],2)):(r(),V(m,{key:1}))}}});const nl=k(sl,[["__scopeId","data-v-9d8abc1e"]]);const al={Layout:nl,enhanceApp:({app:e})=>{e.component("Badge",bt)}};export{al as t}; +import{d as $,o as r,c,r as h,n as B,a as j,t as x,_ as k,b as V,w as v,T as Se,e as g,u as Ue,i as it,f as he,g as L,h as M,j as Z,k as d,l,p as q,m as R,q as X,s as ee,v as $e,x as Q,y as ve,z as Le,A as qe,B as rt,C as W,F as A,D,E as Me,G as se,H as f,I as Y,J as Re,K as pe,L as re,M as fe,N as lt,O as ct,P as Ke,Q as ut,R as dt,S as _t,U as ze,V as ht,W as We,X as vt,Y as pt,Z as Je,$ as Ye,a0 as ft,a1 as mt,a2 as gt}from"./framework.22f5e90d.js";const kt=$({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,s)=>(r(),c("span",{class:B(["VPBadge",t.type])},[h(t.$slots,"default",{},()=>[j(x(t.text),1)],!0)],2))}});const bt=k(kt,[["__scopeId","data-v-ea5b2908"]]),yt={key:0,class:"VPBackdrop"},$t=$({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,s)=>(r(),V(Se,{name:"fade"},{default:v(()=>[t.show?(r(),c("div",yt)):g("",!0)]),_:1}))}});const Pt=k($t,[["__scopeId","data-v-54a304ca"]]),C=Ue;function Vt(e,t){let s,n=!1;return()=>{s&&clearTimeout(s),n?s=setTimeout(e,t):(e(),(n=!0)&&setTimeout(()=>n=!1,t))}}function Pe(e){return/^\//.test(e)?e:`/${e}`}function ne(e){const{pathname:t,search:s,hash:n,protocol:o}=new URL(e,"http://a.com");if(it(e)||e.startsWith("#")||!o.startsWith("http")||/\.(?!html|md)\w+($|\?)/i.test(e))return e;const{site:a}=C(),i=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,a.value.cleanUrls?"":".html")}${s}${n}`);return he(i)}function oe({removeCurrent:e=!0,correspondingLink:t=!1}={}){const{site:s,localeIndex:n,page:o,theme:a}=C(),i=L(()=>{var _,p;return{label:(_=s.value.locales[n.value])==null?void 0:_.label,link:((p=s.value.locales[n.value])==null?void 0:p.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:L(()=>Object.entries(s.value.locales).flatMap(([_,p])=>e&&i.value.label===p.label?[]:{text:p.label,link:wt(p.link||(_==="root"?"/":`/${_}/`),a.value.i18nRouting!==!1&&t,o.value.relativePath.slice(i.value.link.length-1),!s.value.cleanUrls)})),currentLang:i}}function wt(e,t,s,n){return t?e.replace(/\/$/,"")+Pe(s.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):e}const St=e=>(q("data-v-b9c0c15a"),e=e(),R(),e),Lt={class:"NotFound"},Mt={class:"code"},xt={class:"title"},Ct=St(()=>d("div",{class:"divider"},null,-1)),It={class:"quote"},Tt={class:"action"},Nt=["href","aria-label"],At=$({__name:"NotFound",setup(e){const{site:t,theme:s}=C(),{localeLinks:n}=oe({removeCurrent:!1}),o=M("/");return Z(()=>{var i;const a=window.location.pathname.replace(t.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((i=n.value.find(({link:u})=>u.startsWith(a)))==null?void 0:i.link)||n.value[0].link)}),(a,i)=>{var u,_,p,m,b;return r(),c("div",Lt,[d("p",Mt,x(((u=l(s).notFound)==null?void 0:u.code)??"404"),1),d("h1",xt,x(((_=l(s).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),Ct,d("blockquote",It,x(((p=l(s).notFound)==null?void 0:p.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",Tt,[d("a",{class:"link",href:l(he)(o.value),"aria-label":((m=l(s).notFound)==null?void 0:m.linkLabel)??"go to home"},x(((b=l(s).notFound)==null?void 0:b.linkText)??"Take me home"),9,Nt)])])}}});const Bt=k(At,[["__scopeId","data-v-b9c0c15a"]]);function Xe(e,t){if(Array.isArray(e))return le(e);if(e==null)return[];t=Pe(t);const s=Object.keys(e).sort((o,a)=>a.split("/").length-o.split("/").length).find(o=>t.startsWith(Pe(o))),n=s?e[s]:[];return Array.isArray(n)?le(n):le(n.items,n.base)}function Ht(e){const t=[];let s=0;for(const n in e){const o=e[n];if(o.items){s=t.push(o);continue}t[s]||t.push({items:[]}),t[s].items.push(o)}return t}function zt(e){const t=[];function s(n){for(const o of n)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&s(o.items)}return s(e),t}function Ve(e,t){return Array.isArray(t)?t.some(s=>Ve(e,s)):X(e,t.link)?!0:t.items?Ve(e,t.items):!1}function le(e,t){return[...e].map(s=>{const n={...s},o=n.base||t;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=le(n.items,o)),n})}function K(){const{frontmatter:e,page:t,theme:s}=C(),n=$e("(min-width: 960px)"),o=M(!1),a=L(()=>{const I=s.value.sidebar,S=t.value.relativePath;return I?Xe(I,S):[]}),i=M(a.value);Q(a,(I,S)=>{JSON.stringify(I)!==JSON.stringify(S)&&(i.value=a.value)});const u=L(()=>e.value.sidebar!==!1&&i.value.length>0&&e.value.layout!=="home"),_=L(()=>p?e.value.aside==null?s.value.aside==="left":e.value.aside==="left":!1),p=L(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:s.value.aside!==!1),m=L(()=>u.value&&n.value),b=L(()=>u.value?Ht(i.value):[]);function w(){o.value=!0}function y(){o.value=!1}function P(){o.value?y():w()}return{isOpen:o,sidebar:i,sidebarGroups:b,hasSidebar:u,hasAside:p,leftAside:_,isSidebarEnabled:m,open:w,close:y,toggle:P}}function Dt(e,t){let s;ve(()=>{s=e.value?document.activeElement:void 0}),Z(()=>{window.addEventListener("keyup",n)}),Le(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&e.value&&(t(),s==null||s.focus())}}const Ze=M(ee?location.hash:"");ee&&window.addEventListener("hashchange",()=>{Ze.value=location.hash});function Et(e){const{page:t}=C(),s=M(!1),n=L(()=>e.value.collapsed!=null),o=L(()=>!!e.value.link),a=M(!1),i=()=>{a.value=X(t.value.relativePath,e.value.link)};Q([t,e,Ze],i),Z(i);const u=L(()=>a.value?!0:e.value.items?Ve(t.value.relativePath,e.value.items):!1),_=L(()=>!!(e.value.items&&e.value.items.length));ve(()=>{s.value=!!(n.value&&e.value.collapsed)}),qe(()=>{(a.value||u.value)&&(s.value=!1)});function p(){n.value&&(s.value=!s.value)}return{collapsed:s,collapsible:n,isLink:o,isActiveLink:a,hasActiveLink:u,hasChildren:_,toggle:p}}function Ot(){const{hasSidebar:e}=K(),t=$e("(min-width: 960px)"),s=$e("(min-width: 1280px)");return{isAsideEnabled:L(()=>!s.value&&!t.value?!1:e.value?s.value:t.value)}}const Ft=71;function xe(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function Ce(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(s=>s.id&&s.hasChildNodes()).map(s=>{const n=Number(s.tagName[1]);return{title:jt(s),link:"#"+s.id,level:n}});return Gt(t,e)}function jt(e){let t="";for(const s of e.childNodes)if(s.nodeType===1){if(s.classList.contains("VPBadge")||s.classList.contains("header-anchor"))continue;t+=s.textContent}else s.nodeType===3&&(t+=s.textContent);return t.trim()}function Gt(e,t){if(t===!1)return[];const s=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[n,o]=typeof s=="number"?[s,s]:s==="deep"?[2,6]:s;e=e.filter(i=>i.level>=n&&i.level<=o);const a=[];e:for(let i=0;i=0;_--){const p=e[_];if(p.level{requestAnimationFrame(a),window.addEventListener("scroll",n)}),rt(()=>{i(location.hash)}),Le(()=>{window.removeEventListener("scroll",n)});function a(){if(!s.value)return;const u=[].slice.call(e.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(y=>u.some(P=>P.hash===y.hash&&y.offsetParent!==null)),p=window.scrollY,m=window.innerHeight,b=document.body.offsetHeight,w=Math.abs(p+m-b)<1;if(_.length&&w){i(_[_.length-1].hash);return}for(let y=0;y<_.length;y++){const P=_[y],I=_[y+1],[S,E]=qt(y,P,I);if(S){i(E);return}}}function i(u){o&&o.classList.remove("active"),u==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(u)}"]`);const _=o;_?(_.classList.add("active"),t.value.style.top=_.offsetTop+33+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function De(e){return e.parentElement.offsetTop-Ft}function qt(e,t,s){const n=window.scrollY;return e===0&&n===0?[!0,null]:n{const o=W("VPDocOutlineItem",!0);return r(),c("ul",{class:B(s.root?"root":"nested")},[(r(!0),c(A,null,D(s.headers,({children:a,link:i,title:u})=>(r(),c("li",null,[d("a",{class:"outline-link",href:i,onClick:t,title:u},x(u),9,Rt),a!=null&&a.length?(r(),V(o,{key:0,headers:a},null,8,["headers"])):g("",!0)]))),256))],2)}}});const Ie=k(Kt,[["__scopeId","data-v-463da30f"]]),Wt=e=>(q("data-v-3a6c4994"),e=e(),R(),e),Jt={class:"content"},Yt={class:"outline-title",role:"heading","aria-level":"2"},Xt={"aria-labelledby":"doc-outline-aria-label"},Zt=Wt(()=>d("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Qt=$({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:s}=C(),n=Me([]);se(()=>{n.value=Ce(t.value.outline??s.value.outline)});const o=M(),a=M();return Ut(o,a),(i,u)=>(r(),c("div",{class:B(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[d("div",Jt,[d("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),d("div",Yt,x(l(xe)(l(s))),1),d("nav",Xt,[Zt,f(Ie,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const es=k(Qt,[["__scopeId","data-v-3a6c4994"]]),ts={class:"VPDocAsideCarbonAds"},ss=$({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(s,n)=>(r(),c("div",ts,[f(l(t),{"carbon-ads":s.carbonAds},null,8,["carbon-ads"])]))}}),ns=e=>(q("data-v-cb998dce"),e=e(),R(),e),os={class:"VPDocAside"},as=ns(()=>d("div",{class:"spacer"},null,-1)),is=$({__name:"VPDocAside",setup(e){const{theme:t}=C();return(s,n)=>(r(),c("div",os,[h(s.$slots,"aside-top",{},void 0,!0),h(s.$slots,"aside-outline-before",{},void 0,!0),f(es),h(s.$slots,"aside-outline-after",{},void 0,!0),as,h(s.$slots,"aside-ads-before",{},void 0,!0),l(t).carbonAds?(r(),V(ss,{key:0,"carbon-ads":l(t).carbonAds},null,8,["carbon-ads"])):g("",!0),h(s.$slots,"aside-ads-after",{},void 0,!0),h(s.$slots,"aside-bottom",{},void 0,!0)]))}});const rs=k(is,[["__scopeId","data-v-cb998dce"]]);function ls(){const{theme:e,page:t}=C();return L(()=>{const{text:s="Edit this page",pattern:n=""}=e.value.editLink||{};let o;return typeof n=="function"?o=n(t.value):o=n.replace(/:path/g,t.value.filePath),{url:o,text:s}})}function cs(){const{page:e,theme:t,frontmatter:s}=C();return L(()=>{var _,p,m,b,w,y,P,I;const n=Xe(t.value.sidebar,e.value.relativePath),o=zt(n),a=o.findIndex(S=>X(e.value.relativePath,S.link)),i=((_=t.value.docFooter)==null?void 0:_.prev)===!1&&!s.value.prev||s.value.prev===!1,u=((p=t.value.docFooter)==null?void 0:p.next)===!1&&!s.value.next||s.value.next===!1;return{prev:i?void 0:{text:(typeof s.value.prev=="string"?s.value.prev:typeof s.value.prev=="object"?s.value.prev.text:void 0)??((m=o[a-1])==null?void 0:m.docFooterText)??((b=o[a-1])==null?void 0:b.text),link:(typeof s.value.prev=="object"?s.value.prev.link:void 0)??((w=o[a-1])==null?void 0:w.link)},next:u?void 0:{text:(typeof s.value.next=="string"?s.value.next:typeof s.value.next=="object"?s.value.next.text:void 0)??((y=o[a+1])==null?void 0:y.docFooterText)??((P=o[a+1])==null?void 0:P.text),link:(typeof s.value.next=="object"?s.value.next.link:void 0)??((I=o[a+1])==null?void 0:I.link)}}})}const us={},ds={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},_s=d("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),hs=d("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),vs=[_s,hs];function ps(e,t){return r(),c("svg",ds,vs)}const fs=k(us,[["render",ps]]),J=$({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,s=L(()=>t.tag??(t.href?"a":"span")),n=L(()=>t.href&&Re.test(t.href));return(o,a)=>(r(),V(Y(s.value),{class:B(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?l(ne)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[h(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),ms={class:"VPLastUpdated"},gs=["datetime"],ks=$({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:s,frontmatter:n,lang:o}=C(),a=L(()=>new Date(n.value.lastUpdated??s.value.lastUpdated)),i=L(()=>a.value.toISOString()),u=M("");return Z(()=>{ve(()=>{var _,p,m;u.value=new Intl.DateTimeFormat((p=(_=t.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&p.forceLocale?o.value:void 0,((m=t.value.lastUpdated)==null?void 0:m.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(a.value)})}),(_,p)=>{var m;return r(),c("p",ms,[j(x(((m=l(t).lastUpdated)==null?void 0:m.text)||l(t).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:i.value},x(u.value),9,gs)])}}});const bs=k(ks,[["__scopeId","data-v-19a7ae4e"]]),ys={key:0,class:"VPDocFooter"},$s={key:0,class:"edit-info"},Ps={key:0,class:"edit-link"},Vs={key:1,class:"last-updated"},ws={key:1,class:"prev-next"},Ss={class:"pager"},Ls=["href"],Ms=["innerHTML"],xs=["innerHTML"],Cs={class:"pager"},Is=["href"],Ts=["innerHTML"],Ns=["innerHTML"],As=$({__name:"VPDocFooter",setup(e){const{theme:t,page:s,frontmatter:n}=C(),o=ls(),a=cs(),i=L(()=>t.value.editLink&&n.value.editLink!==!1),u=L(()=>s.value.lastUpdated&&n.value.lastUpdated!==!1),_=L(()=>i.value||u.value||a.value.prev||a.value.next);return(p,m)=>{var b,w,y,P,I,S;return _.value?(r(),c("footer",ys,[h(p.$slots,"doc-footer-before",{},void 0,!0),i.value||u.value?(r(),c("div",$s,[i.value?(r(),c("div",Ps,[f(J,{class:"edit-link-button",href:l(o).url,"no-icon":!0},{default:v(()=>[f(fs,{class:"edit-link-icon","aria-label":"edit icon"}),j(" "+x(l(o).text),1)]),_:1},8,["href"])])):g("",!0),u.value?(r(),c("div",Vs,[f(bs)])):g("",!0)])):g("",!0),(b=l(a).prev)!=null&&b.link||(w=l(a).next)!=null&&w.link?(r(),c("nav",ws,[d("div",Ss,[(y=l(a).prev)!=null&&y.link?(r(),c("a",{key:0,class:"pager-link prev",href:l(ne)(l(a).prev.link)},[d("span",{class:"desc",innerHTML:((P=l(t).docFooter)==null?void 0:P.prev)||"Previous page"},null,8,Ms),d("span",{class:"title",innerHTML:l(a).prev.text},null,8,xs)],8,Ls)):g("",!0)]),d("div",Cs,[(I=l(a).next)!=null&&I.link?(r(),c("a",{key:0,class:"pager-link next",href:l(ne)(l(a).next.link)},[d("span",{class:"desc",innerHTML:((S=l(t).docFooter)==null?void 0:S.next)||"Next page"},null,8,Ts),d("span",{class:"title",innerHTML:l(a).next.text},null,8,Ns)],8,Is)):g("",!0)])])):g("",!0)])):g("",!0)}}});const Bs=k(As,[["__scopeId","data-v-a2d931e4"]]),Hs={},zs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ds=d("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),Es=[Ds];function Os(e,t){return r(),c("svg",zs,Es)}const Te=k(Hs,[["render",Os]]),Fs={key:0,class:"VPDocOutlineDropdown"},js={key:0,class:"items"},Gs=$({__name:"VPDocOutlineDropdown",setup(e){const{frontmatter:t,theme:s}=C(),n=M(!1);se(()=>{n.value=!1});const o=Me([]);return se(()=>{o.value=Ce(t.value.outline??s.value.outline)}),(a,i)=>o.value.length>0?(r(),c("div",Fs,[d("button",{onClick:i[0]||(i[0]=u=>n.value=!n.value),class:B({open:n.value})},[j(x(l(xe)(l(s)))+" ",1),f(Te,{class:"icon"})],2),n.value?(r(),c("div",js,[f(Ie,{headers:o.value},null,8,["headers"])])):g("",!0)])):g("",!0)}});const Us=k(Gs,[["__scopeId","data-v-95bb0785"]]),qs=e=>(q("data-v-a3c25e27"),e=e(),R(),e),Rs={class:"container"},Ks=qs(()=>d("div",{class:"aside-curtain"},null,-1)),Ws={class:"aside-container"},Js={class:"aside-content"},Ys={class:"content"},Xs={class:"content-container"},Zs={class:"main"},Qs=$({__name:"VPDoc",setup(e){const{theme:t}=C(),s=pe(),{hasSidebar:n,hasAside:o,leftAside:a}=K(),i=L(()=>s.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(u,_)=>{const p=W("Content");return r(),c("div",{class:B(["VPDoc",{"has-sidebar":l(n),"has-aside":l(o)}])},[h(u.$slots,"doc-top",{},void 0,!0),d("div",Rs,[l(o)?(r(),c("div",{key:0,class:B(["aside",{"left-aside":l(a)}])},[Ks,d("div",Ws,[d("div",Js,[f(rs,null,{"aside-top":v(()=>[h(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[h(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[h(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[h(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[h(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[h(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):g("",!0),d("div",Ys,[d("div",Xs,[h(u.$slots,"doc-before",{},void 0,!0),f(Us),d("main",Zs,[f(p,{class:B(["vp-doc",[i.value,l(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),f(Bs,null,{"doc-footer-before":v(()=>[h(u.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),h(u.$slots,"doc-after",{},void 0,!0)])])]),h(u.$slots,"doc-bottom",{},void 0,!0)],2)}}});const en=k(Qs,[["__scopeId","data-v-a3c25e27"]]),tn=$({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(e){const t=e,s=L(()=>t.href&&Re.test(t.href)),n=L(()=>t.tag||t.href?"a":"button");return(o,a)=>(r(),V(Y(n.value),{class:B(["VPButton",[o.size,o.theme]]),href:o.href?l(ne)(o.href):void 0,target:s.value?"_blank":void 0,rel:s.value?"noreferrer":void 0},{default:v(()=>[j(x(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const sn=k(tn,[["__scopeId","data-v-1e76fe75"]]),nn=["src","alt"],on=$({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,s)=>{const n=W("VPImage",!0);return t.image?(r(),c(A,{key:0},[typeof t.image=="string"||"src"in t.image?(r(),c("img",re({key:0,class:"VPImage"},typeof t.image=="string"?t.$attrs:{...t.image,...t.$attrs},{src:l(he)(typeof t.image=="string"?t.image:t.image.src),alt:t.alt??(typeof t.image=="string"?"":t.image.alt||"")}),null,16,nn)):(r(),c(A,{key:1},[f(n,re({class:"dark",image:t.image.dark,alt:t.image.alt},t.$attrs),null,16,["image","alt"]),f(n,re({class:"light",image:t.image.light,alt:t.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}});const ue=k(on,[["__scopeId","data-v-ab19afbb"]]),an=e=>(q("data-v-5a3e9999"),e=e(),R(),e),rn={class:"container"},ln={class:"main"},cn={key:0,class:"name"},un=["innerHTML"],dn=["innerHTML"],_n=["innerHTML"],hn={key:0,class:"actions"},vn={key:0,class:"image"},pn={class:"image-container"},fn=an(()=>d("div",{class:"image-bg"},null,-1)),mn=$({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=fe("hero-image-slot-exists");return(s,n)=>(r(),c("div",{class:B(["VPHero",{"has-image":s.image||l(t)}])},[d("div",rn,[d("div",ln,[h(s.$slots,"home-hero-info",{},()=>[s.name?(r(),c("h1",cn,[d("span",{innerHTML:s.name,class:"clip"},null,8,un)])):g("",!0),s.text?(r(),c("p",{key:1,innerHTML:s.text,class:"text"},null,8,dn)):g("",!0),s.tagline?(r(),c("p",{key:2,innerHTML:s.tagline,class:"tagline"},null,8,_n)):g("",!0)],!0),s.actions?(r(),c("div",hn,[(r(!0),c(A,null,D(s.actions,o=>(r(),c("div",{key:o.link,class:"action"},[f(sn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):g("",!0)]),s.image||l(t)?(r(),c("div",vn,[d("div",pn,[fn,h(s.$slots,"home-hero-image",{},()=>[s.image?(r(),V(ue,{key:0,class:"image-src",image:s.image},null,8,["image"])):g("",!0)],!0)])])):g("",!0)])],2))}});const gn=k(mn,[["__scopeId","data-v-5a3e9999"]]),kn=$({__name:"VPHomeHero",setup(e){const{frontmatter:t}=C();return(s,n)=>l(t).hero?(r(),V(gn,{key:0,class:"VPHomeHero",name:l(t).hero.name,text:l(t).hero.text,tagline:l(t).hero.tagline,image:l(t).hero.image,actions:l(t).hero.actions},{"home-hero-info":v(()=>[h(s.$slots,"home-hero-info")]),"home-hero-image":v(()=>[h(s.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):g("",!0)}}),bn={},yn={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},$n=d("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Pn=[$n];function Vn(e,t){return r(),c("svg",yn,Pn)}const wn=k(bn,[["render",Vn]]),Sn={class:"box"},Ln={key:0,class:"icon"},Mn=["innerHTML"],xn=["innerHTML"],Cn=["innerHTML"],In={key:4,class:"link-text"},Tn={class:"link-text-value"},Nn=$({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,s)=>(r(),V(J,{class:"VPFeature",href:t.link,rel:t.rel,target:t.target,"no-icon":!0,tag:t.link?"a":"div"},{default:v(()=>[d("article",Sn,[typeof t.icon=="object"&&t.icon.wrap?(r(),c("div",Ln,[f(ue,{image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])])):typeof t.icon=="object"?(r(),V(ue,{key:1,image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])):t.icon?(r(),c("div",{key:2,class:"icon",innerHTML:t.icon},null,8,Mn)):g("",!0),d("h2",{class:"title",innerHTML:t.title},null,8,xn),t.details?(r(),c("p",{key:3,class:"details",innerHTML:t.details},null,8,Cn)):g("",!0),t.linkText?(r(),c("div",In,[d("p",Tn,[j(x(t.linkText)+" ",1),f(wn,{class:"link-text-icon"})])])):g("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const An=k(Nn,[["__scopeId","data-v-ee984185"]]),Bn={key:0,class:"VPFeatures"},Hn={class:"container"},zn={class:"items"},Dn=$({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,s=L(()=>{const n=t.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,o)=>n.features?(r(),c("div",Bn,[d("div",Hn,[d("div",zn,[(r(!0),c(A,null,D(n.features,a=>(r(),c("div",{key:a.title,class:B(["item",[s.value]])},[f(An,{icon:a.icon,title:a.title,details:a.details,link:a.link,"link-text":a.linkText,rel:a.rel,target:a.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):g("",!0)}});const En=k(Dn,[["__scopeId","data-v-b1eea84a"]]),On=$({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=C();return(s,n)=>l(t).features?(r(),V(En,{key:0,class:"VPHomeFeatures",features:l(t).features},null,8,["features"])):g("",!0)}}),Fn={class:"VPHome"},jn=$({__name:"VPHome",setup(e){return(t,s)=>{const n=W("Content");return r(),c("div",Fn,[h(t.$slots,"home-hero-before",{},void 0,!0),f(kn,null,{"home-hero-info":v(()=>[h(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[h(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),h(t.$slots,"home-hero-after",{},void 0,!0),h(t.$slots,"home-features-before",{},void 0,!0),f(On),h(t.$slots,"home-features-after",{},void 0,!0),f(n)])}}});const Gn=k(jn,[["__scopeId","data-v-20eabd3a"]]),Un={},qn={class:"VPPage"};function Rn(e,t){const s=W("Content");return r(),c("div",qn,[h(e.$slots,"page-top"),f(s),h(e.$slots,"page-bottom")])}const Kn=k(Un,[["render",Rn]]),Wn=$({__name:"VPContent",setup(e){const{page:t,frontmatter:s}=C(),{hasSidebar:n}=K();return(o,a)=>(r(),c("div",{class:B(["VPContent",{"has-sidebar":l(n),"is-home":l(s).layout==="home"}]),id:"VPContent"},[l(t).isNotFound?h(o.$slots,"not-found",{key:0},()=>[f(Bt)],!0):l(s).layout==="page"?(r(),V(Kn,{key:1},{"page-top":v(()=>[h(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[h(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(s).layout==="home"?(r(),V(Gn,{key:2},{"home-hero-before":v(()=>[h(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[h(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[h(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[h(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[h(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[h(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(s).layout&&l(s).layout!=="doc"?(r(),V(Y(l(s).layout),{key:3})):(r(),V(en,{key:4},{"doc-top":v(()=>[h(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[h(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[h(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[h(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[h(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[h(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[h(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[h(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[h(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[h(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[h(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Jn=k(Wn,[["__scopeId","data-v-3cf691b6"]]),Yn={class:"container"},Xn=["innerHTML"],Zn=["innerHTML"],Qn=$({__name:"VPFooter",setup(e){const{theme:t,frontmatter:s}=C(),{hasSidebar:n}=K();return(o,a)=>l(t).footer&&l(s).footer!==!1?(r(),c("footer",{key:0,class:B(["VPFooter",{"has-sidebar":l(n)}])},[d("div",Yn,[l(t).footer.message?(r(),c("p",{key:0,class:"message",innerHTML:l(t).footer.message},null,8,Xn)):g("",!0),l(t).footer.copyright?(r(),c("p",{key:1,class:"copyright",innerHTML:l(t).footer.copyright},null,8,Zn)):g("",!0)])],2)):g("",!0)}});const eo=k(Qn,[["__scopeId","data-v-e4279f1c"]]),to={class:"header"},so={class:"outline"},no=$({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:s}=C(),n=M(!1),o=M(0),a=M();se(()=>{n.value=!1});function i(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function u(p){p.target.classList.contains("outline-link")&&(a.value&&(a.value.style.transition="none"),ct(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(p,m)=>(r(),c("div",{class:"VPLocalNavOutlineDropdown",style:lt({"--vp-vh":o.value+"px"})},[p.headers.length>0?(r(),c("button",{key:0,onClick:i,class:B({open:n.value})},[j(x(l(xe)(l(s)))+" ",1),f(Te,{class:"icon"})],2)):(r(),c("button",{key:1,onClick:_},x(l(s).returnToTopLabel||"Return to top"),1)),f(Se,{name:"flyout"},{default:v(()=>[n.value?(r(),c("div",{key:0,ref_key:"items",ref:a,class:"items",onClick:u},[d("div",to,[d("a",{class:"top-link",href:"#",onClick:_},x(l(s).returnToTopLabel||"Return to top"),1)]),d("div",so,[f(Ie,{headers:p.headers},null,8,["headers"])])],512)):g("",!0)]),_:1})],4))}});const oo=k(no,[["__scopeId","data-v-24251f6f"]]),ao={},io={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ro=d("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),lo=d("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),co=d("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),uo=d("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),_o=[ro,lo,co,uo];function ho(e,t){return r(),c("svg",io,_o)}const vo=k(ao,[["render",ho]]),po=["aria-expanded"],fo={class:"menu-text"},mo=$({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:s}=C(),{hasSidebar:n}=K(),{y:o}=Ke(),a=Me([]),i=M(0);Z(()=>{i.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),se(()=>{a.value=Ce(s.value.outline??t.value.outline)});const u=L(()=>a.value.length===0&&!n.value),_=L(()=>({VPLocalNav:!0,fixed:u.value,"reached-top":o.value>=i.value}));return(p,m)=>l(s).layout!=="home"&&(!u.value||l(o)>=i.value)?(r(),c("div",{key:0,class:B(_.value)},[l(n)?(r(),c("button",{key:0,class:"menu","aria-expanded":p.open,"aria-controls":"VPSidebarNav",onClick:m[0]||(m[0]=b=>p.$emit("open-menu"))},[f(vo,{class:"menu-icon"}),d("span",fo,x(l(t).sidebarMenuLabel||"Menu"),1)],8,po)):g("",!0),f(oo,{headers:a.value,navHeight:i.value},null,8,["headers","navHeight"])],2)):g("",!0)}});const go=k(mo,[["__scopeId","data-v-9e669cc1"]]);function ko(){const e=M(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function s(){e.value=!1,window.removeEventListener("resize",o)}function n(){e.value?s():t()}function o(){window.outerWidth>=768&&s()}const a=pe();return Q(()=>a.path,s),{isScreenOpen:e,openScreen:t,closeScreen:s,toggleScreen:n}}const bo={},yo={class:"VPSwitch",type:"button",role:"switch"},$o={class:"check"},Po={key:0,class:"icon"};function Vo(e,t){return r(),c("button",yo,[d("span",$o,[e.$slots.default?(r(),c("span",Po,[h(e.$slots,"default",{},void 0,!0)])):g("",!0)])])}const wo=k(bo,[["render",Vo],["__scopeId","data-v-1c29e291"]]),So={},Lo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Mo=d("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),xo=[Mo];function Co(e,t){return r(),c("svg",Lo,xo)}const Io=k(So,[["render",Co]]),To={},No={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ao=ut('',9),Bo=[Ao];function Ho(e,t){return r(),c("svg",No,Bo)}const zo=k(To,[["render",Ho]]),Do=$({__name:"VPSwitchAppearance",setup(e){const{isDark:t}=C(),s=fe("toggle-appearance",()=>{t.value=!t.value});return(n,o)=>(r(),V(wo,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":l(t),onClick:l(s)},{default:v(()=>[f(zo,{class:"sun"}),f(Io,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const Ne=k(Do,[["__scopeId","data-v-3329432d"]]),Eo={key:0,class:"VPNavBarAppearance"},Oo=$({__name:"VPNavBarAppearance",setup(e){const{site:t}=C();return(s,n)=>l(t).appearance&&l(t).appearance!=="force-dark"?(r(),c("div",Eo,[f(Ne)])):g("",!0)}});const Fo=k(Oo,[["__scopeId","data-v-283b26e9"]]),Ae=M();let Qe=!1,ke=0;function jo(e){const t=M(!1);if(ee){!Qe&&Go(),ke++;const s=Q(Ae,n=>{var o,a,i;n===e.el.value||(o=e.el.value)!=null&&o.contains(n)?(t.value=!0,(a=e.onFocus)==null||a.call(e)):(t.value=!1,(i=e.onBlur)==null||i.call(e))});Le(()=>{s(),ke--,ke||Uo()})}return dt(t)}function Go(){document.addEventListener("focusin",et),Qe=!0,Ae.value=document.activeElement}function Uo(){document.removeEventListener("focusin",et)}function et(){Ae.value=document.activeElement}const qo={},Ro={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ko=d("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Wo=[Ko];function Jo(e,t){return r(),c("svg",Ro,Wo)}const tt=k(qo,[["render",Jo]]),Yo={},Xo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Zo=d("circle",{cx:"12",cy:"12",r:"2"},null,-1),Qo=d("circle",{cx:"19",cy:"12",r:"2"},null,-1),ea=d("circle",{cx:"5",cy:"12",r:"2"},null,-1),ta=[Zo,Qo,ea];function sa(e,t){return r(),c("svg",Xo,ta)}const na=k(Yo,[["render",sa]]),oa={class:"VPMenuLink"},aa=$({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=C();return(s,n)=>(r(),c("div",oa,[f(J,{class:B({active:l(X)(l(t).relativePath,s.item.activeMatch||s.item.link,!!s.item.activeMatch)}),href:s.item.link,target:s.item.target,rel:s.item.rel},{default:v(()=>[j(x(s.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const me=k(aa,[["__scopeId","data-v-f51f088d"]]),ia={class:"VPMenuGroup"},ra={key:0,class:"title"},la=$({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,s)=>(r(),c("div",ia,[t.text?(r(),c("p",ra,x(t.text),1)):g("",!0),(r(!0),c(A,null,D(t.items,n=>(r(),c(A,null,["link"in n?(r(),V(me,{key:0,item:n},null,8,["item"])):g("",!0)],64))),256))]))}});const ca=k(la,[["__scopeId","data-v-a6b0397c"]]),ua={class:"VPMenu"},da={key:0,class:"items"},_a=$({__name:"VPMenu",props:{items:{}},setup(e){return(t,s)=>(r(),c("div",ua,[t.items?(r(),c("div",da,[(r(!0),c(A,null,D(t.items,n=>(r(),c(A,{key:n.text},["link"in n?(r(),V(me,{key:0,item:n},null,8,["item"])):(r(),V(ca,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):g("",!0),h(t.$slots,"default",{},void 0,!0)]))}});const ha=k(_a,[["__scopeId","data-v-e42ed9b3"]]),va=["aria-expanded","aria-label"],pa={key:0,class:"text"},fa=["innerHTML"],ma={class:"menu"},ga=$({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=M(!1),s=M();jo({el:s,onBlur:n});function n(){t.value=!1}return(o,a)=>(r(),c("div",{class:"VPFlyout",ref_key:"el",ref:s,onMouseenter:a[1]||(a[1]=i=>t.value=!0),onMouseleave:a[2]||(a[2]=i=>t.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":o.label,onClick:a[0]||(a[0]=i=>t.value=!t.value)},[o.button||o.icon?(r(),c("span",pa,[o.icon?(r(),V(Y(o.icon),{key:0,class:"option-icon"})):g("",!0),o.button?(r(),c("span",{key:1,innerHTML:o.button},null,8,fa)):g("",!0),f(tt,{class:"text-icon"})])):(r(),V(na,{key:1,class:"icon"}))],8,va),d("div",ma,[f(ha,{items:o.items},{default:v(()=>[h(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const Be=k(ga,[["__scopeId","data-v-aa8de344"]]),ka={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},ba=["href","aria-label","innerHTML"],ya=$({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,s=L(()=>typeof t.icon=="object"?t.icon.svg:ka[t.icon]);return(n,o)=>(r(),c("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:s.value},null,8,ba))}});const $a=k(ya,[["__scopeId","data-v-16cf740a"]]),Pa={class:"VPSocialLinks"},Va=$({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,s)=>(r(),c("div",Pa,[(r(!0),c(A,null,D(t.links,({link:n,icon:o,ariaLabel:a})=>(r(),V($a,{key:n,icon:o,link:n,ariaLabel:a},null,8,["icon","link","ariaLabel"]))),128))]))}});const He=k(Va,[["__scopeId","data-v-e71e869c"]]),wa={key:0,class:"group translations"},Sa={class:"trans-title"},La={key:1,class:"group"},Ma={class:"item appearance"},xa={class:"label"},Ca={class:"appearance-action"},Ia={key:2,class:"group"},Ta={class:"item social-links"},Na=$({__name:"VPNavBarExtra",setup(e){const{site:t,theme:s}=C(),{localeLinks:n,currentLang:o}=oe({correspondingLink:!0}),a=L(()=>n.value.length&&o.value.label||t.value.appearance||s.value.socialLinks);return(i,u)=>a.value?(r(),V(Be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[l(n).length&&l(o).label?(r(),c("div",wa,[d("p",Sa,x(l(o).label),1),(r(!0),c(A,null,D(l(n),_=>(r(),V(me,{key:_.link,item:_},null,8,["item"]))),128))])):g("",!0),l(t).appearance&&l(t).appearance!=="force-dark"?(r(),c("div",La,[d("div",Ma,[d("p",xa,x(l(s).darkModeSwitchLabel||"Appearance"),1),d("div",Ca,[f(Ne)])])])):g("",!0),l(s).socialLinks?(r(),c("div",Ia,[d("div",Ta,[f(He,{class:"social-links-list",links:l(s).socialLinks},null,8,["links"])])])):g("",!0)]),_:1})):g("",!0)}});const Aa=k(Na,[["__scopeId","data-v-8e87c032"]]),Ba=e=>(q("data-v-6bee1efd"),e=e(),R(),e),Ha=["aria-expanded"],za=Ba(()=>d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)),Da=[za],Ea=$({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,s)=>(r(),c("button",{type:"button",class:B(["VPNavBarHamburger",{active:t.active}]),"aria-label":"mobile navigation","aria-expanded":t.active,"aria-controls":"VPNavScreen",onClick:s[0]||(s[0]=n=>t.$emit("click"))},Da,10,Ha))}});const Oa=k(Ea,[["__scopeId","data-v-6bee1efd"]]),Fa=["innerHTML"],ja=$({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=C();return(s,n)=>(r(),V(J,{class:B({VPNavBarMenuLink:!0,active:l(X)(l(t).relativePath,s.item.activeMatch||s.item.link,!!s.item.activeMatch)}),href:s.item.link,target:s.item.target,rel:s.item.rel,tabindex:"0"},{default:v(()=>[d("span",{innerHTML:s.item.text},null,8,Fa)]),_:1},8,["class","href","target","rel"]))}});const Ga=k(ja,[["__scopeId","data-v-cb318fec"]]),Ua=$({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:s}=C(),n=a=>"link"in a?X(s.value.relativePath,a.link,!!t.item.activeMatch):a.items.some(n),o=L(()=>n(t.item));return(a,i)=>(r(),V(Be,{class:B({VPNavBarMenuGroup:!0,active:l(X)(l(s).relativePath,a.item.activeMatch,!!a.item.activeMatch)||o.value}),button:a.item.text,items:a.item.items},null,8,["class","button","items"]))}}),qa=e=>(q("data-v-f732b5d0"),e=e(),R(),e),Ra={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Ka=qa(()=>d("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Wa=$({__name:"VPNavBarMenu",setup(e){const{theme:t}=C();return(s,n)=>l(t).nav?(r(),c("nav",Ra,[Ka,(r(!0),c(A,null,D(l(t).nav,o=>(r(),c(A,{key:o.text},["link"in o?(r(),V(Ga,{key:0,item:o},null,8,["item"])):(r(),V(Ua,{key:1,item:o},null,8,["item"]))],64))),128))])):g("",!0)}});const Ja=k(Wa,[["__scopeId","data-v-f732b5d0"]]),Ya="/assets/flex-logo.2489261b.svg";function be(e,t){return typeof e>"u"?t:e}function Ee(e){const t=Array(e);for(let s=0;s=this.minlength&&(u||!i[m])){let w=ie(_,o,p),y="";switch(this.tokenize){case"full":if(3P;I--)if(I-P>=this.minlength){const S=ie(_,o,p,b,P);y=m.substring(P,I),this.push_index(i,y,S,e,s)}break}case"reverse":if(2=this.minlength){const I=ie(_,o,p,b,P);this.push_index(i,y,I,e,s)}y=""}case"forward":if(1=this.minlength&&this.push_index(i,y,w,e,s);break}default:if(this.boost&&(w=Math.min(0|w/this.boost(t,m,p),_-1)),this.push_index(i,m,w,e,s),u&&1=this.minlength&&!P[m]){P[m]=1;const T=ie(I+(o/2>I?0:1),o,p,E-1,N-1),H=this.bidirectional&&m>S;this.push_index(a,H?S:m,T,e,s,H?m:S)}}}}}this.fastupdate||(this.register[e]=1)}}return this};function ie(e,t,s,n,o){return s&&1=this.minlength&&!b[y]){if(!this.optimize&&!a&&!this.map[y])return i;w[I++]=y,b[y]=1}e=w,n=e.length}if(!n)return i;t||(t=100);let _,p=this.depth&&1=s)))));y++);if(p)return o?je(u,s,0):void(e[e.length]=u)}return!t&&u};function je(e,t,s){return e=e.length===1?e[0]:Za(e),s||e.length>t?e.slice(s,s+t):e}function Ge(e,t,s,n){if(s){const o=n&&t>s;e=e[o?t:s],e=e&&e[o?s:t]}else e=e[t];return e}O.prototype.contain=function(e){return!!this.register[e]},O.prototype.update=function(e,t){return this.remove(e).add(e,t)},O.prototype.remove=function(e,t){const s=this.register[e];if(s){if(this.fastupdate)for(let n,o=0;o{if(a.value){for(var N=b.value.search(a.value,{enrich:!0}),T=[],H=0;H!N||!N.length?[]:N.reduce((H,z)=>(H[T(z)]||(H[T(z)]=[]),H[T(z)].push(z),H),{}),S=()=>{setTimeout(()=>{u.value&&u.value.focus()},100),E(),o.value=!0};Z(async()=>{var z,U;const N=await _t(()=>import("./virtual_search-data.8ca79d1f.js"),[]);_.value=N.default.INDEX_DATA,p.value=N.default.PREVIEW_LOOKUP,m.value=N.default.Options,i.value=window.location.origin+he(s.value==="root"?"/":s.value),w.value=((z=m.value)==null?void 0:z.buttonLabel)||w.value,y.value=((U=m.value)==null?void 0:U.placeholder)||y.value;var T=new O(m.value);T.import("reg",_.value.reg),T.import("cfg",_.value.cfg),T.import("map",_.value.map),T.import("ctx",_.value.ctx),b.value=T,n.value.innerHTML=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"⌘":"Ctrl";const H=G=>{var ae;G.key==="k"&&(G.ctrlKey||G.metaKey)&&(G.preventDefault(),S()),G.key==="Escape"&&((ae=a.value)==null?void 0:ae.length)==0&&o.value&&(o.value=!1)};window.addEventListener("keydown",H)});function E(){o.value=!1,a.value=""}return(N,T)=>{const H=W("ClientOnly");return r(),c("div",gi,[f(H,null,{default:v(()=>[(r(),V(pt,{to:"body"},[ze(d("div",{class:"VPPluginSearch-modal-back",onClick:T[2]||(T[2]=z=>o.value=!1)},[d("div",{class:"VPPluginSearch-modal",onClick:T[1]||(T[1]=We(()=>{},["stop"]))},[d("form",ki,[bi,ze(d("input",{class:"DocSearch-Input","aria-autocomplete":"both","aria-labelledby":"docsearch-label",id:"docsearch-input",autocomplete:"off",autocorrect:"off",autocapitalize:"off",enterkeyhint:"search",spellcheck:"false",autofocus:"true","onUpdate:modelValue":T[0]||(T[0]=z=>a.value=z),placeholder:y.value,maxlength:"64",type:"search",ref_key:"input",ref:u},null,8,yi),[[vt,a.value]])]),d("div",$i,[(r(!0),c(A,null,D(I(P.value,z=>z.link.split("/").slice(0,-1).join("-")),(z,U)=>(r(),c("div",{key:U},[d("span",Pi,x(U?U.toString()[0].toUpperCase()+U.toString().slice(1):"Home"),1),(r(!0),c(A,null,D(z,G=>(r(),c("a",{href:i.value+G.link,key:G.id,onClick:E},[d("div",wi,[d("span",Si,x(G.link.includes("#")?"#":"▤"),1),d("div",Li,[d("h3",null,x(G.title),1),d("p",null,[d("div",{innerHTML:G.preview},null,8,Mi)])]),xi])],8,Vi))),128))]))),128))]),Ci])],512),[[ht,o.value]])]))]),_:1}),d("div",{id:"docsearch",onClick:T[3]||(T[3]=z=>S())},[d("button",Ii,[d("span",Ti,[Ni,d("span",Ai,x(w.value),1)]),d("span",Bi,[d("span",{class:"DocSearch-Button-Key",ref_key:"metaKey",ref:n},"Meta",512),Hi])])])])}}});const Di=$({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=C();return(s,n)=>l(t).socialLinks?(r(),V(He,{key:0,class:"VPNavBarSocialLinks",links:l(t).socialLinks},null,8,["links"])):g("",!0)}});const Ei=k(Di,[["__scopeId","data-v-ef6192dc"]]),Oi=["href"],Fi=$({__name:"VPNavBarTitle",setup(e){const{site:t,theme:s}=C(),{hasSidebar:n}=K(),{currentLang:o}=oe();return(a,i)=>(r(),c("div",{class:B(["VPNavBarTitle",{"has-sidebar":l(n)}])},[d("a",{class:"title",href:l(s).logoLink??l(ne)(l(o).link)},[h(a.$slots,"nav-bar-title-before",{},void 0,!0),l(s).logo?(r(),V(ue,{key:0,class:"logo",image:l(s).logo},null,8,["image"])):g("",!0),l(s).siteTitle?(r(),c(A,{key:1},[j(x(l(s).siteTitle),1)],64)):l(s).siteTitle===void 0?(r(),c(A,{key:2},[j(x(l(t).title),1)],64)):g("",!0),h(a.$slots,"nav-bar-title-after",{},void 0,!0)],8,Oi)],2))}});const ji=k(Fi,[["__scopeId","data-v-2973dbb4"]]),Gi={},Ui={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},qi=d("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ri=d("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Ki=[qi,Ri];function Wi(e,t){return r(),c("svg",Ui,Ki)}const st=k(Gi,[["render",Wi]]),Ji={class:"items"},Yi={class:"title"},Xi=$({__name:"VPNavBarTranslations",setup(e){const{theme:t}=C(),{localeLinks:s,currentLang:n}=oe({correspondingLink:!0});return(o,a)=>l(s).length&&l(n).label?(r(),V(Be,{key:0,class:"VPNavBarTranslations",icon:st,label:l(t).langMenuLabel||"Change language"},{default:v(()=>[d("div",Ji,[d("p",Yi,x(l(n).label),1),(r(!0),c(A,null,D(l(s),i=>(r(),V(me,{key:i.link,item:i},null,8,["item"]))),128))])]),_:1},8,["label"])):g("",!0)}});const Zi=k(Xi,[["__scopeId","data-v-ff4524ae"]]),Qi=e=>(q("data-v-f1abbc6e"),e=e(),R(),e),er={class:"container"},tr={class:"title"},sr={class:"content"},nr=Qi(()=>d("div",{class:"curtain"},null,-1)),or={class:"content-body"},ar=$({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{y:t}=Ke(),{hasSidebar:s}=K(),{frontmatter:n}=C(),o=M({});return qe(()=>{o.value={"has-sidebar":s.value,top:n.value.layout==="home"&&t.value===0}}),(a,i)=>(r(),c("div",{class:B(["VPNavBar",o.value])},[d("div",er,[d("div",tr,[f(ji,null,{"nav-bar-title-before":v(()=>[h(a.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[h(a.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",sr,[nr,d("div",or,[h(a.$slots,"nav-bar-content-before",{},void 0,!0),f(zi,{class:"search"}),f(Ja,{class:"menu"}),f(Zi,{class:"translations"}),f(Fo,{class:"appearance"}),f(Ei,{class:"social-links"}),f(Aa,{class:"extra"}),h(a.$slots,"nav-bar-content-after",{},void 0,!0),f(Oa,{class:"hamburger",active:a.isScreenOpen,onClick:i[0]||(i[0]=u=>a.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const ir=k(ar,[["__scopeId","data-v-f1abbc6e"]]),rr={key:0,class:"VPNavScreenAppearance"},lr={class:"text"},cr=$({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:s}=C();return(n,o)=>l(t).appearance&&l(t).appearance!=="force-dark"?(r(),c("div",rr,[d("p",lr,x(l(s).darkModeSwitchLabel||"Appearance"),1),f(Ne)])):g("",!0)}});const ur=k(cr,[["__scopeId","data-v-338d9b48"]]),dr=$({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=fe("close-screen");return(s,n)=>(r(),V(J,{class:"VPNavScreenMenuLink",href:s.item.link,target:s.item.target,rel:s.item.rel,onClick:l(t)},{default:v(()=>[j(x(s.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const _r=k(dr,[["__scopeId","data-v-fe523e3d"]]),hr={},vr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},pr=d("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),fr=[pr];function mr(e,t){return r(),c("svg",vr,fr)}const gr=k(hr,[["render",mr]]),kr=$({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=fe("close-screen");return(s,n)=>(r(),V(J,{class:"VPNavScreenMenuGroupLink",href:s.item.link,target:s.item.target,rel:s.item.rel,onClick:l(t)},{default:v(()=>[j(x(s.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const nt=k(kr,[["__scopeId","data-v-aea78dd1"]]),br={class:"VPNavScreenMenuGroupSection"},yr={key:0,class:"title"},$r=$({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,s)=>(r(),c("div",br,[t.text?(r(),c("p",yr,x(t.text),1)):g("",!0),(r(!0),c(A,null,D(t.items,n=>(r(),V(nt,{key:n.text,item:n},null,8,["item"]))),128))]))}});const Pr=k($r,[["__scopeId","data-v-f60dbfa7"]]),Vr=["aria-controls","aria-expanded"],wr={class:"button-text"},Sr=["id"],Lr={key:1,class:"group"},Mr=$({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,s=M(!1),n=L(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){s.value=!s.value}return(a,i)=>(r(),c("div",{class:B(["VPNavScreenMenuGroup",{open:s.value}])},[d("button",{class:"button","aria-controls":n.value,"aria-expanded":s.value,onClick:o},[d("span",wr,x(a.text),1),f(gr,{class:"button-icon"})],8,Vr),d("div",{id:n.value,class:"items"},[(r(!0),c(A,null,D(a.items,u=>(r(),c(A,{key:u.text},["link"in u?(r(),c("div",{key:u.text,class:"item"},[f(nt,{item:u},null,8,["item"])])):(r(),c("div",Lr,[f(Pr,{text:u.text,items:u.items},null,8,["text","items"])]))],64))),128))],8,Sr)],2))}});const xr=k(Mr,[["__scopeId","data-v-c2c554ed"]]),Cr={key:0,class:"VPNavScreenMenu"},Ir=$({__name:"VPNavScreenMenu",setup(e){const{theme:t}=C();return(s,n)=>l(t).nav?(r(),c("nav",Cr,[(r(!0),c(A,null,D(l(t).nav,o=>(r(),c(A,{key:o.text},["link"in o?(r(),V(_r,{key:0,item:o},null,8,["item"])):(r(),V(xr,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):g("",!0)}}),Tr=$({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=C();return(s,n)=>l(t).socialLinks?(r(),V(He,{key:0,class:"VPNavScreenSocialLinks",links:l(t).socialLinks},null,8,["links"])):g("",!0)}}),Nr={class:"list"},Ar=$({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:s}=oe({correspondingLink:!0}),n=M(!1);function o(){n.value=!n.value}return(a,i)=>l(t).length&&l(s).label?(r(),c("div",{key:0,class:B(["VPNavScreenTranslations",{open:n.value}])},[d("button",{class:"title",onClick:o},[f(st,{class:"icon lang"}),j(" "+x(l(s).label)+" ",1),f(tt,{class:"icon chevron"})]),d("ul",Nr,[(r(!0),c(A,null,D(l(t),u=>(r(),c("li",{key:u.link,class:"item"},[f(J,{class:"link",href:u.link},{default:v(()=>[j(x(u.text),1)]),_:2},1032,["href"])]))),128))])],2)):g("",!0)}});const Br=k(Ar,[["__scopeId","data-v-41505286"]]),Hr={class:"container"},zr=$({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=M(null),s=Je(ee?document.body:null);return(n,o)=>(r(),V(Se,{name:"fade",onEnter:o[0]||(o[0]=a=>s.value=!0),onAfterLeave:o[1]||(o[1]=a=>s.value=!1)},{default:v(()=>[n.open?(r(),c("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[d("div",Hr,[h(n.$slots,"nav-screen-content-before",{},void 0,!0),f(Ir,{class:"menu"}),f(Br,{class:"translations"}),f(ur,{class:"appearance"}),f(Tr,{class:"social-links"}),h(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):g("",!0)]),_:3}))}});const Dr=k(zr,[["__scopeId","data-v-57cce842"]]),Er={key:0,class:"VPNav"},Or=$({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:s,toggleScreen:n}=ko(),{frontmatter:o}=C(),a=L(()=>o.value.navbar!==!1);return Ye("close-screen",s),ve(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!a.value)}),(i,u)=>a.value?(r(),c("header",Er,[f(ir,{"is-screen-open":l(t),onToggleScreen:l(n)},{"nav-bar-title-before":v(()=>[h(i.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[h(i.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[h(i.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[h(i.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),f(Dr,{open:l(t)},{"nav-screen-content-before":v(()=>[h(i.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[h(i.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):g("",!0)}});const Fr=k(Or,[["__scopeId","data-v-7ad780c2"]]),jr=e=>(q("data-v-bd01e0d5"),e=e(),R(),e),Gr=["role","tabindex"],Ur=jr(()=>d("div",{class:"indicator"},null,-1)),qr=["onKeydown"],Rr={key:1,class:"items"},Kr=$({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:s,collapsible:n,isLink:o,isActiveLink:a,hasActiveLink:i,hasChildren:u,toggle:_}=Et(L(()=>t.item)),p=L(()=>u.value?"section":"div"),m=L(()=>o.value?"a":"div"),b=L(()=>u.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),w=L(()=>o.value?void 0:"button"),y=L(()=>[[`level-${t.depth}`],{collapsible:n.value},{collapsed:s.value},{"is-link":o.value},{"is-active":a.value},{"has-active":i.value}]);function P(S){"key"in S&&S.key!=="Enter"||!t.item.link&&_()}function I(){t.item.link&&_()}return(S,E)=>{const N=W("VPSidebarItem",!0);return r(),V(Y(p.value),{class:B(["VPSidebarItem",y.value])},{default:v(()=>[S.item.text?(r(),c("div",re({key:0,class:"item",role:w.value},mt(S.item.items?{click:P,keydown:P}:{},!0),{tabindex:S.item.items&&0}),[Ur,S.item.link?(r(),V(J,{key:0,tag:m.value,class:"link",href:S.item.link,rel:S.item.rel,target:S.item.target},{default:v(()=>[(r(),V(Y(b.value),{class:"text",innerHTML:S.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(r(),V(Y(b.value),{key:1,class:"text",innerHTML:S.item.text},null,8,["innerHTML"])),S.item.collapsed!=null?(r(),c("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:I,onKeydown:ft(I,["enter"]),tabindex:"0"},[f(Te,{class:"caret-icon"})],40,qr)):g("",!0)],16,Gr)):g("",!0),S.item.items&&S.item.items.length?(r(),c("div",Rr,[S.depth<5?(r(!0),c(A,{key:0},D(S.item.items,T=>(r(),V(N,{key:T.text,item:T,depth:S.depth+1},null,8,["item","depth"]))),128)):g("",!0)])):g("",!0)]),_:1},8,["class"])}}});const Wr=k(Kr,[["__scopeId","data-v-bd01e0d5"]]),ot=e=>(q("data-v-ee2efba5"),e=e(),R(),e),Jr=ot(()=>d("div",{class:"curtain"},null,-1)),Yr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Xr=ot(()=>d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Zr=$({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:s}=K(),n=e,o=M(null),a=Je(ee?document.body:null);return Q([n,o],()=>{var i;n.open?(a.value=!0,(i=o.value)==null||i.focus()):a.value=!1},{immediate:!0,flush:"post"}),(i,u)=>l(s)?(r(),c("aside",{key:0,class:B(["VPSidebar",{open:i.open}]),ref_key:"navEl",ref:o,onClick:u[0]||(u[0]=We(()=>{},["stop"]))},[Jr,d("nav",Yr,[Xr,h(i.$slots,"sidebar-nav-before",{},void 0,!0),(r(!0),c(A,null,D(l(t),_=>(r(),c("div",{key:_.text,class:"group"},[f(Wr,{item:_,depth:0},null,8,["item"])]))),128)),h(i.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):g("",!0)}});const Qr=k(Zr,[["__scopeId","data-v-ee2efba5"]]),el=$({__name:"VPSkipLink",setup(e){const t=pe(),s=M();Q(()=>t.path,()=>s.value.focus());function n({target:o}){const a=document.getElementById(decodeURIComponent(o.hash).slice(1));if(a){const i=()=>{a.removeAttribute("tabindex"),a.removeEventListener("blur",i)};a.setAttribute("tabindex","-1"),a.addEventListener("blur",i),a.focus(),window.scrollTo(0,0)}}return(o,a)=>(r(),c(A,null,[d("span",{ref_key:"backToTop",ref:s,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const tl=k(el,[["__scopeId","data-v-c8291ffa"]]),sl=$({__name:"Layout",setup(e){const{isOpen:t,open:s,close:n}=K(),o=pe();Q(()=>o.path,n),Dt(t,n);const{frontmatter:a}=C(),i=gt(),u=L(()=>!!i["home-hero-image"]);return Ye("hero-image-slot-exists",u),(_,p)=>{const m=W("Content");return l(a).layout!==!1?(r(),c("div",{key:0,class:B(["Layout",l(a).pageClass])},[h(_.$slots,"layout-top",{},void 0,!0),f(tl),f(Pt,{class:"backdrop",show:l(t),onClick:l(n)},null,8,["show","onClick"]),f(Fr,null,{"nav-bar-title-before":v(()=>[h(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[h(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[h(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[h(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[h(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[h(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),f(go,{open:l(t),onOpenMenu:l(s)},null,8,["open","onOpenMenu"]),f(Qr,{open:l(t)},{"sidebar-nav-before":v(()=>[h(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[h(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),f(Jn,null,{"page-top":v(()=>[h(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[h(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[h(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[h(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[h(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[h(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[h(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[h(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[h(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[h(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[h(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[h(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[h(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[h(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[h(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[h(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[h(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[h(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[h(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[h(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),f(eo),h(_.$slots,"layout-bottom",{},void 0,!0)],2)):(r(),V(m,{key:1}))}}});const nl=k(sl,[["__scopeId","data-v-9d8abc1e"]]);const al={Layout:nl,enhanceApp:({app:e})=>{e.component("Badge",bt)}};export{al as t}; diff --git a/assets/chunks/virtual_search-data.49d7e173.js b/assets/chunks/virtual_search-data.49d7e173.js deleted file mode 100644 index d669738..0000000 --- a/assets/chunks/virtual_search-data.49d7e173.js +++ /dev/null @@ -1,31 +0,0 @@ -const e={map:'[{"soundworks":["0.0","4.1","4.2","4.3","4.4","4.5","4.6","4.7","4.8","4.9","4.10","4.11","4.12","13.0","14.0","15.0","16.0","17.0","18.0","19.0"],"credits":["0.1","1.8","3.0","13.13","14.31","15.36","16.14","17.16","18.38","19.24"],"license":["0.2","3.6","13.14","14.32","15.37","16.15","17.17","18.39","19.25"],"notes":["1.0","14.7","15.6","18.6","19.6","23.5","24.7"],"structure":["1.1"],"homepage":["1.2"],"introduction":["1.3","6.0","21.2","25.2","26.2"],"tutorials":["1.4"],"receipes":["1.5"],"ecosystem":["1.6","4.0"],"misc":["1.7"],"design":["3.1"],"supporting":["3.2"],"artistic":["3.3"],"citing":["3.4"],"related":["3.5","23.1"],"div":["5.0"],"goal":["6.1"],"philosophy":["6.2"],"architecture":["6.3"],"client":["6.4","13.5","14.5","15.5","15.11","16.5","17.5","18.5","19.5","24.5"],"distributed":["6.5"],"plugin":["6.6"],"contributing":["7.0"],"install":["7.1"],"run":["7.2"],"publish":["7.3"],"examples":["7.4"],"adding":["7.5","7.8"],"subsection":["7.6","7.7"],"deploying":["8.0"],"application":["8.1"],"nginx":["8.2"],"apache":["8.3"],"deployment":["9.0"],"network":["9.1"],"dhcp":["9.2"],"dns":["9.3"],"wifi":["9.4"],"sharing":["9.5"],"tp":["9.6"],"unify":["9.7"],"configuring":["9.8","9.10"],"creating":["9.9","10.0","15.9","20.0","21.4","26.8","28.4","28.8","28.10","28.11"],"the":["9.11","25.3","25.4","26.3","26.4","28.0"],"how":["10.1","21.3"],"auto":["10.2"],"websockets":["11.0"],"scaffolding":["11.1","23.2","24.2","25.5","26.5","26.11","28.3"],"implementing":["11.2","23.3","23.4"],"opening":["11.3"],"propagating":["11.4"],"conclusion":["11.5","21.6","22.6","23.8","24.8","25.9","26.15","28.16"],"copyright":["12.0"],"table":["13.1","14.1","15.1","16.1","17.1","18.1","19.1"],"installation":["13.2","14.2","15.2","16.2","17.2","18.2","19.2"],"usage":["13.3","14.3","15.3","16.3","17.3","18.3","19.3"],"server":["13.4","14.4","15.4","16.4","17.4","18.4","19.4","24.4"],"api":["13.6","14.10","15.12","16.7","17.6","18.7","19.11"],"classes":["13.7","14.11","15.13","16.8","17.7","18.8","19.12"],"plugincheckinclient":["13.8","13.9","13.10"],"plugincheckinserver":["13.11"],"new":["13.12","14.22","15.15","15.19","16.10","17.9","17.15","18.18","19.14","19.20"],"registering":["14.6","24.3","26.7","28.9"],"reading":["14.8"],"security":["14.9"],"pluginfilesystemclient":["14.12","14.13","14.14","14.15","14.16","14.17","14.18","14.19","14.20"],"pluginfilesystemserver":["14.21","14.23","14.24","14.25","14.26","14.27","14.28","14.29","14.30"],"default":["15.7","19.7"],"prefix":["15.8"],"share":["15.10"],"pluginloggerclient":["15.14","15.16","15.17"],"pluginloggerserver":["15.18","15.20","15.21"],"writerclient":["15.22","15.23","15.24","15.25","15.26","15.27","15.28","15.29"],"writerserver":["15.30","15.31","15.32","15.33","15.34","15.35"],"available":["16.6"],"pluginplatforminitclient":["16.9","16.11","16.12"],"pluginplatforminitserver":["16.13"],"pluginpositionclient":["17.8","17.10","17.11","17.12","17.13"],"pluginpositionserver":["17.14"],"pluginscriptingclient":["18.9","18.10","18.11","18.12","18.13","18.14","18.15","18.16"],"pluginscriptingserver":["18.17","18.19","18.20","18.21","18.22","18.23","18.24","18.25","18.26","18.27"],"sharedscript":["18.28","18.29","18.30","18.31","18.32","18.33","18.34","18.35","18.36","18.37"],"using":["19.8","21.0","21.5","24.0","25.0","25.6","26.0","26.14"],"scheduling":["19.9"],"correspondances":["19.10"],"pluginsyncclient":["19.13","19.15","19.16","19.17","19.18"],"pluginsyncserver":["19.19","19.21","19.22"],"resources":["19.23"],"relevant":["21.1","24.1","25.1","26.1","28.1"],"getting":["22.0"],"prerequisites":["22.1"],"step":["22.2","22.3","22.4","22.5"],"working":["23.0"],"emulating":["23.6"],"running":["23.7"],"resuming":["24.6"],"register":["25.7"],"synchronizing":["25.8"],"declaring":["26.6"],"display":["26.9"],"remote":["26.10"],"binding":["26.12"],"observing":["26.13"],"synchronized":["27.0"],"user":["28.2"],"create":["28.5","28.13"],"attaching":["28.6"],"controlling":["28.7"],"resume":["28.12"],"implement":["28.14"],"remotely":["28.15"]},{"0":["22.5"],"1":["1.4","7.1","7.5","7.6","22.2","22.5","24.0","26.8","28.5"],"2":["7.7","22.3","25.0","25.4","28.4"],"3":["22.4"],"4":["22.5"],"5":["26.7"],"6":["26.7"],"7":["26.12"],"10":["26.12"],"101":["11.0"],"127":["22.5"],"2014":["12.0"],"8000":["22.5"],"website":["0.0","7.0"],"https":["0.1","5.0","7.7","9.11","13.0","13.13","14.31","16.14","17.0","17.16","18.38","19.0","19.24"],"bsd":["0.2","3.6","13.14","14.32","15.37","16.15","17.17","18.39","19.25"],"screenshot":["1.0"],"x":["1.2","1.3","1.4","1.7","17.10","17.12"],"links":["1.2","9.6"],"getting":["1.4","22.3"],"started":["1.4","22.0","22.3"],"using":["1.4","25.5","28.4","28.8","28.10"],"the":["1.4","3.3","4.1","4.6","4.10","6.2","6.3","6.4","6.5","7.3","7.8","8.0","8.1","8.2","11.1","11.2","11.4","12.0","13.12","14.6","14.8","14.12","14.15","14.21","14.22","14.23","15.10","15.15","15.19","15.20","15.26","15.36","16.6","16.10","16.11","16.12","17.9","17.10","17.12","17.15","18.6","18.9","18.17","18.18","18.23","19.7","19.8","19.10","19.14","19.15","19.16","19.20","19.21","19.22","22.2","22.3","22.4","22.5","22.6","23.3","23.4","23.7","24.0","24.2","24.3","24.4","24.5","24.6","24.7","24.8","25.0","25.5","25.6","25.7","25.8","25.9","26.0","26.5","26.6","26.7","26.8","26.9","26.11","26.12","26.13","26.14","26.15","28.2","28.3","28.4","28.5","28.6","28.7","28.8","28.9","28.10","28.11","28.12","28.13","28.14","28.15","28.16"],"state":["1.4","22.4","23.3","26.0","26.4","26.8","26.12","26.15","28.4","28.6","28.7","28.9","28.10","28.13","28.15"],"manager":["1.4","26.0","28.15"],"plugins":["1.4","24.0","24.8","25.0"],"soundworks":["1.4","1.6","3.1","3.3","5.0","6.1","6.2","6.4","6.6","14.4","14.12","14.21","15.4","16.6","16.10","17.4","18.9","18.17","22.2","22.6","23.0","24.2","24.3","24.7","24.8","26.4","26.5","26.11","26.12","26.14","26.15","28.3","28.12","28.15","28.16"],"plugin":["1.4","4.2","4.3","4.4","4.5","4.6","4.7","4.8","4.9","13.0","14.0","14.6","14.8","14.22","15.0","15.19","16.0","16.6","16.10","17.0","18.0","18.23","18.36","18.37","19.0","19.14","24.0","24.2","24.3","24.5","24.6","25.0","25.7","28.3","28.12"],"platform":["1.4","4.6","6.2","16.0","16.6","24.0","24.5","24.6","28.12"],"statemanager":["1.5","6.5","26.6"],"updatehook":["1.5"],"return":["1.5","14.15"],"setting":["1.7","22.2"],"up":["1.7","22.2"],"a":["1.7","5.0","6.6","7.5","7.8","8.0","8.1","9.0","11.0","11.1","11.2","11.3","11.4","11.5","13.7","14.11","14.14","14.23","14.25","15.7","15.10","15.13","15.16","15.17","15.21","15.28","15.29","15.35","16.6","16.8","17.7","18.8","18.10","18.13","18.19","18.24","18.28","18.34","18.35","19.9","19.12","20.0","21.4","22.2","22.4","22.5","23.3","23.4","23.7","24.2","24.6","25.3","25.4","25.5","26.3","26.4","26.6","28.0","28.2","28.3","28.4","28.9","28.10","28.12","28.13","28.15"],"development":["1.7","3.1","3.3","6.1","7.2","22.4"],"improve":["1.8"],"has":["3.1","3.2","6.2","15.36","19.8","26.6"],"been":["3.1","3.2","6.2","19.8"],"initiated":["3.1"],"by":["3.1","14.22","15.8","15.17","16.6","16.10","16.11","19.7","25.8","26.4","26.8","26.12","26.14","28.13"],"norbert":["3.1","3.5"],"research":["3.2","3.3","6.2"],"projects":["3.2"],"initial":["3.2"],"and":["3.2","3.5","6.2","6.4","7.1","11.2","11.3","11.4","12.0","14.9","15.8","15.25","15.33","17.10","17.12","18.28","19.10","22.2","22.3","22.4","22.5","23.4","24.2","24.4","24.5","24.7","24.8","25.7","26.6","26.9","26.10","26.11","26.12","26.13","28.4","28.6","28.8","28.9","28.13","28.14","28.15"],"futher":["3.2"],"developments":["3.2"],"supported":["3.2"],"collaborations":["3.3"],"design":["3.3"],"of":["3.3","4.1","6.2","11.4","13.1","14.1","14.12","14.21","15.1","15.13","15.16","15.21","16.1","17.1","17.8","18.1","18.8","18.9","18.17","19.1","19.9","19.13","19.15","19.16","19.21","19.22","22.3","22.5","23.3","23.4","24.2","24.5","24.6","24.8","25.2","25.3","25.8","26.2","26.3","26.4","26.5","26.6","26.9","26.13","28.2","28.4","28.15","28.16"],"this":["3.4","7.0","11.5","22.0","22.4","22.5","23.0","23.8","24.0","24.8","25.0","25.8","25.9","26.0","26.5","26.8","26.14","26.15","28.0","28.10","28.16"],"work":["3.4","7.3"],"benjamin":["3.4","3.5"],"matuszewski":["3.4","3.5"],"academic":["3.5"],"papers":["3.5"],"frederic":["3.5"],"bevilacqua":["3.5"],"garth":["3.5"],"paine":["3.5"],"schnell":["3.5"],"on":["3.5","5.0","6.1","8.0","9.0","11.3","11.4","19.7","19.9","22.5","23.3","23.7","24.7","25.4","25.7","26.3","26.8","26.9","28.4","28.5","28.6","28.7","28.14"],"designing":["3.5"],"composing":["3.5"],"performing":["3.5"],"networked":["3.5"],"collective":["3.5"],"interactions":["3.5"],"organised":["3.5"],"sound":["3.5","11.4","19.9","23.3"],"cambridge":["3.5"],"university":["3.5"],"toc":["4.0","15.1","19.1"],"core":["4.1","14.4","15.4","17.4","26.12"],"framework":["4.1","5.0","6.1"],"is":["4.1","6.1","6.2","8.1","11.0","11.2","11.3","11.4","11.5","15.7","19.8","19.10","22.2","22.5","23.4","23.7","24.6","25.3","25.4","25.7","25.8","26.4","26.6","26.14","28.7","28.14"],"principally":["4.1"],"audio":["4.2","16.6","19.8","19.9","23.4","25.8","28.13"],"buffer":["4.2"],"loader":["4.2"],"checkin":["4.3","13.0"],"for":["4.3","4.7","4.8","4.10","5.0","6.1","6.2","14.8","18.36","18.37","23.4","24.2","24.5","24.6","26.12","28.6","28.9","28.13"],"filesystem":["4.4","14.0","14.8","14.12","14.21","14.23"],"logger":["4.5","15.0"],"that":["4.6","8.2","11.0","11.3","11.4","12.0","19.8","22.5","23.3","23.4","23.7","24.3","24.6","24.7","25.3","25.4","25.7","26.3","26.6","26.8","26.9","26.13","26.14","28.7","28.9","28.10","28.14","28.15","28.16"],"checks":["4.6"],"availability":["4.6"],"position":["4.7","17.0","17.10"],"scripting":["4.8","18.0","18.17"],"runtime":["4.8"],"sync":["4.9","19.0","19.10","25.0"],"template":["4.10","4.11","4.12","24.7"],"project":["4.10","11.1","25.5"],"developing":["4.10"],"applications":["4.10","5.0","6.1"],"build":["4.11","22.3","28.0"],"helpers":["4.12","24.7","26.12"],"set":["4.12","17.10","17.12","26.6"],"class":["5.0","22.5"],"vphome":["5.0"],"use":["5.0","11.5","12.0","22.2","23.0","23.3","26.11","26.14","26.15"],"homepage":["5.0"],"styles":["5.0"],"h1":["5.0"],"intro":["5.0"],"img":["5.0"],"src":["5.0","16.4","16.5","18.4","18.5","22.5","24.4","24.5","24.7","25.7","26.7","26.8","26.12","28.7","28.9","28.12"],"assets":["5.0"],"home":["5.0"],"png":["5.0"],"p":["5.0","15.13","18.8","22.5"],"i":["5.0","25.4"],"open":["5.0","6.1","22.2","22.3","22.5","24.5","25.7","26.12","28.7"],"source":["5.0","6.1","12.0","18.29"],"creative":["5.0","6.1"],"coding":["5.0","6.1"],"distributed":["5.0","6.1","11.5","18.28","26.0","26.4","26.15"],"based":["5.0","6.1","26.8","28.14"],"web":["5.0","6.1","23.4","28.10"],"technologies":["5.0","6.1"],"br":["5.0"],"ref":["5.0"],"badge":["5.0","13.0","19.0"],"fury":["5.0","13.0","19.0"],"io":["5.0","13.0","19.0"],"js":["5.0","11.2","13.4","13.5","14.4","14.6","15.4","15.5","16.4","16.5","17.4","17.5","18.4","18.5","19.0","19.4","19.5","22.5","23.3","23.4","24.4","24.5","24.7","25.7","26.7","26.8","26.12","28.9","28.12","28.13"],"2fcore":["5.0"],"style":["5.0"],"width":["5.0"],"auto":["5.0"],"height":["5.0"],"20px":["5.0"],"margin":["5.0"],"top":["5.0"],"svg":["5.0"],"an":["6.1","6.2","9.9","19.8","23.8","24.6","25.3","25.8","26.3","28.16"],"primarily":["6.1","6.2"],"focused":["6.1"],"music":["6.1","6.2"],"aims":["6.1","28.16"],"at":["6.1","19.9"],"supporting":["6.1"],"rapid":["6.1"],"still":["6.2"],"developped":["6.2"],"as":["6.2","15.10","16.6","18.6","19.8","24.5","24.6","24.7","25.3","26.3","26.6","26.8","28.8"],"experimental":["6.2"],"artistic":["6.2"],"scientific":["6.2"],"in":["6.2","7.7","12.0","15.6","15.8","15.9","15.10","15.11","15.20","18.6","21.0","22.0","22.3","22.4","23.0","23.4","23.6","23.8","24.0","24.4","24.6","24.7","24.8","25.0","25.3","25.4","25.8","25.9","26.0","26.3","26.8","26.15","28.0","28.2","28.8","28.10","28.16"],"domain":["6.2"],"arts":["6.2"],"such":["6.2"],"code":["6.2","13.9","13.10","14.13","14.14","14.15","14.16","14.17","14.18","14.19","14.20","14.24","14.25","14.26","14.27","14.28","14.29","14.30","15.16","15.21","15.27","15.34","15.36","17.11","17.13","18.11","18.12","18.13","18.14","18.15","18.16","18.20","18.21","18.22","18.24","18.25","18.26","18.27","18.29","18.30","18.31","18.32","18.34","19.15","19.16","19.18","19.21","19.22","22.5","23.4","24.4","25.7","26.9","26.11","26.12","28.13"],"base":["6.2"],"server":["6.4","8.0","8.2","11.2","11.3","13.11","14.21","15.8","15.18","15.30","17.14","18.17","19.7","19.19","22.3","22.4","22.5","23.4","24.5","25.7","26.7","26.8","28.5","28.9"],"initalization":["6.4"],"shared":["6.5","15.17","18.6","22.4","26.8","26.9","26.12","28.4","28.5","28.6","28.7","28.8","28.10"],"states":["6.5","26.8","26.9","26.13","28.7","28.8","28.9","28.15"],"component":["6.5","26.6","28.10"],"provides":["6.5","11.0"],"tools":["6.5","22.2"],"host":["6.6"],"also":["6.6","16.6"],"implements":["6.6"],"system":["6.6","18.6","25.3","26.4","26.15"],"to":["7.0","8.0","8.1","8.2","10.1","11.1","11.2","11.5","14.9","14.14","14.23","14.25","15.11","15.17","15.28","15.29","15.35","16.6","16.11","18.10","18.19","18.22","18.23","18.35","19.8","19.9","19.17","22.0","22.2","22.3","22.4","22.5","23.0","23.4","23.7","24.6","25.3","25.4","25.8","26.8","26.9","26.11","26.12","26.13","26.14","26.15","28.3","28.4","28.6","28.7","28.9","28.10","28.14","28.15","28.16"],"you":["7.0","8.0","11.5","15.11","19.9","22.3","22.6","24.2","24.8","25.9","26.6","26.15","28.3","28.16"],"wrote":["7.0","22.6"],"some":["7.0","19.9","22.2","23.7","26.3","26.12"],"documentation":["7.0","23.1","24.1","25.1","26.1","28.1"],"clone":["7.1"],"repo":["7.1"],"mode":["7.2","22.4"],"get":["7.2","16.12","28.15"],"remote":["7.2"],"changes":["7.2"],"tip":["7.3","22.2","22.4","26.6"],"note":["7.3","9.1"],"following":["7.3","19.10","22.2","22.3","24.2","24.4","25.4","25.7","26.12","28.9"],"commands":["7.3","23.4"],"will":["7.3","8.2","11.2","11.4","14.22","16.10","19.14","22.0","23.0","23.3","23.4","24.2","25.0","25.3","26.0","28.0","28.4","28.6","28.9","28.10","28.13","28.14"],"only":["7.3","19.8","28.6","28.14"],"misc":["7.5"],"page":["7.5","7.8","22.5"],"add":["7.5","24.6","25.7","26.12"],"duis":["7.7"],"aute":["7.7"],"irure":["7.7"],"dolor":["7.7"],"cf":["7.7"],"vuepress":["7.7"],"vuejs":["7.7"],"org":["7.7"],"tutorial":["7.8","11.5","22.0","23.0","23.6","23.8","24.6","24.8","25.0","25.9","26.0","26.15","28.0","28.16"],"creating":["7.8","26.12","28.9","28.13"],"follow":["7.8"],"internets":["8.0"],"if":["8.0","15.7","26.6","28.12"],"want":["8.0","15.11","26.8"],"deploy":["8.0"],"single":["8.0"],"application":["8.0","9.8","11.5","16.11","22.2","22.3","22.5","22.6","23.2","24.2","24.7","25.5","26.3","26.5","26.8","28.0","28.2","28.3","28.4"],"there":["8.0"],"configure":["8.1","26.11"],"first":["8.1","11.1","22.2","22.4","22.5","22.6","23.4","24.0","24.2","24.4","25.2","25.5","26.2","26.7","26.8","28.3","28.5","28.12"],"thing":["8.1","19.8","22.2","24.2","25.3","25.5","26.13","28.3","28.12"],"do":["8.1","25.8","26.13"],"create":["8.1","11.1","11.2","11.3","11.5","15.16","15.21","18.13","18.24","22.2","22.4","23.0","24.2","25.5","26.8","26.11","28.3","28.9","28.10","28.14"],"new":["8.1","11.1","11.2","14.23","18.13","18.24","22.2","24.2","25.5","26.11","28.3","28.9","28.12"],"env":["8.1"],"config":["8.1","8.2","8.3","22.5","28.12"],"file":["8.1","11.2","18.6","22.3","22.5","24.4","25.7","26.7","26.12","28.9"],"proxy":["8.2"],"need":["8.2","11.2"],"be":["8.2","11.4","13.12","14.22","15.19","15.28","15.29","15.35","16.10","16.11","17.9","17.15","18.10","18.18","18.19","18.28","19.14","19.20","23.4","25.4","26.6","26.8","26.13","28.7","28.13"],"configured":["8.2","26.6"],"so":["8.2","11.2","11.4","22.2","23.3","24.6","25.8","26.5","26.8"],"it":["8.2","11.5","24.2","25.3","26.6","26.14"],"route":["8.2"],"all":["8.2","11.2","12.0","15.8","23.4","26.2","26.8","26.11","26.13","28.6","28.7","28.14","28.15"],"request":["8.2"],"configuration":["9.1","23.7"],"access":["9.4"],"internet":["9.5"],"ports":["9.10"],"issue":["9.11"],"electron":["10.0"],"updates":["10.2"],"websocket":["11.0","11.3","11.5"],"communication":["11.0","11.4"],"protocol":["11.0"],"full":["11.0"],"duplex":["11.0"],"channels":["11.0"],"let":["11.1","11.2","11.3","11.4","22.5","23.2","23.3","23.4","24.2","24.4","24.5","25.5","25.7","26.7","26.8","26.9","26.11","26.12","26.14","28.3","28.5","28.6","28.7","28.9","28.10","28.12","28.13","28.15"],"s":["11.1","11.2","11.3","11.4","22.5","23.2","23.3","23.4","24.2","24.4","24.5","25.5","25.7","26.7","26.8","26.9","26.11","26.12","26.14","28.3","28.5","28.6","28.7","28.9","28.10","28.12","28.13","28.15"],"simple":["11.1","11.2","11.5","22.2","22.5","28.0","28.10","28.14"],"sh":["11.1","13.2","14.2","15.2","16.2","17.2","18.2","19.2","22.2","22.3","22.4","23.4","28.3"],"cd":["11.1","22.2","28.3"],"path":["11.1","14.16","14.26","22.2","28.3"],"working":["11.1","22.2","25.3","28.2","28.3"],"directory":["11.1","14.23","15.20","22.2","22.3","28.3"],"npx":["11.1","22.2","28.3"],"ircam":["11.1","12.0","26.12"],"now":["11.2","11.3","11.4","14.8","22.5","24.3","24.6","25.7","26.9","28.6","28.7","28.14"],"eveything":["11.2","11.3","25.7","28.11"],"ready":["11.2","22.5","25.7","28.14"],"implement":["11.2","22.5","28.4","28.7"],"our":["11.2","11.3","11.4","22.2","22.5","23.2","23.3","23.4","25.7","25.8","26.8","26.9","26.11","26.13","28.6","28.7","28.8","28.13","28.14","28.15"],"called":["11.2","13.12","14.22","15.19","16.10","17.15","18.18","19.14","19.20"],"start":["11.2","22.5","23.2","23.3","24.4","25.7","26.12","28.13"],"with":["11.2","12.0","15.7","23.0","23.2","23.3","24.2","24.4","25.3","25.7","25.8","26.3","26.6","26.12","28.3","28.7","28.9","28.12"],"importing":["11.2"],"dependencies":["11.2"],"we":["11.2","11.4","22.0","22.5","23.0","23.3","23.6","23.8","24.6","24.7","25.0","25.4","25.8","26.0","26.3","26.6","26.8","26.13","26.15","28.0","28.6","28.7","28.9","28.10","28.14"],"import":["11.2","13.5","14.4","14.6","15.4","15.5","16.5","17.4","17.5","18.4","18.5","18.32","24.4","24.5","26.7","26.12","28.5"],"http":["11.2","22.5"],"from":["11.2","14.4","14.9","15.4","15.5","17.4","18.4","18.5","26.4","26.6","26.12","26.13","28.7","28.9","28.15"],"node":["11.2","22.1","23.0","23.3","23.4","23.7"],"websocketserver":["11.2"],"client":["11.3","11.4","13.8","14.9","14.12","15.8","15.13","15.14","15.22","16.9","16.13","17.8","18.8","18.9","19.10","19.13","22.5","23.4","23.7","24.2","25.7","26.9","26.11","26.12","26.14","28.7"],"setup":["11.3","11.4","26.9","28.7"],"running":["11.3"],"side":["11.3","13.8","13.11","14.12","14.21","15.8","15.11","15.13","15.14","15.18","15.22","15.30","16.9","17.8","17.14","18.8","18.9","18.17","19.7","19.10","19.13","19.19","22.5","24.4","24.5","25.7","26.9","28.7"],"events":["11.4","19.9"],"channel":["11.4"],"modify":["11.4","22.5"],"sligthly":["11.4"],"behavior":["11.4"],"demo":["11.4"],"app":["11.4","22.5"],"user":["11.4","26.3","28.4","28.8","28.10"],"click":["11.4","24.6"],"bang":["11.4"],"components":["11.4","26.12"],"triggered":["11.4"],"every":["11.4"],"connected":["11.4","14.9","20.0","28.7","28.9","28.10","28.15"],"not":["11.4","14.8","23.4","24.7"],"just":["11.4","11.5","22.6","26.14"],"itself":["11.4"],"data":["11.4","14.17","14.27","15.25","15.33"],"flow":["11.4"],"thus":["11.4","25.4"],"showed":["11.5"],"how":["11.5","22.0","23.0","25.4","26.4","26.15"],"however":["11.5","28.14"],"c":["12.0","22.3","23.4"],"present":["12.0"],"centre":["12.0"],"pompidou":["12.0"],"france":["12.0"],"paris":["12.0"],"rights":["12.0"],"reserved":["12.0"],"redistribution":["12.0"],"binary":["12.0"],"forms":["12.0"],"or":["12.0","24.6","25.3","28.2"],"without":["12.0"],"modification":["12.0"],"are":["12.0","15.8","18.6","24.7","25.8","26.6","26.9","28.12"],"permitted":["12.0"],"provided":["12.0","26.12"],"npm":["13.0","14.0","15.0","16.0","17.0","19.0","22.4","23.4"],"version":["13.0","16.0","17.0","19.0"],"index":["13.4","13.5","14.4","14.6","15.4","15.5","16.4","16.5","17.4","17.5","18.4","18.5","19.4","19.5","22.5","24.4","24.5","24.7","25.7","26.7","26.12","28.12"],"dl":["13.7","14.11","15.13","16.8","17.7","18.8","19.12"],"dt":["13.7","14.11","15.13","16.8","17.7","18.8","19.12"],"href":["13.7","14.11","15.13","16.8","17.7","18.8","19.12"],"plugincheckinclient":["13.7"],"representation":["13.8","14.12","14.21","15.13","15.14","15.18","16.9","17.8","18.8","18.9","18.17","19.13","19.19"],"getindex":["13.9"],"number":["13.9","19.15","19.16","19.21","19.22","26.12"],"getdata":["13.10"],"mixed":["13.10"],"plugincheckinserver":["13.12"],"constructor":["13.12","14.22","15.15","15.19","16.10","17.9","17.15","18.18","19.14","19.20"],"should":["13.12","14.22","15.15","15.19","16.10","17.9","17.15","18.18","19.14","19.20","22.3"],"never":["13.12","14.22","15.19","16.10","17.9","17.15","18.18","19.14","19.20"],"contents":["14.1","15.1","16.1","18.1","19.1"],"pluginfilesystem":["14.4"],"files":["14.8","14.9","15.8","15.9","18.6"],"does":["14.8","23.4","24.6"],"provide":["14.8","16.6"],"any":["14.8","14.9","23.3","25.8","28.10"],"being":["14.9"],"able":["14.9","26.13","28.7"],"write":["14.9","15.25","15.33","23.4","24.4"],"delete":["14.9","18.15","18.26","18.37"],"pluginfilesystemclient":["14.11"],"gettree":["14.13","14.24","18.12","18.21"],"onupdate":["14.14","14.25","18.22","18.34"],"callback":["14.14","14.25","15.28","15.29","15.35","18.22","18.34","18.35","19.17"],"executelistener":["14.14","14.25","18.22","18.34"],"function":["14.14","14.25","15.28","15.29","15.35","18.22","18.34"],"register":["14.14","14.25","15.28","15.29","15.35","18.22","18.34","18.35","28.9"],"execute":["14.14","14.25","18.22","22.2"],"gettreeasurlmap":["14.15"],"filterext":["14.15"],"keepextension":["14.15"],"object":["14.15","14.16","14.26","17.11","17.13","18.10","18.12","18.19","18.21","19.18","24.7"],"findintree":["14.16","14.26"],"writefile":["14.17","14.27"],"pathname":["14.17","14.18","14.20","14.27","14.28","14.30","15.24","15.32"],"promise":["14.17","14.18","14.27","14.28","15.27","15.34","18.13","18.14","18.15","18.16","18.24","18.25","18.26","18.27","18.32"],"mkdir":["14.18","14.28"],"rename":["14.19","14.29"],"oldpath":["14.19","14.29"],"newpath":["14.19","14.29"],"rm":["14.20","14.30"],"pluginfilesystemserver":["14.22"],"manually":["14.22","15.19","16.10","17.15","18.18","19.14","19.20"],"instantiated":["14.22","16.10"],"switch":["14.23","15.20","18.23"],"options":["14.23","15.16","15.17","15.21"],"e":["14.23","25.4","28.2"],"g":["14.23","28.2"],"installation":["15.1","19.1"],"usage":["15.1","24.8"],"receipes":["15.6","19.6"],"extension":["15.7"],"writer":["15.7","15.10","15.16","15.17","15.21","15.22","15.30"],"created":["15.7","15.17","15.22","24.7","25.8","26.6"],"no":["15.7"],"extesion":["15.7"],"log":["15.8","15.9"],"default":["15.8","15.16","16.6","24.2","24.7"],"sub":["15.9","25.4"],"directories":["15.9"],"between":["15.10","19.10","25.4"],"several":["15.10"],"clients":["15.10","16.5","18.28","22.5","23.0","23.3","23.6","23.7","24.5","24.7","26.8","26.12","26.13","28.6","28.7","28.12"],"similar":["15.10","19.10"],"way":["15.10","16.6","22.2","25.3","26.3"],"buffering":["15.11"],"many":["15.11"],"cases":["15.11"],"may":["15.11"],"pluginloggerclient":["15.13","15.15"],"dd":["15.13","18.8"],"createwriter":["15.16","15.21"],"name":["15.16","15.17","15.21","15.23","15.31","18.13","18.14","18.15","18.16","18.24","18.25","18.26","18.27","22.5","24.2"],"kind":["15.16","15.21","26.6"],"instance":["15.16","15.21","28.5"],"method":["15.16","15.21","16.11","28.15"],"param":["15.16","15.21"],"type":["15.16"],"attachwriter":["15.17"],"attach":["15.17","18.16","18.27","28.6"],"pluginloggerserver":["15.19"],"dirname":["15.20","18.23"],"change":["15.20","22.5","26.9"],"which":["15.20","26.3","26.6","26.15","28.9","28.13","28.15"],"stream":["15.22","15.30"],"format":["15.25","15.33"],"successive":["15.25","15.33"],"flush":["15.26"],"close":["15.27","15.34"],"onpacketsend":["15.28"],"onclose":["15.29","15.35"],"executed":["15.29","16.11"],"init":["16.0","16.6","24.0","24.5","24.6","28.12"],"features":["16.6","23.3","23.4","24.6"],"resume":["16.6","19.8"],"context":["16.6","18.10","18.19","21.3","25.8","28.12"],"shown":["16.6"],"above":["16.6","26.8","28.4"],"but":["16.6","24.6","25.8"],"pluginplatforminitclient":["16.8","16.10"],"when":["16.10","19.8","19.9","24.2","25.3","25.4","26.9","26.14"],"onusergesture":["16.11"],"featureid":["16.12"],"returns":["16.12","19.7"],"poayload":["16.12"],"pluginpositionclient":["17.7","17.9"],"setposition":["17.10"],"y":["17.10","17.12"],"getposition":["17.11"],"setnormalizedposition":["17.12"],"getnormalizedposition":["17.13"],"pluginpositionserver":["17.15"],"scripts":["18.6"],"stored":["18.6"],"raw":["18.6"],"javascript":["18.6","26.6"],"located":["18.6"],"pluginscriptingclient":["18.8"],"setglobalscriptingcontext":["18.10","18.19"],"ctx":["18.10","18.19"],"registers":["18.10","18.19"],"global":["18.10","18.19","22.4","26.8","26.12","28.4","28.6","28.7","28.13"],"getlist":["18.11","18.20"],"array":["18.11","18.20"],"createscript":["18.13","18.24"],"value":["18.13","18.14","18.24","18.25","18.36"],"updatescript":["18.14","18.25","18.36"],"update":["18.14","18.25","18.36","26.9"],"deletescript":["18.15","18.26","18.37"],"pluginscriptingserver":["18.18"],"watch":["18.23"],"can":["18.28","22.5","23.3","25.4","25.8","26.3","26.6","26.8","28.3","28.14"],"amongst":["18.28"],"different":["18.28","25.3","26.9"],"modified":["18.28"],"error":["18.30"],"transpiled":["18.31"],"dynamically":["18.32"],"detach":["18.33"],"stop":["18.33","22.3"],"ondetach":["18.35"],"alias":["18.36","18.37"],"clocks":["19.7","25.4"],"master":["19.7","28.13"],"clock":["19.7","19.8","19.21","25.8"],"used":["19.7","23.4","23.6"],"audiocontext":["19.8","24.6","25.8","28.12"],"currenttime":["19.8"],"local":["19.8","19.10","19.15","19.21"],"important":["19.8","23.7","25.3","28.16"],"consider":["19.8","23.7","25.4"],"perform":["19.8"],"synchronization":["19.8","25.8"],"starts":["19.8","22.4"],"increment":["19.8"],"await":["19.8","22.5"],"synchronized":["19.9"],"propagate":["19.9"],"event":["19.9"],"your":["19.9","22.3","22.5","22.6"],"network":["19.9","23.7"],"devices":["19.9","25.3"],"trigger":["19.9","23.3"],"specific":["19.9"],"time":["19.9","19.10","19.15","19.16","19.21","19.22","26.3"],"api":["19.10","21.1","23.4"],"pluginsyncclient":["19.12","19.14"],"getlocaltime":["19.15","19.21"],"synctime":["19.15","19.21"],"getsynctime":["19.16","19.22"],"audiotime":["19.16"],"synced":["19.16","19.22"],"onreport":["19.17"],"subscribe":["19.17"],"getreport":["19.18"],"pluginsyncserver":["19.20"],"localtime":["19.22"],"jean":["19.23"],"philippe":["19.23"],"lambert":["19.23"],"lamp":["20.0"],"contexts":["21.0","21.5"],"learn":["22.0"],"things":["22.2","28.14"],"best":["22.2"],"most":["22.2","26.3"],"dedicated":["22.2"],"command":["22.2","22.4"],"line":["22.2","22.5"],"terminal":["22.2","22.4","26.11"],"go":["22.2","22.4","22.5","26.11","28.15"],"dir":["22.2"],"latest":["22.2","28.3"],"exploring":["22.3"],"structure":["22.3","28.14"],"press":["22.3"],"ctrl":["22.3","23.4"],"favorite":["22.3"],"text":["22.3","22.5","26.12"],"editor":["22.3","22.5"],"see":["22.3"],"where":["22.3","25.4"],"back":["22.4","22.5","28.15"],"restart":["22.4"],"run":["22.4"],"dev":["22.4"],"quite":["22.4"],"wisely":["22.4"],"make":["22.5"],"interactive":["22.5"],"logic":["22.5","23.3"],"browser":["22.5"],"then":["22.5","28.9","28.10","28.13"],"player":["22.5","24.2","24.5","24.7","26.13","28.6","28.7","28.8","28.9","28.10","28.12"],"sure":["22.5"],"act":["22.5"],"fancy":["22.5"],"black":["22.5"],"screen":["22.5","26.9","28.6"],"render":["22.5","26.12"],"html":["22.5","26.12"],"div":["22.5"],"layout":["22.5"],"hello":["22.5"],"congrats":["22.6"],"along":["22.6"],"explore":["23.0"],"control":["23.3","26.10","26.13","26.14","28.7","28.10","28.15"],"before":["23.3"],"cient":["23.3"],"have":["23.3","23.8","24.7","24.8","25.8","25.9","28.16"],"learned":["23.3","24.8","25.9","26.15","28.16"],"far":["23.3","24.6","25.8"],"controller":["23.3","26.11","26.12","26.13","28.7","28.10","28.15"],"future":["23.3"],"defining":["23.3"],"call":["23.3","26.6"],"shutdown":["23.4","26.11"],"while":["23.4"],"launch":["23.4"],"few":["23.4"],"install":["23.4"],"package":["23.4"],"allow":["23.4","28.10"],"us":["23.4","28.10"],"into":["23.4","24.3","25.3","26.0","26.7"],"save":["23.4"],"info":["23.4","26.5","26.9"],"re":["23.4"],"implementation":["23.4"],"specification":["23.4"],"within":["23.4","26.14"],"written":["23.4"],"rust":["23.4"],"language":["23.4"],"relatively":["23.4"],"recent":["23.4"],"expose":["23.4","28.15"],"yet":["23.4","24.7","25.8"],"multiple":["23.6","25.3","26.6","28.12"],"previous":["23.6"],"often":["23.6"],"another":["23.7","28.9","28.13"],"point":["23.7","26.4","28.2"],"needs":["23.7","26.13"],"explored":["23.8"],"installing":["24.2","25.7"],"generate":["24.2","28.3"],"empty":["24.2","28.3"],"wizard":["24.2","26.5","26.11","28.3"],"ask":["24.2"],"enter":["24.2"],"informations":["24.2"],"select":["24.2","28.3"],"registration":["24.4","24.5"],"part":["24.4","24.5"],"good":["24.6","25.8"],"what":["24.6","25.8","28.7"],"did":["24.6","28.7"],"until":["24.6"],"mainly":["24.6"],"slashscreen":["24.6"],"asking":["24.6"],"nothing":["24.6"],"particular":["24.6"],"stated":["24.6"],"beginning":["24.6"],"whole":["24.6"],"aim":["24.6"],"simplify":["24.6","28.16"],"initialization":["24.6"],"require":["24.6"],"views":["24.7"],"spashscreen":["24.7"],"well":["24.7"],"other":["24.7"],"inititialization":["24.7"],"seen":["24.7"],"automatically":["24.7","26.14"],"handled":["24.7"],"launcher":["24.7","26.12"],"included":["24.7"],"basics":["24.8"],"why":["25.3","26.3"],"understand":["25.3"],"composed":["25.3"],"each":["25.3","26.13","26.14","28.9"],"them":["25.3"],"live":["25.3"],"timeline":["25.3"],"say":["25.3"],"more":["25.3","25.4","26.4"],"formal":["25.3"],"observation":["25.3"],"consequence":["25.3"],"dealing":["25.3"],"independent":["25.3"],"nodes":["25.3"],"one":["25.3","28.13"],"practical":["25.4"],"manner":["25.4"],"trying":["25.4"],"synchornize":["25.4"],"face":["25.4"],"problem":["25.4","26.14"],"express":["25.4"],"form":["25.4"],"t":["25.4","25.8"],"clock1":["25.4"],"clock2":["25.4"],"b":["25.4"],"speed":["25.4"],"difference":["25.4"],"two":["25.4","28.14"],"their":["25.4","26.6","26.9"],"drift":["25.4"],"both":["25.7"],"interested":["25.8"],"too":["25.8"],"synchronize":["25.8"],"synthesis":["25.8"],"don":["25.8"],"process":["25.8"],"indeed":["25.8"],"dig":["26.0"],"think":["26.3","26.6","26.15"],"something":["26.3"],"runs":["26.3"],"computer":["26.3"],"interact":["26.3"],"technical":["26.4"],"view":["26.4","28.2"],"management":["26.4","26.15"],"proposed":["26.4"],"circular":["26.4"],"dataflow":["26.4"],"pattern":["26.4","28.16"],"loosely":["26.4"],"inspired":["26.4"],"flux":["26.4"],"section":["26.5"],"requires":["26.5"],"basic":["26.5"],"knowledge":["26.5"],"schemas":["26.6","26.7","26.8","28.9"],"objects":["26.6"],"declare":["26.6"],"attributes":["26.6"],"properties":["26.6"],"schema":["26.6","26.8","28.4","28.5","28.9"],"blueprint":["26.6"],"sharedstate":["26.6"],"instances":["26.6"],"familiar":["26.6"],"databases":["26.6"],"declarations":["26.7"],"declaration":["26.8"],"defined":["26.8","28.4","28.8"],"explained":["26.8"],"unique":["26.8"],"across":["26.8"],"entire":["26.8"],"share":["26.8","26.14"],"same":["26.8","28.14"],"values":["26.8","26.9","28.6"],"simply":["26.8","28.10"],"achieved":["26.8"],"continue":["26.9"],"current":["26.9","28.6"],"monitoring":["26.10"],"boilerplate":["26.11"],"controls":["26.12"],"high":["26.12"],"level":["26.12"],"sc":["26.12"],"library":["26.12","28.10"],"polyfills":["26.12"],"lit":["26.12","28.10"],"slider":["26.12"],"controlling":["26.13"],"collections":["26.13"],"final":["26.13"],"would":["26.13"],"like":["26.13"],"frequency":["26.13"],"end":["26.13","28.2","28.9","28.10","28.15"],"track":["26.13"],"creation":["26.13"],"deletion":["26.13"],"id":["26.14"],"enhance":["26.14"],"interface":["26.14","28.10"],"fix":["26.14"],"given":["26.14"],"connects":["26.14"],"scheduling":["27.0"],"todo":["28.0","28.3"],"noise":["28.0","28.3"],"story":["28.2","28.4","28.8"],"purposely":["28.2"],"privileges":["28.2"],"situation":["28.2"],"developer":["28.2"],"designer":["28.2"],"composer":["28.2"],"performer":["28.2"],"rather":["28.2"],"than":["28.2"],"already":["28.3"],"rely":["28.4"],"types":["28.4"],"display":["28.6"],"its":["28.6"],"everything":["28.7"],"similarly":["28.7"],"define":["28.9"],"players":["28.9","28.15"],"snippet":["28.9"],"graphical":["28.10"],"abstraction":["28.10"],"reuse":["28.10"],"later":["28.10"],"remotely":["28.10"],"take":["28.10"],"over":["28.10"],"synthesizers":["28.11"],"instanciate":["28.12"],"const":["28.12"],"window":["28.12"],"emulated":["28.12"],"chain":["28.13"],"bus":["28.13"],"controlled":["28.13"],"gainnode":["28.13"],"volume":["28.13"],"parameter":["28.13"],"mute":["28.13"],"synths":["28.14"],"finally":["28.14"],"keep":["28.14"],"focus":["28.14"],"general":["28.14"],"architecture":["28.14"],"oscillators":["28.14"],"exact":["28.14"],"list":["28.15"],"getcollection":["28.15"],"allows":["28.15"],"grab":["28.15"],"collection":["28.15"],"mirror":["28.15"],"ability":["28.16"]},{"0":["19.8","28.13","28.14"],"1":["11.4","22.6","25.4","28.13"],"2":["1.4","11.4","26.8"],"3":["0.2","3.5","3.6","11.4","13.14","14.32","15.37","16.15","17.17","18.39","19.25","26.14"],"4":["24.4","24.5"],"5":["24.4","24.5"],"6":["23.6","26.14"],"26":["3.5"],"39":["18.8"],"50":["28.9"],"101":["11.1"],"200":["28.9"],"333":["3.5"],"339":["3.5"],"2000":["28.9"],"2021":["3.5"],"8002":["8.2"],"sources":["0.0","7.1","7.2"],"for":["0.0","3.5","4.2","4.9","9.1","11.2","18.33","19.0","22.2","25.4","25.7","26.6","28.3","28.7","28.14"],"soundworks":["0.1","7.0","7.3","13.4","13.5","13.8","13.13","14.6","14.22","14.31","15.5","15.13","15.14","15.18","15.19","16.5","16.9","16.14","17.5","17.8","17.15","17.16","18.4","18.5","18.8","18.18","18.38","19.4","19.5","19.13","19.14","19.19","19.20","19.24","22.0","22.5","23.1","23.2","23.4","23.8","24.0","24.4","24.5","25.1","25.5","25.7","26.0"],"size":["1.0"],"to":["1.2","4.1","4.3","4.4","4.5","4.8","4.10","5.0","6.1","6.2","6.5","6.6","7.1","7.7","11.3","11.4","13.0","14.8","14.22","15.10","15.16","15.21","15.25","15.33","16.10","16.12","18.16","18.27","18.34","21.5","22.6","23.2","23.3","23.6","24.2","24.7","24.8","25.5","26.3","26.4","26.5","26.6","28.2","28.8","28.12"],"apps":["1.2"],"ismm":["1.2"],"what":["1.3"],"init":["1.4","24.2","24.8","28.3"],"example":["1.4"],"mixing":["1.4"],"it":["1.4","5.0","6.1","11.2","11.4","22.2","23.4","25.8","26.3","26.5","26.8","28.3"],"all":["1.4","15.20","18.13","18.24","22.3","25.2","26.6","26.9"],"todo":["1.4"],"noise":["1.4"],"application":["1.4","4.6","14.9","22.0","22.4","23.0","23.3","25.7","26.6","26.9","26.11","26.13","28.7"],"values":["1.5"],"etc":["1.5"],"customize":["1.5"],"the":["1.5","3.2","4.8","5.0","6.1","7.5","11.3","11.5","13.8","13.9","13.10","14.14","14.16","14.25","14.26","15.6","15.7","15.11","15.13","15.14","15.16","15.17","15.18","15.21","15.22","15.23","15.24","15.27","15.28","15.29","15.31","15.32","15.34","15.35","16.9","17.8","17.11","17.13","18.8","18.10","18.11","18.12","18.13","18.14","18.15","18.19","18.20","18.21","18.22","18.24","18.25","18.26","18.28","18.32","18.34","18.35","19.9","19.13","19.17","19.18","19.19","23.6","23.8"],"core":["1.6","6.3","13.5","14.6","15.5","16.5","17.5","18.4","18.5","24.4","24.5","25.7"],"create":["1.6","6.5","14.18","14.28","15.17","23.2","23.3","23.4","26.9","26.13","26.15","28.16"],"environment":["1.7","9.9"],"some":["1.7","28.2","28.8"],"general":["1.7","25.9"],"principles":["1.7","28.14"],"about":["1.7","7.0"],"networks":["1.7"],"project":["1.8","3.2","14.23","22.0","23.4"],"schnell":["3.1","19.23"],"sébastien":["3.1","19.23"],"robaszkiewicz":["3.1","19.23"],"and":["3.1","4.2","4.4","4.6","5.0","6.1","6.6","14.23","15.11","15.22","15.30","15.34","16.6","18.23","19.8","22.0","23.3","24.0","25.3","25.4","25.9","26.3","26.8","26.15","28.2","28.3","28.7","28.16"],"benjamin":["3.1"],"matuszewski":["3.1"],"at":["3.1","5.0","14.9","14.23","18.28","26.3","26.11"],"by":["3.2","4.6","8.2","13.12","15.7","15.19","15.22","15.30","17.10","17.12","17.15","18.18","19.14","19.20","22.3","22.5","23.3","24.6","26.0","26.6","26.9","28.4"],"following":["3.2","11.3","11.4","12.0","15.6","15.8","23.3","26.11","28.6","28.10"],"dots":["3.2"],"funded":["3.2"],"has":["3.3"],"also":["3.3","11.5"],"been":["3.3","15.36"],"conducted":["3.3"],"within":["3.3","23.0","25.3","25.7"],"many":["3.3"],"with":["3.3","11.3","22.5","23.4","25.0","28.10","28.14","28.15"],"a":["3.4","3.5","4.3","4.10","6.2","8.2","14.16","14.17","14.18","14.19","14.20","14.26","14.27","14.28","14.29","15.8","15.9","15.25","15.33","16.12","18.15","18.16","18.22","18.26","18.27","19.0","22.0","22.6","23.0","24.3","25.0","25.8","26.0","26.9","26.12","26.13","26.14"],"web":["3.4","3.5","24.6","26.12"],"based":["3.4","3.5"],"framework":["3.4","3.5","22.5"],"press":["3.5","22.2"],"cup":["3.5"],"pp":["3.5"],"hal":["3.5"],"03575509":["3.5"],"distributed":["3.5","4.1","25.0","25.3","26.3","26.13","28.0"],"music":["3.5","5.0"],"system":["3.5","25.0","26.0"],"research":["3.5"],"creation":["3.5"],"dedicated":["4.1","4.5"],"websocket":["4.1"],"communications":["4.1"],"state":["4.1","15.10","26.6","26.13","26.14","28.14"],"management":["4.1","26.0"],"plugin":["4.1","13.12","14.4","14.12","14.21","14.23","15.4","15.13","17.4","17.8","17.9","17.15","18.5","18.8","18.9","18.17","18.18","19.7","19.13","19.20","24.4","24.8","25.1","25.5","25.8"],"hosting":["4.1"],"loading":["4.2"],"managing":["4.2"],"buffers":["4.2"],"assigning":["4.3"],"ticket":["4.3"],"unique":["4.3","26.6","28.4"],"index":["4.3","11.2","28.5","28.6","28.7"],"parse":["4.4"],"recording":["4.5"],"of":["4.6","4.12","5.0","6.1","7.3","7.7","11.5","12.0","13.8","13.11","14.15","15.14","15.18","15.23","15.24","15.31","15.32","16.9","17.10","17.12","17.14","19.19","22.2","23.0","23.8","24.3","24.4","25.4","26.8","26.11","26.14","26.15","28.0","28.3","28.14"],"features":["4.6","28.2"],"required":["4.6","24.6"],"their":["4.6","28.8"],"initialisation":["4.6"],"locating":["4.7"],"people":["4.7"],"in":["4.7","5.0","7.5","8.2","11.0","11.1","14.22","15.7","15.19","15.36","16.10","17.10","17.11","17.12","17.15","18.10","18.19","18.28","19.7","19.8","19.14","20.0","22.2","22.5","23.3","23.7","26.6","26.9","26.10","26.12","26.13","28.5","28.6"],"an":["4.7","11.5","18.14","18.25","22.4","23.4"],"area":["4.7"],"allows":["4.8"],"define":["4.8"],"synchronizing":["4.9","19.0"],"arbitrary":["4.9"],"clocks":["4.9"],"provides":["4.10","5.0","6.1"],"clean":["4.10"],"code":["4.10","12.0","14.12","22.3","26.14","28.6","28.7","28.9","28.10","28.12"],"base":["4.10"],"start":["4.10","7.2","8.0","26.2","28.7"],"scripts":["4.11","18.10","18.19"],"common":["4.12","19.0","25.3","28.0","28.2"],"primarily":["5.0"],"focused":["5.0"],"b":["5.0"],"aims":["5.0","14.9"],"supporting":["5.0"],"rapid":["5.0"],"development":["5.0","23.4"],"real":["5.0","6.1","26.4"],"time":["5.0","6.1","19.7","22.2","22.4","25.3","25.4","26.4","26.13","28.2"],"using":["5.0","6.1","11.5","19.7","22.5","23.4","26.9"],"javascript":["5.0","6.1"],"abstractions":["5.0","6.1"],"hide":["5.0","6.1"],"complexity":["5.0","6.1","8.0"],"network":["5.0","6.1","9.0","25.4","26.6","28.15"],"foster":["5.0","6.1"],"very":["5.0","6.1","25.0","28.2"],"prototyping":["5.0","6.1"],"trial":["5.0","6.1"],"error":["5.0"],"workflows":["5.0"],"that":["5.0","7.0","8.1","11.2","15.17","18.10","18.12","18.19","18.21","19.9","22.2","22.3","23.0","26.4","26.12","28.2","28.4","28.12"],"are":["5.0","6.4","7.3","15.20","15.25","15.33","22.3","22.5","26.12","28.2","28.15"],"typical":["5.0"],"artistic":["5.0"],"practices":["5.0"],"href":["5.0"],"introduction":["5.0","26.0"],"action":["5.0"],"button":["5.0","26.12"],"infos":["5.0","22.5"],"more":["5.0","6.6","24.8","26.12","28.14"],"tutorials":["5.0","23.2"],"considered":["6.2"],"which":["6.2","6.4","11.1","22.2","22.4","23.4","25.8","26.8","28.0","28.4"],"embodies":["6.2"],"dynamic":["6.2"],"relation":["6.2"],"dialog":["6.2"],"betwenn":["6.2"],"epistemic":["6.2"],"things":["6.2","22.6","25.4"],"technical":["6.2"],"objects":["6.2"],"quote":["6.2"],"rheinberger":["6.2"],"approach":["6.2"],"strong":["6.2"],"implications":["6.2"],"on":["6.2","14.14","14.25","15.28","16.11","18.6","19.0","24.0","24.4","25.8","26.0","26.12","28.8","28.15"],"design":["6.2"],"abstrations":["6.4"],"help":["6.5"],"you":["6.5","7.3","19.8","22.2","22.5","23.4","26.5","26.9","26.11","26.13","28.0","28.12"],"synchronized":["6.5"],"among":["6.5"],"your":["6.5","7.5","7.7","7.8","8.1","14.9","24.7"],"add":["6.6","7.7","11.3","26.14"],"new":["6.6","8.2","14.4","14.21","15.25","15.33","17.4","18.17","23.0","25.7","26.9","26.12","26.13","26.14","28.10"],"specific":["6.6","24.7","26.12","28.2"],"functionnalities":["6.6"],"related":["7.0","14.23"],"stuff":["7.0"],"could":["7.0","22.5","28.14"],"go":["7.1","24.2"],"branch":["7.1"],"where":["7.1","26.3"],"sh":["7.2","16.6","23.2","24.2","25.5","26.11"],"git":["7.2"],"pull":["7.2"],"origin":["7.2","25.4"],"if":["7.3","14.9","15.9","19.8","19.15","19.16","19.21","19.22","22.2","22.5","26.5"],"part":["7.3"],"team":["7.3"],"markdown":["7.5","7.7"],"file":["7.5","7.8","11.3","14.14","14.17","14.19","14.25","14.27","14.29","15.16","22.4","23.3","28.6","28.10"],"lorem":["7.6"],"guide":["7.7"],"html":["7.7","26.9","28.10"],"table":["7.7","26.6"],"contents":["7.7","13.1","17.1"],"page":["7.7"],"same":["7.8","14.23","25.4","26.3","28.7"],"process":["7.8","19.7","19.8","19.17","23.0"],"as":["7.8","8.0","11.2","14.15","22.5","23.4","23.7","24.3","25.8","26.11","26.12","28.3"],"misc":["7.8"],"except":["7.8"],"should":["7.8","22.5","25.8"],"is":["8.0","8.2","9.11","14.14","14.25","15.9","15.28","15.29","15.35","18.10","18.19","18.22","18.28","18.34","18.35","22.3","22.4","24.3","24.8","26.8","26.13","26.15","28.2","28.11","28.12","28.15"],"no":["8.0","19.15","19.16","19.21","19.22"],"particular":["8.0","26.4"],"only":["8.0","15.26"],"thing":["8.0","23.3","23.4"],"will":["8.0","8.1","13.12","15.19","15.29","17.9","17.15","18.18","18.22","18.36","18.37","19.8","19.9","19.20","22.2","22.4","24.0","25.4","26.6","26.9","26.12"],"have":["8.0","14.8","25.3","26.8","26.15","28.3","28.8"],"do":["8.0","24.6","26.8"],"e":["8.1","11.4","19.7","23.8","24.7","26.6","26.8","26.13","28.4"],"g":["8.1","11.4","24.7","28.4"],"prod":["8.1"],"json":["8.1","22.3"],"contain":["8.1"],"production":["8.1"],"informations":["8.1","26.6"],"js":["8.1","11.3","13.0","16.0","16.6","17.0","19.7","19.10","22.1","23.0","26.14","28.5","28.6","28.7","28.10","28.14"],"cf":["8.1","18.6"],"my":["8.2"],"app":["8.2"],"port":["8.2"],"this":["8.2","9.0","11.1","12.0","15.8","16.11","18.36","18.37","19.9","20.0","21.0","24.6","25.3","25.4","25.7","26.3","26.6","26.10","26.12","28.12"],"done":["8.2","22.5","23.4","24.2","25.8"],"simply":["8.2","28.16"],"adding":["8.2"],"location":["8.2"],"configuration":["8.2","22.3"],"warning":["8.3"],"local":["9.0","19.9"],"tp":["9.1"],"point":["9.4"],"connection":["9.5","11.0"],"when":["9.11","11.4","11.5","14.14","14.22","14.25","15.19","15.28","15.29","15.35","17.15","18.13","18.18","18.22","18.24","18.34","18.35","19.14","19.20","22.4","23.3","23.7","25.0","26.8","26.11","26.13","28.3","28.7"],"applications":["10.0","26.3","26.4"],"over":["11.0"],"single":["11.0"],"tcp":["11.0"],"other":["11.0","19.8","22.5","25.3"],"enable":["11.0"],"bi":["11.0"],"directionnal":["11.0"],"latest":["11.1","24.2","25.5"],"websockets":["11.1"],"we":["11.1","23.7","24.0","25.3","26.10","26.12","28.8","28.15"],"wont":["11.1"],"use":["11.1","18.23","24.7","24.8","25.8","26.6","26.12"],"server":["11.1","11.4","15.1","15.17","18.6","19.1","19.10","23.3","23.7","26.11","26.14"],"command":["11.1","26.11"],"line":["11.1"],"tool":["11.1"],"propose":["11.1"],"i":["11.1","19.7","23.8","26.6","26.8","26.13"],"ws":["11.2"],"servestatic":["11.2"],"serve":["11.2"],"static":["11.2"],"finalhandler":["11.2"],"creating":["11.2","23.0"],"configuring":["11.2"],"behaves":["11.2"],"handler":["11.2"],"files":["11.2","15.17","15.20","22.3","26.12"],"const":["11.2","14.4","17.4","19.10","25.7","28.7","28.13","28.14"],"staticfilehandler":["11.2"],"communicate":["11.3"],"open":["11.3","22.4"],"main":["11.3","28.12"],"lines":["11.3"],"form":["11.4","12.0"],"sc":["11.4","26.9","28.10"],"component":["11.4"],"message":["11.4","25.4"],"trigger":["11.4"],"input":["11.4"],"sent":["11.4","15.28"],"receives":["11.4"],"output":["11.4"],"sends":["11.4","15.11"],"another":["11.4","18.23","25.8"],"socket":["11.4"],"gives":["11.5","26.13"],"idea":["11.5","26.3"],"problem":["11.5","25.0"],"might":["11.5","23.4","28.12"],"encounter":["11.5"],"raw":["11.5"],"api":["11.5","24.6"],"indeed":["11.5","23.7","28.2"],"conditions":["12.0"],"met":["12.0"],"redistributions":["12.0"],"must":["12.0","19.8"],"retain":["12.0"],"above":["12.0"],"notice":["12.0"],"list":["12.0"],"disclaimer":["12.0"],"reproduce":["12.0"],"2fplugin":["13.0","17.0","19.0"],"assign":["13.0"],"toc":["13.1","14.1","16.1","17.1","18.1"],"npm":["13.2","14.2","15.2","16.2","16.6","17.2","18.0","18.2","19.2"],"import":["13.4","16.4","19.4","19.5","25.7","28.10","28.15"],"from":["13.4","13.5","14.6","14.16","14.26","16.4","16.5","17.5","19.4","19.5","19.10","19.17","19.18","24.4","24.5","25.7","26.7","28.5","28.10"],"dd":["13.7","14.11","15.8","16.8","17.7","19.12"],"p":["13.7","14.11","16.8","17.7","19.12"],"client":["13.7","14.6","14.11","15.1","16.8","17.7","17.10","17.12","19.1","19.12","22.3","24.1","24.7","26.1","26.13","28.1","28.3"],"return":["13.9","13.10","14.13","14.16","14.24","14.26","18.12","18.21","19.8"],"representation":["13.11","16.13","17.14"],"manually":["13.12","15.15","17.9"],"instantiated":["13.12","15.19","17.15","18.18","19.14","19.20"],"version":["14.0","15.0","18.0"],"https":["14.0","15.0","16.0","18.32","26.12"],"badge":["14.0","15.0","16.0","17.0"],"installation":["14.1","16.1","18.1"],"filesystem":["14.4"],"pluginmanager":["14.4","14.22","15.19","16.10","19.14"],"register":["14.4","24.7","26.12"],"way":["14.8","22.6","24.6","24.7","28.7","28.16"],"read":["14.8"],"due":["14.8"],"impossibility":["14.8"],"poses":["14.9"],"evident":["14.9"],"questions":["14.9","25.3"],"moreover":["14.9"],"running":["14.9"],"kind":["14.12","14.15","14.17","14.21","14.23","14.27","15.27","18.9","18.16","18.17","18.23","18.27","18.29","18.30","18.31","19.13"],"global":["14.12","14.21","18.9","18.17","25.3","26.6","26.7","26.15","28.14"],"class":["14.12","14.21","18.9","18.17"],"gettree":["14.12"],"object":["14.12","14.13","14.24"],"created":["14.14","14.25","15.20","15.30","18.22","23.3","26.11","26.13","28.12","28.15"],"modified":["14.14","14.25"],"or":["14.14","14.25","18.22","22.5","24.7","25.8","26.3"],"deleted":["14.14","14.25","18.22","26.8","28.15"],"underlying":["14.14","14.25"],"directory":["14.14","14.18","14.22","14.25","14.28","18.6","18.23","24.2","25.5","28.10"],"tree":["14.15"],"flat":["14.15"],"map":["14.15"],"filename":["14.15"],"url":["14.15","23.6"],"node":["14.16","14.26","22.3"],"write":["14.17","14.27","28.6"],"promise":["14.19","14.20","14.29","14.30"],"delete":["14.20","14.30"],"switch":["14.21"],"registered":["14.22","15.19","16.10","17.15","18.18","19.14","19.20"],"available":["14.22","15.19","16.10","19.14"],"options":["14.22","16.10","19.14"],"dirname":["14.22","18.6"],"string":["14.22","15.16","15.21","18.29","18.30","18.31"],"watch":["14.22"],"into":["14.22","25.0"],"change":["14.23","24.7"],"while":["14.23","15.10","22.5","24.7","24.8","26.8","28.2"],"keeping":["14.23","25.4"],"logic":["14.23"],"hand":["14.23"],"fury":["15.0","16.0","17.0"],"notes":["15.1","19.1"],"receipes":["15.1","19.1"],"default":["15.1","15.21","17.10","17.12","22.5","23.3","25.8","26.9","26.14","28.3","28.9"],"pluginlogger":["15.4","15.5"],"logger":["15.4"],"examples":["15.6"],"its":["15.7","25.3","26.15"],"name":["15.7","18.36","18.37","22.2","23.4","28.3","28.15"],"txt":["15.7"],"extention":["15.7"],"added":["15.7","15.25","15.33"],"prefixed":["15.8"],"format":["15.8"],"yyyy":["15.8"],"mm":["15.8"],"hh":["15.8"],"ss":["15.8"],"id":["15.8","23.3","28.9"],"basename":["15.8"],"behavior":["15.8"],"path":["15.9","23.2","24.2","25.5","26.4"],"given":["15.9","16.12","17.10","17.11","17.13","28.15"],"shared":["15.10","26.6","28.14","28.16"],"most":["15.10","26.15","28.0","28.2"],"simple":["15.10","18.6","21.4","22.0","25.4"],"can":["15.10","15.17","23.4","26.12","28.12"],"attach":["15.10","26.8","26.12","28.7"],"buffer":["15.11","15.26"],"data":["15.11","26.4"],"batch":["15.11"],"sync":["15.13","19.13","19.16","19.17","19.19","19.22","25.5","25.6","25.7","25.8"],"pluginloggerserver":["15.13"],"never":["15.15"],"be":["15.15","15.17","18.34","18.35","19.8","22.4","22.5","23.3","23.7","24.6","25.8","26.9","28.4","28.14"],"called":["15.15","17.9","26.6","26.12","26.14","28.10"],"description":["15.16","15.21"],"used":["15.16","15.21","18.10","18.19","22.5","28.14"],"generate":["15.16","15.21"],"log":["15.16","15.20"],"pathname":["15.16"],"usefull":["15.17"],"gather":["15.17"],"closes":["15.20"],"existing":["15.20","18.14","18.25"],"type":["15.21","23.3","26.14","28.0","28.9"],"retrived":["15.22","15.30"],"writer":["15.23","15.24","15.27","15.29","15.31","15.32","15.34","15.35"],"calls":["15.25","15.33"],"applies":["15.26"],"executed":["15.28","15.35","18.34","18.35"],"packet":["15.28"],"closed":["15.29","15.35"],"initiated":["15.36"],"io":["16.0","17.0"],"access":["16.6","24.6","26.8","26.13"],"microphone":["16.6","24.6"],"camera":["16.6","24.6"],"streams":["16.6"],"motion":["16.6"],"sensors":["16.6"],"throught":["16.6"],"ircam":["16.6","26.9","28.10"],"devicemotion":["16.6"],"package":["16.6","22.2"],"install":["16.6","22.2","24.2","28.3"],"save":["16.6"],"side":["16.8","16.13","18.6","26.8"],"audiocontext":["16.10","28.13","28.14"],"instance":["16.10","18.16","18.23","18.27"],"audio":["16.10","24.6","28.6","28.12","28.14"],"context":["16.10","19.8","19.9"],"resumed":["16.10"],"aliases":["16.10"],"webaudio":["16.10"],"first":["16.11","26.14","28.15"],"user":["16.11","24.6","24.7"],"gesture":["16.11","24.6"],"calling":["16.11","18.36","18.37","19.8"],"several":["16.11","26.3","28.15"],"associated":["16.12"],"feature":["16.12","23.8","26.15"],"pluginposition":["17.4"],"position":["17.4","17.8","17.11","17.12","17.13"],"ranges":["17.10"],"units":["17.10","17.12"],"retrieve":["17.11","17.13"],"normalized":["17.12"],"pluginscripting":["18.4","18.5"],"defined":["18.6","24.7"],"option":["18.6"],"scripting":["18.8","18.9"],"pluginscriptingserver":["18.8"],"note":["18.10","18.19"],"store":["18.10","18.19","26.6","26.14"],"returns":["18.11","18.20","19.15","19.16","19.21","19.22"],"convenience":["18.12","18.21"],"method":["18.12","18.21","18.23","18.36","18.37"],"script":["18.13","18.14","18.15","18.16","18.22","18.24","18.25","18.26","18.27","18.28","18.34","18.35"],"returned":["18.13","18.14","18.15","18.24","18.25","18.26","28.15"],"resolves":["18.13","18.14","18.15","18.24","18.25","18.26"],"underlyings":["18.13","18.24"],"states":["18.13","18.24","26.15","28.16"],"setglobalscriptingcontext":["18.17"],"runtime":["18.28"],"source":["18.28","22.3","22.4"],"stored":["18.28"],"directly":["18.28","23.4"],"filestem":["18.28"],"transpiled":["18.32"],"module":["18.32"],"listening":["18.33"],"entirely":["18.37"],"clients":["19.0","22.3","28.4","28.8","28.10","28.16"],"master":["19.0","28.4"],"usage":["19.1","22.5","25.7"],"seconds":["19.7"],"since":["19.7"],"started":["19.7","26.5"],"hrtime":["19.7"],"fulfilled":["19.8"],"words":["19.8","25.3"],"suspended":["19.8"],"always":["19.8"],"broken":["19.8"],"hence":["19.8"],"make":["19.8","26.13","28.7"],"sure":["19.8","26.13","28.7"],"need":["19.9","28.15"],"convert":["19.9"],"information":["19.9","26.12"],"clock":["19.9","19.10","19.15","19.16","19.22","25.3","25.9"],"so":["19.9","26.14"],"speak":["19.9"],"get":["19.10","19.18","28.13","28.14"],"current":["19.10","19.15","19.16","19.21","19.22"],"reference":["19.10","25.3"],"arguments":["19.15","19.16","19.21","19.22"],"provided":["19.15","19.16","19.21","19.22"],"reports":["19.17"],"last":["19.18"],"statistics":["19.18"],"else":["19.21"],"norbert":["19.23"],"tutorial":["20.0","21.0","24.0","25.4","26.5"],"documentation":["21.1"],"works":["21.3","22.5"],"setup":["22.0","22.6"],"develop":["22.0"],"run":["22.2","23.0","23.4","26.3"],"quite":["22.2","22.6","23.4"],"likely":["22.2"],"tell":["22.2"],"needs":["22.2","24.7","26.4"],"just":["22.2","25.8","26.11","28.3"],"enter":["22.2","26.11"],"accept":["22.2"],"continue":["22.2"],"wizard":["22.2","23.4","25.5"],"startup":["22.2"],"ask":["22.2"],"want":["22.2","28.8","28.12"],"built":["22.3"],"config":["22.3","25.7","26.7","28.5"],"modules":["22.3"],"dependencies":["22.3"],"installed":["22.3","24.3","26.9","28.3"],"public":["22.3"],"exposed":["22.3"],"src":["22.3","22.4","23.3","26.14","28.5","28.6","28.10"],"declared":["22.3"],"components":["22.3","26.9","28.10"],"player":["22.3","26.12","26.14","28.3","28.14"],"means":["22.4","26.8"],"bundled":["22.4"],"restarted":["22.4"],"each":["22.4"],"saved":["22.4"],"expected":["22.4","22.5"],"confortable":["22.4"],"saving":["22.4"],"developping":["22.4"],"click":["22.5"],"here":["22.5","26.6"],"sw":["22.5","26.12","28.10"],"credits":["22.5"],"container":["22.5","24.7","28.12"],"reload":["22.5"],"cmd":["22.5"],"shift":["22.5"],"r":["22.5"],"see":["22.5","23.4","26.12","28.12"],"displayed":["22.5"],"top":["22.5","24.4"],"left":["22.5"],"tip":["22.5","28.12"],"rendering":["22.5","26.9"],"lit":["22.5","26.9"],"library":["22.5","23.4","26.9"],"developped":["22.5"],"google":["22.5","26.9"],"promote":["22.5"],"template":["22.5","24.2","25.7"],"does":["22.5"],"not":["22.5","24.8","26.8"],"require":["22.5"],"potentially":["22.5"],"any":["22.5"],"everything":["22.5"],"learned":["22.6"],"few":["22.6"],"how":["22.6","24.8"],"opening":["23.0"],"possibilities":["23.0"],"ouside":["23.0"],"cd":["23.2","24.2","25.5"],"npx":["23.2","23.4","24.2","25.5","26.11"],"they":["23.3","26.8"],"connect":["23.3","23.7","28.13"],"named":["23.3"],"schemas":["23.3","26.14"],"declare":["23.3"],"schema":["23.3","26.14","28.15"],"definition":["23.3"],"export":["23.3","26.14","28.9"],"integer":["23.3","28.9"],"null":["23.3","28.9"],"such":["23.4","24.6","25.8","26.12","26.13"],"audioworklet":["23.4"],"would":["23.4"],"expect":["23.4"],"browsers":["23.4","24.6"],"however":["23.4","25.8"],"already":["23.4"],"offers":["23.4"],"interesting":["23.4"],"compatibility":["23.4"],"descent":["23.4"],"performances":["23.4"],"makes":["23.4"],"usable":["23.4"],"hopefully":["23.4"],"large":["23.4"],"spectrum":["23.4"],"projects":["23.4"],"those":["23.4"],"who":["23.4"],"interested":["23.4"],"rs":["23.4"],"then":["23.4","26.12","28.3","28.14"],"second":["23.4"],"target":["23.4","24.2","28.3"],"once":["23.4","24.2"],"restart":["23.4"],"dev":["23.4"],"emulate":["23.6"],"query":["23.6"],"parameter":["23.6","26.12","26.14"],"our":["23.6","24.3","26.12","26.14","28.12"],"able":["23.7"],"launch":["23.7","24.2"],"browser":["23.7","24.2","28.3"],"important":["23.8","25.0"],"learn":["24.0"],"why":["24.0"],"working":["24.2","25.5"],"platform":["24.2","24.8","28.3"],"confirm":["24.2"],"again":["24.2"],"dependency":["24.3"],"helpers":["24.4","24.5","25.7"],"polyfills":["24.4","25.7"],"launcher":["24.5"],"order":["24.6"],"properly":["24.6"],"launched":["24.6"],"let":["24.6","25.2","25.8","26.2","26.13","28.14"],"s":["24.6","25.2","25.3","25.8","26.2","26.13","28.14"],"examplify":["24.6"],"info":["24.6","26.12"],"initialize":["24.6"],"certain":["24.6"],"protect":["24.6"],"end":["24.6","26.4"],"initscreenscontainer":["24.7"],"offer":["24.7","28.15"],"numerous":["24.7","28.14"],"adapt":["24.7"],"these":["24.7","26.9","26.12"],"styles":["24.7"],"language":["24.7"],"even":["24.7"],"completely":["24.7"],"different":["24.7","26.6"],"won":["24.7","26.8"],"precisely":["24.8"],"dig":["25.0"],"dealing":["25.0"],"own":["25.3","26.8","28.8"],"notion":["25.3"],"cannot":["25.3"],"assume":["25.3"],"there":["25.3"],"something":["25.3"],"like":["25.3"],"lack":["25.3"],"leads":["25.3"],"fundamental":["25.3"],"regarding":["25.3"],"synchronization":["25.3","25.9"],"coordination":["25.3"],"maarten":["25.3"],"van":["25.3"],"steen":["25.3"],"andrew":["25.3"],"tanenbaum":["25.3"],"brief":["25.3"],"offset":["25.4"],"delta":["25.4"],"respective":["25.4"],"sake":["25.4"],"ideal":["25.4"],"case":["25.4"],"excatly":["25.4"],"propagation":["25.4"],"pluginsync":["25.7"],"configure":["25.7"],"either":["25.8"],"date":["25.8"],"now":["25.8","26.12","28.11"],"performance":["25.8"],"depending":["25.8"],"possible":["25.8"],"currenttime":["25.8"],"against":["25.8"],"thus":["25.8","26.8","26.13"],"implement":["25.8"],"reasons":["25.9"],"concepts":["25.9"],"behind":["25.9"],"proposed":["26.0","26.9"],"after":["26.0"],"short":["26.0"],"statemanager":["26.1","26.13","28.7"],"extends":["26.3"],"computers":["26.3"],"users":["26.3"],"say":["26.3"],"facebook":["26.4"],"adapted":["26.4"],"flow":["26.4"],"structured":["26.4"],"according":["26.4","28.15"],"please":["26.5"],"refer":["26.5"],"getting":["26.5"],"didn":["26.5"],"t":["26.5","26.8"],"check":["26.5"],"yet":["26.5"],"database":["26.6"],"syntax":["26.6"],"described":["26.6"],"two":["26.6"],"accessible":["26.6"],"nodes":["26.6"],"across":["26.6"],"whole":["26.6"],"loadconfig":["26.7","28.5"],"utils":["26.7","28.5"],"load":["26.7","28.5"],"catch":["26.7"],"unhandled":["26.7"],"errors":["26.7"],"globalschema":["26.7"],"playerschema":["26.7"],"owner":["26.8"],"attaching":["26.8"],"full":["26.8"],"but":["26.8"],"disconnect":["26.8"],"distinction":["26.8"],"between":["26.8"],"series":["26.9"],"achieved":["26.9"],"both":["26.9"],"libraries":["26.9"],"section":["26.10"],"ctrl":["26.11"],"c":["26.11"],"beginning":["26.11"],"toggle":["26.12"],"audit":["26.12"],"importing":["26.12"],"elements":["26.12"],"templates":["26.12"],"element":["26.12"],"display":["26.12"],"names":["26.12"],"control":["26.12","28.16"],"volume":["26.12","28.4"],"mute":["26.12","28.4","28.14"],"box":["26.12"],"players":["26.12","26.13","28.7","28.10"],"frequencies":["26.12"],"developer":["26.12"],"mozilla":["26.12"],"org":["26.12"],"en":["26.12"],"us":["26.12"],"docs":["26.12"],"subject":["26.12"],"fortunately":["26.13"],"functionality":["26.13"],"sharedstatecollection":["26.13","28.1"],"interface":["26.13"],"updated":["26.13","28.7"],"connects":["26.13"],"inteeger":["26.14"],"value":["26.14","28.13","28.14"],"one":["26.15"],"powerfull":["26.15"],"versatile":["26.15"],"seen":["26.15"],"building":["27.0"],"illustrates":["28.0"],"interaction":["28.0"],"participant":["28.2"],"audience":["28.2"],"later":["28.2","28.6"],"artwork":["28.2"],"former":["28.2"],"generally":["28.2"],"requires":["28.2"],"properties":["28.2"],"relatively":["28.2"],"asks":["28.3"],"call":["28.3"],"well":["28.3"],"defining":["28.4"],"variables":["28.4"],"every":["28.4"],"connected":["28.4"],"keep":["28.6"],"actual":["28.6"],"snippet":["28.6"],"await":["28.6","28.7"],"screen":["28.7"],"refreshed":["28.7"],"function":["28.7","28.12"],"renderapp":["28.7"],"onupdate":["28.7","28.14"],"controls":["28.8"],"nullable":["28.9"],"true":["28.9"],"frequency":["28.9"],"float":["28.9"],"min":["28.9"],"max":["28.9"],"synthtoggle":["28.9"],"boolean":["28.9"],"false":["28.9"],"immediate":["28.9"],"synthtrigger":["28.9"],"event":["28.9"],"litelement":["28.10"],"css":["28.10"],"needed":["28.10"],"gui":["28.10"],"text":["28.10"],"slider":["28.10"],"ready":["28.11"],"share":["28.12"],"async":["28.12"],"outside":["28.12"],"destination":["28.13"],"creategain":["28.13","28.14"],"gain":["28.13","28.14"],"update":["28.13"],"complex":["28.14"],"synthesizers":["28.14"],"parameters":["28.14"],"callback":["28.14"],"handle":["28.14"],"synthesis":["28.14"],"automatically":["28.15"],"kept":["28.15"],"synchonized":["28.15"],"methods":["28.15"],"work":["28.15"],"remote":["28.16"],"monitoring":["28.16"],"through":["28.16"],"along":["28.16"]},{"0":["19.7","26.14"],"1":["15.16","24.2","26.11","26.14","28.14"],"2":["22.6","24.2","26.11","28.5"],"3":["24.2","24.5","24.6","26.11","28.15"],"4":["24.6","26.8","26.13"],"5":["22.4","22.5","26.8"],"6":["26.12"],"7":["22.4"],"8":["26.7","28.15"],"9":["28.15"],"10":["25.3"],"16":["22.1"],"24":["26.13"],"39":["13.7","14.11","16.8","17.7"],"50":["26.14"],"60":["26.12"],"80":["8.0"],"98":["25.3"],"101":["11.4"],"127":["11.2"],"440":["26.14"],"443":["8.0"],"1000":["26.14"],"2016":["25.3"],"2020":["3.5"],"3000":["11.2"],"the":["0.0","3.1","3.5","4.3","4.7","4.9","4.11","6.6","7.1","7.2","7.7","11.0","13.0","13.7","13.11","14.4","14.11","14.13","14.24","15.8","15.9","15.30","16.8","16.13","17.4","17.7","17.14","18.36","18.37","19.12","23.2"],"https":["0.0","4.10","8.0","11.3","18.0","19.17","19.18","28.10"],"dev":["0.1","13.13","14.31","16.14","17.16","18.38","19.24","28.10"],"clause":["0.2","3.6","13.14","14.32","15.37","16.15","17.17","18.39","19.25"],"735px":["1.0"],"ircam":["1.2","3.1","3.2","11.3","16.10","19.17","28.7","28.15"],"fr":["1.2"],"youtube":["1.2"],"is":["1.3","6.5","17.10","17.12","18.6","23.3","24.5","26.3","28.4","28.13"],"sync":["1.4","15.14","19.12","19.15","19.21","25.1"],"working":["1.4","25.8"],"with":["1.4","19.0","25.2","26.2","26.4","26.5","26.8"],"node":["1.4","4.5","5.0","14.8","23.2"],"clients":["1.4","5.0","6.1","13.0","16.6","23.2","23.4","23.8","24.6","25.7","26.6","26.9","26.15","28.2","28.15"],"synchronized":["1.4","26.4"],"audio":["1.4","3.5","19.23"],"scheduling":["1.4"],"building":["1.4"],"a":["1.4","3.3","7.3","13.0","14.22","14.30","16.10","16.11","19.14","22.1","22.3","24.7","24.8","25.2","25.9","26.2","26.5","26.8","26.10","27.0","28.16"],"distributed":["1.4","3.4","19.23","25.9"],"step":["1.4","20.0"],"sequencer":["1.4"],"soundworks":["1.5","3.5","6.3","8.1","13.7","13.11","13.12","14.11","16.4","16.8","17.7","17.9","17.10","17.12","17.14","19.8","19.12","24.6","25.8","26.7","26.9","28.7","28.10"],"helpers":["1.5","1.6"],"plugin":["1.6","5.0","13.5","13.8","15.5","15.14","15.15","15.18","16.5","16.9","17.5","18.4","18.28","19.8","19.19","25.6"],"creating":["1.7","15.8"],"local":["1.7","19.16","19.22"],"network":["1.7","15.11","15.28"],"and":["1.7","3.3","7.3","7.8","11.0","14.8","14.14","14.25","15.29","18.13","18.14","18.15","18.22","18.24","18.25","18.26","18.37","19.21","19.22","24.6","25.8","26.0"],"list":["1.8","14.14","14.25","18.11","18.20","18.22"],"ismm":["3.1"],"team":["3.1"],"centre":["3.1"],"pompidou":["3.1"],"in":["3.1","6.1","7.8","8.1","11.5","13.12","15.1","16.11","17.9","17.13","18.18","19.10","19.20","25.7","26.4","28.9","28.12","28.14"],"french":["3.2"],"national":["3.2"],"agency":["3.2"],"anr":["3.2"],"composers":["3.3"],"artists":["3.3"],"designers":["3.3"],"researchers":["3.3"],"number":["3.3","15.16"],"for":["3.4","4.6","4.12","6.6","8.0","14.22","15.10","15.16","15.21","17.0","19.8","19.23","25.0","28.15"],"music":["3.4","25.0"],"system":["3.4","5.0","25.9","26.3"],"aes":["3.5"],"journal":["3.5"],"of":["3.5","4.8","4.11","6.3","6.4","11.3","13.7","14.11","14.14","14.17","14.18","14.23","14.25","14.27","14.28","15.8","15.17","15.20","15.25","15.27","15.33","15.36","16.8","16.12","16.13","17.7","17.15","18.11","18.16","18.20","18.22","18.23","18.27","18.28","18.34","18.36","19.0","19.12","22.4","24.7","26.7","28.6","28.9"],"engineering":["3.5"],"society":["3.5"],"accoustics":["3.5"],"application":["3.5","4.8","4.10","24.3","26.15","28.16"],"inc":["3.5"],"03033143":["3.5"],"tip":["4.1","7.5"],"note":["4.1","7.5","22.2","22.3"],"most":["4.1","25.3"],"time":["4.1","18.6","19.14","25.8","28.13"],"you":["4.1","8.1","9.1","17.10","23.2","25.5"],"won":["4.1"],"related":["4.2"],"json":["4.2","24.7"],"data":["4.2","6.1","13.10"],"currently":["4.2"],"limited":["4.2"],"to":["4.2","13.10","14.4","15.8","16.0","18.13","18.24","19.10","19.14","23.8","24.0","24.3","25.0","25.9","26.0","28.0","28.11"],"client":["4.3","11.0","14.1","16.6","23.1","26.6","28.2","28.4","28.6","28.10","28.15"],"among":["4.3","13.0","28.15"],"available":["4.3","13.0","13.12","17.15","18.18","19.20"],"watch":["4.4","23.4"],"directories":["4.4"],"distribute":["4.4"],"arbitrarily":["4.5"],"from":["4.5","11.3","15.17","16.6","22.2","23.3","23.4","25.4","26.8","28.4"],"any":["4.5","15.25","15.33","22.0"],"it":["4.6","6.2","9.11","15.25","15.33","19.9","23.3","24.4","24.5","24.6","24.8","28.9"],"also":["4.6","28.8"],"provides":["4.6"],"an":["4.6","4.8","4.10","26.4"],"entry":["4.6","4.8","6.4","24.2"],"point":["4.6","4.8","11.4"],"template":["4.7","28.3","28.6"],"default":["4.7","14.23","19.1","28.7"],"views":["4.7","4.12"],"that":["4.8","6.1","18.6","19.14","23.8","24.5","25.8","26.15","28.13"],"across":["4.9"],"devices":["4.9","6.5"],"sh":["4.10","19.8"],"git":["4.10"],"clone":["4.10"],"github":["4.10","19.17","19.18"],"com":["4.10","11.3","18.32","19.17"],"collective":["4.10"],"init":["4.12","16.5","16.9","19.8","24.4","24.7","25.8"],"etc":["4.12","5.0","8.2"],"getting":["5.0","22.2"],"started":["5.0","11.2","22.2"],"get":["5.0","26.8","26.12"],"h2":["5.0","26.12"],"main":["5.0","6.4","11.4"],"features":["5.0"],"ul":["5.0"],"li":["5.0"],"support":["5.0"],"both":["5.0","11.0"],"browser":["5.0","14.8","23.6","26.11"],"communications":["5.0"],"through":["5.0"],"websockets":["5.0","11.4"],"state":["5.0","19.9","22.5","25.8"],"management":["5.0"],"extend":["5.0"],"core":["5.0","6.1","6.6","13.4","16.4","16.6","19.4","19.5"],"functionalities":["5.0"],"clock":["5.0","19.0","25.4"],"synchronization":["5.0","6.1"],"runtime":["5.0"],"scripting":["5.0","18.4","18.5","18.10","18.19"],"error":["6.1"],"workflows":["6.1"],"are":["6.1","7.1","8.1","18.13","18.24","23.8","25.4","26.15","28.13"],"typical":["6.1"],"artistic":["6.1"],"practices":["6.1","6.2"],"its":["6.1","26.3","26.12","28.4"],"states":["6.1","18.14","18.15","18.25","18.26","26.0"],"amonst":["6.1"],"maintenance":["6.2"],"must":["6.2"],"evolve":["6.2"],"way":["6.2"],"keep":["6.2"],"questionning":["6.2"],"theory":["6.2"],"order":["6.2"],"not":["6.2","23.8"],"be":["6.2","7.0","7.8","11.1","14.4","15.8","15.10","15.11","15.25","15.33","18.12","18.21","19.9","22.0","24.7","28.2","28.8"],"reduced":["6.2"],"simple":["6.2"],"points":["6.4"],"responsible":["6.4"],"specifically":["6.5"],"designed":["6.5"],"framework":["6.6","15.36"],"example":["6.6","15.10","19.8","19.9"],"we":["6.6","15.6","20.0","21.0","24.5","26.7","28.12"],"provide":["6.6"],"plugins":["6.6","18.10","18.19","24.2","25.5","25.7"],"useful":["7.0"],"others":["7.0"],"or":["7.0","8.0","14.19","14.20","14.29","14.30","26.13"],"would":["7.0","25.5","25.8"],"source":["7.1","18.36"],"files":["7.1","15.1","18.13","18.14","18.15","18.24","18.25","18.26","22.2"],"located":["7.1","8.2"],"server":["7.2","11.0","14.1","15.10","15.11","15.13","16.1","18.1","18.8","18.28","24.1","26.4","26.6","28.1"],"npm":["7.2","19.8"],"otherwise":["7.3","15.7"],"proceed":["7.3"],"usual":["7.3"],"steps":["7.3"],"create":["7.3","15.10","16.10","22.6","23.8","24.6","26.6","26.12","28.4","28.7"],"pull":["7.3"],"directory":["7.5","7.8","14.4","14.19","14.20","14.29","14.30","15.19","18.18","23.4"],"if":["7.5","14.22","15.26","25.8","28.14"],"ipsum":["7.6"],"sidebar":["7.7"],"menu":["7.7"],"open":["7.7","23.4","24.7"],"config":["7.7","9.9","15.4","18.4","18.5","23.3","24.6","24.7","26.12"],"js":["7.7","8.2","11.4","14.0","15.0","15.7","22.4","24.6","26.9","26.13","28.15"],"path":["7.7","14.4","14.22","23.4"],"placed":["7.8"],"tutorials":["7.8","23.4"],"link":["7.8","9.1"],"port":["8.0","11.2"],"http":["8.0"],"however":["8.0"],"more":["8.0","26.3","26.8"],"common":["8.0","26.15"],"situation":["8.0"],"environement":["8.1"],"type":["8.1","14.23","15.25","15.33","18.23","22.4","28.3"],"file":["8.2","11.4","14.8","14.20","14.30","15.21","18.22","18.37","26.6"],"generally":["8.2"],"at":["8.2","22.4","26.8"],"conf":["8.2"],"such":["8.2","14.9","18.6"],"as":["8.2","11.5","18.35","19.0","22.2","25.4","26.4","28.2","28.9","28.12"],"cf":["8.2"],"todo":["8.3"],"page":["9.0","28.12"],"describes":["9.0"],"how":["9.0","24.0","25.0","25.9","26.0","28.16"],"networks":["9.1"],"mandatory":["9.11"],"between":["11.0","14.8","19.15","19.16","19.21","19.22"],"meaning":["11.0"],"e":["11.1","11.5","14.9","15.9","15.28","18.35","25.0","25.3","26.4","28.0","28.7"],"serve":["11.1"],"but":["11.1","26.11","28.8"],"will":["11.1","14.14","14.25","15.15","15.35","16.11","18.10","18.19","20.0","21.0","22.5","24.7","25.5","25.8","26.8","26.10","26.11","28.7"],"rather":["11.1","11.5"],"our":["11.1","24.5","25.0","25.3","25.4","28.3"],"own":["11.1","19.9","22.4","26.6","28.0","28.4"],"able":["11.1","22.0","22.5","28.8"],"handle":["11.1"],"websocket":["11.1"],"connections":["11.1"],"html":["11.2","11.3","11.4","28.15"],"use":["11.2","24.0","25.3","26.0","28.7"],"respond":["11.2"],"requests":["11.2"],"createserver":["11.2"],"req":["11.2"],"res":["11.2"],"listening":["11.2"],"request":["11.2"],"on":["11.2","28.12","28.13"],"listen":["11.2"],"console":["11.2","22.2","22.5","28.14"],"log":["11.2","15.1","15.19","15.21","22.5","28.6","28.14"],"code":["11.3","11.4","14.21","14.23","15.17","15.20","16.12","18.9","18.17","18.23","24.3","26.8","28.5","28.14"],"import":["11.3","16.6","23.3","28.7","28.9"],"render":["11.3","11.4"],"unpkg":["11.3"],"lit":["11.3","28.15","28.16"],"plays":["11.4"],"start":["11.4","22.4","25.2","26.8","26.9","26.13","28.4","28.6","28.14"],"by":["11.4","15.10","17.9","24.2","28.6","28.7","28.10"],"implementing":["11.4"],"side":["11.4","13.7","14.11","17.7","18.28","19.12"],"h1":["11.4","26.12"],"send":["11.4","11.5"],"const":["11.4","15.4","15.5","15.7","18.4","18.5","19.7","22.4","22.5","24.6","26.8","26.9","26.12","26.13","28.6"],"src":["11.4","16.6","24.6","26.6","26.9","26.13","28.15"],"audiocontext":["11.4","19.1"],"low":["11.5"],"level":["11.5"],"g":["11.5","15.9","26.4"],"implies":["11.5"],"messages":["11.5"],"strings":["11.5"],"route":["11.5","14.22"],"them":["11.5","26.7","26.15","28.15"],"all":["11.5","14.9","18.11","18.14","18.15","18.20","18.25","18.26","26.15","28.13"],"manually":["11.5"],"documentation":["12.0"],"other":["12.0","14.9"],"materials":["12.0"],"distribution":["12.0"],"neither":["12.0"],"name":["12.0","15.9","15.22","26.8","26.11","26.12"],"unique":["13.0","13.9"],"index":["13.0","13.9","16.6","22.4","23.3","24.6","26.8","26.13","28.9","28.15"],"installation":["13.1","17.1","24.2"],"usage":["13.1","14.1","16.1","17.1","18.1"],"install":["13.2","14.2","15.2","16.2","17.2","18.2","19.2","19.8","25.8"],"plugincheckin":["13.5"],"checkin":["13.5","13.8","13.11"],"representation":["13.7","14.8","14.11","16.8","17.7","19.12"],"kind":["13.8","14.16","14.18","14.19","14.20","14.26","14.28","14.29","15.14","15.17","15.18","15.20","15.23","15.24","15.31","15.32","15.34","16.12","17.8","17.13","18.13","18.24","18.32","18.33","18.34","19.19"],"global":["13.8","15.14","15.18","17.8","19.13","19.19","22.5","24.6","26.9","26.13","28.5","28.9"],"given":["13.9","13.10","14.16","14.26","15.7","19.15","19.16","19.21","19.22"],"associated":["13.10"],"when":["13.12","15.8","17.9","18.14","18.15","18.25","18.26","23.2","25.5","26.4","28.12"],"registered":["13.12","17.9","26.8"],"pluginmanager":["13.12","15.4","17.4","17.15","18.18","19.20","24.1","24.4","24.5","24.6","25.7"],"fury":["14.0","18.0"],"io":["14.0","15.0"],"watched":["14.4"],"can":["14.4","15.8","15.11","15.25","15.33","18.12","18.21","23.0","24.2","24.5","24.7","24.8","26.7","28.2"],"relative":["14.4"],"process":["14.4","19.18"],"cwd":["14.4"],"pluginfilesystem":["14.6"],"filesystem":["14.6","14.13","14.24","18.12","18.21"],"consistent":["14.8"],"online":["14.9"],"prevent":["14.9"],"issues":["14.9"],"sensible":["14.9"],"operations":["14.9"],"i":["14.9","15.28","18.35","25.0","25.3","28.0","28.4","28.7"],"than":["14.9"],"onupdate":["14.12","14.21","28.10","28.13"],"callback":["14.12","14.21","28.10","28.13"],"executelistener":["14.12"],"function":["14.12","19.14","19.20","26.12","28.6"],"gettreeasurlmap":["14.12"],"current":["14.13","14.24","25.8"],"receive":["14.14","14.25","18.22"],"updated":["14.14","14.25","18.22","18.34"],"tree":["14.14","14.16","14.25","14.26","18.12","18.21"],"instance":["14.15","14.17","14.18","14.19","14.23","14.27","14.28","14.29","15.17","15.20","15.23","15.24","15.27","15.31","15.32","15.34","16.12","17.13","18.29","18.30","18.31","18.32","18.33","18.34","26.6","26.7","26.8","28.4"],"method":["14.15","14.17","14.18","14.19","14.23","14.27","14.28","14.29","15.17","15.20","15.27","16.12","17.10","17.12","18.16","18.27","18.34","24.6"],"returns":["14.15","19.14"],"matching":["14.16","14.26"],"options":["14.21","15.19","17.15","18.18","19.20"],"gettree":["14.21","18.9","18.17"],"object":["14.21","15.16","15.21","18.17"],"publicpath":["14.22"],"optionnal":["14.22"],"public":["14.22"],"assets":["14.22"],"set":["14.22","19.9"],"param":["14.23","18.23"],"description":["14.23","18.23"],"2fplugin":["15.0","16.0"],"extension":["15.1"],"prefix":["15.1"],"new":["15.4","17.8","18.4","18.5","19.13","24.6","26.5","28.15"],"register":["15.4","17.4","23.3","24.3","24.4","24.5","24.6","26.7","28.5"],"logger":["15.5","15.13","15.18","15.22","15.30"],"assume":["15.6","19.9"],"kept":["15.7"],"intact":["15.7"],"turned":["15.8"],"seeting":["15.8"],"useprefix":["15.8","15.21"],"option":["15.8","15.26","18.28","28.3"],"false":["15.8"],"writer":["15.8"],"my":["15.9"],"dir":["15.9"],"created":["15.10","22.3","22.5","23.4"],"this":["15.10","15.11","17.10","17.12","22.2","26.11","28.2","28.4"],"used":["15.10","25.8"],"avoid":["15.11"],"congestion":["15.11"],"done":["15.11","26.7"],"buffersize":["15.16","15.22","15.26"],"informations":["15.17"],"multiple":["15.17"],"nodes":["15.17","19.0","28.13"],"dirname":["15.19","18.18","18.28"],"null":["15.19","28.10","28.14"],"string":["15.19","18.18"],"which":["15.19","19.9","24.0","28.7"],"writers":["15.20"],"pathname":["15.21"],"createwriter":["15.22","15.30"],"property":["15.23","15.24","15.31","15.32","18.29","18.30","18.31"],"line":["15.25","15.33"],"buffer":["15.28","15.29"],"after":["15.29","16.11","24.2"],"has":["15.29","24.2"],"been":["15.29"],"flushed":["15.29"],"underlying":["15.34","15.35","18.12","18.21","26.0"],"stream":["15.34","15.35","16.10"],"pluginplatforminit":["16.5","16.6","24.4","24.5"],"platform":["16.5","16.8","16.9","19.8","24.4","25.8"],"devicemotion":["16.10"],"module":["16.10"],"device":["16.10","19.9","25.3"],"motion":["16.10"],"micro":["16.10"],"boolean":["16.10","22.4","23.3"],"microphone":["16.10"],"times":["16.11"],"result":["16.11"],"no":["16.11","25.3"],"op":["16.11"],"locating":["17.0"],"people":["17.0"],"these":["17.4","22.3","25.4"],"values":["17.4","26.12"],"define":["17.4"],"coordinates":["17.4"],"pluginposition":["17.5"],"position":["17.5","17.14"],"class":["17.8","19.13","19.19","26.12","28.10"],"instantiated":["17.9"],"automatically":["17.10","17.12","22.2"],"called":["17.10","17.12"],"launcher":["17.10","17.12"],"ranges":["17.11"],"units":["17.11","17.13"],"normalized":["17.13"],"xrange":["17.15"],"array":["17.15","18.9","18.17"],"range":["17.15"],"area":["17.15"],"badge":["18.0"],"modules":["18.6"],"re":["18.6"],"bundled":["18.6"],"using":["18.6","19.1","22.6","24.2","28.16"],"esbuild":["18.6"],"each":["18.6","19.0","19.9","28.4","28.13"],"their":["18.6"],"content":["18.6"],"modified":["18.6"],"setglobalscriptingcontext":["18.9"],"ctx":["18.9","18.17"],"getlist":["18.9","18.17"],"globally":["18.10","18.19"],"so":["18.10","18.19","23.4","25.4","28.13"],"several":["18.10","18.19","23.6","28.12"],"running":["18.10","18.19"],"parallel":["18.10","18.19"],"instances":["18.13","18.14","18.24","18.25"],"up":["18.13","18.24","19.9"],"date":["18.13","18.24"],"underlyings":["18.14","18.15","18.25","18.26"],"names":["18.22"],"see":["18.28","19.17","19.18","22.2","24.7","26.0"],"shared":["18.28","19.9","22.5","26.0","26.14"],"caniuse":["18.32"],"search":["18.32"],"updates":["18.33","22.5","28.13","28.14"],"detached":["18.35"],"detach":["18.35"],"script":["18.36","18.37"],"because":["19.0"],"consequence":["19.0"],"dealing":["19.0"],"independent":["19.0"],"clocks":["19.1","25.3"],"currenttime":["19.1"],"starttime":["19.7"],"gettimefunction":["19.7","19.14","19.20"],"now":["19.7","23.3","23.4","24.5","28.13"],"return":["19.7"],"first":["19.8","24.6","25.8","26.5","26.9","28.7"],"soudnworks":["19.8"],"before":["19.8"],"starting":["19.8"],"need":["19.8","25.4","28.0","28.7"],"save":["19.8","24.8"],"s":["19.9","24.3","24.7","26.5","26.6","28.4"],"reference":["19.9","25.4","28.10"],"wont":["19.9"],"same":["19.9","22.5","28.12"],"next":["19.9"],"have":["19.9","22.5"],"localtime":["19.10"],"getlocaltime":["19.10"],"according":["19.10"],"second":["19.14","26.10","26.14","28.3"],"defaults":["19.14"],"else":["19.15","19.16","19.22"],"performs":["19.15","19.16","19.21","19.22"],"convertion":["19.15","19.16","19.21","19.22"],"synchronaization":["19.18"],"synchronisation":["19.23","25.1"],"router":["21.4"],"model":["21.5"],"where":["22.0","23.7"],"connected":["22.0","23.4"],"user":["22.0","26.4","28.12"],"trigger":["22.0","22.4"],"write":["22.2","23.7","24.3"],"copy":["22.2"],"bunch":["22.2"],"required":["22.2"],"dependencies":["22.2","28.15"],"illustrated":["22.2","26.4"],"screenshot":["22.2"],"below":["22.2"],"info":["22.2"],"screenshots":["22.2"],"guide":["22.2"],"may":["22.2"],"differ":["22.2"],"slightly":["22.2"],"what":["22.2"],"actually":["22.2"],"your":["22.2","22.4","23.4","28.0"],"cli":["22.2"],"tool":["22.2"],"just":["22.3","23.3","24.7","26.8","28.9"],"styles":["22.3"],"utils":["22.3","23.3"],"package":["22.3"],"contains":["22.3","26.13"],"declaration":["22.3"],"readme":["22.3"],"md":["22.3"],"general":["22.3"],"infos":["22.3"],"about":["22.3"],"there":["22.3"],"few":["22.3"],"thing":["22.3","26.5"],"add":["22.4","22.5","26.8"],"following":["22.4","22.5","23.4","26.8"],"lines":["22.4","26.8"],"end":["22.4"],"await":["22.4","26.8","26.9","26.12","26.13"],"do":["22.4"],"stuff":["22.4"],"globalschema":["22.4","28.5","28.9"],"control":["22.5","28.8"],"over":["22.5"],"behavior":["22.5"],"web":["22.5","23.0","28.15","28.16"],"statemanager":["22.5","26.7","26.8","26.9","26.12","28.6","28.9"],"attach":["22.5","26.6","26.9","26.13"],"getvalues":["22.5"],"simply":["22.5"],"means":["22.5"],"apply":["22.5"],"some":["22.5","23.4","26.4","26.11","28.7"],"wizard":["22.6","23.2","26.9","28.7"],"browsers":["23.0"],"indeed":["23.0","25.3"],"functionality":["23.0"],"allows":["23.0","28.12"],"applications":["23.0","28.0"],"work":["23.0"],"screenless":["23.0"],"embedded":["23.0"],"latest":["23.2"],"asks":["23.2"],"nullable":["23.3"],"true":["23.3","25.4","28.7","28.13","28.14"],"triggersound":["23.3"],"event":["23.3"],"declared":["23.3"],"into":["23.3","24.4","24.5","26.8","28.5","28.7"],"manager":["23.3"],"loadconfig":["23.3"],"load":["23.3"],"catch":["23.3","28.5"],"terminal":["23.4"],"go":["23.4"],"tutorial":["23.4","24.7","26.11","28.12"],"cd":["23.4"],"newly":["23.4"],"mode":["23.4"],"tada":["23.4"],"should":["23.4"],"eveything":["23.4"],"setup":["23.4"],"ready":["23.4"],"needed":["23.4"],"react":["23.4","28.11"],"instructions":["23.4"],"controller":["23.4","28.2","28.3"],"play":["23.4"],"sound":["23.4"],"only":["23.6"],"one":["23.6"],"window":["23.6","24.6"],"human":["23.7"],"tell":["23.7"],"reach":["23.7"],"url":["23.7"],"address":["23.7"],"bar":["23.7","24.2"],"possibility":["23.8"],"aims":["24.0"],"uninstall":["24.2"],"space":["24.2"],"completed":["24.2"],"exit":["24.2"],"pressing":["24.2"],"ctrl":["24.2"],"c":["24.2"],"let":["24.3","24.7","26.5","26.6","28.4"],"then":["24.4","24.7","25.7","25.8","26.6","28.6","28.7"],"component":["24.4","26.12","28.15","28.16"],"imported":["24.5"],"users":["24.6","28.2"],"against":["24.6"],"intrusive":["24.6"],"ads":["24.6"],"obvious":["24.6"],"privacy":["24.6"],"reasons":["24.6"],"player":["24.6","25.7","26.6","26.7","26.9","28.2","28.4","28.15"],"context":["24.6"],"pass":["24.6","26.14"],"third":["24.6"],"argument":["24.6"],"t":["24.7","25.3"],"cover":["24.7"],"advanced":["24.7"],"case":["24.7","28.14"],"here":["24.7"],"they":["24.7"],"subject":["24.7"],"dedicated":["24.7","28.2"],"minimal":["24.7"],"changes":["24.7"],"make":["24.7"],"customize":["24.7"],"view":["24.7","28.13"],"per":["24.8"],"se":["24.8"],"very":["24.8"],"complex":["24.8"],"lot":["24.8"],"quite":["24.8"],"boring":["24.8"],"development":["24.8","28.3"],"creation":["25.0"],"synchronize":["25.0"],"musical":["25.0"],"introduction":["25.3"],"systems":["25.3"],"computing":["25.3","26.3"],"october":["25.3"],"physical":["25.3"],"having":["25.3"],"origin":["25.3"],"furthermore":["25.3"],"speed":["25.3"],"computers":["25.3"],"daily":["25.3"],"life":["25.3","25.4"],"don":["25.3"],"constant":["25.4"],"disclaimer":["25.4"],"none":["25.4"],"assumptions":["25.4"],"real":["25.4"],"hence":["25.4"],"goal":["25.4"],"estimate":["25.4"],"calculate":["25.4"],"inversely":["25.4"],"achieve":["25.4"],"ask":["25.5","26.11"],"select":["25.5","26.11"],"like":["25.5"],"usedefaultapplicationtemplate":["25.7"],"allow":["25.8"],"us":["25.8"],"resume":["25.8"],"suspended":["25.8"],"always":["25.8","26.4"],"zero":["25.8"],"fail":["25.8"],"concepts":["26.0"],"sharedstate":["26.1","26.8","28.10"],"bit":["26.2","26.8"],"formal":["26.3"],"collection":["26.3","26.13"],"autonomous":["26.3"],"elements":["26.3"],"appears":["26.3"],"single":["26.3","26.6"],"coherent":["26.3"],"maarten":["26.3"],"van":["26.3"],"steen":["26.3"],"figure":["26.4"],"above":["26.4"],"input":["26.4"],"gesture":["26.4","28.12"],"triggers":["26.4"],"change":["26.4"],"generate":["26.5"],"empty":["26.5"],"describe":["26.6","26.15"],"role":["26.6","26.12"],"scheme":["26.6"],"once":["26.7","28.3"],"confusing":["26.8"],"clear":["26.8"],"writing":["26.8"],"modify":["26.9","28.6","28.13"],"renderapp":["26.9","26.12","28.6","28.13"],"provided":["26.9","28.6","28.7"],"boilerplate":["26.9"],"two":["26.9","28.2"],"implement":["26.10","28.0"],"questions":["26.11"],"target":["26.11"],"displays":["26.12"],"div":["26.12"],"layout":["26.12","28.13"],"header":["26.12"],"app":["26.12"],"section":["26.12"],"p":["26.12"],"hello":["26.12"],"style":["26.12"],"padding":["26.12"],"bottom":["26.12"],"4px":["26.12"],"readonly":["26.12"],"value":["26.12"],"db":["26.12"],"min":["26.12","26.14"],"max":["26.12","26.14"],"deleted":["26.13"],"disconnects":["26.13"],"integer":["26.14"],"frequency":["26.14"],"float":["26.14"],"review":["26.14"],"remote":["28.0"],"monitoring":["28.0"],"illustrate":["28.2"],"roles":["28.2"],"composed":["28.2"],"different":["28.2"],"types":["28.2"],"envisioned":["28.2"],"ended":["28.3"],"launch":["28.3"],"tools":["28.3"],"inside":["28.3"],"tied":["28.4"],"unhandled":["28.5"],"errors":["28.5"],"schemas":["28.5"],"interface":["28.7","28.8"],"again":["28.7"],"components":["28.7","28.15"],"sc":["28.7","28.15"],"compoents":["28.7"],"library":["28.7","28.16"],"installed":["28.7"],"text":["28.7","28.15"],"slider":["28.7","28.15"],"toggle":["28.7","28.10"],"importantly":["28.8"],"take":["28.8"],"playerschema":["28.9"],"registerschema":["28.9"],"parameters":["28.9"],"bang":["28.10"],"swplayer":["28.10"],"extends":["28.10"],"constructor":["28.10"],"super":["28.10"],"stores":["28.10"],"unsubscribe":["28.10"],"returned":["28.10"],"methos":["28.10"],"unobserve":["28.10"],"connectedcallback":["28.10"],"emulate":["28.12"],"seen":["28.12"],"needs":["28.12"],"changed":["28.13"],"requestupdate":["28.13"],"applied":["28.13"],"key":["28.13","28.14"],"connect":["28.14"],"master":["28.14"],"synthtoggle":["28.14"],"switch":["28.14"],"nothing":["28.15"],"reusable":["28.16"],"while":["28.16"],"purposely":["28.16"],"simplified":["28.16"],"aspects":["28.16"]},{"0":["5.0","7.2","11.2","26.6"],"1":["11.2","19.7","26.4","26.12"],"2":["22.5","26.4"],"4":["28.5"],"5":["24.6","28.5","28.6"],"6":["26.6"],"8":["28.5"],"9":["19.7"],"10":["26.3","28.5"],"16":["28.6"],"60":["26.6"],"80":["8.2"],"98":["26.3"],"127":["7.2"],"443":["8.2"],"2016":["26.3"],"2019":["3.5"],"8002":["8.1"],"dev":["0.0","7.2"],"channel":["1.2"],"soundworks":["1.3","1.7","13.2","14.2","15.2","15.15","16.2","16.13","17.2","18.2","22.3","22.4","25.9","28.0","28.1"],"contexts":["1.4","26.3"],"what":["1.4","11.5"],"are":["1.4","14.9","18.14","18.15","18.18","18.25","18.26","22.4","22.6","25.3","26.13"],"note":["1.4","24.2"],"relation":["1.4"],"to":["1.4","6.4","7.2","9.0","11.0","12.0","13.9","17.10","17.12","18.12","18.14","18.15","18.21","18.25","18.26","18.36","19.20","26.2"],"experience":["1.4"],"context":["1.4","3.1","11.3"],"simple":["1.4","26.9","28.6","28.9","28.16"],"router":["1.4","14.22"],"switch":["1.4","28.13"],"between":["1.4","6.1","19.9","26.12"],"music":["1.4","20.0"],"parts":["1.4"],"css":["1.5"],"globals":["1.5"],"variables":["1.5","11.5"],"build":["1.6"],"related":["1.6"],"libraries":["1.6","22.2"],"and":["1.6","3.4","6.5","14.22","15.13","15.35","15.36","17.4","19.14","19.15","19.16","25.5","28.0","28.5","28.12"],"deploying":["1.7"],"application":["1.7","4.1","23.6","26.7"],"an":["1.7","14.22","17.0","18.4","28.9"],"of":["3.1","4.3","4.5","13.12","14.8","14.9","14.16","14.19","14.20","14.26","14.29","15.34","16.0","17.4","17.11","17.13","18.13","18.24","18.29","18.30","18.31","18.32","18.33","22.0","22.6","23.7","24.0","26.12"],"cosima":["3.1"],"research":["3.1","3.4"],"project":["3.1","22.2"],"become":["3.2"],"so":["3.2","19.8","22.5","28.12"],"a":["3.2","4.6","4.9","19.20","23.6","23.8","25.7"],"p":["3.2","26.9","28.6"],"constella":["3.2"],"c":["3.2"],"tions":["3.2"],"musical":["3.3"],"pieces":["3.3"],"artworks":["3.3"],"created":["3.3","15.11","15.13","15.19","18.12","18.21","26.8","26.14","28.3"],"using":["3.3","25.3","26.15","28.15"],"can":["3.3","7.5","9.1","11.0","18.6","18.8","26.0","28.9"],"creation":["3.4","28.8"],"aes":["3.4"],"systems":["3.5","26.3"],"state":["3.5","15.29","23.4","26.5","28.0","28.5"],"affairs":["3.5"],"new":["3.5","13.5","14.6","15.5","15.14","15.18","16.5","16.6","17.5","19.19","23.3","24.4","24.5","26.7","28.4"],"developments":["3.5"],"proceedings":["3.5"],"conference":["3.5"],"wac":["3.5"],"dec":["3.5"],"t":["4.1","23.7"],"need":["4.1","6.2","8.0"],"install":["4.1","11.1","22.3","25.5","28.12"],"manually":["4.1","17.10","17.12","18.28","22.3"],"as":["4.1","19.1","23.0","24.0"],"mp3":["4.2"],"wav":["4.2"],"or":["4.2","6.1","6.6","14.4","15.11","15.28","18.6","18.35","19.14","24.2","26.12"],"formats":["4.2"],"ones":["4.3","13.0"],"number":["4.3","13.12","19.13","28.2","28.16"],"tickets":["4.3"],"their":["4.4","6.1"],"content":["4.4"],"all":["4.4","6.4","14.4","15.10","16.10","18.36","18.37","19.9","22.0","24.3","25.4"],"the":["4.5","14.9","15.4","18.4","18.5","19.1","22.0","23.0"],"network":["4.5","22.5","25.3"],"may":["4.6","12.0"],"require":["4.6","14.8"],"user":["4.6","4.8"],"gesture":["4.6"],"e":["4.6","11.2","16.10","18.6","22.3","25.7","26.12","28.9"],"g":["4.6","11.2","26.12","28.9"],"clicking":["4.6","26.12"],"on":["4.6","4.12","7.3","15.11","19.14","22.0","22.3","28.16"],"is":["4.7","4.9","7.5","12.0","15.19","15.26","16.11","19.9","19.14","23.6","24.7","26.12","28.9","28.10"],"associated":["4.7","18.37","19.15","19.16","19.21","19.22"],"with":["4.7","6.2","6.6","15.8","15.21","16.10","18.4","19.7","26.14","28.4","28.16"],"initialization":["4.7","16.0","24.8"],"enables":["4.8"],"end":["4.8","22.6","26.8"],"modify":["4.8","28.7"],"basically":["4.9"],"wrapper":["4.9"],"my":["4.10","15.8"],"cd":["4.10","26.5"],"sh":["4.11","7.1","26.5"],"applications":["4.12","8.0","20.0"],"based":["4.12"],"high":["5.0"],"level":["5.0"],"architecture":["5.0"],"projects":["5.0"],"demos":["5.0"],"iframe":["5.0"],"www":["5.0"],"youtube":["5.0"],"nocookie":["5.0"],"com":["5.0","19.18"],"embed":["5.0"],"videoseries":["5.0"],"list":["5.0"],"plt5gv5ypsj0w":["5.0"],"wgzuzle1an6ykwbiknyn":["5.0"],"title":["5.0"],"video":["5.0"],"player":["5.0","26.8","28.11"],"frameborder":["5.0"],"allow":["5.0","28.9"],"encrypted":["5.0"],"media":["5.0"],"picture":["5.0"],"allowfullscreen":["5.0"],"details":["5.0"],"h3":["5.0"],"nbsp":["5.0"],"installations":["5.0"],"performances":["5.0"],"concerts":["5.0"],"experimental":["5.0"],"settings":["5.0"],"simplifying":["6.1","24.8"],"control":["6.1","6.5","26.0","26.15","28.0"],"both":["6.1","28.11"],"localy":["6.1"],"remotely":["6.1","28.8"],"another":["6.1","22.5"],"important":["6.1","26.3"],"feature":["6.1","16.10"],"one":["6.1","19.0","26.11","28.9"],"make":["6.1","22.3","23.4"],"no":["6.1","17.4","18.18","26.3"],"distinction":["6.1"],"browsers":["6.1"],"node":["6.1","18.6","23.1"],"js":["6.1","15.8","18.0","19.8","19.9","25.8","26.6","28.4"],"runtimes":["6.1"],"demonstration":["6.2"],"phenomenon":["6.2"],"again":["6.2"],"mitigate":["6.2"],"this":["6.2","8.0","23.3","24.7","26.7","28.3"],"change":["6.2","28.10"],"mutation":["6.2"],"contradictory":["6.2"],"stability":["6.2"],"required":["6.2"],"by":["6.2","8.0","11.2","15.11","15.15","18.28","24.3","24.7","24.8","25.4","25.9","28.9","28.12"],"software":["6.2","12.0"],"development":["6.2","28.8"],"we":["6.2","11.5","19.0","22.4","24.2"],"opted":["6.2"],"modular":["6.2"],"framework":["6.3"],"do":["6.4"],"nitty":["6.4"],"gritty":["6.4"],"implement":["6.5","11.4","16.10","26.0","26.15","28.9"],"remote":["6.5","26.0","26.15"],"monitoring":["6.5","26.0","26.15"],"which":["6.5","11.0","15.4","18.18","23.6","24.7","26.4"],"synchronizing":["6.6","25.3"],"clocks":["6.6"],"working":["6.6","26.5"],"filesystem":["6.6","14.11"],"like":["7.0","24.7"],"fix":["7.0"],"even":["7.0"],"improve":["7.0"],"existing":["7.0"],"git":["7.1"],"github":["7.1"],"go":["7.2","9.1"],"http":["7.2","8.2"],"request":["7.3"],"for":["7.3","8.2","18.6","23.3","24.7","25.1","26.7","28.10"],"changes":["7.3"],"push":["7.3","26.6"],"your":["7.3","11.2","26.8","26.12"],"quite":["7.5","11.4"],"long":["7.5","24.2"],"it":["7.5","13.0","17.10","17.12","18.28","19.8","25.4","26.11","28.2","28.4","28.12"],"dolor":["7.6"],"file":["7.7","9.9","14.4","23.4","24.7","25.8","26.8","28.4","28.7"],"children":["7.7"],"entry":["7.7","7.8","14.22","24.7"],"misc":["7.7"],"object":["7.7","14.23","18.9","18.23","22.4"],"side":["7.8","15.6","26.4"],"bar":["7.8"],"several":["8.0","24.6"],"same":["8.0","18.10","18.19","28.3"],"generally":["8.0"],"done":["8.0","22.2"],"having":["8.0"],"proxy":["8.0"],"server":["8.1","13.1","15.6","15.16","17.1","25.4","25.8","28.4"],"listen":["8.1","8.2"],"port":["8.1"],"be":["8.1","12.0","15.4","15.9","15.21","18.8","18.36","19.7","22.3","26.11","28.9","28.12"],"accessible":["8.1"],"map":["8.2"],"upgrade":["8.2"],"connection":["8.2"],"default":["8.2","14.15","15.17","16.11","18.13","18.24","23.2","24.6","26.6","26.8","26.11","26.12"],"close":["8.2","15.28","15.29","15.35"],"create":["9.0","26.5","26.14","28.15"],"motion":["9.11"],"sensors":["9.11"],"send":["11.0"],"data":["11.0","22.4"],"not":["11.0","17.10","17.12","26.12"],"possible":["11.0"],"then":["11.1","19.8","25.4","28.15"],"some":["11.1","11.5","15.19","22.3","22.6","23.0"],"dependencies":["11.1","18.6"],"simplifies":["11.1"],"process":["11.1","19.20","25.4"],"npm":["11.1","22.3"],"save":["11.1","19.2"],"ws":["11.1"],"if":["11.2","11.5","13.10","15.19","18.18","18.37","23.4","23.7","24.2","25.7","26.11","26.12"],"you":["11.2","17.12","18.37","19.7","23.7","24.7","25.7","26.0","26.8","26.12"],"open":["11.2","26.8"],"url":["11.2","14.22"],"in":["11.2","14.4","15.4","17.0","28.4","28.13"],"browser":["11.2","16.0","19.14","23.8","24.7","24.8","28.12"],"should":["11.2","15.21","17.10","17.12","24.7","26.8","26.12"],"retrieve":["11.2"],"requested":["11.2"],"client":["11.2","13.0","13.1","13.9","13.10","16.0","16.1","17.1","18.1","18.28","19.8","19.9","23.2","23.3","24.6","25.4","26.4","26.10","26.15"],"main":["11.2"],"sc":["11.3"],"components":["11.3","18.12","18.21"],"latest":["11.3","26.5"],"resumeaudiocontext":["11.3"],"lib":["11.3"],"resume":["11.3"],"audio":["11.3","25.0"],"loadaudiobuffer":["11.3"],"load":["11.3"],"buffer":["11.3","11.4"],"createbuffersource":["11.4"],"connect":["11.4"],"destination":["11.4"],"document":["11.4"],"body":["11.4"],"easy":["11.4"],"step":["11.4"],"through":["11.4","25.3","26.4"],"instance":["11.4","14.13","14.14","14.16","14.20","14.24","14.25","14.26","14.30","15.28","17.11","18.13","18.14","18.22","18.24","18.25","19.15","19.16","19.21","19.22"],"where":["11.5","15.10"],"deliberately":["11.5"],"but":["11.5","23.8","25.3"],"want":["11.5","24.2","26.11"],"frequency":["11.5","28.14"],"values":["11.5","22.5","26.13"],"nor":["12.0"],"names":["12.0"],"its":["12.0","19.0","23.4","25.4"],"contributors":["12.0"],"used":["12.0","22.3"],"endorse":["12.0"],"promote":["12.0"],"products":["12.0"],"derived":["12.0","26.6"],"from":["12.0","19.8","22.5","25.8"],"specific":["12.0"],"prior":["12.0"],"written":["12.0","15.4"],"permission":["12.0"],"when":["13.0","15.15","17.0","22.5","23.6","28.10"],"disconnects":["13.0"],"s":["13.0","26.3"],"plugincheckin":["13.4"],"const":["13.5","14.6","15.8","16.5","16.6","17.5","19.9","23.3","23.4","24.4","24.5","26.7","26.14","28.15"],"checkin":["13.7"],"plugin":["13.7","13.11","14.9","14.11","16.8","17.7","17.14","19.12","24.7","25.9"],"class":["13.8","15.14","15.18","16.9","26.9","28.6"],"getindex":["13.8"],"kind":["13.11","14.13","14.14","14.24","14.25","14.30","15.22","15.26","15.28","15.30","16.9","17.11","17.14","18.11","18.14","18.20","18.22","18.25","19.15","19.16","19.21","19.22"],"options":["13.12","17.9"],"capacity":["13.12"],"infinity":["13.12"],"2fplugin":["14.0"],"notes":["14.1","18.1"],"reading":["14.1"],"absolute":["14.4"],"cases":["14.4"],"paths":["14.4"],"tree":["14.4","14.13","14.24","18.22"],"will":["14.4","15.4","15.9","15.25","15.33","19.0","19.7","28.3"],"large":["14.8"],"type":["14.8","14.15","14.17","14.27","15.17","15.20","16.12","18.13","18.24","26.6","26.10"],"that":["14.8","18.16","18.27","18.34","19.20","22.4","22.6","24.2","25.0"],"would":["14.8"],"different":["14.8","25.0","28.9"],"handling":["14.8"],"listing":["14.9"],"blocked":["14.9"],"env":["14.9"],"filterext":["14.12"],"keepextension":["14.12"],"findintree":["14.12","14.21"],"path":["14.12","14.21","18.23","26.5"],"events":["14.14","14.25","25.0"],"describing":["14.14","14.25"],"modifications":["14.14","14.25"],"made":["14.14","14.25","22.2","22.5"],"method":["14.14","14.16","14.20","14.25","14.26","14.30","15.28","15.30","15.34","17.11","17.13","18.13","18.14","18.22","18.24","18.25","18.32","18.33","19.15","19.16","19.21","19.22","24.4","26.12"],"param":["14.15","14.17","14.18","14.19","14.27","14.28","14.29","15.17","15.20","16.12","18.13","18.24"],"description":["14.17","14.27","15.17","15.20","16.12"],"executelistener":["14.21","18.17"],"function":["14.21","18.10","18.17","18.19","26.9","26.13"],"added":["14.22"],"serve":["14.22"],"dirname":["14.23","18.4"],"string":["14.23","15.17","15.20","18.23"],"watch":["14.23"],"creating":["15.1","22.4","24.2"],"sub":["15.1"],"define":["15.4"],"directory":["15.4","26.5","28.4"],"files":["15.4","15.19","18.18"],"config":["15.5","16.5","16.6","24.4","24.5","26.9","28.6"],"pluginmanager":["15.5","16.6","17.9","18.5","19.9","25.8"],"register":["15.5","16.6","18.4","18.5","19.8","25.8"],"await":["15.7","15.8","18.5","19.9","23.4","26.14","28.15"],"logger":["15.7","15.8"],"createwriter":["15.7","15.8"],"first":["15.7"],"log":["15.7","23.4","26.8"],"console":["15.7","15.8","23.4","26.8"],"true":["15.8","15.16","15.21","16.6","22.4","24.7","26.6"],"txt":["15.8"],"global":["15.10","15.30","16.9","26.14","28.15"],"logs":["15.10","15.16"],"informations":["15.10"],"contribute":["15.10"],"writers":["15.11"],"attach":["15.11","26.14","28.15"],"writerclient":["15.13"],"stream":["15.13"],"writer":["15.13"],"instantiated":["15.15"],"writes":["15.16"],"buffered":["15.16"],"before":["15.16","15.25","15.29","15.33","15.35"],"sending":["15.16"],"useprefix":["15.16"],"boolean":["15.16","15.21","17.9","26.6"],"whether":["15.21"],"prefixed":["15.21"],"attachwriter":["15.22"],"methods":["15.22"],"code":["15.23","15.24","15.31","15.32","19.9","19.13","23.3","24.6","25.8","26.6","26.13","28.15"],"stringified":["15.25","15.33"],"typedarrays":["15.25","15.33"],"set":["15.26","16.10"],"returns":["15.27","18.16","18.22","18.27","18.34","19.20"],"full":["15.28"],"flushed":["15.28"],"underlying":["15.29","18.10","18.19"],"deleted":["15.29"],"name":["15.30","18.9","24.7","26.9"],"promise":["15.35"],"wave":["15.36"],"handle":["16.0"],"available":["16.1","17.9","18.11","18.20"],"pluginplatforminit":["16.4","24.6","25.8"],"init":["16.8","22.2","25.5"],"i":["16.10","18.6","22.3","22.5","25.7"],"echocancellation":["16.10"],"noisereduction":["16.10"],"autogaincontrol":["16.10"],"false":["16.10","26.6"],"mic":["16.10"],"todo":["16.10"],"deviceid":["16.10"],"call":["16.11","17.10","17.12"],"automatically":["16.11","26.4"],"called":["16.11","18.35"],"platform":["16.13","24.7","25.5"],"area":["17.0","17.4"],"registered":["17.0"],"system":["17.4"],"they":["17.4","18.6","22.3"],"have":["17.4","17.10","17.12","19.0","22.2","23.7","26.3","28.12"],"special":["17.4"],"meaning":["17.4","26.11"],"position":["17.7"],"setposition":["17.8"],"x":["17.8","17.15"],"y":["17.8"],"randomize":["17.9"],"autoamtically":["17.9"],"most":["17.10","19.7"],"axis":["17.15"],"yrange":["17.15"],"io":["18.0"],"optionnal":["18.4"],"import":["18.6","19.8","25.8","28.12"],"installed":["18.6"],"other":["18.6"],"now":["18.6","19.14","22.2","26.8"],"sharedscript":["18.8"],"distributed":["18.8","23.6","25.1","27.0"],"amongst":["18.8"],"createscript":["18.9"],"value":["18.9"],"share":["18.10","18.19"],"getglobalscriptingcontext":["18.10","18.19"],"scripts":["18.11","18.20","18.37"],"usefull":["18.12","18.21"],"reuse":["18.12","18.21"],"up":["18.14","18.15","18.25","18.26"],"date":["18.14","18.15","18.25","18.26","19.14"],"instances":["18.15","18.26"],"onupdate":["18.17","19.9","23.4","26.13"],"callback":["18.17"],"script":["18.18"],"located":["18.18"],"cannot":["18.28","19.0"],"instatiated":["18.28"],"retrieved":["18.28"],"calling":["18.28"],"unregister":["18.34"],"been":["18.35","22.2","22.5","24.7"],"propagated":["18.36"],"attached":["18.36","22.5"],"own":["19.0"],"notion":["19.0"],"time":["19.0","19.20","24.7","24.8","26.11","28.3"],"local":["19.1"],"clock":["19.1"],"scheduling":["19.1"],"pluginsync":["19.4","19.5","25.8"],"1e":["19.7"],"case":["19.7","28.13"],"perfectly":["19.7"],"fine":["19.7"],"configure":["19.8","23.3","26.7","28.12"],"resumes":["19.8"],"core":["19.8","25.8"],"pluginplatform":["19.8"],"clients":["19.9","19.14","22.0","25.4","26.14"],"pseudo":["19.9"],"sync":["19.9","19.18","25.4","25.9"],"get":["19.9","26.9","28.10"],"mysharedstate":["19.9"],"updates":["19.9","23.4"],"synctriggertime":["19.9"],"given":["19.10"],"synchronized":["19.10"],"synctime":["19.10","19.13"],"getlocaltime":["19.13","19.19"],"performance":["19.14"],"ismm":["19.17","19.18"],"syncclient":["19.17","19.18"],"reportfunction":["19.17"],"ircam":["19.18"],"second":["19.20","22.5","28.9"],"defaults":["19.20"],"rendering":["19.23"],"over":["19.23","28.8"],"heterogeneous":["19.23"],"devices":["19.23","25.0"],"aside":["20.0"],"learn":["21.0"],"how":["21.0","24.2"],"sections":["21.5"],"flash":["22.0"],"screen":["22.0"],"modern":["22.1"],"might":["22.2"],"evolved":["22.2"],"bit":["22.2","25.2","25.3"],"since":["22.2"],"once":["22.2"],"installation":["22.2"],"propose":["22.2"],"plugins":["22.2"],"curated":["22.2"],"skip":["22.2"],"steps":["22.2"],"deps":["22.2"],"after":["22.2","25.0"],"directories":["22.3"],"never":["22.3"],"edited":["22.3"],"repspectively":["22.3"],"manager":["22.3","24.4","24.5","24.6","26.5","28.5"],"tools":["22.3","22.6"],"transformation":["22.3"],"event":["22.4"],"here":["22.4"],"just":["22.4","22.5","23.2","24.2","28.12"],"plain":["22.4"],"old":["22.4"],"javascript":["22.4","22.5"],"follows":["22.4"],"schema":["22.4"],"definition":["22.4"],"structure":["22.4"],"declares":["22.4"],"parameter":["22.4","28.2"],"named":["22.4","28.4"],"configured":["22.4"],"notified":["22.5"],"current":["22.5","25.4"],"into":["22.5","24.6","26.6"],"has":["22.5","24.7","28.2"],"successfully":["22.5"],"press":["22.5"],"alt":["22.5"],"j":["22.5"],"chrome":["22.5"],"firefox":["22.5"],"select":["22.5"],"tab":["22.5"],"write":["22.5"],"allows":["22.5"],"use":["22.6","24.2","25.4","25.9"],"at":["22.6","25.3","25.4","28.12"],"hardware":["23.0"],"such":["23.0","24.0"],"raspberry":["23.0"],"pi":["23.0"],"allowing":["23.0"],"access":["23.0","28.2"],"fonctionnalities":["23.0"],"controlling":["23.0"],"unhandled":["23.3"],"errors":["23.3"],"thingschema":["23.3"],"usage":["23.3","26.7","26.12"],"within":["23.3","24.2","26.7"],"template":["23.3","26.7","26.11"],"usedefaultapplicationtemplate":["23.3","24.4","26.7"],"statemanager":["23.3","23.4","26.14","28.15"],"registerschema":["23.3"],"thus":["23.4"],"initialize":["23.4"],"id":["23.4","28.10"],"field":["23.4"],"idea":["23.4"],"src":["23.4","25.8","28.4"],"index":["23.4","25.8","26.14"],"add":["23.4","25.8"],"snippet":["23.4"],"start":["23.4","28.2","28.15"],"triggered":["23.4","28.9"],"triggersound":["23.4"],"noise":["23.4"],"very":["23.6","28.9"],"practical":["23.6"],"developing":["23.6"],"web":["23.7","23.8"],"however":["23.7","26.12"],"don":["23.7"],"any":["23.7","28.2","28.8"],"hence":["23.7"],"doesn":["23.7"],"running":["23.8"],"rather":["23.8"],"simplify":["24.0","28.8"],"certain":["24.0"],"features":["24.0","24.8","28.16"],"selecting":["24.2"],"tip":["24.2"],"asks":["24.2","25.4"],"followed":["24.2"],"show":["24.2"],"info":["24.2"],"design":["24.3"],"provides":["24.6"],"simplified":["24.6"],"look":["24.7"],"author":["24.7"],"target":["24.7"],"generated":["24.7"],"wizard":["24.7","28.12"],"updated":["24.7"],"each":["24.7","25.4","26.15","28.2"],"certains":["24.8"],"along":["24.8"],"way":["24.8"],"also":["24.8"],"across":["25.0"],"compose":["25.0"],"theory":["25.2","26.2"],"perceive":["25.3"],"users":["25.3"],"only":["25.3"],"because":["25.3"],"constently":["25.3"],"themselves":["25.3"],"distant":["25.3"],"protocol":["25.3"],"ntp":["25.3"],"could":["25.3","28.16"],"consider":["25.3"],"problem":["25.3"],"solved":["25.3"],"let":["25.3"],"unfortunately":["25.3"],"complicated":["25.3"],"provided":["25.4","25.9"],"connected":["25.4"],"shown":["25.4"],"figure":["25.4"],"below":["25.4"],"periodically":["25.4"],"precisely":["25.4"],"iteration":["25.4"],"takes":["25.4"],"launcher":["25.7"],"launch":["25.7"],"following":["25.8","26.6","28.2"],"pattern":["26.0"],"help":["26.0"],"sharedstatecollection":["26.1"],"andrew":["26.3"],"tanenbaum":["26.3"],"brief":["26.3"],"introduction":["26.3"],"october":["26.3"],"additionally":["26.3"],"creative":["26.3"],"arrow":["26.4"],"red":["26.4"],"representation":["26.4"],"websockets":["26.4"],"npx":["26.5"],"export":["26.6"],"volume":["26.6","26.9"],"db":["26.6"],"float":["26.6"],"min":["26.6"],"max":["26.6"],"mute":["26.6","26.9"],"see":["26.6","26.8","28.9"],"getvalues":["26.8"],"terminal":["26.8"],"window":["26.8"],"displayed":["26.8","26.12"],"render":["26.9","28.6","28.7","28.10"],"div":["26.9","28.6","28.10"],"layout":["26.9","28.6"],"hello":["26.9","28.6"],"app":["26.9"],"h2":["26.9","28.10"],"ul":["26.9"],"li":["26.9"],"od":["26.10"],"additionnally":["26.11"],"active":["26.12"],"container":["26.12","28.6"],"refresh":["26.12"],"page":["26.12"],"interface":["26.12"],"correctly":["26.12"],"still":["26.12"],"missing":["26.12"],"interacting":["26.12"],"moving":["26.12"],"does":["26.12"],"getcollection":["26.13"],"renderapp":["26.13"],"update":["26.13","28.2","28.10"],"shared":["26.13","28.9"],"onattach":["26.13"],"ondetach":["26.13"],"interfaces":["26.15"],"collections":["26.15"],"requires":["28.0"],"basic":["28.0"],"knowledge":["28.0"],"accept":["28.2"],"players":["28.2"],"fonctionalities":["28.2"],"trigger":["28.2"],"sound":["28.2","28.9","28.12"],"stop":["28.2","28.10","28.14"],"synthesizer":["28.2","28.9"],"devtools":["28.3"],"devtool":["28.3"],"ask":["28.3"],"questions":["28.3"],"schemas":["28.4"],"fill":["28.4"],"createlayout":["28.6"],"html":["28.6","28.7"],"lit":["28.7"],"sw":["28.7","28.15"],"audit":["28.7"],"finally":["28.7"],"fasten":["28.8"],"us":["28.9"],"two":["28.9"],"types":["28.9"],"common":["28.9"],"behavior":["28.9"],"playing":["28.9"],"back":["28.9"],"started":["28.9"],"stopped":["28.9"],"occurs":["28.10"],"requestupdate":["28.10"],"disconnectedcallback":["28.10"],"reacting":["28.10"],"element":["28.10"],"removed":["28.10"],"dom":["28.10"],"controls":["28.10"],"return":["28.10"],"style":["28.10"],"allowed":["28.12"],"produce":["28.12"],"properly":["28.12"],"remind":["28.12"],"already":["28.12"],"asked":["28.12"],"currenttime":["28.13"],"settargetattime":["28.13"],"02":["28.13"],"break":["28.13","28.14"],"synth":["28.14"],"createoscillator":["28.14"],"else":["28.14"],"toggle":["28.15"],"focus":["28.16"],"these":["28.16"],"key":["28.16"],"points":["28.16"],"improved":["28.16"]},{"0":["25.7","26.8","28.4"],"1":["7.2","25.7","28.4"],"2":["22.2","24.4","24.5","24.7","26.7","26.14","28.15"],"3":["15.7","15.8","22.6","25.4","26.4"],"4":["25.4"],"6":["22.5"],"7":["24.6"],"8":["22.5","24.6"],"16":["15.7","15.8"],"23":["24.6"],"30":["28.15"],"35":["28.15"],"39":["15.7","15.8"],"43":["15.7","15.8","28.15"],"50":["26.6"],"127":["25.7","26.8"],"400":["28.10"],"440":["26.6"],"1000":["26.6"],"2023":["15.7","15.8"],"8000":["25.7","26.8"],"8080":["7.2"],"built":["0.0"],"html":["0.1","13.13","14.31","16.14","17.16","18.38","19.24","26.13","26.14"],"github":["1.2","5.0"],"io":["1.2"],"paragraph":["1.4"],"on":["1.4","1.7","3.3","18.16","18.27","23.4","25.0","28.9"],"locking":["1.4"],"specific":["1.4","24.2"],"roles":["1.4"],"creating":["1.4","6.4","11.0"],"and":["1.4","4.3","8.0","13.0","15.19","18.8","20.0","25.0","26.14","28.11"],"start":["1.4","15.5","16.6","18.5","28.8","28.10","28.12","28.16"],"advanced":["1.4","24.4"],"text":["1.5","14.8","26.13"],"language":["1.5"],"tools":["1.6"],"sc":["1.6","26.13"],"node":["1.6","14.22","19.14","22.0","23.8","26.4"],"the":["1.7","3.4","4.12","16.5","17.0","21.0","25.2","26.2"],"internet":["1.7","25.3"],"nginx":["1.7","8.0"],"configuration":["1.7","25.5","26.5"],"founded":["3.1"],"french":["3.1"],"national":["3.1"],"agency":["3.1"],"residency":["3.2"],"starts":["3.2","19.20"],"program":["3.2"],"of":["3.2","3.4","6.6","7.8","13.0","13.9","14.13","14.22","14.24","14.30","15.4","15.26","15.28","15.29","15.35","18.6","18.14","18.15","18.25","18.26","18.35","19.14","19.17","19.18","21.5","25.5","25.7","28.12"],"european":["3.2"],"commission":["3.2"],"be":["3.3","4.3","6.1","7.5","7.7","15.16","17.4","25.0","25.3","26.4","28.3"],"found":["3.3"],"ircam":["3.3","4.9","5.0"],"sound":["3.3","14.8","24.6"],"music":["3.3"],"movement":["3.3"],"journal":["3.4"],"audio":["3.4","4.6","9.11","16.5","19.1","24.0","25.1","26.4","28.9"],"engineering":["3.4"],"trondheim":["3.5"],"norway":["3.5"],"02387783":["3.5"],"frédéric":["3.5"],"interaction":["3.5","16.0"],"topologies":["3.5"],"in":["3.5","4.4","7.2","15.15","17.4","18.8","19.9","19.23","26.11","26.14"],"mobile":["3.5"],"situated":["3.5"],"wireless":["3.5"],"communications":["3.5"],"template":["4.1","22.2","23.2","26.13"],"already":["4.1"],"takes":["4.1","24.4","26.7"],"care":["4.1"],"that":["4.1","8.0","11.1","11.5","14.14","14.25","15.27","15.28","16.0","18.22","19.0","24.0","24.4","24.8","26.7","26.11"],"sh":["4.1","7.3"],"npm":["4.1","4.10","4.11","24.2"],"enforce":["4.2"],"browser":["4.2","22.1","22.2","23.2","26.8"],"compatibility":["4.2"],"support":["4.2"],"meaning":["4.2","11.5"],"can":["4.3","6.1","11.2","22.4","25.0","26.4","26.11"],"limited":["4.3","12.0"],"clients":["4.4","18.8","19.7","25.8","26.3","26.11"],"real":["4.4","6.5"],"time":["4.4","22.3","23.4"],"into":["4.5","13.0","23.7"],"plain":["4.5"],"old":["4.5"],"files":["4.5","14.1"],"screen":["4.6","4.7","11.2","25.7","25.8"],"to":["4.6","4.7","7.5","9.1","13.12","14.0","14.15","15.4","15.19","15.20","17.9","17.15","18.37","19.21","19.22","20.0","21.0","24.4","24.5","25.2","25.7","28.13"],"resume":["4.6"],"context":["4.6","25.3"],"where":["4.7"],"are":["4.7","11.0","23.0"],"asked":["4.7"],"behavior":["4.8"],"distributed":["4.8","6.4"],"around":["4.9"],"rm":["4.10"],"rf":["4.10"],"install":["4.10","4.11"],"run":["4.10","23.7"],"dev":["4.10"],"what":["5.0"],"is":["5.0","13.0","14.9","14.23","16.10","18.5","18.8","18.18","19.0","24.2","24.4"],"not":["5.0","12.0","16.11"],"develop":["5.0","6.1"],"regular":["5.0"],"websites":["5.0"],"although":["5.0"],"its":["5.0","26.8"],"probably":["5.0"],"feasible":["5.0"],"do":["5.0","22.5"],"so":["5.0","28.0","28.16"],"if":["5.0","14.4","14.23","19.9","22.4","26.8","26.9","28.3","28.15"],"you":["5.0","11.1","16.11","17.4","22.4","25.3","28.8"],"adventurous":["5.0"],"ready":["5.0"],"application":["5.0","6.2","6.4","6.6","17.4","24.6","28.9"],"will":["5.0","6.2","17.0","18.13","18.24","22.3","23.7","24.6","26.5"],"have":["5.0","11.1","16.11"],"code":["5.0","13.8","15.13","15.28","15.29","15.35","17.8","17.10","17.12","18.6","18.33","18.36","19.17","19.19","28.4"],"however":["5.0","24.7"],"we":["5.0"],"maintain":["5.0"],"set":["5.0","11.4","14.9","19.20","26.12","28.10"],"quite":["5.0"],"generic":["5.0"],"could":["5.0","17.4"],"fit":["5.0"],"your":["5.0","7.2","14.8","17.4","23.7","26.0","26.9","26.11","26.15"],"case":["5.0"],"as":["6.1","8.1","12.0","15.6","15.20","18.23","22.4","24.4"],"such":["6.1","25.9"],"used":["6.1","15.17","24.4","24.7","26.8","28.3"],"prototype":["6.1"],"running":["6.1","6.4"],"exclusively":["6.1"],"partly":["6.1"],"embedded":["6.1"],"hardware":["6.1"],"rapberry":["6.1"],"pi":["6.1"],"while":["6.1","6.2"],"architecture":["6.2","28.9"],"follow":["6.2"],"semver":["6.2"],"hope":["6.2"],"choice":["6.2"],"minimize":["6.2"],"burden":["6.2"],"existing":["6.2"],"allowing":["6.2"],"framework":["6.2"],"according":["6.2","14.8"],"novel":["6.2"],"questions":["6.2","22.2"],"finally":["6.2","24.6","25.7","26.13","28.6","28.15"],"mainly":["6.3"],"provides":["6.3"],"a":["6.4","6.5","7.0","7.7","12.0","15.1","15.5","16.0","17.9","17.15","18.18","18.23","23.2","24.0","24.4","26.7","28.14"],"an":["6.4","19.9","19.14","19.20","24.4","24.5","25.0"],"key":["6.5"],"feature":["6.5","26.4"],"for":["6.5","11.0","11.4","12.0","15.0","17.4","18.12","18.18","18.21","22.4","22.5","25.3","25.5","26.5","26.13","28.16"],"rapid":["6.5"],"prototyping":["6.5"],"dynamically":["6.6"],"script":["6.6","18.4","18.8"],"parts":["6.6"],"at":["6.6","8.1","18.8","22.3","22.5","24.4","25.7","28.3"],"runtime":["6.6","18.8"],"content":["7.0"],"which":["7.0","7.7","23.0","25.4"],"might":["7.0"],"great":["7.0"],"challenge":["7.0"],"com":["7.1"],"collective":["7.1"],"soundworks":["7.1","14.9","16.11","19.2","24.1"],"favorite":["7.2"],"source":["7.3","18.8"],"branch":["7.3"],"git":["7.3"],"add":["7.3","11.4","28.7","28.15"],"commit":["7.3"],"nice":["7.5"],"insert":["7.5"],"table":["7.5","22.4"],"sit":["7.6"],"title":["7.7","7.8"],"required":["7.7","7.8"],"optional":["7.7"],"should":["7.7","11.1","15.16","16.11","24.2","25.7","28.3"],"absolute":["7.7"],"config":["7.8","14.9","19.8","23.4","28.7"],"js":["7.8","15.9","15.10","15.11","22.0","23.8"],"path":["7.8","15.20","17.15"],"apache":["8.0"],"handle":["8.0","11.2"],"requests":["8.0","8.2"],"possibly":["8.0"],"certificates":["8.0"],"internally":["8.0"],"route":["8.0"],"subpath":["8.1"],"my":["8.1","18.4"],"app":["8.1","23.4","28.6","28.7"],"no":["8.1","11.5","26.11","28.3","28.16"],"need":["8.1","23.7","26.12"],"use":["8.1","18.5","21.0","22.5","24.4","26.8","28.9"],"https":["8.1","8.2"],"internaly":["8.2"],"redirects":["8.2"],"rewrite":["8.2"],"wifi":["9.0"],"worklet":["9.11"],"local":["9.11","19.7","25.3","25.4"],"with":["11.0","15.16","19.14","19.20","22.4","24.3","28.8"],"traditionnal":["11.0"],"http":["11.0","11.3","25.7","26.8"],"they":["11.0"],"particularly":["11.0"],"useful":["11.0","17.4"],"applications":["11.0","26.0"],"requiring":["11.0"],"static":["11.1"],"finalhandler":["11.1"],"after":["11.1"],"last":["11.1"],"see":["11.1","11.2","20.0","24.2","25.7","26.11"],"file":["11.1","14.15","15.17","24.2"],"called":["11.1"],"package":["11.1","24.2"],"json":["11.1","24.2"],"been":["11.1","15.6"],"created":["11.1","11.4","15.9"],"by":["11.1","12.0","15.13","22.6"],"etc":["11.2"],"thus":["11.2","25.3"],"following":["11.2","28.4"],"homepage":["11.2"],"then":["11.2","22.2","25.5"],"just":["11.2","18.37","23.4","26.13","28.15"],"modify":["11.2"],"bit":["11.2","23.7","25.7"],"websockets":["11.2"],"connection":["11.2","11.4"],"well":["11.2","24.6","26.6"],"const":["11.3","15.9","15.10","15.11","19.8","28.5"],"url":["11.3","26.8"],"window":["11.3"],"location":["11.3"],"origin":["11.3","19.14","19.20"],"replace":["11.3"],"ws":["11.3"],"wss":["11.4"],"new":["11.4","15.20","16.9","18.16","18.23","18.27","19.8","24.7","28.5"],"websocketserver":["11.4"],"store":["11.4"],"instances":["11.4"],"sockets":["11.4"],"listen":["11.4"],"event":["11.4"],"websocket":["11.4"],"console":["11.4","24.6"],"log":["11.4","15.17","28.13"],"list":["11.4"],"or":["11.5","14.8","15.19","18.28","23.0","26.4","28.15"],"more":["11.5","22.5","24.4","24.6"],"complex":["11.5"],"data":["11.5","13.12","14.12","14.21","15.0"],"structure":["11.5","28.16"],"another":["11.5"],"issue":["11.5","25.0"],"completely":["11.5"],"stateless":["11.5"],"there":["11.5","19.0","22.5"],"history":["11.5"],"holders":["12.0"],"any":["12.0","13.10","15.19","17.4","26.4","28.15"],"express":["12.0"],"implied":["12.0"],"warranties":["12.0"],"including":["12.0"],"but":["12.0","22.5","23.7"],"merchantability":["12.0"],"fitness":["12.0"],"particular":["12.0"],"recycled":["13.0"],"pool":["13.0"],"indexes":["13.0","13.12"],"api":["13.1","14.1","16.1","17.1","18.1","22.4","24.0"],"classes":["13.1","16.1","17.1","18.1"],"plugin":["13.2","13.4","14.2","15.2","16.2","16.4","16.13","17.2","18.2","19.4","19.5","28.0","28.1"],"checkin":["13.4"],"pluginmanager":["13.5","14.6","15.15","17.5","18.4"],"register":["13.5","14.6","17.5","22.5","28.6"],"plugincheckinserver":["13.7"],"number":["13.8","19.19"],"kind":["13.9","13.10","15.4","15.25","15.29","15.33","15.35","17.10","17.12","18.15","18.26","18.28","18.35","18.36","19.17","19.18"],"instance":["13.9","13.10","15.25","15.26","15.29","15.33","15.35","17.10","17.12","18.11","18.15","18.20","18.26","18.35","18.36","19.17","19.18","24.4"],"method":["13.9","14.13","14.24","15.26","15.29","15.35","18.11","18.15","18.20","18.26","18.28","18.35","19.17","19.18","22.5","24.5","26.7","26.8","28.13"],"global":["13.11","15.22","17.14","18.28","19.0","28.11","28.12"],"class":["13.11","15.22","15.30","17.14","18.28","26.14","28.7"],"array":["13.12","15.25","15.33"],"optionnal":["13.12","14.23"],"associated":["13.12"],"watch":["14.0"],"security":["14.1"],"normalized":["14.4"],"dirname":["14.4","15.18","18.17"],"defined":["14.4","19.9","24.4","24.5","26.7"],"await":["14.6","15.5","15.9","15.10","15.11","16.6","18.4","23.3"],"processing":["14.8"],"e":["14.8","15.4","18.12","18.21","22.1","22.2","26.3","26.15","28.10"],"g":["14.8","18.12","18.21","25.3","26.3"],"image":["14.8"],"type":["14.9","14.16","14.18","14.19","14.20","14.26","14.28","14.29","17.10","18.14","18.25","18.34","22.2","28.4"],"option":["14.9","15.11","18.18"],"passed":["14.9","24.5"],"server":["14.9","24.3","25.3","26.1","28.12"],"pluginfilesystemserver":["14.11"],"writefile":["14.12","14.21"],"pathname":["14.12","14.21","15.7","15.8","15.17","15.22","15.30"],"promise":["14.12","14.21","15.29","18.9","18.17"],"returns":["14.14","14.25","15.28","15.34","17.11","17.13","18.32"],"unregister":["14.14","14.25","15.28","18.22"],"listener":["14.14","14.25","18.22"],"description":["14.15","14.16","14.18","14.19","14.26","14.28","14.29","18.13","18.14","18.24","18.25","18.34"],"string":["14.15","14.17","14.19","14.27","14.29","16.12","17.15","18.13","18.24"],"extension":["14.15"],"retrieve":["14.15","18.10","18.19","24.4"],"param":["14.16","14.20","14.26","17.10","18.14","18.22","18.25","18.34"],"mkdir":["14.21"],"each":["14.22","23.4","28.15"],"tree":["14.22"],"depth":["14.22"],"maximum":["14.22"],"idle":["14.23","15.4","15.19"],"null":["14.23","15.4"],"publicpath":["14.23"],"public":["14.23"],"recording":["15.0"],"arbitrary":["15.0"],"directories":["15.1"],"share":["15.1"],"writer":["15.1","15.9"],"between":["15.1","19.1"],"defaults":["15.4"],"i":["15.4","22.2","26.15","28.2"],"state":["15.4","15.19","26.3"],"create":["15.5","19.8","24.7","25.3"],"logger":["15.6","15.10"],"logs":["15.7","15.8"],"07":["15.7","15.8"],"0001":["15.8"],"automatically":["15.9","17.0","23.4","24.8"],"usual":["15.10"],"side":["15.10","15.19","25.8","28.12"],"sharedwrite":["15.10"],"createwriter":["15.10","15.13","15.14","15.19"],"defining":["15.11"],"buffersize":["15.11","15.13"],"mywriter":["15.11"],"retrived":["15.13"],"name":["15.13","15.14","18.17","26.5","26.7","28.6","28.7"],"attachwriter":["15.13","15.19"],"options":["15.14"],"registered":["15.15"],"example":["15.15","18.18","28.16"],"whether":["15.16"],"prefixed":["15.16"],"yyyy":["15.16","15.21"],"mm":["15.16","15.21"],"dd":["15.16","15.21"],"hh":["15.16","15.21"],"ss":["15.16","15.21"],"uid":["15.16","15.21"],"generate":["15.17"],"switch":["15.18","18.17"],"call":["15.19","22.2","26.10"],"client":["15.19","22.2","25.5","25.8","26.5","26.8"],"object":["15.20","17.8"],"allowreuse":["15.21"],"write":["15.22","15.30"],"read":["15.23","15.24","15.31","15.32","18.29","18.30","18.31"],"converted":["15.25","15.33"],"being":["15.25","15.33"],"resolves":["15.29","18.16","18.27"],"resolved":["15.35"],"cosima":["15.36"],"research":["15.36"],"projects":["15.36"],"features":["16.0","16.1"],"require":["16.0","24.0"],"user":["16.0","18.18","24.0","24.4","24.5","25.8","26.7"],"platform":["16.2","16.4","28.0","28.1"],"init":["16.4","16.13","28.0"],"audiocontext":["16.5"],"pass":["16.5"],"platforminit":["16.6"],"get":["16.6","28.6"],"micstream":["16.6"],"camerastream":["16.6"],"pluginplatforminitserver":["16.8"],"onusergesture":["16.9"],"video":["16.10"],"camera":["16.10"],"oncheck":["16.10"],"function":["16.10","22.5","24.5","26.14"],"executed":["16.10","18.22","22.5"],"launcher":["16.11","17.0","24.6","24.8"],"id":["16.12","24.4","24.5"],"provide":["17.0"],"unit":["17.4"],"find":["17.4"],"pluginpositionserver":["17.7"],"getposition":["17.8"],"setnormalizedposition":["17.8"],"give":["17.9"],"random":["17.9"],"position":["17.9"],"cases":["17.10","17.12","24.4"],"most":["17.12","22.3"],"y":["17.15"],"backgroundimage":["17.15"],"background":["17.15"],"2fplugin":["18.0"],"pluginscriptingclient":["18.1"],"once":["18.5"],"only":["18.6","18.29","18.30","18.31"],"named":["18.6"],"exports":["18.6"],"supported":["18.6"],"this":["18.6","19.7","22.3","23.4","23.6","24.2","26.4"],"responsibility":["18.6"],"consuming":["18.6"],"different":["18.8"],"modified":["18.8"],"stored":["18.8"],"directly":["18.8"],"updatescript":["18.9"],"allow":["18.10","18.19","26.6"],"given":["18.10","18.18","18.19"],"from":["18.10","18.19","28.12"],"within":["18.10","18.19","26.15"],"createscript":["18.17"],"value":["18.17","28.3","28.9","28.10"],"before":["18.18"],"selects":["18.18"],"convenience":["18.23"],"s":["18.28","22.2"],"pluscritping":["18.28"],"attach":["18.28"],"default":["18.34","22.2","25.5","26.5","28.4"],"has":["18.35"],"deleted":["18.35"],"scripts":["18.36"],"want":["18.37","25.3"],"stop":["18.37","28.16"],"using":["18.37","24.7"],"assume":["19.0"],"something":["19.0","22.5"],"like":["19.0"],"m":["19.0"],"van":["19.0"],"synchronized":["19.1"],"events":["19.1"],"correspondances":["19.1"],"sync":["19.4","19.5","19.8"],"pluginsync":["19.8"],"even":["19.9"],"synctime":["19.9","19.19"],"getsynctime":["19.10","19.13"],"pluginsyncserver":["19.12"],"audiotime":["19.13"],"process":["19.14","23.4","23.8","25.7","28.8"],"hrtime":["19.14","19.20"],"all":["19.14"],"them":["19.14","26.6"],"reportfunction":["19.18"],"corresponding":["19.21","19.22"],"html5":["19.23"],"2nd":["19.23"],"web":["19.23","23.1","24.0","26.9"],"system":["20.0"],"requires":["22.0"],"basic":["22.0"],"knowledge":["22.0"],"javascript":["22.0"],"let":["22.2"],"player":["22.2","25.8"],"show":["22.2","24.6"],"few":["22.2"],"configure":["22.2"],"again":["22.2"],"select":["22.2"],"values":["22.2","28.13"],"contrary":["22.3"],"work":["22.3"],"network":["22.3","26.4"],"familiar":["22.4"],"databases":["22.4"],"think":["22.4"],"these":["22.4"],"curious":["22.4"],"full":["22.4"],"documentation":["22.4","24.6"],"declaring":["22.4"],"schemas":["22.4","28.12"],"us":["22.5","24.6","26.6"],"react":["22.5"],"onupdate":["22.5"],"snippet":["22.5"],"update":["22.5","23.3","26.12","28.14"],"callback":["22.5"],"come":["22.5","24.3"],"later":["22.5"],"point":["22.5","24.5"],"simplify":["22.6","26.0"],"development":["22.6","26.3"],"discovered":["22.6","24.8"],"shared":["22.6"],"states":["22.6","23.3","28.11"],"provided":["22.6","24.8"],"motor":["23.0"],"led":["23.0"],"hard":["23.0"],"achieve":["23.0","25.9"],"sandboxed":["23.0"],"environment":["23.0"],"controller":["23.2","26.10"],"go":["23.3"],"first":["23.3","24.7","25.3"],"collection":["23.3"],"gui":["23.3"],"every":["23.3"],"thingcollection":["23.3"],"hello":["23.4"],"launched":["23.4"],"restarted":["23.4"],"saved":["23.4"],"goal":["23.4"],"command":["23.4"],"back":["23.4","25.4"],"interface":["23.4","28.15"],"updated":["23.4","28.15"],"click":["23.4","28.16"],"trigger":["23.4","28.14"],"button":["23.4"],"turn":["23.4"],"appear":["23.4"],"similar":["23.6"],"manner":["23.6"],"also":["23.6"],"possible":["23.6"],"computer":["23.7"],"remote":["23.7"],"device":["23.7"],"it":["23.7","24.7","26.4","28.14","28.16"],"know":["23.7"],"next":["23.8","25.9"],"gesture":["24.0"],"functionnality":["24.2"],"mere":["24.2"],"alias":["24.2"],"equivalent":["24.2"],"doing":["24.2"],"save":["24.2"],"open":["24.2"],"plugins":["24.3"],"always":["24.3","25.3"],"both":["24.3","26.3"],"least":["24.4"],"arguments":["24.4","24.5","26.7"],"here":["24.4","24.5"],"internal":["24.4"],"identifier":["24.4"],"factory":["24.5"],"important":["24.5","26.4"],"motion":["24.6"],"sensors":["24.6"],"refer":["24.6","28.0"],"information":["24.6"],"some":["24.6","24.8"],"welcoming":["24.6"],"everything":["24.6"],"works":["24.6"],"our":["24.6"],"resumed":["24.6"],"initscreenscontainer":["24.6"],"container":["24.6","26.9"],"launch":["24.6"],"lines":["24.7","26.12"],"safely":["24.7"],"splashscreen":["24.7"],"entries":["24.7"],"action":["24.7"],"functionalities":["24.8"],"component":["24.8","28.7"],"included":["24.8"],"short":["25.0"],"introduction":["25.0"],"why":["25.0"],"rendering":["25.1","26.4"],"understand":["25.2","26.2"],"connected":["25.3"],"able":["25.3"],"connect":["25.3"],"many":["25.3"],"situations":["25.3"],"several":["25.3"],"reasons":["25.3"],"ping":["25.4"],"sends":["25.4"],"tag":["25.4"],"reception":["25.4"],"tagged":["25.4"],"pong":["25.4"],"startup":["25.7"],"telling":["25.7"],"synchronizing":["25.7"],"going":["25.7"],"display":["25.7","26.13","26.14"],"when":["25.8","26.5","28.16"],"clicks":["25.8"],"along":["26.0","26.15"],"way":["26.0","26.15"],"concepts":["26.2"],"very":["26.3","28.13"],"simple":["26.3","26.4","26.14"],"ways":["26.3"],"monitor":["26.3"],"control":["26.3","26.6","28.13"],"distant":["26.3"],"true":["26.3"],"during":["26.3","28.2"],"artwork":["26.3"],"tweak":["26.3"],"done":["26.4"],"visual":["26.4"],"enables":["26.4"],"other":["26.4"],"ask":["26.5"],"unmute":["26.6"],"second":["26.6","28.14"],"containing":["26.6"],"frequency":["26.6","26.9","28.2","28.10"],"registerschema":["26.7","28.5"],"note":["26.7","26.8","28.9"],"instead":["26.8"],"conterpart":["26.8"],"sw":["26.9","28.6"],"credits":["26.9","28.6"],"infos":["26.9","28.6"],"refresh":["26.9","28.15"],"dedicated":["26.10"],"accessible":["26.11","28.3"],"root":["26.11","28.3"],"website":["26.11"],"choose":["26.11"],"confirm":["26.11"],"editor":["26.11"],"directory":["26.11"],"src":["26.11"],"yet":["26.12"],"fix":["26.12"],"simply":["26.12"],"input":["26.12","28.10"],"detail":["26.12","28.10"],"render":["26.13","26.14"],"header":["26.13","28.7"],"section":["26.13"],"div":["26.13","26.14","28.7"],"h2":["26.13","28.6"],"map":["26.13"],"return":["26.13"],"renderapp":["26.14"],"layout":["26.14","28.7"],"h1":["26.14","28.7"],"wizard":["26.15"],"step":["27.0"],"manager":["28.0"],"please":["28.0"],"synths":["28.2","28.9"],"creation":["28.2"],"performance":["28.2"],"tool":["28.3"],"tip":["28.3","28.9","28.13"],"selecting":["28.3"],"means":["28.3"],"export":["28.4"],"float":["28.4"],"min":["28.4","28.10"],"max":["28.4","28.10"],"usedefaultapplicationtemplate":["28.5"],"statemanager":["28.5"],"master":["28.6"],"mute":["28.6"],"role":["28.7"],"indeed":["28.8"],"one":["28.8"],"working":["28.8"],"multiple":["28.8"],"physical":["28.8"],"devices":["28.8"],"smartphones":["28.8"],"tablets":["28.8"],"loop":["28.9"],"keep":["28.9"],"focus":["28.9"],"logic":["28.9"],"synthesizers":["28.9"],"based":["28.9"],"oscillators":["28.9"],"same":["28.9"],"attribute":["28.9"],"padding":["28.10"],"bottom":["28.10"],"4px":["28.10"],"width":["28.10"],"getschema":["28.10"],"synth":["28.10","28.16"],"changes":["28.11"],"beginning":["28.12"],"pluginplatforminit":["28.12"],"globalschema":["28.12"],"current":["28.13"],"audioparam":["28.13"],"usefull":["28.13"],"automation":["28.13"],"parameters":["28.13"],"runnings":["28.14"],"currenttime":["28.14"],"settargetattime":["28.14"],"02":["28.14"],"synthtrigger":["28.14"],"connects":["28.15"],"disconnects":["28.15"],"modification":["28.16"],"improve":["28.16"],"occurs":["28.16"]},{"0":["17.4","24.2","24.6","24.7","26.12"],"1":["8.2","17.4","24.7"],"2":["17.4","23.3"],"3":["1.4","22.2"],"4":["24.2"],"5":["24.2"],"6":["24.2"],"10":["15.11","22.5"],"12":["22.5"],"44":["24.2"],"50":["26.13"],"127":["24.7","26.12"],"1000":["26.13"],"2016":["19.23"],"8000":["24.7","26.12"],"with":["0.0","4.3","22.0","26.15"],"team":["1.2","3.3"],"web":["1.2","1.6","6.2","28.1"],"site":["1.2","7.0"],"collections":["1.4"],"scripting":["1.4","18.2","18.6"],"graphic":["1.4"],"eject":["1.5"],"understand":["1.5","22.3"],"audio":["1.6","6.1","16.0","23.1","26.6","28.16"],"api":["1.6","15.20","18.6","18.23"],"dot":["1.6"],"apache":["1.7"],"conventions":["1.7","9.1"],"naming":["1.7"],"anr":["3.1"],"is":["3.1","7.0","14.22","15.11","15.16","15.21","18.4","26.11","28.3","28.6","28.16"],"now":["3.1","24.7","26.11","26.13"],"led":["3.1"],"rapid":["3.2"],"mix":["3.2"],"union":["3.2"],"interaction":["3.3"],"youtube":["3.3"],"channel":["3.3"],"https":["3.3","16.6"],"www":["3.3"],"com":["3.3"],"society":["3.4"],"accoustics":["3.4"],"application":["3.4","11.1"],"computing":["3.5"],"hindawi":["3.5"],"publishing":["3.5"],"corporation":["3.5"],"02086673":["3.5"],"jean":["3.5"],"philippe":["3.5"],"lambert":["3.5"],"sébastien":["3.5"],"robaszkiewicz":["3.5"],"synchronisation":["3.5"],"rendering":["3.5"],"over":["3.5","25.1","25.3"],"heterogeneous":["3.5","25.1"],"devices":["3.5"],"save":["4.1","4.11","4.12"],"documentation":["4.1"],"github":["4.1","7.3"],"safari":["4.2","7.2"],"sh":["4.2","4.4","4.5","4.9","4.12"],"npm":["4.2","4.4","4.5","4.9","4.12"],"install":["4.2","4.4","4.5","4.9","4.12"],"associated":["4.3"],"additional":["4.3","16.6"],"data":["4.3","15.22","15.30"],"can":["4.6","11.5","13.0","14.8","15.19","16.6","17.0","20.0","22.3","23.7"],"be":["4.6","7.2","11.5","13.0","14.23","18.13","18.24","22.2","24.0","26.12"],"used":["4.6","18.13","18.24","24.5","25.3"],"simply":["4.6","8.1"],"add":["4.6","11.1","14.4","16.6","28.13"],"splash":["4.6"],"provide":["4.7"],"their":["4.7","6.6"],"on":["4.7","7.5","14.8","15.10","24.5","25.3","26.4","26.6"],"a":["4.7","13.11","13.12","14.9","14.13","14.24","15.4","15.18","15.20","15.23","15.24","15.31","15.32","16.9","17.14","18.29","18.30","18.31","18.33","28.6","28.8"],"map":["4.7","26.14","28.15"],"at":["4.8","14.4","15.19","23.0","24.5","28.13","28.14"],"following":["4.8","11.1","23.7","26.9"],"programming":["4.8"],"library":["4.9"],"additionally":["4.10"],"core":["4.10","23.4","24.2"],"package":["4.10"],"installs":["4.10"],"ismm":["5.0","9.1"],"como":["5.0"],"elements":["5.0"],"playground":["5.0"],"or":["5.0","11.0","22.3","26.8"],"koryphaios":["5.0"],"lot":["5.0"],"other":["5.0","11.1","14.8","28.3"],"things":["5.0","11.1"],"e":["5.0","16.6","24.4"],"g":["5.0","22.1"],"teapot":["5.0"],"related":["5.0"],"links":["5.0","9.1"],"work":["5.0"],"apps":["5.0"],"fr":["5.0"],"target":["5.0","25.5","26.5"],"blank":["5.0"],"span":["5.0"],"same":["6.1","23.6","24.4","24.5","26.4"],"architecture":["6.1"],"codebase":["6.1"],"principles":["6.1"],"high":["6.1"],"level":["6.1"],"despite":["6.1"],"sound":["6.1","22.3","28.14"],"doesn":["6.1"],"t":["6.1","19.20","28.0"],"do":["6.1","28.12"],"any":["6.1","15.0","16.6"],"choice":["6.1","26.8"],"you":["6.1","14.8","16.6","19.20","22.0","23.0","24.4","24.5"],"regarding":["6.1"],"both":["6.2","24.5"],"philosophical":["6.2"],"reasons":["6.2"],"one":["6.2"],"goal":["6.2"],"standarts":["6.2"],"close":["6.2","15.22","15.30"],"possible":["6.2"],"pure":["6.2"],"javascript":["6.2","26.8"],"http":["6.4","24.7","26.12"],"setting":["6.4"],"up":["6.4","26.9","26.11"],"websockets":["6.4"],"properly":["6.4","24.0","25.3"],"time":["6.5","19.1","25.7","28.6"],"applications":["6.5","24.8"],"where":["6.5","23.4","25.3","26.11"],"want":["6.5"],"all":["6.6","11.4","22.5","24.8","28.2"],"live":["6.6"],"in":["6.6","8.0","14.9","14.15","28.3"],"own":["6.6"],"repository":["6.6"],"please":["7.0"],"contribute":["7.0"],"tip":["7.0","26.8"],"note":["7.0","15.10","16.6","19.21","19.22","28.6"],"io":["7.1"],"cd":["7.1"],"browser":["7.2","19.7","25.5","26.5","26.13"],"which":["7.2","7.8","11.5","14.4","18.32","24.4","26.12","28.3"],"shall":["7.2","12.0"],"not":["7.2"],"m":["7.3"],"message":["7.3"],"origin":["7.3"],"sources":["7.3"],"of":["7.5","8.0","11.1","13.10","15.0","18.10","18.19","25.0","26.0","28.8","28.13"],"content":["7.5"],"top":["7.5"],"amet":["7.6"],"collapsable":["7.7","7.8"],"false":["7.7","7.8","8.1","15.16","15.21","28.4"],"defaults":["7.7","17.4"],"true":["7.7","15.23","15.24","15.31","15.32","18.29","18.30","18.31","22.5","28.6"],"sidebardepth":["7.7"],"optional":["7.8"],"absolute":["7.8"],"proper":["8.0"],"node":["8.0","14.4","15.0","23.6"],"js":["8.0","13.12","15.15","17.9","17.15","23.2"],"soundworks":["8.0","20.0"],"remaining":["8.0"],"page":["8.0","26.9"],"we":["8.0","23.2","24.8","25.9","26.9","26.11"],"assume":["8.0"],"your":["8.0","9.0","11.1","11.5","25.3"],"domain":["8.0","28.3"],"this":["8.1","24.5","28.9"],"handled":["8.1"],"by":["8.1","14.9","15.36","24.4","25.7","26.11"],"proxy":["8.1"],"usehttps":["8.1"],"then":["8.1","22.4","26.8"],"launch":["8.1","26.13"],"break":["8.2"],"pass":["8.2"],"localhost":["8.2"],"version":["8.2"],"set":["8.2","14.23","19.14","22.2","22.5","26.9","26.11","26.13"],"header":["8.2","23.3","28.15"],"deploy":["9.0"],"settings":["9.11"],"requirements":["9.11"],"instant":["11.0"],"updates":["11.0"],"such":["11.0","16.0","22.3"],"as":["11.0","16.0","16.12","18.13","18.24","22.3","25.7","28.13"],"chats":["11.0"],"multiplayer":["11.0"],"games":["11.0"],"our":["11.0","23.8"],"case":["11.0","14.9","28.3","28.9"],"distributed":["11.0"],"order":["11.1"],"amongst":["11.1","28.2"],"track":["11.1","28.4"],"just":["11.1","22.0","26.12"],"socket":["11.3"],"new":["11.3","13.4","13.11","16.4","17.14","19.4","19.5","22.5","25.8"],"addeventlistener":["11.3","11.4","16.6","22.5"],"console":["11.3","16.6"],"log":["11.3","16.6","24.6"],"connected":["11.3","13.0","22.3"],"from":["11.4","15.0","26.3","28.8"],"received":["11.4"],"if":["11.4","15.16","15.21","16.10","22.0","24.5","24.7","25.4","26.13","28.0"],"equal":["11.4"],"loop":["11.4"],"though":["11.4"],"dispatch":["11.4"],"happened":["11.5"],"past":["11.5"],"comple":["11.5"],"situations":["11.5"],"for":["11.5","14.23","15.17","16.10","17.9","26.8","26.11"],"example":["11.5","13.12","14.22","16.10","17.9","17.15","28.3"],"clients":["11.5","14.9","15.1"],"purpose":["12.0"],"disclaimed":["12.0"],"no":["12.0","14.22"],"event":["12.0"],"holder":["12.0"],"liable":["12.0"],"direct":["12.0"],"indirect":["12.0"],"incidental":["12.0"],"special":["12.0"],"exemplary":["12.0"],"consequential":["12.0"],"damages":["12.0"],"re":["13.0","26.12"],"assigned":["13.0"],"newly":["13.0"],"plugincheckinclient":["13.1"],"plugincheckinserver":["13.1"],"checkin":["13.2"],"const":["13.4","16.4","19.4","19.5","25.8"],"await":["13.5","15.4","17.5","24.6","25.7","28.5"],"start":["13.5","14.6","15.4","17.5","18.4","24.6","28.5"],"server":["13.7","13.12","14.11","17.7","19.12","19.21","19.22"],"getdata":["13.8"],"mixed":["13.8"],"method":["13.10","15.25","15.33","18.10","18.19","28.6"],"name":["13.11","15.18","17.14","18.33","23.3","25.5"],"given":["13.12","14.22"],"index":["13.12"],"directories":["14.0"],"and":["14.0","19.1","22.6","23.0","24.3","25.2","26.2","26.4","26.7"],"update":["14.0"],"classes":["14.1","23.4"],"pluginfilesystemclient":["14.1"],"filesystem":["14.2","15.20","18.23"],"an":["14.4","15.16","15.19","15.21","18.23","18.32","21.5","26.6","28.3"],"url":["14.4","28.3"],"each":["14.4","26.6","28.6","28.8"],"that":["14.4","14.9","15.29","15.34","15.35","16.6","17.0","28.6"],"defines":["14.4"],"route":["14.4","14.23","28.3"],"specific":["14.8"],"needs":["14.8"],"rely":["14.8"],"plugins":["14.8","24.7","25.8"],"production":["14.9"],"only":["14.9","15.23","15.24","15.31","15.32","26.9"],"trusted":["14.9"],"authentified":["14.9"],"login":["14.9"],"mkdir":["14.12"],"rename":["14.12","14.21"],"oldpath":["14.12","14.21"],"executed":["14.14","14.25","24.4"],"param":["14.14","14.25","14.30","15.25","15.28","15.33","17.12","18.10","18.15","18.16","18.19","18.26","18.27","18.35","18.36","19.15","19.16","19.17"],"type":["14.14","14.25","14.30","15.28","17.12","18.15","18.16","18.22","18.26","18.27","18.35","18.36","19.15","19.16","19.17"],"default":["14.14","14.25","18.22"],"description":["14.14","14.20","14.25","14.30","15.28","17.10","17.12","18.15","18.16","18.22","18.26","18.27","18.35","18.36"],"list":["14.15"],"boolean":["14.15","18.34","28.4"],"string":["14.16","14.18","14.20","14.26","14.28","18.14","18.25","18.28","18.36"],"blob":["14.17","14.27"],"path":["14.18","14.23","14.28"],"current":["14.19","14.29","18.37","25.7","26.8"],"pathname":["14.19","14.29"],"newpath":["14.21"],"file":["14.22"],"structure":["14.22","26.6"],"option":["14.22","18.8"],"before":["14.22","24.6","28.9"],"user":["14.22","22.5"],"selects":["14.22"],"assets":["14.23","22.3"],"will":["14.23","23.2","23.8","24.8","25.9","26.4","26.15"],"added":["14.23"],"several":["15.1","24.4"],"side":["15.1","19.21","19.22","24.3"],"buffering":["15.1"],"logger":["15.2","15.9","15.11"],"dirname":["15.4","18.8"],"logs":["15.4"],"create":["15.4","23.7","25.8"],"get":["15.5","16.9","18.5","25.7","26.3","26.13","26.14","28.7"],"configured":["15.6"],"to":["15.6","16.5","17.4","18.6","18.32","19.15","19.16","26.7","26.10"],"0001":["15.7","24.6"],"second":["15.7","19.7","25.3"],"createwriter":["15.9","15.11","15.18"],"client":["15.10","15.15","17.9","24.3","28.12"],"size":["15.10"],"attachwriter":["15.10","15.14"],"buffered":["15.11"],"writer":["15.11"],"methods":["15.13"],"writerserver":["15.13"],"register":["15.15","16.5","22.4","28.10","28.12"],"allowreuse":["15.16"],"allow":["15.16","15.21","22.6"],"reuse":["15.16","15.21"],"existing":["15.16","15.21"],"object":["15.17","18.32"],"buffersize":["15.17"],"number":["15.17","17.10","17.12","26.13"],"options":["15.18","28.9"],"throw":["15.19"],"error":["15.19","18.28"],"changed":["15.19"],"convenience":["15.20"],"match":["15.20","18.23","24.5"],"plugin":["15.20","18.6","19.2","24.1"],"underlying":["15.21","25.0"],"flush":["15.22"],"code":["15.22","15.25","15.26","15.30","15.33","18.8","18.10","18.19","18.28","18.35","24.7"],"promise":["15.22","15.30","16.10"],"resolves":["15.27","15.34"],"when":["15.27","15.34","26.12"],"stream":["15.27"],"listener":["15.28","15.29","15.35"],"returns":["15.29","15.35","19.18"],"unregister":["15.29","15.35"],"funded":["15.36"],"resuming":["16.0"],"context":["16.0","16.5","21.0"],"pluginplatforminitclient":["16.1"],"pluginplatforminitserver":["16.1"],"init":["16.2","28.1"],"pluginmanager":["16.5","19.8","28.12"],"these":["16.6","26.6","28.2"],"require":["16.6"],"connection":["16.6"],"featureid":["16.9"],"started":["16.10","18.5","19.8"],"check":["16.10","28.0"],"provided":["16.10"],"return":["16.10","26.14","28.15"],"it":["16.11","18.37","22.3","25.5","25.7","26.9"],"manually":["16.11"],"most":["16.11","19.20"],"cases":["16.11","19.20"],"kind":["16.11","16.13","18.10","18.12","18.19","18.21"],"instance":["16.11","18.10","18.12","18.19","18.21","25.7","25.8"],"global":["16.13","28.2"],"interface":["17.0","23.3","28.9"],"so":["17.0","22.3","26.9"],"pluginpositionclient":["17.1"],"pluginpositionserver":["17.1"],"position":["17.2"],"xrange":["17.4"],"yrange":["17.4"],"getnormalizedposition":["17.8"],"useful":["17.9"],"testing":["17.9"],"x":["17.11","17.13"],"y":["17.11","17.13"],"image":["17.15"],"displayed":["17.15"],"launcher":["17.15","23.4"],"view":["17.15"],"pluginscriptingserver":["18.1"],"sharedscript":["18.1"],"use":["18.4","19.8","22.3"],"once":["18.4"],"define":["18.6","26.7"],"should":["18.6","26.9"],"expose":["18.6"],"internally":["18.6"],"relies":["18.6"],"filestem":["18.8"],"see":["18.8","26.9","26.15"],"shared":["18.8"],"deletescript":["18.9","18.17"],"sc":["18.12","18.21","24.2","26.14"],"actual":["18.13","18.24","24.4"],"filename":["18.13","18.24"],"updatescript":["18.17"],"project":["18.18"],"stay":["18.18"],"idle":["18.18"],"until":["18.18"],"transpiled":["18.28"],"fulfills":["18.32"],"containing":["18.32"],"without":["18.37","28.13"],"deleting":["18.37"],"call":["18.37"],"steen":["19.0"],"s":["19.0"],"tanenbaum":["19.0"],"the":["19.0"],"synchronizes":["19.0"],"local":["19.0","25.7"],"sync":["19.1"],"performance":["19.7"],"finally":["19.8","22.2","22.4","23.4","25.8","26.12","26.14"],"after":["19.8","24.6"],"audiotime":["19.9"],"getlocaltime":["19.9","19.22"],"src":["19.9"],"audiocontext":["19.9","23.4"],"createbuffersource":["19.9"],"buffer":["19.9"],"someaudiobuffer":["19.9"],"connect":["19.9","24.6"],"onreport":["19.13","19.14"],"callback":["19.13","28.6"],"getreport":["19.13"],"starts":["19.14"],"null":["19.14"],"execute":["19.14"],"corresponding":["19.15","19.16"],"sec":["19.15","19.16","19.21","19.22"],"getsynctime":["19.19","19.21"],"localtime":["19.19"],"shouldn":["19.20"],"have":["19.20","23.0","26.9"],"are":["19.21","22.0","26.11"],"identical":["19.21"],"conference":["19.23"],"apr":["19.23"],"how":["20.0"],"class":["21.0","23.3","28.15"],"command":["22.0","23.7"],"line":["22.0"],"starting":["22.0"],"confirm":["22.2"],"choices":["22.2"],"ready":["22.2"],"launched":["22.2"],"make":["22.2","25.3","26.4"],"sure":["22.2","25.3"],"correctly":["22.2"],"installed":["22.2"],"follow":["22.2"],"proposed":["22.2"],"place":["22.3"],"put":["22.3"],"static":["22.3"],"images":["22.3"],"download":["22.3"],"them":["22.3","28.0","28.2","28.8"],"warning":["22.3"],"very":["22.3"],"important":["22.3"],"keep":["22.3","28.4"],"mind":["22.3"],"found":["22.4"],"need":["22.4","22.5","28.3"],"declaration":["22.4"],"into":["22.4","23.8"],"manager":["22.4"],"statemanager":["22.4"],"registerschema":["22.4"],"nothing":["22.5"],"actually":["22.5","23.4"],"trigger":["22.5","26.4","28.10"],"value":["22.5","26.13","28.7"],"parameter":["22.5"],"clicks":["22.5"],"again":["22.5"],"anywhere":["22.5"],"they":["22.6"],"illustrate":["23.0"],"possibility":["23.0"],"discover":["23.0"],"tools":["23.0"],"hand":["23.0"],"afterward":["23.2"],"getcollection":["23.3"],"onupdate":["23.3","26.12","28.6"],"renderapp":["23.3","25.7","28.15"],"onattach":["23.3"],"ondetach":["23.3"],"function":["23.3","24.4","25.7","28.15"],"modify":["23.3"],"simple":["23.3","24.6","26.7","28.3","28.13"],"graphical":["23.3","26.9"],"render":["23.3","28.15"],"html":["23.3"],"div":["23.3","28.15"],"layout":["23.3","28.15"],"h1":["23.3","28.15"],"app":["23.3","28.15"],"import":["23.4"],"helpers":["23.4","24.2"],"gainnode":["23.4","26.6"],"oscillatornode":["23.4","26.6"],"run":["23.6"],"terminal":["23.6"],"ip":["23.7"],"end":["23.7"],"tutorials":["23.8","28.0"],"continue":["23.8"],"journey":["23.8"],"initialized":["24.0"],"requires":["24.0"],"basic":["24.0"],"knowledge":["24.0"],"platform":["24.1"],"appearing":["24.2"],"under":["24.2","24.4"],"dependencies":["24.2"],"key":["24.2"],"ircam":["24.2"],"components":["24.2","24.5"],"alpha":["24.2"],"json5":["24.2"],"component":["24.3"],"hence":["24.3"],"also":["24.4"],"allows":["24.4","24.5","26.7"],"times":["24.4"],"different":["24.4"],"ids":["24.4"],"factory":["24.4"],"i":["24.4"],"automatically":["24.4","24.5"],"associate":["24.5"],"two":["24.5","26.13"],"state":["24.6"],"currenttime":["24.6"],"envelop":["24.6"],"env":["24.6","28.14"],"creategain":["24.6"],"destination":["24.6","26.6"],"gain":["24.6"],"setvalueattime":["24.6","28.14"],"linearramptovalueattime":["24.6","28.14"],"01":["24.6","28.14"],"exponentialramptovalueattime":["24.6"],"hello":["24.7","28.7"],"me":["24.7"],"myself":["24.7"],"tada":["24.7"],"go":["24.7","25.9"],"something":["24.7"],"homepage":["24.7"],"custom":["24.7"],"info":["24.7"],"created":["24.8"],"using":["24.8","26.12"],"wizard":["24.8"],"next":["24.8","26.15"],"concepts":["25.0","25.2"],"involved":["25.0"],"synchronizing":["25.0"],"general":["25.2","26.2"],"venue":["25.3"],"artwork":["25.3"],"presented":["25.3"],"has":["25.3","26.11"],"poor":["25.3"],"installation":["25.3"],"some":["25.3","26.9","28.11"],"control":["25.3"],"what":["25.3"],"happen":["25.3"],"bandwidth":["25.3"],"etc":["25.3","28.8"],"produce":["25.3"],"sounds":["25.3"],"synchronized":["25.3","28.2"],"interest":["25.3"],"travel":["25.4"],"messages":["25.4","26.0"],"compute":["25.4"],"player":["25.5","26.5"],"template":["25.5","26.5"],"reference":["25.7"],"estimated":["25.7"],"alongside":["25.7"],"retrieve":["25.7"],"config":["25.8","28.15"],"window":["25.8"],"configure":["25.8"],"further":["25.8","25.9"],"uses":["25.8"],"development":["26.0"],"abstracting":["26.0"],"network":["26.0","28.9"],"communications":["26.0"],"logic":["26.2","26.11"],"synthesizer":["26.3"],"machines":["26.3"],"central":["26.3","28.8"],"point":["26.3"],"even":["26.3"],"studio":["26.3"],"modifying":["26.3"],"parameters":["26.3","28.2"],"cumbersome":["26.3"],"quite":["26.3"],"quickly":["26.3"],"well":["26.3"],"blue":["26.4"],"completely":["26.4"],"transparent":["26.4"],"select":["26.5","26.8"],"every":["26.6"],"oscillator":["26.6","28.13"],"definitions":["26.6","28.9"],"already":["26.6"],"foresee":["26.6"],"graph":["26.6"],"could":["26.6"],"controlled":["26.6"],"states":["26.6"],"here":["26.7"],"schema":["26.7"],"definition":["26.7"],"signature":["26.7"],"friendly":["26.7"],"names":["26.7"],"creating":["26.7"],"press":["26.8"],"cmd":["26.8","26.9"],"alt":["26.8"],"j":["26.8"],"chrome":["26.8"],"alternatively":["26.8"],"firefox":["26.8"],"tab":["26.8"],"shift":["26.9"],"r":["26.9"],"far":["26.9"],"good":["26.9"],"indeed":["26.9"],"monitor":["26.10"],"been":["26.11"],"implement":["26.11"],"eveything":["26.11","28.13"],"change":["26.12"],"tell":["26.12"],"itself":["26.12"],"updated":["26.12","28.6"],"achieved":["26.12"],"min":["26.13","28.7"],"max":["26.13","28.7"],"input":["26.13"],"detail":["26.13"],"container":["26.13","26.14"],"open":["26.13"],"windows":["26.13"],"h2":["26.14","28.7","28.15"],"information":["26.14"],"controller":["26.14"],"players":["26.14"],"text":["26.14"],"npx":["26.15"],"extend":["26.15"],"possibilities":["26.15"],"sequencer":["27.0"],"relevant":["28.0"],"didn":["28.0"],"yet":["28.0"],"along":["28.0"],"controllers":["28.2"],"controls":["28.2"],"mute":["28.2"],"master":["28.2","28.7","28.16"],"volume":["28.2"],"must":["28.2"],"more":["28.3","28.9","28.16"],"share":["28.3"],"public":["28.3"],"access":["28.3"],"derived":["28.4"],"refresh":["28.6"],"section":["28.7","28.15"],"p":["28.7"],"style":["28.7"],"padding":["28.7"],"bottom":["28.7"],"4px":["28.7"],"getschema":["28.7"],"being":["28.8","28.9"],"single":["28.8"],"applied":["28.9"],"tweak":["28.9"],"means":["28.9"],"propagated":["28.9"],"locally":["28.9"],"latency":["28.9"],"responsiveness":["28.9"],"minimum":["28.9"],"informations":["28.9"],"active":["28.10"],"synthtoggle":["28.10"],"synthtrigger":["28.10"],"play":["28.11"],"playerschema":["28.12"],"usedefaultapplicationtemplate":["28.12"],"real":["28.13"],"click":["28.13"],"pops":["28.13"],"test":["28.13"],"works":["28.13"],"expected":["28.13"],"beginning":["28.13"],"twice":["28.14"],"role":["28.15"],"audit":["28.15"],"stopped":["28.16"],"complex":["28.16"],"synthesizers":["28.16"],"chains":["28.16"]},{"0":["17.15","23.4","24.5","26.11","26.13","28.15"],"1":["7.7","7.8","15.11","15.17","17.15","23.4","24.5","25.3","26.13"],"2":["7.8","15.11","17.15","25.3","26.12","26.13","28.14"],"3":["6.2","13.12"],"4":["23.6"],"5":["28.9"],"7":["28.9"],"10":["23.4","24.6"],"50":["22.5","23.4"],"60":["25.7"],"127":["24.5","26.11","26.13","28.13","28.15"],"150":["24.6"],"300":["24.6"],"450":["24.6"],"2016":["3.5"],"2020":["3.2"],"8000":["24.5","26.13","28.13"],"vitepress":["0.0"],"vuejs":["0.0"],"com":["1.2","8.0","28.3"],"collective":["1.2","5.0"],"max":["1.4"],"sharing":["1.4","6.4"],"msp":["1.4"],"connected":["1.4","11.5"],"lamp":["1.4"],"rpi":["1.4"],"create":["1.4","11.0","24.4","28.0"],"an":["1.4","8.0","14.23","15.20","26.13"],"and":["1.5","4.10","7.2","8.2","9.11","11.1","26.5","28.10"],"configure":["1.5"],"generic":["1.6","3.3"],"applications":["1.6","3.3"],"playground":["1.6","3.5"],"in":["1.7","24.2","25.1","25.5","26.5","26.7"],"packages":["1.7"],"client":["1.7","17.11","17.13","19.0","19.14","23.0","28.9"],"server":["1.7","14.22","15.19","17.15","18.18","19.0","19.20","22.2"],"node":["1.7","8.1","11.1","19.7"],"sound":["3.1","11.5"],"music":["3.1","11.0"],"movement":["3.1"],"interaction":["3.1"],"s":["3.2","8.0","8.2","11.0","18.8","22.4"],"horizon":["3.2"],"innovation":["3.2"],"cosima":["3.2"],"ismm":["3.3"],"some":["3.3","6.2","15.8","19.14"],"are":["3.3","6.6","14.4","19.22","24.4","26.8","28.4"],"accessible":["3.3","14.4","22.3"],"inc":["3.4"],"html5":["3.5"],"2nd":["3.5"],"apr":["3.5"],"atlanta":["3.5","19.23"],"ga":["3.5","19.23"],"united":["3.5","19.23"],"states":["3.5","19.23","26.12"],"01304889":["3.5"],"artists":["3.5"],"functionalities":["4.1"],"can":["4.1","7.0","11.1","15.16","15.20","15.21","18.23","26.13","28.8","28.13"],"be":["4.1","14.9","14.16","14.26","18.23","20.0","24.2","24.4","28.6"],"extended":["4.1"],"by":["4.1","17.4","18.8","21.0","22.2","23.8","24.5","26.3"],"installing":["4.1"],"plugins":["4.1","26.15"],"here":["4.1"],"save":["4.2","4.4","4.5","4.9","13.2","14.2","15.2","16.2","17.2","18.2","28.8"],"github":["4.2","4.4","4.5","4.11"],"sh":["4.3","4.6","4.7","4.8","8.1","8.2","23.6","23.7"],"npm":["4.3","4.6","4.7","4.8","22.2","23.6","24.5","26.11","28.5"],"install":["4.3","4.6","4.7","4.8"],"strategy":["4.8","19.9"],"uses":["4.10"],"build":["4.10","7.3","8.1","23.0"],"team":["5.0"],"website":["5.0","7.3"],"libs":["5.0"],"footer":["5.0"],"credits":["5.0","13.1","14.1","16.1","17.1","18.1","25.7","28.10"],"license":["5.0","13.1","14.1","16.1","17.1","18.1"],"library":["6.1","24.2","26.0"],"might":["6.1","24.2"],"use":["6.1","15.6","25.0","26.7","28.16"],"low":["6.1","28.16"],"api":["6.1","15.1","19.1","23.1"],"higher":["6.1"],"libraries":["6.1"],"more":["6.1","11.1","22.6","25.9","26.7"],"generally":["6.1"],"rendering":["6.1"],"aspects":["6.1"],"your":["6.1","25.5","26.5"],"application":["6.1","9.0","11.0","24.8","28.10"],"therefore":["6.1","25.4"],"only":["6.2","24.7","25.8","28.10"],"integrate":["6.2"],"language":["6.2"],"features":["6.2"],"that":["6.2","17.4","19.10","28.8"],"have":["6.2","24.3","26.6"],"reach":["6.2"],"stage":["6.2"],"example":["6.2","15.19","16.11","19.14","19.20","23.6"],"propose":["6.2"],"type":["6.2","15.29","15.35","18.10","18.19","19.21","19.22"],"files":["6.2","14.4"],"derived":["6.2"],"from":["6.2","6.5","11.0","14.0","14.15","19.0","19.15","19.16","19.21","22.4","24.6"],"jsdoc":["6.2"],"typescript":["6.2"],"users":["6.2"],"near":["6.2"],"following":["6.3","22.0"],"fonctionnalities":["6.3"],"configuration":["6.4"],"objets":["6.4"],"handling":["6.4"],"initialization":["6.4"],"process":["6.4"],"etc":["6.4","16.0","24.6","26.3"],"many":["6.5","19.7"],"single":["6.5"],"point":["6.5","25.4","28.8"],"see":["6.5","7.2","14.9","24.5","26.13"],"versionned":["6.6"],"pace":["6.6"],"simplify":["6.6"],"generated":["7.0"],"using":["7.0","7.5","8.1","28.5"],"vuepress":["7.0"],"full":["7.0","24.4","28.2"],"checkout":["7.1"],"preview":["7.2"],"action":["7.3"],"deploy":["7.3"],"it":["7.3","18.6","18.8","19.10","22.4","22.5","28.10"],"toc":["7.5"],"macro":["7.5"],"md":["7.5","15.7"],"setting":["7.7"],"up":["7.7","22.0","24.8"],"environment":["7.7","22.0","23.7"],"local":["7.7"],"deployment":["7.7"],"defaults":["7.8"],"to":["7.8","14.16","14.26","19.7"],"true":["7.8","14.14","14.25","17.9","18.22","18.34","28.15"],"sidebardepth":["7.8"],"my":["8.0","15.5","18.5","28.3"],"run":["8.0","24.5","26.11","28.5"],"behind":["8.0","26.2"],"path":["8.0"],"app":["8.0","25.7"],"so":["8.0","11.1","24.0","24.8","26.12","28.9"],"index":["8.1","28.10"],"then":["8.2","11.0","23.2","26.5","26.11"],"reload":["8.2","24.6"],"warning":["9.0"],"work":["9.0"],"how":["9.11","28.0"],"systems":["11.0"],"let":["11.0","16.6"],"very":["11.0","23.0"],"simple":["11.0","19.9","23.0","25.7"],"modern":["11.1"],"compliant":["11.1"],"javascript":["11.1"],"syntax":["11.1"],"within":["11.1"],"js":["11.1","14.22","15.19","16.11","18.18","19.14","19.20"],"websocket":["11.2"],"code":["11.2","16.11"],"wss":["11.2"],"event":["11.2","11.5","28.15"],"when":["11.2","16.12"],"created":["11.2","24.4","25.3"],"socket":["11.2"],"any":["11.2","22.3"],"error":["11.3","18.29"],"err":["11.3"],"message":["11.3"],"close":["11.3","11.4"],"closed":["11.3","11.4","15.27","15.34"],"if":["11.3","14.14","14.25","18.22","18.34","24.4","26.14","28.13"],"you":["11.3","24.3","24.6","26.14","28.5","28.13","28.15"],"foreach":["11.4"],"delete":["11.4"],"finally":["11.4","22.5","25.5"],"go":["11.4","24.5","26.9","26.12"],"back":["11.4","24.7","26.11","26.12"],"make":["11.4","28.16"],"react":["11.4"],"playback":["11.5"],"file":["11.5","23.7"],"together":["11.5"],"one":["11.5","23.4"],"after":["11.5"],"was":["11.5","16.12"],"should":["11.5","22.2","24.5","24.6","28.13"],"procurement":["12.0"],"substitute":["12.0"],"goods":["12.0"],"services":["12.0"],"loss":["12.0"],"data":["12.0","15.16","15.21"],"profits":["12.0"],"business":["12.0"],"interruption":["12.0"],"however":["12.0","26.9","26.13"],"caused":["12.0"],"on":["12.0","16.10","17.0","19.10","22.6","24.6","28.11"],"theory":["12.0"],"liability":["12.0"],"whether":["12.0"],"contract":["12.0"],"strict":["12.0"],"number":["13.0","26.14"],"limited":["13.0"],"pluginmanager":["13.4","16.4","19.4","19.5"],"register":["13.4","13.12","15.19","16.4","17.9","17.15","18.18","19.4","19.5","19.14","19.20"],"get":["13.5","14.6","15.4","17.5","18.4","23.3"],"a":["13.8","13.9","13.10","15.14","15.15","15.22","15.26","15.27","15.30","15.34","17.4","17.8","17.11","17.13","18.11","18.12","18.20","18.21","18.32","19.13","19.17","19.19"],"name":["13.8","13.9","13.10","14.13","14.18","14.20","14.24","14.28","15.15","15.24","15.26","15.27","15.32","15.34","16.9","17.8","17.11","18.11","18.20","18.29","18.30","18.31","19.13","19.17","19.19"],"checkin":["13.12"],"plugincheckin":["13.12"],"color":["13.12","22.5"],"their":["14.0","17.0"],"contents":["14.0"],"pluginfilesystemserver":["14.1"],"publicly":["14.4"],"publicpath":["14.4"],"await":["14.4","16.5","28.9"],"start":["14.4","16.5","19.8","19.9","24.5","28.9"],"writefile":["14.6"],"audio":["14.8","25.3","25.4","26.9"],"buffer":["14.8"],"loader":["14.8"],"state":["14.8","26.7","26.10","28.2"],"manager":["14.8"],"password":["14.9"],"will":["14.9","15.16","15.21","17.4","22.6","24.3","24.4","26.13","28.8"],"perform":["14.9"],"these":["14.9","25.3","26.4"],"newpath":["14.12"],"rm":["14.12","14.21"],"onupdate":["14.13","14.24","18.28","18.33","28.15"],"boolean":["14.14","14.25","18.22"],"false":["14.14","14.15","14.25","16.6","18.22","18.34"],"keep":["14.15","26.6","26.9"],"or":["14.15","18.8","19.7","25.4","28.4","28.13"],"remove":["14.15","28.6"],"retrieved":["14.16","14.26","18.8"],"content":["14.17","14.27"],"the":["14.17","14.18","14.27","14.28","15.0","18.16","18.27","26.10"],"new":["14.19","14.29","15.16","15.21","18.14","18.25","18.36","23.4","25.9"],"project":["14.22"],"stay":["14.22"],"idle":["14.22"],"until":["14.22"],"switch":["14.22","15.19","18.18","26.3"],"router":["14.23"],"serve":["14.23"],"url":["14.23","26.12"],"entry":["14.23"],"string":["14.30","18.15","18.16","18.26","18.27"],"network":["15.0","22.6","25.0"],"into":["15.0","26.9","26.15","28.10"],"plain":["15.0"],"classes":["15.1","19.1"],"pluginloggerclient":["15.1"],"pluginloggerserver":["15.1"],"writerclient":["15.1"],"writer":["15.4","15.5"],"createwriter":["15.5"],"logs":["15.6","15.9"],"while":["15.8","25.4"],"usefull":["15.8","15.16","15.21"],"situations":["15.8"],"console":["15.9","28.5"],"pathname":["15.9","15.23","15.31"],"method":["15.10","15.19","19.8"],"sharedwriter":["15.10"],"write":["15.11","15.24","15.32"],"logger":["15.15","15.19"],"pluginlogger":["15.15"],"underlying":["15.16"],"appended":["15.16","15.21"],"writes":["15.17"],"buffered":["15.17"],"before":["15.17"],"sending":["15.17"],"runtime":["15.19","18.0"],"usin":["15.19"],"containing":["15.20","18.23"],"key":["15.20","18.23"],"also":["15.20","18.23","26.7"],"onpacketsend":["15.22"],"callback":["15.22","15.30","18.28"],"onclose":["15.22","15.30"],"description":["15.25","15.29","15.33","15.35","18.10","18.19","19.15","19.16","19.21","19.22"],"is":["15.27","15.34","26.9"],"execute":["15.28","18.34"],"param":["15.29","15.35","19.21","19.22"],"french":["15.36","24.7"],"national":["15.36"],"tutorial":["16.0","22.6","26.6","26.9"],"dev":["16.0","22.2","24.5","26.11","28.5"],"tutorials":["16.0","26.4"],"config":["16.4","19.4","23.7"],"arbitraty":["16.6"],"logic":["16.6","26.12"],"passing":["16.6"],"function":["16.6","18.28","18.35","19.17","28.10"],"oncheck":["16.6"],"onactivate":["16.6"],"options":["16.6"],"oncheckcalled":["16.6"],"onactivatecalled":["16.6"],"onactive":["16.10"],"user":["16.10"],"gesture":["16.10"],"init":["16.10","23.2","24.1","26.15"],"of":["16.11","18.12","18.21","18.37","26.10"],"myview":["16.11"],"addeventlistener":["16.11"],"e":["16.11","19.8","23.3","24.5","26.14","28.16"],"plugin":["16.12","26.15"],"registered":["16.12"],"class":["16.13","25.7"],"apistop":["16.13"],"give":["17.0"],"approximate":["17.0"],"background":["17.4","22.5"],"image":["17.4"],"displayed":["17.4"],"launcher":["17.4","28.12"],"view":["17.4"],"positionplugin":["17.9","17.15"],"position":["17.15"],"for":["18.0","23.6","26.15"],"distributed":["18.0","26.6"],"started":["18.4","24.0"],"script":["18.5","18.32"],"attach":["18.5","18.9","18.17","28.9"],"constants":["18.5"],"mod":["18.5"],"soundworks":["18.6","23.7","25.0","26.2","26.3"],"filesystem":["18.6"],"provide":["18.6","24.7"],"same":["18.6","22.3","25.3","26.7","26.9","26.12"],"security":["18.6"],"restrictions":["18.6"],"cannot":["18.8"],"instatiated":["18.8"],"manually":["18.8"],"calling":["18.8"],"quot":["18.13","18.24"],"x27":["18.13","18.24"],"initial":["18.13","18.24"],"scripting":["18.18"],"import":["18.28","18.31"],"promise":["18.28"],"detach":["18.28","18.37"],"executelistener":["18.28"],"transpiled":["18.30"],"all":["18.32","28.4"],"exports":["18.32"],"given":["18.34","28.6"],"instead":["18.37","22.5"],"kind":["18.37"],"instance":["18.37","22.4"],"pluginsyncclient":["19.1"],"pluginsyncserver":["19.1"],"resources":["19.1"],"sync":["19.2"],"want":["19.7"],"itself":["19.8"],"fully":["19.8","26.12"],"end":["19.8","22.2","26.12"],"last":["19.8","28.6"],"argument":["19.8"],"passed":["19.8","28.6"],"i":["19.8","24.5"],"specifically":["19.8"],"tells":["19.8"],"once":["19.8","28.10"],"destination":["19.9","23.4"],"note":["19.9","19.10"],"effectively":["19.9"],"logical":["19.9"],"as":["19.10","24.2","28.6"],"object":["19.13","24.4"],"synchronization":["19.14"],"reports":["19.14"],"statistics":["19.14"],"optionnal":["19.15","19.16","19.21"],"report":["19.18"],"modify":["19.20"],"this":["19.20","26.9","28.6"],"default":["19.20","24.5"],"behavior":["19.20","28.16"],"identical":["19.22"],"used":["20.0"],"proposed":["21.0","26.3"],"experience":["21.5"],"development":["22.0","22.2","26.11"],"please":["22.0","24.0"],"first":["22.0","26.11","26.15","28.9"],"set":["22.0","23.3","26.14","28.7"],"working":["22.0","24.8"],"chrome":["22.1"],"firefox":["22.1"],"next":["22.2","22.6"],"optionally":["22.2"],"git":["22.2"],"add":["22.2","28.9","28.16"],"commit":["22.2"],"m":["22.2"],"launch":["22.2","25.5","26.5"],"mode":["22.2"],"seconds":["22.2"],"running":["22.2"],"exposing":["22.3"],"means":["22.3","28.6"],"located":["22.3"],"computer":["22.3"],"do":["22.3","24.7"],"not":["22.3","25.3","28.4"],"expose":["22.3"],"sensitive":["22.3"],"private":["22.3"],"information":["22.3","25.4"],"appear":["22.5"],"each":["22.5","26.8"],"review":["22.5"],"inside":["22.5"],"logging":["22.5"],"style":["22.5"],"backgroundcolor":["22.5"],"white":["22.5"],"settimeout":["22.5"],"whenever":["22.5"],"put":["22.5"],"hide":["22.6"],"complexity":["22.6"],"we":["22.6","26.4"],"explore":["22.6"],"help":["23.0"],"where":["23.0"],"browser":["23.0"],"controller":["23.0","28.13"],"role":["23.3"],"sw":["23.3","25.7"],"audit":["23.3"],"section":["23.3"],"p":["23.3","25.7"],"hello":["23.3"],"map":["23.3"],"return":["23.3"],"sc":["23.3","26.0","26.1"],"text":["23.3"],"button":["23.3"],"input":["23.3","26.14","28.7"],"currenttime":["23.4","25.3"],"env":["23.4","23.7"],"gain":["23.4","28.4"],"connect":["23.4"],"setvalueattime":["23.4"],"linearramptovalueattime":["23.4"],"01":["23.4"],"exponentialramptovalueattime":["23.4","28.14"],"0001":["23.4"],"randomly":["23.4","24.6"],"pick":["23.4","24.6"],"harmonics":["23.4"],"at":["23.4","24.7","26.6","26.12","28.6"],"50hz":["23.4"],"frequency":["23.4","24.6"],"math":["23.4","24.6"],"floor":["23.4","24.6"],"random":["23.4","24.6"],"osc":["23.4","28.13","28.14"],"watch":["23.6"],"consume":["23.7"],"npx":["23.7"],"tackling":["23.8"],"question":["23.8"],"wizard":["24.0"],"refer":["24.0"],"getting":["24.0"],"lit":["24.2","28.1"],"actual":["24.2"],"list":["24.2"],"version":["24.2"],"numbers":["24.2"],"change":["24.2","28.2","28.7"],"compared":["24.2"],"ones":["24.2"],"listed":["24.2"],"above":["24.2"],"versions":["24.2","24.7"],"released":["24.2"],"future":["24.2"],"info":["24.4","26.4"],"common":["24.4","26.6"],"design":["24.4"],"pattern":["24.4"],"featured":["24.4"],"call":["24.4"],"interested":["24.4"],"http":["24.5","26.11","26.13","28.3","28.13","28.15"],"splashscreen":["24.5"],"provided":["24.5","25.8"],"screen":["24.5","26.12","28.15"],"createoscillator":["24.6","28.13"],"harmonic":["24.6"],"spectrum":["24.6"],"value":["24.6"],"stop":["24.6"],"page":["24.6","26.11"],"cmd":["24.6"],"r":["24.6"],"ear":["24.6","28.13"],"incredibly":["24.6"],"nice":["24.6"],"coming":["24.6"],"try":["24.7"],"locale":["24.7"],"falls":["24.7"],"english":["24.7"],"localized":["24.7"],"texts":["24.7"],"exist":["24.7"],"writing":["24.7"],"wrap":["24.8"],"what":["24.8","26.9"],"far":["24.8"],"creating":["24.8"],"small":["24.8"],"learn":["25.0"],"devices":["25.1"],"behing":["25.2"],"two":["25.3","26.3","26.12"],"share":["25.3"],"audiocontext":["25.3"],"defined":["25.3"],"they":["25.3","28.4"],"even":["25.3"],"advance":["25.3"],"possible":["25.4"],"estimation":["25.4"],"with":["25.4","26.9","26.13"],"such":["25.4"],"schedule":["25.4"],"musical":["25.4","25.9"],"events":["25.4"],"infered":["25.4"],"confirm":["25.5","26.5"],"open":["25.5","26.5","26.11","28.13","28.15"],"favorite":["25.5","26.5"],"editor":["25.5","26.5"],"render":["25.7"],"html":["25.7"],"div":["25.7"],"layout":["25.7"],"localtime":["25.7"],"getlocaltime":["25.7"],"synctime":["25.7"],"getsynctime":["25.7"],"infos":["25.7"],"container":["25.7","28.15"],"refresh":["25.7"],"fps":["25.7"],"window":["25.7"],"requestanimationframe":["25.7"],"starts":["25.8"],"properly":["25.8"],"resumed":["25.8"],"gettimefunction":["25.8"],"declare":["25.8"],"tool":["25.9"],"way":["25.9","26.4","28.0"],"routing":["26.0"],"discover":["26.0","28.0"],"related":["26.0"],"ircam":["26.0","26.1"],"performance":["26.3"],"general":["26.3","26.9","26.10"],"volume":["26.3","28.16"],"between":["26.3","28.4"],"sections":["26.3"],"statemanager":["26.3"],"sharedstate":["26.3"],"abstractions":["26.3"],"speak":["26.4"],"consider":["26.4"],"both":["26.4","26.12"],"clients":["26.4","28.9"],"form":["26.4"],"being":["26.6"],"able":["26.6"],"values":["26.6"],"contrary":["26.6"],"globally":["26.6"],"things":["26.6","26.9"],"focused":["26.6","26.9"],"management":["26.6"],"system":["26.6"],"won":["26.6","26.9"],"t":["26.6","26.9"],"actually":["26.6"],"attaching":["26.7"],"shared":["26.7"],"but":["26.7","26.9"],"under":["26.7"],"different":["26.7"],"advanced":["26.7"],"cases":["26.7"],"now":["26.7","26.14","28.5","28.15"],"them":["26.8"],"line":["26.8","28.3","28.6"],"details":["26.9"],"idea":["26.9"],"would":["26.9","28.3"],"exactly":["26.9"],"miss":["26.9"],"implementation":["26.11"],"restart":["26.11"],"emulate":["26.12"],"side":["26.12","28.13"],"interfaces":["26.12"],"synchronized":["26.12"],"through":["26.12"],"ready":["26.12"],"implement":["26.12"],"there":["26.13"],"still":["26.13"],"issue":["26.13"],"detail":["26.14","28.7"],"dive":["26.15"],"platform":["26.15"],"todo":["27.0"],"our":["28.0","28.5","28.10","28.11"],"reusable":["28.0"],"web":["28.0"],"components":["28.0","28.1"],"take":["28.2"],"control":["28.2"],"over":["28.2"],"done":["28.3","28.10"],"exit":["28.3"],"command":["28.3"],"applied":["28.4"],"wether":["28.4"],"muted":["28.4"],"log":["28.5"],"getvalues":["28.5"],"second":["28.6"],"parameter":["28.6"],"executed":["28.6"],"immediately":["28.6"],"registration":["28.6"],"allows":["28.6"],"us":["28.6"],"know":["28.6"],"mute":["28.7"],"active":["28.7"],"lot":["28.8"],"testing":["28.8"],"time":["28.8"],"const":["28.9"],"custom":["28.10"],"elements":["28.10"],"registry":["28.10"],"customelements":["28.10"],"define":["28.10"],"need":["28.10"],"insert":["28.10"],"template":["28.10"],"renderapp":["28.10","28.14"],"sounds":["28.11"],"core":["28.12"],"helpers":["28.12"],"several":["28.13"],"players":["28.13"],"001":["28.14"],"onattach":["28.15"],"ondetach":["28.15"],"chain":["28.16"],"g":["28.16"],"decibels":["28.16"],"slider":["28.16"],"natural":["28.16"]},{"0":["11.1","22.2","23.3","28.6","28.7"],"1":["11.1","23.3","24.6","28.6","28.7","28.15"],"2":["11.1"],"3":["5.0","7.7"],"6":["26.13"],"8":["11.1"],"15":["3.5","11.1"],"16":["11.1"],"42":["18.4"],"127":["22.2","23.3","24.6","26.14","28.6","28.7"],"2015":["3.5"],"2020":["3.4"],"8000":["22.2","23.3","24.6","26.11","26.14","28.6","28.7","28.15"],"org":["0.0","7.0"],"soundworks":["1.2","11.5","21.0","25.4","28.9"],"embedded":["1.4"],"system":["1.4","1.5","22.6"],"dotpi":["1.4"],"anatomy":["1.4"],"of":["1.4","4.10","11.0","28.5"],"default":["1.4","8.0","28.0","28.5"],"template":["1.4","26.6"],"app":["1.4","28.10"],"osc":["1.4"],"build":["1.5","20.0"],"como":["1.6"],"elements":["1.6"],"koryphaios":["1.6"],"browser":["1.7","22.4","23.4","25.7","26.12"],"runtimes":["1.7"],"for":["1.7","19.9","24.4"],"clients":["1.7","18.6","24.8","28.11"],"from":["3.1","19.22","28.14"],"s":["3.1","22.3","25.4"],"stms":["3.1","5.0"],"lab":["3.1","5.0"],"online":["3.3"],"at":["3.3","7.0","8.0","24.6","28.2"],"apps":["3.3"],"fr":["3.3"],"hal":["3.4","19.23"],"03033143":["3.4"],"developers":["3.5"],"to":["3.5","9.11"],"create":["3.5","26.0","26.7"],"collaborative":["3.5","6.1"],"performances":["3.5"],"paris":["3.5"],"france":["3.5"],"01580797":["3.5"],"a":["4.1","14.12","14.15","14.21","15.19","17.0","17.10","17.12","18.9","18.14","18.17","18.25","18.36","19.15","19.16","19.18","19.21","24.5","28.7"],"list":["4.1"],"available":["4.1"],"so":["4.1"],"far":["4.1"],"example":["4.2","4.3","4.4","4.5","4.6","4.7","4.8","4.9"],"w":["4.2","4.6"],"filesystem":["4.2","14.22"],"save":["4.3","4.6","4.7","4.8"],"github":["4.3","4.6","4.7","4.8","4.9","4.12"],"devicemotion":["4.6"],"helpers":["4.10"],"simplify":["4.10","26.15"],"set":["4.10","28.2"],"common":["4.10","25.7"],"tasks":["4.10","26.15"],"blob":["5.0"],"bsd":["5.0"],"clause":["5.0"],"sound":["5.0","23.0"],"movement":["5.0"],"interaction":["5.0"],"tutelles":["5.0"],"http":["5.0","22.2","23.3","24.6","26.14","28.6","28.7"],"cnrs":["5.0"],"sorbonne":["5.0"],"universite":["5.0"],"su":["5.0"],"culture":["5.0"],"gouv":["5.0"],"also":["6.1","24.6"],"suited":["6.1"],"outside":["6.1"],"realm":["6.1"],"graphics":["6.1"],"multi":["6.1"],"user":["6.1","26.0"],"games":["6.1"],"future":["6.2","6.6","23.7"],"fact":["6.2"],"works":["6.2","11.2"],"or":["6.2","17.0","28.3"],"our":["6.2","26.7"],"hands":["6.2"],"won":["6.2","25.3"],"t":["6.2","24.0","28.13"],"implemented":["6.2"],"into":["6.2","25.4"],"until":["6.2"],"annotation":["6.2"],"proposal":["6.2"],"evolved":["6.2"],"see":["6.4","6.6","11.3","22.4","24.6","25.4","28.5","28.6","28.15"],"getting":["6.4"],"started":["6.4"],"tutorial":["6.4","6.5","6.6","14.9","23.7","24.4"],"state":["6.5","7.8","16.5","22.6","28.3"],"manager":["6.5","7.8","24.2"],"evolutions":["6.6"],"platform":["6.6","16.10","23.4"],"init":["6.6"],"found":["7.0"],"https":["7.0"],"vuejs":["7.0"],"npm":["7.1","23.2","25.5","26.5"],"edit":["7.2"],"some":["7.2","25.4","26.15"],"content":["7.2"],"cf":["7.2"],"examples":["7.2"],"automatically":["7.3","26.11","26.12"],"this":["7.3","7.7","24.4","26.13","28.13"],"can":["7.3","24.4"],"take":["7.3"],"few":["7.3"],"minutes":["7.3"],"my":["7.5","14.4","14.6","14.22","15.4","15.19"],"awesome":["7.5"],"document":["7.5"],"contributing":["7.7"],"site":["7.7"],"here":["7.7","7.8","22.0","26.8","28.9"],"publish":["7.7"],"children":["7.8"],"add":["7.8"],"client":["8.0","16.10","22.4","24.4","28.13","28.14"],"should":["8.0","8.2","11.3","22.4","26.14","28.2","28.5","28.6","28.7","28.10","28.15"],"be":["8.0","15.20","24.8"],"accessible":["8.0","8.2"],"tip":["8.1","24.6","26.11"],"an":["8.1","22.3","24.7","26.8"],"interesting":["8.1","26.6","28.8"],"free":["8.1"],"tool":["8.1"],"deploy":["8.1"],"and":["8.1","18.6","23.8"],"monitor":["8.1"],"several":["8.1","22.5","24.8","25.7","26.13","26.14","28.2"],"applications":["8.1","22.3","28.2"],"pm2":["8.1"],"your":["8.2","24.2","24.3","24.6","26.6","28.8","28.10"],"application":["8.2","11.4","23.7","26.10","28.6","28.15"],"on":["8.2","15.29","15.35","24.3","26.7"],"internets":["8.2"],"domain":["8.2"],"com":["8.2"],"in":["9.0","11.3","15.16","15.21","28.7","28.15"],"progress":["9.0"],"unify":["9.1"],"groundup":["11.0"],"have":["11.0","11.4","22.3","23.4","26.13","26.14"],"taste":["11.0"],"what":["11.0"],"using":["11.0","25.8","28.0"],"raw":["11.0"],"means":["11.0"],"type":["11.1"],"module":["11.1"],"code":["11.1","18.37","25.4"],"easily":["11.2","28.9"],"expected":["11.2"],"restart":["11.2"],"changes":["11.2"],"terminal":["11.2","28.5"],"press":["11.2"],"ctrl":["11.2","28.3"],"c":["11.2","28.3"],"close":["11.2","15.26","15.33"],"sh":["11.2"],"reload":["11.3"],"page":["11.3","22.4","28.10"],"displayed":["11.3"],"await":["11.4","17.4"],"resumeaudiocontext":["11.4"],"loadaudiobuffer":["11.4"],"assets":["11.4"],"sample":["11.4"],"wav":["11.4"],"samplerate":["11.4"],"congrats":["11.4","22.2"],"you":["11.4","23.3","24.0","25.4","28.6","28.7"],"working":["11.4"],"simple":["11.4","23.4","26.12"],"distributed":["11.4","22.6","24.8","28.2"],"do":["11.5","26.6"],"such":["11.5","12.0","19.7","25.3","26.15"],"case":["11.5"],"designed":["11.5"],"hopefully":["11.5","26.0"],"help":["11.5"],"handle":["11.5"],"cases":["11.5"],"manner":["11.5","23.4"],"tort":["12.0"],"negligence":["12.0"],"otherwise":["12.0"],"arising":["12.0"],"way":["12.0","22.5","26.9","26.13"],"out":["12.0"],"even":["12.0"],"if":["12.0","15.8","23.3","24.0","24.6","28.2","28.6","28.7"],"advised":["12.0"],"possibility":["12.0"],"damage":["12.0"],"associated":["13.0"],"additional":["13.0"],"data":["13.0"],"tocstop":["13.1","14.1","15.1","16.1","17.1","18.1","19.1"],"getindex":["13.5"],"name":["13.7","14.11","14.12","14.14","14.15","14.16","14.17","14.19","14.21","14.22","14.23","14.25","14.26","14.27","14.29","15.8","15.19","15.20","15.25","15.28","15.29","15.33","16.8","16.10","16.11","16.12","17.7","17.9","17.10","17.12","17.13","18.8","18.10","18.12","18.18","18.19","18.21","18.22","18.23","18.28","18.32","18.34","18.35","19.12","19.14","19.15","19.16","19.18","19.20","19.21"],"getdata":["13.9"],"plugincheckinserver":["13.10"],"green":["13.12"],"yellow":["13.12"],"pink":["13.12"],"apistop":["13.12","14.30","15.35","17.15","18.37","19.22"],"any":["14.0","28.14"],"node":["14.0","14.23","24.2","26.8"],"get":["14.4","16.11"],"writefile":["14.4","14.16","14.26"],"txt":["14.4","14.6","15.9"],"hello":["14.4","14.6","15.4","15.5"],"file":["14.6"],"share":["14.8"],"js":["14.9","16.10"],"configure":["14.9","19.7","23.7"],"todo":["14.9","28.15"],"given":["14.14","14.25","18.22"],"immediately":["14.14","14.25","18.22","18.34"],"gettreeasurlmap":["14.14"],"keys":["14.15"],"findintree":["14.15","14.25"],"mkdir":["14.17","14.27"],"rename":["14.18","14.28"],"rm":["14.19","14.29"],"pluginfilesystemserver":["14.20"],"register":["14.22","16.10"],"filesystemplugin":["14.22"],"dir":["14.22"],"each":["14.23","24.6","28.3"],"tree":["14.23"],"gettree":["14.23","18.11","18.20"],"old":["15.0"],"files":["15.0"],"writerserver":["15.1","15.29"],"credits":["15.1","19.1"],"license":["15.1","19.1"],"createwriter":["15.4","15.15","15.20"],"log":["15.4","15.5","16.5","18.5"],"write":["15.4","15.5","22.3"],"directory":["15.6","26.6"],"0002":["15.7"],"lead":["15.8"],"errors":["15.8"],"two":["15.8","28.7"],"writers":["15.8","15.10"],"created":["15.8"],"same":["15.8","15.16","15.21","22.4","23.4","24.6"],"attached":["15.10"],"sent":["15.11"],"method":["15.13","18.8","28.9"],"global":["15.16","15.21","28.3","28.10"],"informations":["15.16","15.21"],"amongst":["15.16","15.21"],"different":["15.16","15.21","23.8","25.4","28.7","28.15"],"sessions":["15.16","15.21"],"attachwriter":["15.16"],"logs":["15.17","15.19"],"pluginloggerserver":["15.17"],"pluginlogger":["15.19"],"passed":["15.20","18.23","28.9"],"writerclient":["15.21"],"written":["15.25","15.33"],"flush":["15.25"],"onpacketsend":["15.27"],"onclose":["15.28","15.34"],"execute":["15.29","15.35"],"agency":["15.36"],"anr":["15.36"],"html":["16.0"],"console":["16.5","18.5"],"running":["16.5","23.0"],"return":["16.6"],"promise":["16.6"],"resolve":["16.6"],"pluginplatforminit":["16.10"],"onusergesture":["16.10"],"platformplugin":["16.11"],"pluginplatforminitserver":["16.12"],"map":["17.0","17.4","17.15"],"backgroundimage":["17.4"],"public":["17.4","17.15"],"path":["17.4"],"png":["17.4","17.15"],"start":["17.4"],"clientposition":["17.5"],"getposition":["17.5","17.10"],"setposition":["17.9"],"setnormalizedposition":["17.11"],"getnormalizedposition":["17.12"],"pluginpositionserver":["17.13"],"createscript":["18.4","18.12","18.23"],"constants":["18.4"],"export":["18.4"],"answer":["18.4","18.5"],"production":["18.6","23.7"],"mode":["18.6","25.5","26.5"],"authentified":["18.6"],"trusted":["18.6"],"allowed":["18.6"],"modify":["18.6"],"pluscritping":["18.8"],"attach":["18.8","18.15","18.26","28.4"],"getlist":["18.10","18.19"],"updatescript":["18.13","18.24"],"deletescript":["18.14","18.25"],"pluginscriptingserver":["18.16"],"scriptingplugin":["18.18"],"setglobalscriptingcontext":["18.18"],"onupdate":["18.21"],"switch":["18.22"],"sharedscript":["18.27"],"ondetach":["18.28","18.34"],"update":["18.28","18.35"],"value":["18.28"],"delete":["18.28","18.36"],"detach":["18.32"],"wrapper":["19.0"],"around":["19.0"],"ircam":["19.0"],"library":["19.0","28.0"],"synchronize":["19.7","26.3"],"another":["19.7","23.0","24.7","26.8"],"as":["19.7","24.8","26.15"],"audiocontext":["19.7","19.14"],"currenttime":["19.7","19.14"],"resumed":["19.8","28.12"],"gettimefunction":["19.8"],"but":["19.9","23.3","26.6"],"unfortunately":["19.9"],"not":["19.9","22.2","26.6"],"compensate":["19.9"],"output":["19.9"],"latency":["19.9"],"may":["19.9"],"differ":["19.9"],"great":["19.9"],"extent":["19.9"],"master":["19.10","28.10"],"there":["19.10"],"no":["19.10","22.4","26.13"],"difference":["19.10"],"sync":["19.14","19.20","25.2"],"pluginsync":["19.14","19.20"],"getlocaltime":["19.14","19.20"],"getsynctime":["19.15"],"onreport":["19.16"],"getreport":["19.17"],"pluginsyncserver":["19.18"],"optionnal":["19.22"],"01304889v1":["19.23"],"prototype":["20.0"],"instructions":["22.0"],"come":["22.0"],"back":["22.0"],"when":["22.0"],"done":["22.0","28.4"],"favorite":["22.2"],"shall":["22.2"],"probably":["22.2"],"safari":["22.2"],"tada":["22.2"],"rather":["22.2"],"pretty":["22.2"],"almost":["22.2"],"black":["22.2","22.4"],"screen":["22.2","23.3"],"fancy":["22.2","22.4"],"configured":["22.2"],"ran":["22.2"],"closer":["22.2"],"look":["22.2","28.10"],"codebase":["22.2"],"whenever":["22.3"],"deal":["22.3"],"with":["22.3","24.7"],"servers":["22.3"],"networks":["22.3"],"specific":["22.3"],"now":["22.3","24.4","25.4","28.3","28.10"],"we":["22.3"],"overviewed":["22.3"],"let":["22.3","25.4"],"side":["22.4","26.14"],"logic":["22.4","25.4"],"everything":["22.4","23.3"],"went":["22.4"],"well":["22.4","24.2","28.13"],"error":["22.4"],"launching":["22.4"],"still":["22.4"],"show":["22.4"],"after":["22.5","28.10"],"50ms":["22.5"],"action":["22.5","26.12"],"understand":["22.5"],"precisely":["22.5"],"why":["22.5"],"keep":["22.5","24.2"],"calling":["22.5"],"emulate":["22.5","24.6","26.13","26.14","28.15"],"parallel":["22.5","23.6"],"window":["22.5","28.15"],"end":["22.5"],"note":["22.5","24.6","26.6","26.11"],"url":["22.5","26.11"],"emulated":["22.5"],"these":["22.5","26.7"],"them":["22.5","24.6","26.12","28.13"],"blink":["22.5"],"indeed":["22.5","23.4","25.4","26.4"],"exactly":["22.5","23.4"],"possibilities":["22.6"],"proposed":["22.6","25.0","26.6","28.0"],"management":["22.6"],"trigger":["23.0"],"synthesized":["23.0"],"by":["23.0","28.0","28.3","28.14"],"run":["23.2","25.5","26.5"],"dev":["23.2","25.5","26.5"],"container":["23.3","28.7","28.10"],"course":["23.3"],"launch":["23.3","23.6"],"right":["23.3"],"empty":["23.3","26.6"],"ready":["23.3"],"stop":["23.4"],"runs":["23.4"],"wrote":["23.4"],"abstracting":["23.4","26.3"],"important":["23.4","28.2"],"related":["23.4"],"libraries":["23.4"],"thing":["23.6"],"four":["23.6"],"explain":["23.7"],"more":["23.7","26.14","28.8"],"detail":["23.7"],"about":["23.7"],"how":["23.7","24.6","25.7","26.8","28.15"],"setting":["23.7"],"synchronization":["23.8","25.4","25.7"],"between":["23.8"],"processes":["23.8"],"machines":["23.8"],"didn":["24.0"],"check":["24.0","24.4"],"it":["24.0"],"yet":["24.0"],"allows":["24.2","25.7","28.9"],"i":["24.2","24.6"],"e":["24.2","24.6"],"track":["24.2","28.9"],"project":["24.2","28.3","28.14"],"then":["24.2"],"need":["24.2"],"re":["24.2"],"installed":["24.2"],"information":["24.4"],"subject":["24.4"],"all":["24.4","24.6","25.3","25.8","26.3","26.12"],"install":["24.4"],"requires":["24.5"],"gesture":["24.5"],"click":["24.5"],"event":["24.5"],"shown":["24.5"],"because":["24.5"],"has":["24.5"],"been":["24.5"],"registered":["24.5","26.7"],"homepage":["24.5","24.6"],"speakers":["24.6","24.8"],"multiple":["24.6","26.3"],"helps":["24.6"],"once":["24.6","28.4","28.13"],"without":["24.6","25.3"],"requiring":["24.6"],"likely":["24.7","25.3"],"version":["24.7"],"confortable":["24.7"],"willing":["24.7"],"contribute":["24.7"],"please":["24.7"],"issue":["24.7"],"pull":["24.7"],"request":["24.7"],"repository":["24.7"],"where":["24.8"],"used":["24.8","28.8"],"central":["24.8","26.4"],"controller":["24.8","28.14"],"which":["25.0","26.13"],"is":["25.0"],"solve":["25.0"],"particular":["25.0"],"html5":["25.1"],"plugin":["25.2","25.4"],"soundcard":["25.3"],"reason":["25.3"],"arbitrary":["25.3"],"relying":["25.3"],"external":["25.3"],"resources":["25.3"],"scheduling":["25.4"],"actual":["25.4"],"synthesis":["25.4"],"own":["25.4"],"explanation":["25.4"],"simplified":["25.4"],"hope":["25.4"],"gives":["25.4","26.4"],"intuition":["25.4"],"behind":["25.4"],"nodes":["25.4"],"experiement":["25.4"],"ideas":["25.4"],"translate":["25.4"],"development":["25.5","26.5"],"windows":["25.7","26.12","28.7"],"estimate":["25.7"],"clock":["25.7"],"dependency":["25.8"],"estimating":["25.8"],"reference":["25.8"],"implemeting":["25.9"],"step":["25.9","28.13"],"sequencer":["25.9"],"components":["26.0","26.1","28.16"],"simply":["26.0","28.9"],"usable":["26.0"],"elegant":["26.0"],"graphical":["26.0"],"interfaces":["26.0"],"shared":["26.2","28.15"],"states":["26.2","28.3"],"provide":["26.3","28.2"],"define":["26.3"],"sets":["26.3"],"are":["26.3","26.7","28.14"],"interest":["26.3"],"while":["26.3","26.9"],"network":["26.3"],"communications":["26.3"],"involved":["26.3"],"just":["26.4","26.6"],"however":["26.4"],"its":["26.4"],"role":["26.4"],"abilities":["26.4"],"features":["26.4"],"exercise":["26.6"],"info":["26.6"],"included":["26.6"],"mandatory":["26.6"],"declarations":["26.6"],"potentially":["26.6"],"live":["26.6"],"anywhere":["26.6"],"good":["26.6","28.2"],"practice":["26.6"],"organized":["26.6"],"safely":["26.7"],"instances":["26.7"],"sharedstate":["26.7"],"based":["26.7"],"methods":["26.8"],"relate":["26.8"],"creates":["26.8"],"new":["26.8"],"owned":["26.8"],"existing":["26.8"],"could":["26.9"],"implement":["26.9"],"directly":["26.9"],"bit":["26.9","26.13"],"deeper":["26.9"],"dedicated":["26.9"],"task":["26.9"],"part":["26.11"],"according":["26.11"],"names":["26.11"],"anytime":["26.12"],"modified":["26.12"],"one":["26.12"],"other":["26.12"],"g":["26.13"],"know":["26.13"],"correspond":["26.13"],"badly":["26.13"],"defined":["26.13"],"review":["26.13"],"takle":["26.13"],"open":["26.14","28.6"],"usefull":["26.14"],"final":["26.14"],"meant":["26.15"],"redondant":["26.15"],"cumbersome":["26.15"],"resuming":["26.15"],"audio":["26.15","28.2"],"context":["26.15"],"etc":["26.15","28.16"],"lit":["28.0"],"he":["28.2"],"was":["28.2"],"itself":["28.2"],"minimal":["28.2"],"functionalities":["28.2"],"overview":["28.2"],"recurring":["28.2"],"patterns":["28.2"],"stake":["28.2"],"real":["28.2"],"typing":["28.3"],"entry":["28.3"],"that":["28.3"],"scaffolded":["28.3"],"schemas":["28.3"],"describing":["28.3"],"instaciate":["28.4"],"players":["28.4","28.14"],"controllers":["28.4","28.14"],"current":["28.5"],"values":["28.5","28.9"],"logged":["28.5"],"excuted":["28.6"],"startup":["28.6"],"remote":["28.7","28.14"],"better":["28.8"],"make":["28.8"],"artwork":["28.8"],"experience":["28.8"],"argument":["28.9"],"initialization":["28.9"],"pass":["28.9","28.12","28.16"],"generated":["28.9"],"bound":["28.9"],"layout":["28.10"],"p":["28.10"],"mute":["28.10"],"infos":["28.10"],"config":["28.10"],"refreshing":["28.10"],"like":["28.10"],"full":["28.10","28.14","28.15"],"instance":["28.12"],"splashscreen":["28.12"],"general":["28.13"],"player":["28.13"],"don":["28.13"],"forget":["28.13"],"remove":["28.13"],"snippet":["28.13"],"before":["28.13"],"going":["28.13"],"next":["28.13"],"fully":["28.14"],"functionnal":["28.14"],"their":["28.14"],"chain":["28.14"],"controlled":["28.14"],"remotely":["28.14"],"finish":["28.14"],"enabling":["28.14"],"control":["28.14"],"synchronized":["28.15"],"through":["28.15"],"noise":["28.15"],"high":["28.16"],"filters":["28.16"],"refactor":["28.16"],"classes":["28.16"]}]'},t={"0.0":{t:"# soundworks | website",p:"Sources fo ...",l:"README.html",a:"soundworks-website"},"0.1":{t:"Credits",p:"https://so ...",l:"README.html#credits",a:"credits"},"0.2":{t:"License",p:"BSD-3-Clau ...",l:"README.html#license",a:"license"},"1.0":{t:"Notes",p:` -screensho ...`,l:"TODOS.html",a:"notes"},"1.1":{t:"Structure",p:"",l:"TODOS.html#structure",a:"structure"},"1.2":{t:"homepage",p:` -[x] links ...`,l:"TODOS.html#homepage",a:"homepage"},"1.3":{t:"Introduction",p:` -[x] What ...`,l:"TODOS.html#introduction",a:"introduction"},"1.4":{t:"tutorials",p:` -[x] Getti ...`,l:"TODOS.html#tutorials",a:"tutorials"},"1.5":{t:"receipes",p:` -[ ] state ...`,l:"TODOS.html#receipes",a:"receipes"},"1.6":{t:"ecosystem",p:` -[ ] Sound ...`,l:"TODOS.html#ecosystem",a:"ecosystem"},"1.7":{t:"misc",p:` -[x] setti ...`,l:"TODOS.html#misc",a:"misc"},"1.8":{t:"Credits",p:` -[ ] impro ...`,l:"TODOS.html#credits",a:"credits"},"3.0":{t:"# Credits",p:"",l:"credits.html",a:"credits"},"3.1":{t:"Design & Development",p:"soundworks ...",l:"credits.html#design-development",a:"design-development"},"3.2":{t:"Supporting Research Projects",p:"Initial an ...",l:"credits.html#supporting-research-projects",a:"supporting-research-projects"},"3.3":{t:"Artistic & Research Collaborations",p:"The design ...",l:"credits.html#artistic-research-collaborations",a:"artistic-research-collaborations"},"3.4":{t:"Citing this Work",p:` -Benjamin ...`,l:"credits.html#citing-this-work",a:"citing-this-work"},"3.5":{t:"Related Academic Papers",p:` -Frederic ...`,l:"credits.html#related-academic-papers",a:"related-academic-papers"},"3.6":{t:"License",p:"BSD-3-Clau ...",l:"credits.html#license",a:"license"},"4.0":{t:"# Ecosystem",p:`[[toc]] -`,l:"ecosystem/ecosystem.html",a:"ecosystem"},"4.1":{t:"`@soundworks/core`",p:"The core o ...",l:"ecosystem/ecosystem.html#soundworks-core",a:"soundworks-core"},"4.2":{t:"`@soundworks/plugin-audio-buffer-loader`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-audio-buffer-loader",a:"soundworks-plugin-audio-buffer-loader"},"4.3":{t:"`@soundworks/plugin-checkin`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-checkin",a:"soundworks-plugin-checkin"},"4.4":{t:"`@soundworks/plugin-filesystem`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-filesystem",a:"soundworks-plugin-filesystem"},"4.5":{t:"`@soundworks/plugin-logger`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-logger",a:"soundworks-plugin-logger"},"4.6":{t:"`@soundworks/plugin-platform`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-platform",a:"soundworks-plugin-platform"},"4.7":{t:"`@soundworks/plugin-position`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-position",a:"soundworks-plugin-position"},"4.8":{t:"`@soundworks/plugin-scripting`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-scripting",a:"soundworks-plugin-scripting"},"4.9":{t:"`@soundworks/plugin-sync`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-sync",a:"soundworks-plugin-sync"},"4.10":{t:"`@soundworks-template`",p:"Project te ...",l:"ecosystem/ecosystem.html#soundworks-template",a:"soundworks-template"},"4.11":{t:"`@soundworks/template-build`",p:"Build scri ...",l:"ecosystem/ecosystem.html#soundworks-template-build",a:"soundworks-template-build"},"4.12":{t:"`@soundworks/template-helpers`",p:"Set of com ...",l:"ecosystem/ecosystem.html#soundworks-template-helpers",a:"soundworks-template-helpers"},"5.0":{t:'
',p:"<h1> ...",l:"index.html",a:"div-class-vphome-use-homepage-styles"},"6.0":{t:"# Introduction",p:"",l:"introduction.html",a:"introduction"},"6.1":{t:"Goal",p:"soundworks ...",l:"introduction.html#goal",a:"goal"},"6.2":{t:"Philosophy",p:"soundworks ...",l:"introduction.html#philosophy",a:"philosophy"},"6.3":{t:"Architecture",p:"The core o ...",l:"introduction.html#architecture",a:"architecture"},"6.4":{t:"Client and server initalization",p:"The soundw ...",l:"introduction.html#client-and-server-initalization",a:"client-and-server-initalization"},"6.5":{t:"Distributed shared states",p:"The StateM ...",l:"introduction.html#distributed-shared-states",a:"distributed-shared-states"},"6.6":{t:"Plugin host",p:"soundworks ...",l:"introduction.html#plugin-host",a:"plugin-host"},"7.0":{t:"# Contributing to this Website",p:"You wrote ...",l:"misc/_contributing-to-this-site.html",a:"contributing-to-this-website"},"7.1":{t:"Install",p:` -Clone rep ...`,l:"misc/_contributing-to-this-site.html#install",a:"install"},"7.2":{t:"Run Development Mode",p:"Get remote ...",l:"misc/_contributing-to-this-site.html#run-development-mode",a:"run-development-mode"},"7.3":{t:"Publish",p:"::: tip No ...",l:"misc/_contributing-to-this-site.html#publish",a:"publish"},"7.4":{t:"Examples",p:"",l:"misc/_contributing-to-this-site.html#examples",a:"examples"},"7.5":{t:'Adding a "Misc" Page',p:` -Add your ...`,l:"misc/_contributing-to-this-site.html#adding-a-misc-page",a:"adding-a-misc-page"},"7.6":{t:"subsection 1",p:"Lorem ipsu ...",l:"misc/_contributing-to-this-site.html#subsection-1",a:"subsection-1"},"7.7":{t:"subsection 2",p:"Duis aute ...",l:"misc/_contributing-to-this-site.html#subsection-2",a:"subsection-2"},"7.8":{t:'Adding a "Tutorial" Page',p:"Creating a ...",l:"misc/_contributing-to-this-site.html#adding-a-tutorial-page",a:"adding-a-tutorial-page"},"8.0":{t:"# Deploying on the Internets",p:"If you wan ...",l:"misc/_deployment.html",a:"deploying-on-the-internets"},"8.1":{t:"Application Configure ",p:"The first ...",l:"misc/_deployment.html#application-configure",a:"application-configure"},"8.2":{t:"Nginx Config",p:"The nginx ...",l:"misc/_deployment.html#nginx-config",a:"nginx-config"},"8.3":{t:"Apache Config",p:":::warning ...",l:"misc/_deployment.html#apache-config",a:"apache-config"},"9.0":{t:"# Deployment on a Local Network",p:"This page ...",l:"misc/_local-deployment.html",a:"deployment-on-a-local-network"},"9.1":{t:"Network Configuration",p:"note: for ...",l:"misc/_local-deployment.html#network-configuration",a:"network-configuration"},"9.2":{t:"DHCP",p:"",l:"misc/_local-deployment.html#dhcp",a:"dhcp"},"9.3":{t:"DNS",p:"",l:"misc/_local-deployment.html#dns",a:"dns"},"9.4":{t:"WiFi Access Point",p:"",l:"misc/_local-deployment.html#wifi-access-point",a:"wifi-access-point"},"9.5":{t:"Sharing Internet Connection",p:"",l:"misc/_local-deployment.html#sharing-internet-connection",a:"sharing-internet-connection"},"9.6":{t:"TP-Links",p:"",l:"misc/_local-deployment.html#tp-links",a:"tp-links"},"9.7":{t:"Unify",p:"",l:"misc/_local-deployment.html#unify",a:"unify"},"9.8":{t:"Configuring Application",p:"",l:"misc/_local-deployment.html#configuring-application",a:"configuring-application"},"9.9":{t:"Creating an Environment Config File",p:"",l:"misc/_local-deployment.html#creating-an-environment-config-file",a:"creating-an-environment-config-file"},"9.10":{t:"Configuring Ports",p:"",l:"misc/_local-deployment.html#configuring-ports",a:"configuring-ports"},"9.11":{t:"The `https` Issue",p:` -when is i ...`,l:"misc/_local-deployment.html#the-https-issue",a:"the-https-issue"},"10.0":{t:"# Creating Electron Applications",p:"",l:"misc/_todo_electron-applications.html",a:"creating-electron-applications"},"10.1":{t:"How to",p:"",l:"misc/_todo_electron-applications.html#how-to",a:"how-to"},"10.2":{t:"Auto-Updates",p:"",l:"misc/_todo_electron-applications.html#auto-updates",a:"auto-updates"},"11.0":{t:"# WebSockets 101",p:"WebSocket ...",l:"misc/web-sockets-101.html",a:"websockets-101"},"11.1":{t:"Scaffolding the project",p:"Let's firs ...",l:"misc/web-sockets-101.html#scaffolding-the-project",a:"scaffolding-the-project"},"11.2":{t:"Implementing the server",p:"Now eveyth ...",l:"misc/web-sockets-101.html#implementing-the-server",a:"implementing-the-server"},"11.3":{t:"Opening a client WebSocket",p:"Now that e ...",l:"misc/web-sockets-101.html#opening-a-client-websocket",a:"opening-a-client-websocket"},"11.4":{t:"Propagating Events",p:"Now, that ...",l:"misc/web-sockets-101.html#propagating-events",a:"propagating-events"},"11.5":{t:"Conclusion",p:"This tutor ...",l:"misc/web-sockets-101.html#conclusion",a:"conclusion"},"12.0":{t:"Copyright (c) 2014-present IRCAM – Centre Pompidou (France, Paris)",p:"All rights ...",l:"plugins/LICENSE.html",a:"copyright-c-2014-present-ircam-–-centre-pompidou-france-paris"},"13.0":{t:"# soundworks | plugin checkin",p:` -soundwork ...`,l:"plugins/checkin.html",a:"soundworks-plugin-checkin"},"13.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/checkin.html#table-of-contents",a:"table-of-contents"},"13.2":{t:"Installation",p:"npm instal ...",l:"plugins/checkin.html#installation",a:"installation"},"13.3":{t:"Usage",p:"",l:"plugins/checkin.html#usage",a:"usage"},"13.4":{t:"Server",p:"// index.j ...",l:"plugins/checkin.html#server",a:"server"},"13.5":{t:"Client",p:"// index.j ...",l:"plugins/checkin.html#client",a:"client"},"13.6":{t:"API",p:"<!-- ap ...",l:"plugins/checkin.html#api",a:"api"},"13.7":{t:"Classes",p:"<dl> ...",l:"plugins/checkin.html#classes",a:"classes"},"13.8":{t:"PluginCheckinClient",p:"Client-sid ...",l:"plugins/checkin.html#plugincheckinclient",a:"plugincheckinclient"},"13.9":{t:"pluginCheckinClient.getIndex() ⇒ number",p:"Return the ...",l:"plugins/checkin.html#plugincheckinclient-getindex-⇒-code-number-code",a:"plugincheckinclient-getindex-⇒-code-number-code"},"13.10":{t:"pluginCheckinClient.getData() ⇒ mixed",p:"Return the ...",l:"plugins/checkin.html#plugincheckinclient-getdata-⇒-code-mixed-code",a:"plugincheckinclient-getdata-⇒-code-mixed-code"},"13.11":{t:"PluginCheckinServer",p:"Server-sid ...",l:"plugins/checkin.html#plugincheckinserver",a:"plugincheckinserver"},"13.12":{t:"new PluginCheckinServer()",p:"The constr ...",l:"plugins/checkin.html#new-plugincheckinserver",a:"new-plugincheckinserver"},"13.13":{t:"Credits",p:"https://so ...",l:"plugins/checkin.html#credits",a:"credits"},"13.14":{t:"License",p:"BSD-3-Clau ...",l:"plugins/checkin.html#license",a:"license"},"14.0":{t:"# soundworks | plugin filesystem",p:` -soundwork ...`,l:"plugins/filesystem.html",a:"soundworks-plugin-filesystem"},"14.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/filesystem.html#table-of-contents",a:"table-of-contents"},"14.2":{t:"Installation",p:"npm instal ...",l:"plugins/filesystem.html#installation",a:"installation"},"14.3":{t:"Usage",p:"",l:"plugins/filesystem.html#usage",a:"usage"},"14.4":{t:"Server",p:"// index.j ...",l:"plugins/filesystem.html#server",a:"server"},"14.5":{t:"Client",p:"",l:"plugins/filesystem.html#client",a:"client"},"14.6":{t:"Registering the plugin",p:"// index.j ...",l:"plugins/filesystem.html#registering-the-plugin",a:"registering-the-plugin"},"14.7":{t:"Notes",p:"",l:"plugins/filesystem.html#notes",a:"notes"},"14.8":{t:"Reading files",p:"For now, t ...",l:"plugins/filesystem.html#reading-files",a:"reading-files"},"14.9":{t:"Security",p:"Being able ...",l:"plugins/filesystem.html#security",a:"security"},"14.10":{t:"API",p:"<!-- ap ...",l:"plugins/filesystem.html#api",a:"api"},"14.11":{t:"Classes",p:"<dl> ...",l:"plugins/filesystem.html#classes",a:"classes"},"14.12":{t:"PluginFilesystemClient",p:"Client-sid ...",l:"plugins/filesystem.html#pluginfilesystemclient",a:"pluginfilesystemclient"},"14.13":{t:"pluginFilesystemClient.getTree() ⇒ Object",p:"Return the ...",l:"plugins/filesystem.html#pluginfilesystemclient-gettree-⇒-code-object-code",a:"pluginfilesystemclient-gettree-⇒-code-object-code"},"14.14":{t:"pluginFilesystemClient.onUpdate(callback, [executeListener]) ⇒ function",p:"Register a ...",l:"plugins/filesystem.html#pluginfilesystemclient-onupdate-callback-executelistener-⇒-code-function-code",a:"pluginfilesystemclient-onupdate-callback-executelistener-⇒-code-function-code"},"14.15":{t:"pluginFilesystemClient.getTreeAsUrlMap(filterExt, [keepExtension]) ⇒ Object",p:"Return the ...",l:"plugins/filesystem.html#pluginfilesystemclient-gettreeasurlmap-filterext-keepextension-⇒-code-object-code",a:"pluginfilesystemclient-gettreeasurlmap-filterext-keepextension-⇒-code-object-code"},"14.16":{t:"pluginFilesystemClient.findInTree(path) ⇒ Object",p:"Return a n ...",l:"plugins/filesystem.html#pluginfilesystemclient-findintree-path-⇒-code-object-code",a:"pluginfilesystemclient-findintree-path-⇒-code-object-code"},"14.17":{t:"pluginFilesystemClient.writeFile(pathname, data) ⇒ Promise",p:"Write a fi ...",l:"plugins/filesystem.html#pluginfilesystemclient-writefile-pathname-data-⇒-code-promise-code",a:"pluginfilesystemclient-writefile-pathname-data-⇒-code-promise-code"},"14.18":{t:"pluginFilesystemClient.mkdir(pathname) ⇒ Promise",p:"Create a d ...",l:"plugins/filesystem.html#pluginfilesystemclient-mkdir-pathname-⇒-code-promise-code",a:"pluginfilesystemclient-mkdir-pathname-⇒-code-promise-code"},"14.19":{t:"pluginFilesystemClient.rename(oldPath, newPath) ⇒ Promise",p:"Rename a f ...",l:"plugins/filesystem.html#pluginfilesystemclient-rename-oldpath-newpath-⇒-code-promise-code",a:"pluginfilesystemclient-rename-oldpath-newpath-⇒-code-promise-code"},"14.20":{t:"pluginFilesystemClient.rm(pathname) ⇒ Promise",p:"Delete a f ...",l:"plugins/filesystem.html#pluginfilesystemclient-rm-pathname-⇒-code-promise-code",a:"pluginfilesystemclient-rm-pathname-⇒-code-promise-code"},"14.21":{t:"PluginFilesystemServer",p:"Server-sid ...",l:"plugins/filesystem.html#pluginfilesystemserver",a:"pluginfilesystemserver"},"14.22":{t:"new PluginFilesystemServer()",p:"The constr ...",l:"plugins/filesystem.html#new-pluginfilesystemserver",a:"new-pluginfilesystemserver"},"14.23":{t:"pluginFilesystemServer.switch(options)",p:"Switch the ...",l:"plugins/filesystem.html#pluginfilesystemserver-switch-options",a:"pluginfilesystemserver-switch-options"},"14.24":{t:"pluginFilesystemServer.getTree() ⇒ Object",p:"Return the ...",l:"plugins/filesystem.html#pluginfilesystemserver-gettree-⇒-code-object-code",a:"pluginfilesystemserver-gettree-⇒-code-object-code"},"14.25":{t:"pluginFilesystemServer.onUpdate(callback, [executeListener]) ⇒ function",p:"Register a ...",l:"plugins/filesystem.html#pluginfilesystemserver-onupdate-callback-executelistener-⇒-code-function-code",a:"pluginfilesystemserver-onupdate-callback-executelistener-⇒-code-function-code"},"14.26":{t:"pluginFilesystemServer.findInTree(path) ⇒ Object",p:"Return a n ...",l:"plugins/filesystem.html#pluginfilesystemserver-findintree-path-⇒-code-object-code",a:"pluginfilesystemserver-findintree-path-⇒-code-object-code"},"14.27":{t:"pluginFilesystemServer.writeFile(pathname, data) ⇒ Promise",p:"Write a fi ...",l:"plugins/filesystem.html#pluginfilesystemserver-writefile-pathname-data-⇒-code-promise-code",a:"pluginfilesystemserver-writefile-pathname-data-⇒-code-promise-code"},"14.28":{t:"pluginFilesystemServer.mkdir(pathname) ⇒ Promise",p:"Create a d ...",l:"plugins/filesystem.html#pluginfilesystemserver-mkdir-pathname-⇒-code-promise-code",a:"pluginfilesystemserver-mkdir-pathname-⇒-code-promise-code"},"14.29":{t:"pluginFilesystemServer.rename(oldPath, newPath) ⇒ Promise",p:"Rename a f ...",l:"plugins/filesystem.html#pluginfilesystemserver-rename-oldpath-newpath-⇒-code-promise-code",a:"pluginfilesystemserver-rename-oldpath-newpath-⇒-code-promise-code"},"14.30":{t:"pluginFilesystemServer.rm(pathname) ⇒ Promise",p:"Delete a f ...",l:"plugins/filesystem.html#pluginfilesystemserver-rm-pathname-⇒-code-promise-code",a:"pluginfilesystemserver-rm-pathname-⇒-code-promise-code"},"14.31":{t:"Credits",p:"https://so ...",l:"plugins/filesystem.html#credits",a:"credits"},"14.32":{t:"License",p:"BSD-3-Clau ...",l:"plugins/filesystem.html#license",a:"license"},"15.0":{t:"# soundworks | plugin logger",p:` -soundwork ...`,l:"plugins/logger.html",a:"soundworks-plugin-logger"},"15.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/logger.html#table-of-contents",a:"table-of-contents"},"15.2":{t:"Installation",p:"npm instal ...",l:"plugins/logger.html#installation",a:"installation"},"15.3":{t:"Usage",p:"",l:"plugins/logger.html#usage",a:"usage"},"15.4":{t:"Server",p:"// index.j ...",l:"plugins/logger.html#server",a:"server"},"15.5":{t:"Client",p:"// index.j ...",l:"plugins/logger.html#client",a:"client"},"15.6":{t:"Notes & Receipes",p:"In the fol ...",l:"plugins/logger.html#notes-receipes",a:"notes-receipes"},"15.7":{t:"Default extension",p:"If a write ...",l:"plugins/logger.html#default-extension",a:"default-extension"},"15.8":{t:"Prefix in log files",p:"By default ...",l:"plugins/logger.html#prefix-in-log-files",a:"prefix-in-log-files"},"15.9":{t:"Creating log files in sub-directories",p:"If a path ...",l:"plugins/logger.html#creating-log-files-in-sub-directories",a:"creating-log-files-in-sub-directories"},"15.10":{t:"Share a writer between several clients",p:"In a simil ...",l:"plugins/logger.html#share-a-writer-between-several-clients",a:"share-a-writer-between-several-clients"},"15.11":{t:"Client-side buffering",p:"In many ca ...",l:"plugins/logger.html#client-side-buffering",a:"client-side-buffering"},"15.12":{t:"API",p:"<!-- ap ...",l:"plugins/logger.html#api",a:"api"},"15.13":{t:"Classes",p:"<dl> ...",l:"plugins/logger.html#classes",a:"classes"},"15.14":{t:"PluginLoggerClient",p:"Client-sid ...",l:"plugins/logger.html#pluginloggerclient",a:"pluginloggerclient"},"15.15":{t:"new PluginLoggerClient()",p:"The constr ...",l:"plugins/logger.html#new-pluginloggerclient",a:"new-pluginloggerclient"},"15.16":{t:"pluginLoggerClient.createWriter(name, options)",p:"Create a w ...",l:"plugins/logger.html#pluginloggerclient-createwriter-name-options",a:"pluginloggerclient-createwriter-name-options"},"15.17":{t:"pluginLoggerClient.attachWriter(name, options)",p:"Attach to ...",l:"plugins/logger.html#pluginloggerclient-attachwriter-name-options",a:"pluginloggerclient-attachwriter-name-options"},"15.18":{t:"PluginLoggerServer",p:"Server-sid ...",l:"plugins/logger.html#pluginloggerserver",a:"pluginloggerserver"},"15.19":{t:"new PluginLoggerServer()",p:"The constr ...",l:"plugins/logger.html#new-pluginloggerserver",a:"new-pluginloggerserver"},"15.20":{t:"pluginLoggerServer.switch(dirname)",p:"Change the ...",l:"plugins/logger.html#pluginloggerserver-switch-dirname",a:"pluginloggerserver-switch-dirname"},"15.21":{t:"pluginLoggerServer.createWriter(name, options)",p:"Create a w ...",l:"plugins/logger.html#pluginloggerserver-createwriter-name-options",a:"pluginloggerserver-createwriter-name-options"},"15.22":{t:"WriterClient",p:"Client-sid ...",l:"plugins/logger.html#writerclient",a:"writerclient"},"15.23":{t:"writerClient.name",p:"Name of th ...",l:"plugins/logger.html#writerclient-name",a:"writerclient-name"},"15.24":{t:"writerClient.pathname",p:"Pathname o ...",l:"plugins/logger.html#writerclient-pathname",a:"writerclient-pathname"},"15.25":{t:"writerClient.write(data)",p:"Format and ...",l:"plugins/logger.html#writerclient-write-data",a:"writerclient-write-data"},"15.26":{t:"writerClient.flush()",p:"Flush the ...",l:"plugins/logger.html#writerclient-flush",a:"writerclient-flush"},"15.27":{t:"writerClient.close() ⇒ Promise",p:"Close the ...",l:"plugins/logger.html#writerclient-close-⇒-code-promise-code",a:"writerclient-close-⇒-code-promise-code"},"15.28":{t:"writerClient.onPacketSend(callback) ⇒",p:"Register a ...",l:"plugins/logger.html#writerclient-onpacketsend-callback-⇒",a:"writerclient-onpacketsend-callback-⇒"},"15.29":{t:"writerClient.onClose(callback) ⇒",p:"Register a ...",l:"plugins/logger.html#writerclient-onclose-callback-⇒",a:"writerclient-onclose-callback-⇒"},"15.30":{t:"WriterServer",p:"Server-sid ...",l:"plugins/logger.html#writerserver",a:"writerserver"},"15.31":{t:"writerServer.name",p:"Name of th ...",l:"plugins/logger.html#writerserver-name",a:"writerserver-name"},"15.32":{t:"writerServer.pathname",p:"Pathname o ...",l:"plugins/logger.html#writerserver-pathname",a:"writerserver-pathname"},"15.33":{t:"writerServer.write(data)",p:"Format and ...",l:"plugins/logger.html#writerserver-write-data",a:"writerserver-write-data"},"15.34":{t:"writerServer.close() ⇒ Promise",p:"Close the ...",l:"plugins/logger.html#writerserver-close-⇒-code-promise-code",a:"writerserver-close-⇒-code-promise-code"},"15.35":{t:"writerServer.onClose(callback) ⇒",p:"Register a ...",l:"plugins/logger.html#writerserver-onclose-callback-⇒",a:"writerserver-onclose-callback-⇒"},"15.36":{t:"Credits",p:"The code h ...",l:"plugins/logger.html#credits",a:"credits"},"15.37":{t:"License",p:"BSD-3-Clau ...",l:"plugins/logger.html#license",a:"license"},"16.0":{t:"# soundworks | plugin platform init",p:` -soundwork ...`,l:"plugins/platform-init.html",a:"soundworks-plugin-platform-init"},"16.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/platform-init.html#table-of-contents",a:"table-of-contents"},"16.2":{t:"Installation",p:"npm instal ...",l:"plugins/platform-init.html#installation",a:"installation"},"16.3":{t:"Usage",p:"",l:"plugins/platform-init.html#usage",a:"usage"},"16.4":{t:"Server",p:"// src/ser ...",l:"plugins/platform-init.html#server",a:"server"},"16.5":{t:"Client",p:"// src/cli ...",l:"plugins/platform-init.html#client",a:"client"},"16.6":{t:"Available features",p:"By default ...",l:"plugins/platform-init.html#available-features",a:"available-features"},"16.7":{t:"API",p:"<!-- ap ...",l:"plugins/platform-init.html#api",a:"api"},"16.8":{t:"Classes",p:"<dl> ...",l:"plugins/platform-init.html#classes",a:"classes"},"16.9":{t:"PluginPlatformInitClient",p:"Client-sid ...",l:"plugins/platform-init.html#pluginplatforminitclient",a:"pluginplatforminitclient"},"16.10":{t:"new PluginPlatformInitClient()",p:"The constr ...",l:"plugins/platform-init.html#new-pluginplatforminitclient",a:"new-pluginplatforminitclient"},"16.11":{t:"pluginPlatformInitClient.onUserGesture()",p:"Method to ...",l:"plugins/platform-init.html#pluginplatforminitclient-onusergesture",a:"pluginplatforminitclient-onusergesture"},"16.12":{t:"pluginPlatformInitClient.get(featureId)",p:"Returns th ...",l:"plugins/platform-init.html#pluginplatforminitclient-get-featureid",a:"pluginplatforminitclient-get-featureid"},"16.13":{t:"PluginPlatformInitServer",p:"Client-sid ...",l:"plugins/platform-init.html#pluginplatforminitserver",a:"pluginplatforminitserver"},"16.14":{t:"Credits",p:"https://so ...",l:"plugins/platform-init.html#credits",a:"credits"},"16.15":{t:"License",p:"BSD-3-Clau ...",l:"plugins/platform-init.html#license",a:"license"},"17.0":{t:"# soundworks | plugin position",p:` -soundwork ...`,l:"plugins/position.html",a:"soundworks-plugin-position"},"17.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/position.html#table-of-contents",a:"table-of-contents"},"17.2":{t:"Installation",p:"npm instal ...",l:"plugins/position.html#installation",a:"installation"},"17.3":{t:"Usage",p:"",l:"plugins/position.html#usage",a:"usage"},"17.4":{t:"Server",p:"// index.j ...",l:"plugins/position.html#server",a:"server"},"17.5":{t:"Client",p:"// index.j ...",l:"plugins/position.html#client",a:"client"},"17.6":{t:"API",p:"<!-- ap ...",l:"plugins/position.html#api",a:"api"},"17.7":{t:"Classes",p:"<dl> ...",l:"plugins/position.html#classes",a:"classes"},"17.8":{t:"PluginPositionClient",p:"Client-sid ...",l:"plugins/position.html#pluginpositionclient",a:"pluginpositionclient"},"17.9":{t:"new PluginPositionClient()",p:"The constr ...",l:"plugins/position.html#new-pluginpositionclient",a:"new-pluginpositionclient"},"17.10":{t:"pluginPositionClient.setPosition(x, y)",p:"Set the x ...",l:"plugins/position.html#pluginpositionclient-setposition-x-y",a:"pluginpositionclient-setposition-x-y"},"17.11":{t:"pluginPositionClient.getPosition() ⇒ Object",p:"Retrieve t ...",l:"plugins/position.html#pluginpositionclient-getposition-⇒-code-object-code",a:"pluginpositionclient-getposition-⇒-code-object-code"},"17.12":{t:"pluginPositionClient.setNormalizedPosition(x, y)",p:"Set the x ...",l:"plugins/position.html#pluginpositionclient-setnormalizedposition-x-y",a:"pluginpositionclient-setnormalizedposition-x-y"},"17.13":{t:"pluginPositionClient.getNormalizedPosition() ⇒ Object",p:"Retrieve t ...",l:"plugins/position.html#pluginpositionclient-getnormalizedposition-⇒-code-object-code",a:"pluginpositionclient-getnormalizedposition-⇒-code-object-code"},"17.14":{t:"PluginPositionServer",p:"Server-sid ...",l:"plugins/position.html#pluginpositionserver",a:"pluginpositionserver"},"17.15":{t:"new PluginPositionServer()",p:"The constr ...",l:"plugins/position.html#new-pluginpositionserver",a:"new-pluginpositionserver"},"17.16":{t:"Credits",p:"https://so ...",l:"plugins/position.html#credits",a:"credits"},"17.17":{t:"License",p:"BSD-3-Clau ...",l:"plugins/position.html#license",a:"license"},"18.0":{t:"# soundworks | plugin scripting",p:` -soundwork ...`,l:"plugins/scripting.html",a:"soundworks-plugin-scripting"},"18.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/scripting.html#table-of-contents",a:"table-of-contents"},"18.2":{t:"Installation",p:"npm instal ...",l:"plugins/scripting.html#installation",a:"installation"},"18.3":{t:"Usage",p:"",l:"plugins/scripting.html#usage",a:"usage"},"18.4":{t:"Server",p:"// src/ser ...",l:"plugins/scripting.html#server",a:"server"},"18.5":{t:"Client",p:"// src/cli ...",l:"plugins/scripting.html#client",a:"client"},"18.6":{t:"Notes",p:"The shared ...",l:"plugins/scripting.html#notes",a:"notes"},"18.7":{t:"API",p:"<!-- ap ...",l:"plugins/scripting.html#api",a:"api"},"18.8":{t:"Classes",p:"<dl> ...",l:"plugins/scripting.html#classes",a:"classes"},"18.9":{t:"PluginScriptingClient",p:"Client-sid ...",l:"plugins/scripting.html#pluginscriptingclient",a:"pluginscriptingclient"},"18.10":{t:"pluginScriptingClient.setGlobalScriptingContext(ctx)",p:"Registers ...",l:"plugins/scripting.html#pluginscriptingclient-setglobalscriptingcontext-ctx",a:"pluginscriptingclient-setglobalscriptingcontext-ctx"},"18.11":{t:"pluginScriptingClient.getList() ⇒ Array",p:"Returns th ...",l:"plugins/scripting.html#pluginscriptingclient-getlist-⇒-code-array-code",a:"pluginscriptingclient-getlist-⇒-code-array-code"},"18.12":{t:"pluginScriptingClient.getTree() ⇒ Object",p:"Convenienc ...",l:"plugins/scripting.html#pluginscriptingclient-gettree-⇒-code-object-code",a:"pluginscriptingclient-gettree-⇒-code-object-code"},"18.13":{t:"pluginScriptingClient.createScript(name, [value]) ⇒ Promise",p:"Create a n ...",l:"plugins/scripting.html#pluginscriptingclient-createscript-name-value-⇒-code-promise-code",a:"pluginscriptingclient-createscript-name-value-⇒-code-promise-code"},"18.14":{t:"pluginScriptingClient.updateScript(name, value) ⇒ Promise",p:"Update an ...",l:"plugins/scripting.html#pluginscriptingclient-updatescript-name-value-⇒-code-promise-code",a:"pluginscriptingclient-updatescript-name-value-⇒-code-promise-code"},"18.15":{t:"pluginScriptingClient.deleteScript(name) ⇒ Promise",p:"Delete a s ...",l:"plugins/scripting.html#pluginscriptingclient-deletescript-name-⇒-code-promise-code",a:"pluginscriptingclient-deletescript-name-⇒-code-promise-code"},"18.16":{t:"pluginScriptingClient.attach(name) ⇒ Promise",p:"Attach to ...",l:"plugins/scripting.html#pluginscriptingclient-attach-name-⇒-code-promise-code",a:"pluginscriptingclient-attach-name-⇒-code-promise-code"},"18.17":{t:"PluginScriptingServer",p:"Server-sid ...",l:"plugins/scripting.html#pluginscriptingserver",a:"pluginscriptingserver"},"18.18":{t:"new PluginScriptingServer()",p:"The constr ...",l:"plugins/scripting.html#new-pluginscriptingserver",a:"new-pluginscriptingserver"},"18.19":{t:"pluginScriptingServer.setGlobalScriptingContext(ctx)",p:"Registers ...",l:"plugins/scripting.html#pluginscriptingserver-setglobalscriptingcontext-ctx",a:"pluginscriptingserver-setglobalscriptingcontext-ctx"},"18.20":{t:"pluginScriptingServer.getList() ⇒ Array",p:"Returns th ...",l:"plugins/scripting.html#pluginscriptingserver-getlist-⇒-code-array-code",a:"pluginscriptingserver-getlist-⇒-code-array-code"},"18.21":{t:"pluginScriptingServer.getTree() ⇒ Object",p:"Convenienc ...",l:"plugins/scripting.html#pluginscriptingserver-gettree-⇒-code-object-code",a:"pluginscriptingserver-gettree-⇒-code-object-code"},"18.22":{t:"pluginScriptingServer.onUpdate(callback, [executeListener]) ⇒ function",p:"Register c ...",l:"plugins/scripting.html#pluginscriptingserver-onupdate-callback-executelistener-⇒-code-function-code",a:"pluginscriptingserver-onupdate-callback-executelistener-⇒-code-function-code"},"18.23":{t:"pluginScriptingServer.switch(dirname)",p:"Switch the ...",l:"plugins/scripting.html#pluginscriptingserver-switch-dirname",a:"pluginscriptingserver-switch-dirname"},"18.24":{t:"pluginScriptingServer.createScript(name, [value]) ⇒ Promise",p:"Create a n ...",l:"plugins/scripting.html#pluginscriptingserver-createscript-name-value-⇒-code-promise-code",a:"pluginscriptingserver-createscript-name-value-⇒-code-promise-code"},"18.25":{t:"pluginScriptingServer.updateScript(name, value) ⇒ Promise",p:"Update an ...",l:"plugins/scripting.html#pluginscriptingserver-updatescript-name-value-⇒-code-promise-code",a:"pluginscriptingserver-updatescript-name-value-⇒-code-promise-code"},"18.26":{t:"pluginScriptingServer.deleteScript(name) ⇒ Promise",p:"Delete a s ...",l:"plugins/scripting.html#pluginscriptingserver-deletescript-name-⇒-code-promise-code",a:"pluginscriptingserver-deletescript-name-⇒-code-promise-code"},"18.27":{t:"pluginScriptingServer.attach(name) ⇒ Promise",p:"Attach to ...",l:"plugins/scripting.html#pluginscriptingserver-attach-name-⇒-code-promise-code",a:"pluginscriptingserver-attach-name-⇒-code-promise-code"},"18.28":{t:"SharedScript",p:"A SharedSc ...",l:"plugins/scripting.html#sharedscript",a:"sharedscript"},"18.29":{t:"sharedScript.source : string",p:"Kind: inst ...",l:"plugins/scripting.html#sharedscript-source-code-string-code",a:"sharedscript-source-code-string-code"},"18.30":{t:"sharedScript.error : string",p:"Kind: inst ...",l:"plugins/scripting.html#sharedscript-error-code-string-code",a:"sharedscript-error-code-string-code"},"18.31":{t:"sharedScript.transpiled : string",p:"Kind: inst ...",l:"plugins/scripting.html#sharedscript-transpiled-code-string-code",a:"sharedscript-transpiled-code-string-code"},"18.32":{t:"sharedScript.import() ⇒ Promise",p:"Dynamicall ...",l:"plugins/scripting.html#sharedscript-import-⇒-code-promise-code",a:"sharedscript-import-⇒-code-promise-code"},"18.33":{t:"sharedScript.detach()",p:"Stop liste ...",l:"plugins/scripting.html#sharedscript-detach",a:"sharedscript-detach"},"18.34":{t:"sharedScript.onUpdate(callback, [executeListener]) ⇒ function",p:"Register a ...",l:"plugins/scripting.html#sharedscript-onupdate-callback-executelistener-⇒-code-function-code",a:"sharedscript-onupdate-callback-executelistener-⇒-code-function-code"},"18.35":{t:"sharedScript.onDetach(callback)",p:"Register a ...",l:"plugins/scripting.html#sharedscript-ondetach-callback",a:"sharedscript-ondetach-callback"},"18.36":{t:"sharedScript.update(value)",p:"Alias for ...",l:"plugins/scripting.html#sharedscript-update-value",a:"sharedscript-update-value"},"18.37":{t:"sharedScript.delete()",p:"Alias for ...",l:"plugins/scripting.html#sharedscript-delete",a:"sharedscript-delete"},"18.38":{t:"Credits",p:"https://so ...",l:"plugins/scripting.html#credits",a:"credits"},"18.39":{t:"License",p:"BSD-3-Clau ...",l:"plugins/scripting.html#license",a:"license"},"19.0":{t:"# soundworks | plugin sync",p:` -soundwork ...`,l:"plugins/sync.html",a:"soundworks-plugin-sync"},"19.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/sync.html#table-of-contents",a:"table-of-contents"},"19.2":{t:"Installation",p:"npm instal ...",l:"plugins/sync.html#installation",a:"installation"},"19.3":{t:"Usage",p:"",l:"plugins/sync.html#usage",a:"usage"},"19.4":{t:"Server",p:"// index.j ...",l:"plugins/sync.html#server",a:"server"},"19.5":{t:"Client",p:"// index.j ...",l:"plugins/sync.html#client",a:"client"},"19.6":{t:"Notes & Receipes",p:"",l:"plugins/sync.html#notes-receipes",a:"notes-receipes"},"19.7":{t:"Default clocks",p:"On the ser ...",l:"plugins/sync.html#default-clocks",a:"default-clocks"},"19.8":{t:"Using `audioContext.currentTime` as the local clock",p:"An importa ...",l:"plugins/sync.html#using-audiocontext-currenttime-as-the-local-clock",a:"using-audiocontext-currenttime-as-the-local-clock"},"19.9":{t:"Scheduling synchronized audio events",p:"When you p ...",l:"plugins/sync.html#scheduling-synchronized-audio-events",a:"scheduling-synchronized-audio-events"},"19.10":{t:"Correspondances between local time and sync time",p:"The follow ...",l:"plugins/sync.html#correspondances-between-local-time-and-sync-time",a:"correspondances-between-local-time-and-sync-time"},"19.11":{t:"API",p:"<!-- ap ...",l:"plugins/sync.html#api",a:"api"},"19.12":{t:"Classes",p:"<dl> ...",l:"plugins/sync.html#classes",a:"classes"},"19.13":{t:"PluginSyncClient",p:"Client-sid ...",l:"plugins/sync.html#pluginsyncclient",a:"pluginsyncclient"},"19.14":{t:"new PluginSyncClient()",p:"The constr ...",l:"plugins/sync.html#new-pluginsyncclient",a:"new-pluginsyncclient"},"19.15":{t:"pluginSyncClient.getLocalTime([syncTime]) ⇒ Number",p:"Time of th ...",l:"plugins/sync.html#pluginsyncclient-getlocaltime-synctime-⇒-code-number-code",a:"pluginsyncclient-getlocaltime-synctime-⇒-code-number-code"},"19.16":{t:"pluginSyncClient.getSyncTime([audioTime]) ⇒ Number",p:"Time of th ...",l:"plugins/sync.html#pluginsyncclient-getsynctime-audiotime-⇒-code-number-code",a:"pluginsyncclient-getsynctime-audiotime-⇒-code-number-code"},"19.17":{t:"pluginSyncClient.onReport(callback)",p:"Subscribe ...",l:"plugins/sync.html#pluginsyncclient-onreport-callback",a:"pluginsyncclient-onreport-callback"},"19.18":{t:"pluginSyncClient.getReport() ⇒ Object",p:"Get last s ...",l:"plugins/sync.html#pluginsyncclient-getreport-⇒-code-object-code",a:"pluginsyncclient-getreport-⇒-code-object-code"},"19.19":{t:"PluginSyncServer",p:"Server-sid ...",l:"plugins/sync.html#pluginsyncserver",a:"pluginsyncserver"},"19.20":{t:"new PluginSyncServer()",p:"The constr ...",l:"plugins/sync.html#new-pluginsyncserver",a:"new-pluginsyncserver"},"19.21":{t:"pluginSyncServer.getLocalTime([syncTime]) ⇒ Number",p:"Time of th ...",l:"plugins/sync.html#pluginsyncserver-getlocaltime-synctime-⇒-code-number-code",a:"pluginsyncserver-getlocaltime-synctime-⇒-code-number-code"},"19.22":{t:"pluginSyncServer.getSyncTime([localTime]) ⇒ Number",p:"Time of th ...",l:"plugins/sync.html#pluginsyncserver-getsynctime-localtime-⇒-code-number-code",a:"pluginsyncserver-getsynctime-localtime-⇒-code-number-code"},"19.23":{t:"Resources",p:` -Jean-Phil ...`,l:"plugins/sync.html#resources",a:"resources"},"19.24":{t:"Credits",p:"https://so ...",l:"plugins/sync.html#credits",a:"credits"},"19.25":{t:"License",p:"BSD-3-Clau ...",l:"plugins/sync.html#license",a:"license"},"20.0":{t:"# Creating a Connected Lamp",p:"In this tu ...",l:"tutorials/_connected-lamp.html",a:"creating-a-connected-lamp"},"21.0":{t:"# Using Contexts",p:"In this tu ...",l:"tutorials/_context.html",a:"using-contexts"},"21.1":{t:"Relevant API documentation",p:"",l:"tutorials/_context.html#relevant-api-documentation",a:"relevant-api-documentation"},"21.2":{t:"Introduction",p:"",l:"tutorials/_context.html#introduction",a:"introduction"},"21.3":{t:"How context works",p:"",l:"tutorials/_context.html#how-context-works",a:"how-context-works"},"21.4":{t:"Creating a simple router",p:"",l:"tutorials/_context.html#creating-a-simple-router",a:"creating-a-simple-router"},"21.5":{t:"Using contexts to model sections of an experience",p:"",l:"tutorials/_context.html#using-contexts-to-model-sections-of-an-experience",a:"using-contexts-to-model-sections-of-an-experience"},"21.6":{t:"conclusion",p:"",l:"tutorials/_context.html#conclusion",a:"conclusion"},"22.0":{t:"# Getting Started",p:"In this tu ...",l:"tutorials/getting-started.html",a:"getting-started"},"22.1":{t:"Prerequisites",p:` -Node.js 1 ...`,l:"tutorials/getting-started.html#prerequisites",a:"prerequisites"},"22.2":{t:"Step 1 - Setting things up",p:"The best a ...",l:"tutorials/getting-started.html#step-1-setting-things-up",a:"step-1-setting-things-up"},"22.3":{t:"Step 2 - Exploring the file structure of the application",p:"Press Ctrl ...",l:"tutorials/getting-started.html#step-2-exploring-the-file-structure-of-the-application",a:"step-2-exploring-the-file-structure-of-the-application"},"22.4":{t:"Step 3 - Create a global shared state",p:"First, go ...",l:"tutorials/getting-started.html#step-3-create-a-global-shared-state",a:"step-3-create-a-global-shared-state"},"22.5":{t:"Step 4 - Make clients interactive",p:"Now that t ...",l:"tutorials/getting-started.html#step-4-make-clients-interactive",a:"step-4-make-clients-interactive"},"22.6":{t:"Conclusion",p:"Congrats, ...",l:"tutorials/getting-started.html#conclusion",a:"conclusion"},"23.0":{t:"# Working with Node Clients",p:"In this tu ...",l:"tutorials/node-clients.html",a:"working-with-node-clients"},"23.1":{t:"Related Documentation",p:` -soundwork ...`,l:"tutorials/node-clients.html#related-documentation",a:"related-documentation"},"23.2":{t:"Scaffolding Application",p:"Let's star ...",l:"tutorials/node-clients.html#scaffolding-application",a:"scaffolding-application"},"23.3":{t:"Implementing the control logic",p:"Before imp ...",l:"tutorials/node-clients.html#implementing-the-control-logic",a:"implementing-the-control-logic"},"23.4":{t:"Implementing the _Node.js_ client",p:"Let's shut ...",l:"tutorials/node-clients.html#implementing-the-node-js-client",a:"implementing-the-node-js-client"},"23.5":{t:"Notes",p:"",l:"tutorials/node-clients.html#notes",a:"notes"},"23.6":{t:"Emulating multiple clients",p:"In previou ...",l:"tutorials/node-clients.html#emulating-multiple-clients",a:"emulating-multiple-clients"},"23.7":{t:"Running node client on a network",p:"Another im ...",l:"tutorials/node-clients.html#running-node-client-on-a-network",a:"running-node-client-on-a-network"},"23.8":{t:"Conclusion",p:"In this tu ...",l:"tutorials/node-clients.html#conclusion",a:"conclusion"},"24.0":{t:"# Using Plugins 1 - The _platform-init_ Plugin",p:"In this fi ...",l:"tutorials/plugin-platform-init.html",a:"using-plugins-1-the-platform-init-plugin"},"24.1":{t:"Relevant documentation",p:` -client.Pl ...`,l:"tutorials/plugin-platform-init.html#relevant-documentation",a:"relevant-documentation"},"24.2":{t:"Scaffolding the application and installing the plugin",p:"First thin ...",l:"tutorials/plugin-platform-init.html#scaffolding-the-application-and-installing-the-plugin",a:"scaffolding-the-application-and-installing-the-plugin"},"24.3":{t:"Registering the plugin into _soundworks_",p:"Now that t ...",l:"tutorials/plugin-platform-init.html#registering-the-plugin-into-soundworks",a:"registering-the-plugin-into-soundworks"},"24.4":{t:"Server-side registration",p:"Let's star ...",l:"tutorials/plugin-platform-init.html#server-side-registration",a:"server-side-registration"},"24.5":{t:"Client-side registration",p:"Let's open ...",l:"tutorials/plugin-platform-init.html#client-side-registration",a:"client-side-registration"},"24.6":{t:"Resuming an `AudioContext`",p:"So far, so ...",l:"tutorials/plugin-platform-init.html#resuming-an-audiocontext",a:"resuming-an-audiocontext"},"24.7":{t:"Notes on the `@soundworks/helpers` default views",p:"The spashs ...",l:"tutorials/plugin-platform-init.html#notes-on-the-soundworks-helpers-default-views",a:"notes-on-the-soundworks-helpers-default-views"},"24.8":{t:"Conclusion",p:"In this tu ...",l:"tutorials/plugin-platform-init.html#conclusion",a:"conclusion"},"25.0":{t:"# Using Plugins 2 - The _sync_ Plugin",p:"In this tu ...",l:"tutorials/plugin-sync.html",a:"using-plugins-2-the-sync-plugin"},"25.1":{t:"Relevant documentation",p:` -@soundwor ...`,l:"tutorials/plugin-sync.html#relevant-documentation",a:"relevant-documentation"},"25.2":{t:"Introduction",p:"First of a ...",l:"tutorials/plugin-sync.html#introduction",a:"introduction"},"25.3":{t:'The "Why"',p:"An importa ...",l:"tutorials/plugin-sync.html#the-why",a:"the-why"},"25.4":{t:'The "How"',p:"On a more ...",l:"tutorials/plugin-sync.html#the-how",a:"the-how"},"25.5":{t:"Scaffolding the application",p:"First thin ...",l:"tutorials/plugin-sync.html#scaffolding-the-application",a:"scaffolding-the-application"},"25.6":{t:"Using the _sync_ plugin",p:"",l:"tutorials/plugin-sync.html#using-the-sync-plugin",a:"using-the-sync-plugin"},"25.7":{t:"Register the plugin",p:"Now that e ...",l:"tutorials/plugin-sync.html#register-the-plugin",a:"register-the-plugin"},"25.8":{t:"Synchronizing the audio context",p:"So far so ...",l:"tutorials/plugin-sync.html#synchronizing-the-audio-context",a:"synchronizing-the-audio-context"},"25.9":{t:"Conclusion",p:"In this tu ...",l:"tutorials/plugin-sync.html#conclusion",a:"conclusion"},"26.0":{t:"# Using the State Manager",p:"In this tu ...",l:"tutorials/state-manager.html",a:"using-the-state-manager"},"26.1":{t:"Relevant documentation",p:` -client.St ...`,l:"tutorials/state-manager.html#relevant-documentation",a:"relevant-documentation"},"26.2":{t:"Introduction",p:"First of a ...",l:"tutorials/state-manager.html#introduction",a:"introduction"},"26.3":{t:'The "Why"',p:"Most of th ...",l:"tutorials/state-manager.html#the-why",a:"the-why"},"26.4":{t:'The "How"',p:"From a mor ...",l:"tutorials/state-manager.html#the-how",a:"the-how"},"26.5":{t:"Scaffolding the application",p:`::: info -T ...`,l:"tutorials/state-manager.html#scaffolding-the-application",a:"scaffolding-the-application"},"26.6":{t:"Declaring schemas",p:"The StateM ...",l:"tutorials/state-manager.html#declaring-schemas",a:"declaring-schemas"},"26.7":{t:"Registering schemas",p:"Let's firs ...",l:"tutorials/state-manager.html#registering-schemas",a:"registering-schemas"},"26.8":{t:"Creating shared states",p:"Let's firs ...",l:"tutorials/state-manager.html#creating-shared-states",a:"creating-shared-states"},"26.9":{t:"Display the states values",p:"Now that o ...",l:"tutorials/state-manager.html#display-the-states-values",a:"display-the-states-values"},"26.10":{t:"Remote control and monitoring",p:"In this se ...",l:"tutorials/state-manager.html#remote-control-and-monitoring",a:"remote-control-and-monitoring"},"26.11":{t:"Scaffolding the _controller_ client",p:"Let's use ...",l:"tutorials/state-manager.html#scaffolding-the-controller-client",a:"scaffolding-the-controller-client"},"26.12":{t:"Binding the `global` state",p:"Let's star ...",l:"tutorials/state-manager.html#binding-the-global-state",a:"binding-the-global-state"},"26.13":{t:"Observing and controlling collections of states",p:"The final ...",l:"tutorials/state-manager.html#observing-and-controlling-collections-of-states",a:"observing-and-controlling-collections-of-states"},"26.14":{t:"Using the client id to enhance the control interface",p:"To fix thi ...",l:"tutorials/state-manager.html#using-the-client-id-to-enhance-the-control-interface",a:"using-the-client-id-to-enhance-the-control-interface"},"26.15":{t:"Conclusion",p:"In this tu ...",l:"tutorials/state-manager.html#conclusion",a:"conclusion"},"27.0":{t:"# Synchronized Scheduling - Building a Distributed Step Sequencer",p:`@todo -`,l:"tutorials/synchronized-scheduling.html",a:"synchronized-scheduling-building-a-distributed-step-sequencer"},"28.0":{t:"# The _Todo Noise_ Application",p:"In this tu ...",l:"tutorials/todo-noise.html",a:"the-todo-noise-application"},"28.1":{t:"Relevant documentation",p:` -client.Sh ...`,l:"tutorials/todo-noise.html#relevant-documentation",a:"relevant-documentation"},"28.2":{t:"User Story",p:"The applic ...",l:"tutorials/todo-noise.html#user-story",a:"user-story"},"28.3":{t:"Scaffolding the application",p:"First thin ...",l:"tutorials/todo-noise.html#scaffolding-the-application",a:"scaffolding-the-application"},"28.4":{t:"Creating and using the shared `global` state",p:"To impleme ...",l:"tutorials/todo-noise.html#creating-and-using-the-shared-global-state",a:"creating-and-using-the-shared-global-state"},"28.5":{t:"Create the shared instance",p:"First let' ...",l:"tutorials/todo-noise.html#create-the-shared-instance",a:"create-the-shared-instance"},"28.6":{t:"Attaching the `global` state to the _player_ clients",p:"Let's now ...",l:"tutorials/todo-noise.html#attaching-the-global-state-to-the-player-clients",a:"attaching-the-global-state-to-the-player-clients"},"28.7":{t:"Controlling the `global` shared states from the _controller_ clients",p:"Now that e ...",l:"tutorials/todo-noise.html#controlling-the-global-shared-states-from-the-controller-clients",a:"controlling-the-global-shared-states-from-the-controller-clients"},"28.8":{t:"Creating and using the `player` shared states",p:"As defined ...",l:"tutorials/todo-noise.html#creating-and-using-the-player-shared-states",a:"creating-and-using-the-player-shared-states"},"28.9":{t:"Registering the schema and creating the states",p:"To that en ...",l:"tutorials/todo-noise.html#registering-the-schema-and-creating-the-states",a:"registering-the-schema-and-creating-the-states"},"28.10":{t:"Creating the graphical user interface",p:"Then, let' ...",l:"tutorials/todo-noise.html#creating-the-graphical-user-interface",a:"creating-the-graphical-user-interface"},"28.11":{t:"Creating the synthesizers",p:"Eveything ...",l:"tutorials/todo-noise.html#creating-the-synthesizers",a:"creating-the-synthesizers"},"28.12":{t:"Resume the context with the `platform-init` plugin",p:"First thin ...",l:"tutorials/todo-noise.html#resume-the-context-with-the-platform-init-plugin",a:"resume-the-context-with-the-platform-init-plugin"},"28.13":{t:"Create the master chain",p:"Then let's ...",l:"tutorials/todo-noise.html#create-the-master-chain",a:"create-the-master-chain"},"28.14":{t:"Implement the two synths",p:"Now that a ...",l:"tutorials/todo-noise.html#implement-the-two-synths",a:"implement-the-two-synths"},"28.15":{t:"Remotely control players from the controller",p:"Let's go b ...",l:"tutorials/todo-noise.html#remotely-control-players-from-the-controller",a:"remotely-control-players-from-the-controller"},"28.16":{t:"Conclusion",p:"In this tu ...",l:"tutorials/todo-noise.html#conclusion",a:"conclusion"}},i={previewLength:10,buttonLabel:"Search",placeholder:"Search docs",allow:[],ignore:[]},n={INDEX_DATA:e,PREVIEW_LOOKUP:t,Options:i};export{n as default}; diff --git a/assets/chunks/virtual_search-data.8ca79d1f.js b/assets/chunks/virtual_search-data.8ca79d1f.js new file mode 100644 index 0000000..6510109 --- /dev/null +++ b/assets/chunks/virtual_search-data.8ca79d1f.js @@ -0,0 +1,32 @@ +const e={map:'[{"soundworks":["0.0","4.1","4.2","4.3","4.4","4.5","4.6","4.7","4.8","4.9","4.10","4.11","4.12","13.0","14.0","15.0","16.0","17.0","18.0","19.0"],"credits":["0.1","1.8","3.0","13.13","14.31","15.36","16.14","17.16","18.38","19.24"],"license":["0.2","3.6","13.14","14.32","15.37","16.15","17.17","18.39","19.25"],"notes":["1.0","14.7","15.6","18.6","19.6","23.5","24.7"],"structure":["1.1"],"homepage":["1.2"],"introduction":["1.3","6.0","21.2","25.2","26.2"],"tutorials":["1.4"],"receipes":["1.5"],"ecosystem":["1.6","4.0"],"misc":["1.7"],"design":["3.1"],"supporting":["3.2"],"artistic":["3.3"],"citing":["3.4"],"related":["3.5","23.1","25.1","27.1"],"div":["5.0"],"goal":["6.1"],"philosophy":["6.2"],"architecture":["6.3"],"client":["6.4","13.5","14.5","15.5","15.11","16.5","17.5","18.5","19.5","24.5"],"distributed":["6.5"],"plugin":["6.6"],"about":["6.7"],"contributing":["7.0"],"install":["7.1"],"run":["7.2"],"publish":["7.3"],"examples":["7.4"],"adding":["7.5","7.8"],"subsection":["7.6","7.7"],"deploying":["8.0"],"application":["8.1"],"nginx":["8.2"],"apache":["8.3"],"deployment":["9.0"],"network":["9.1"],"dhcp":["9.2"],"dns":["9.3"],"wifi":["9.4"],"sharing":["9.5"],"tp":["9.6"],"unify":["9.7"],"configuring":["9.8","9.10"],"creating":["9.9","10.0","15.9","20.0","21.4","26.8","28.4","28.8","28.10","28.11"],"the":["9.11","25.3","25.4","26.3","26.4","28.0"],"how":["10.1","21.3"],"auto":["10.2"],"websockets":["11.0"],"scaffolding":["11.1","23.2","24.2","25.5","26.5","26.11","27.2","28.3"],"implementing":["11.2","23.3","23.4","27.5","27.6"],"opening":["11.3"],"propagating":["11.4"],"conclusion":["11.5","21.6","22.6","23.8","24.8","25.9","26.15","28.16"],"copyright":["12.0"],"table":["13.1","14.1","15.1","16.1","17.1","18.1","19.1"],"installation":["13.2","14.2","15.2","16.2","17.2","18.2","19.2"],"usage":["13.3","14.3","15.3","16.3","17.3","18.3","19.3"],"server":["13.4","14.4","15.4","16.4","17.4","18.4","19.4","24.4"],"api":["13.6","14.10","15.12","16.7","17.6","18.7","19.11"],"classes":["13.7","14.11","15.13","16.8","17.7","18.8","19.12"],"plugincheckinclient":["13.8","13.9","13.10"],"plugincheckinserver":["13.11"],"new":["13.12","14.22","15.15","15.19","16.10","17.9","17.15","18.18","19.14","19.20"],"registering":["14.6","24.3","26.7","27.4","28.9"],"reading":["14.8"],"security":["14.9"],"pluginfilesystemclient":["14.12","14.13","14.14","14.15","14.16","14.17","14.18","14.19","14.20"],"pluginfilesystemserver":["14.21","14.23","14.24","14.25","14.26","14.27","14.28","14.29","14.30"],"default":["15.7","19.7"],"prefix":["15.8"],"share":["15.10"],"pluginloggerclient":["15.14","15.16","15.17"],"pluginloggerserver":["15.18","15.20","15.21"],"writerclient":["15.22","15.23","15.24","15.25","15.26","15.27","15.28","15.29"],"writerserver":["15.30","15.31","15.32","15.33","15.34","15.35"],"available":["16.6"],"pluginplatforminitclient":["16.9","16.11","16.12"],"pluginplatforminitserver":["16.13"],"pluginpositionclient":["17.8","17.10","17.11","17.12","17.13"],"pluginpositionserver":["17.14"],"pluginscriptingclient":["18.9","18.10","18.11","18.12","18.13","18.14","18.15","18.16"],"pluginscriptingserver":["18.17","18.19","18.20","18.21","18.22","18.23","18.24","18.25","18.26","18.27"],"sharedscript":["18.28","18.29","18.30","18.31","18.32","18.33","18.34","18.35","18.36","18.37"],"using":["19.8","21.0","21.5","24.0","25.0","25.6","26.0","26.14"],"scheduling":["19.9"],"correspondances":["19.10"],"pluginsyncclient":["19.13","19.15","19.16","19.17","19.18"],"pluginsyncserver":["19.19","19.21","19.22"],"resources":["19.23"],"relevant":["21.1","24.1","26.1","28.1"],"getting":["22.0"],"prerequisites":["22.1"],"step":["22.2","22.3","22.4","22.5"],"working":["23.0"],"emulating":["23.6"],"running":["23.7"],"resuming":["24.6"],"register":["25.7"],"synchronizing":["25.8"],"declaring":["26.6"],"display":["26.9"],"remote":["26.10"],"binding":["26.12"],"observing":["26.13"],"building":["27.0"],"defining":["27.3"],"user":["28.2"],"create":["28.5","28.13"],"attaching":["28.6"],"controlling":["28.7"],"resume":["28.12"],"implement":["28.14"],"remotely":["28.15"]},{"0":["22.5"],"1":["1.4","7.1","7.5","7.6","22.2","22.5","24.0","26.8","28.5"],"2":["7.7","22.3","25.0","25.4","28.4"],"3":["22.4"],"4":["22.5"],"5":["26.7"],"6":["26.7"],"7":["26.12"],"10":["26.12"],"101":["1.7","11.0"],"127":["22.5"],"2014":["12.0"],"8000":["22.5"],"website":["0.0","7.0"],"https":["0.1","5.0","7.7","9.11","13.0","13.13","14.31","16.14","17.0","17.16","18.38","19.0","19.24"],"bsd":["0.2","3.6","13.14","14.32","15.37","16.15","17.17","18.39","19.25"],"screenshot":["1.0"],"x":["1.2","1.3","1.4","1.7","17.10","17.12"],"links":["1.2","9.6"],"getting":["1.4","22.3"],"started":["1.4","22.0","22.3"],"using":["1.4","25.5","27.2","28.4","28.8","28.10"],"the":["1.4","3.3","4.1","4.6","4.10","6.2","6.3","6.4","6.5","6.7","7.3","7.8","8.0","8.1","8.2","11.1","11.2","11.4","12.0","13.12","14.6","14.8","14.12","14.15","14.21","14.22","14.23","15.10","15.15","15.19","15.20","15.26","15.36","16.6","16.10","16.11","16.12","17.9","17.10","17.12","17.15","18.6","18.9","18.17","18.18","18.23","19.7","19.8","19.10","19.14","19.15","19.16","19.20","19.21","19.22","22.2","22.3","22.4","22.5","22.6","23.3","23.4","23.7","24.0","24.2","24.3","24.4","24.5","24.6","24.7","24.8","25.0","25.5","25.6","25.7","25.8","25.9","26.0","26.5","26.6","26.7","26.8","26.9","26.11","26.12","26.13","26.14","26.15","27.0","27.2","27.3","27.4","27.5","27.6","28.2","28.3","28.4","28.5","28.6","28.7","28.8","28.9","28.10","28.11","28.12","28.13","28.14","28.15","28.16"],"state":["1.4","22.4","23.3","26.0","26.4","26.8","26.12","26.15","27.3","27.4","27.5","28.4","28.6","28.7","28.9","28.10","28.13","28.15"],"manager":["1.4","26.0","28.15"],"plugins":["1.4","24.0","24.8","25.0","27.4"],"soundworks":["1.4","1.6","3.1","3.3","5.0","6.1","6.2","6.4","6.6","6.7","14.4","14.12","14.21","15.4","16.6","16.10","17.4","18.9","18.17","22.2","22.6","23.0","24.2","24.3","24.7","24.8","26.4","26.5","26.11","26.12","26.14","26.15","27.2","27.4","28.3","28.12","28.15","28.16"],"statemanager":["1.5","6.5","26.6"],"updatehook":["1.5"],"return":["1.5","14.15"],"values":["1.5","26.8","26.9","28.6"],"websockets":["1.7"],"setting":["1.7","22.2"],"improve":["1.8"],"development":["3.1","3.3","6.1","7.2","22.4"],"has":["3.1","3.2","6.2","15.36","19.8","26.6"],"been":["3.1","3.2","6.2","19.8"],"initiated":["3.1"],"by":["3.1","14.22","15.8","15.17","16.6","16.10","16.11","19.7","25.8","26.4","26.8","26.12","26.14","28.13"],"norbert":["3.1","3.5"],"research":["3.2","3.3","6.2"],"projects":["3.2"],"initial":["3.2"],"and":["3.2","3.5","6.2","6.4","7.1","11.2","11.3","11.4","12.0","14.9","15.8","15.25","15.33","17.10","17.12","18.28","19.10","22.2","22.3","22.4","22.5","23.4","24.2","24.4","24.5","24.7","24.8","25.7","26.6","26.9","26.10","26.11","26.12","26.13","27.3","27.4","27.5","27.6","28.4","28.6","28.8","28.9","28.13","28.14","28.15"],"futher":["3.2"],"developments":["3.2"],"supported":["3.2"],"collaborations":["3.3"],"design":["3.3"],"of":["3.3","4.1","6.2","11.4","13.1","14.1","14.12","14.21","15.1","15.13","15.16","15.21","16.1","17.1","17.8","18.1","18.8","18.9","18.17","19.1","19.9","19.13","19.15","19.16","19.21","19.22","22.3","22.5","23.3","23.4","24.2","24.5","24.6","24.8","25.2","25.3","25.8","26.2","26.3","26.4","26.5","26.6","26.9","26.13","27.5","28.2","28.4","28.15","28.16"],"this":["3.4","7.0","11.5","22.0","22.4","22.5","23.0","23.8","24.0","24.8","25.0","25.8","25.9","26.0","26.5","26.8","26.14","26.15","27.0","28.0","28.10","28.16"],"work":["3.4","7.3"],"benjamin":["3.4","3.5"],"matuszewski":["3.4","3.5"],"academic":["3.5"],"papers":["3.5"],"frederic":["3.5"],"bevilacqua":["3.5"],"garth":["3.5"],"paine":["3.5"],"schnell":["3.5"],"on":["3.5","5.0","6.1","6.7","8.0","9.0","11.3","11.4","19.7","19.9","22.5","23.3","23.7","24.7","25.4","25.7","26.3","26.8","26.9","28.4","28.5","28.6","28.7","28.14"],"designing":["3.5"],"composing":["3.5"],"performing":["3.5"],"networked":["3.5"],"collective":["3.5"],"interactions":["3.5"],"organised":["3.5"],"sound":["3.5","11.4","19.9","23.3"],"cambridge":["3.5"],"university":["3.5"],"toc":["4.0","15.1","19.1"],"core":["4.1","14.4","15.4","17.4","26.12"],"framework":["4.1","5.0","6.1"],"is":["4.1","6.1","6.2","8.1","11.0","11.2","11.3","11.4","11.5","15.7","19.8","19.10","22.2","22.5","23.4","23.7","24.6","25.3","25.4","25.7","25.8","26.4","26.6","26.14","27.3","27.4","27.5","28.7","28.14"],"principally":["4.1"],"plugin":["4.2","4.3","4.4","4.5","4.6","4.7","4.8","4.9","13.0","14.0","14.6","14.8","14.22","15.0","15.19","16.0","16.6","16.10","17.0","18.0","18.23","18.36","18.37","19.0","19.14","24.0","24.2","24.3","24.5","24.6","25.0","25.7","28.3","28.12"],"audio":["4.2","16.6","19.8","19.9","23.4","25.8","27.6","28.13"],"buffer":["4.2"],"loader":["4.2"],"checkin":["4.3","13.0"],"for":["4.3","4.7","4.8","4.10","5.0","6.1","6.2","14.8","18.36","18.37","23.4","24.2","24.5","24.6","26.12","28.6","28.9","28.13"],"filesystem":["4.4","14.0","14.8","14.12","14.21","14.23"],"logger":["4.5","15.0"],"platform":["4.6","6.2","16.0","16.6","24.0","24.5","24.6","28.12"],"that":["4.6","8.2","11.0","11.3","11.4","12.0","19.8","22.5","23.3","23.4","23.7","24.3","24.6","24.7","25.3","25.4","25.7","26.3","26.6","26.8","26.9","26.13","26.14","27.3","27.4","27.5","27.6","28.7","28.9","28.10","28.14","28.15","28.16"],"checks":["4.6"],"availability":["4.6"],"position":["4.7","17.0","17.10"],"scripting":["4.8","18.0","18.17"],"runtime":["4.8"],"sync":["4.9","19.0","19.10","25.0"],"template":["4.10","4.11","4.12","24.7"],"project":["4.10","11.1","25.5","27.6"],"developing":["4.10"],"applications":["4.10","5.0","6.1"],"build":["4.11","22.3","28.0"],"helpers":["4.12","24.7","26.12","27.4"],"set":["4.12","17.10","17.12","26.6","27.3","27.4","27.5","27.6"],"class":["5.0","22.5"],"vphome":["5.0"],"use":["5.0","11.5","12.0","22.2","23.0","23.3","26.11","26.14","26.15","27.0"],"homepage":["5.0"],"styles":["5.0"],"h1":["5.0"],"intro":["5.0"],"img":["5.0"],"src":["5.0","16.4","16.5","18.4","18.5","22.5","24.4","24.5","24.7","25.7","26.7","26.8","26.12","27.5","28.7","28.9","28.12"],"assets":["5.0"],"home":["5.0"],"png":["5.0"],"p":["5.0","15.13","18.8","22.5"],"i":["5.0","25.4"],"open":["5.0","6.1","22.2","22.3","22.5","24.5","25.7","26.12","28.7"],"source":["5.0","6.1","12.0","18.29"],"creative":["5.0","6.1"],"coding":["5.0","6.1"],"distributed":["5.0","6.1","11.5","18.28","26.0","26.4","26.15","27.0"],"based":["5.0","6.1","26.8","28.14"],"web":["5.0","6.1","23.4","28.10"],"technologies":["5.0","6.1"],"br":["5.0"],"a":["5.0","6.6","7.5","7.8","8.0","8.1","9.0","11.0","11.1","11.2","11.3","11.4","11.5","13.7","14.11","14.14","14.23","14.25","15.7","15.10","15.13","15.16","15.17","15.21","15.28","15.29","15.35","16.6","16.8","17.7","18.8","18.10","18.13","18.19","18.24","18.28","18.34","18.35","19.9","19.12","20.0","21.4","22.2","22.4","22.5","23.3","23.4","23.7","24.2","24.6","25.3","25.4","25.5","26.3","26.4","26.6","27.0","27.3","27.5","27.6","28.0","28.2","28.3","28.4","28.9","28.10","28.12","28.13","28.15"],"ref":["5.0"],"badge":["5.0","13.0","19.0"],"fury":["5.0","13.0","19.0"],"io":["5.0","13.0","19.0"],"js":["5.0","11.2","13.4","13.5","14.4","14.6","15.4","15.5","16.4","16.5","17.4","17.5","18.4","18.5","19.0","19.4","19.5","22.5","23.3","23.4","24.4","24.5","24.7","25.7","26.7","26.8","26.12","27.4","27.5","28.9","28.12","28.13"],"2fcore":["5.0"],"style":["5.0"],"width":["5.0"],"auto":["5.0"],"height":["5.0"],"20px":["5.0"],"margin":["5.0"],"top":["5.0"],"svg":["5.0"],"an":["6.1","6.2","9.9","19.8","23.8","24.6","25.3","25.8","26.3","28.16"],"primarily":["6.1","6.2"],"focused":["6.1","6.7"],"music":["6.1","6.2"],"aims":["6.1","28.16"],"at":["6.1","19.9"],"supporting":["6.1"],"rapid":["6.1"],"still":["6.2"],"developped":["6.2"],"as":["6.2","15.10","16.6","18.6","19.8","24.5","24.6","24.7","25.3","26.3","26.6","26.8","28.8"],"experimental":["6.2"],"artistic":["6.2"],"scientific":["6.2"],"in":["6.2","7.7","12.0","15.6","15.8","15.9","15.10","15.11","15.20","18.6","21.0","22.0","22.3","22.4","23.0","23.4","23.6","23.8","24.0","24.4","24.6","24.7","24.8","25.0","25.3","25.4","25.8","25.9","26.0","26.3","26.8","26.15","27.0","27.3","27.4","28.0","28.2","28.8","28.10","28.16"],"domain":["6.2"],"arts":["6.2"],"such":["6.2"],"code":["6.2","13.9","13.10","14.13","14.14","14.15","14.16","14.17","14.18","14.19","14.20","14.24","14.25","14.26","14.27","14.28","14.29","14.30","15.16","15.21","15.27","15.34","15.36","17.11","17.13","18.11","18.12","18.13","18.14","18.15","18.16","18.20","18.21","18.22","18.24","18.25","18.26","18.27","18.29","18.30","18.31","18.32","18.34","19.15","19.16","19.18","19.21","19.22","22.5","23.4","24.4","25.7","26.9","26.11","26.12","27.5","28.13"],"base":["6.2"],"server":["6.4","8.0","8.2","11.2","11.3","13.11","14.21","15.8","15.18","15.30","17.14","18.17","19.7","19.19","22.3","22.4","22.5","23.4","24.5","25.7","26.7","26.8","27.4","28.5","28.9"],"initalization":["6.4"],"shared":["6.5","15.17","18.6","22.4","26.8","26.9","26.12","28.4","28.5","28.6","28.7","28.8","28.10"],"states":["6.5","26.8","26.9","26.13","28.7","28.8","28.9","28.15"],"component":["6.5","26.6","28.10"],"provides":["6.5","11.0"],"tools":["6.5","22.2"],"host":["6.6"],"also":["6.6","16.6"],"implements":["6.6"],"system":["6.6","18.6","25.3","26.4","26.15"],"to":["6.6","7.0","8.0","8.1","8.2","10.1","11.1","11.2","11.5","14.9","14.14","14.23","14.25","15.11","15.17","15.28","15.29","15.35","16.6","16.11","18.10","18.19","18.22","18.23","18.35","19.8","19.9","19.17","22.0","22.2","22.3","22.4","22.5","23.0","23.4","23.7","24.6","25.3","25.4","25.8","26.8","26.9","26.11","26.12","26.13","26.14","26.15","27.2","27.3","27.5","27.6","28.3","28.4","28.6","28.7","28.9","28.10","28.14","28.15","28.16"],"tutorials":["6.7","27.2"],"these":["6.7"],"are":["6.7","12.0","15.8","18.6","24.7","25.8","26.6","26.9","27.6","28.12"],"functionnality":["6.7"],"which":["6.7","15.20","26.3","26.6","26.15","27.3","28.9","28.13","28.15"],"you":["7.0","8.0","11.5","15.11","19.9","22.3","22.6","24.2","24.8","25.9","26.6","26.15","28.3","28.16"],"wrote":["7.0","22.6"],"some":["7.0","19.9","22.2","23.7","26.3","26.12"],"documentation":["7.0","23.1","24.1","25.1","26.1","27.1","28.1"],"clone":["7.1"],"repo":["7.1"],"mode":["7.2","22.4"],"get":["7.2","16.12","28.15"],"remote":["7.2"],"changes":["7.2"],"tip":["7.3","22.2","22.4","26.6"],"note":["7.3","9.1"],"following":["7.3","19.10","22.2","22.3","24.2","24.4","25.4","25.7","26.12","28.9"],"commands":["7.3","23.4"],"will":["7.3","8.2","11.2","11.4","14.22","16.10","19.14","22.0","23.0","23.3","23.4","24.2","25.0","25.3","26.0","27.0","27.3","27.6","28.0","28.4","28.6","28.9","28.10","28.13","28.14"],"only":["7.3","19.8","28.6","28.14"],"misc":["7.5"],"page":["7.5","7.8","22.5"],"add":["7.5","24.6","25.7","26.12","27.6"],"duis":["7.7"],"aute":["7.7"],"irure":["7.7"],"dolor":["7.7"],"cf":["7.7"],"vuepress":["7.7"],"vuejs":["7.7"],"org":["7.7"],"tutorial":["7.8","11.5","22.0","23.0","23.6","23.8","24.6","24.8","25.0","25.9","26.0","26.15","27.0","28.0","28.16"],"creating":["7.8","26.12","28.9","28.13"],"follow":["7.8"],"internets":["8.0"],"if":["8.0","15.7","26.6","27.3","28.12"],"want":["8.0","15.11","26.8"],"deploy":["8.0"],"single":["8.0"],"application":["8.0","9.8","11.5","16.11","22.2","22.3","22.5","22.6","23.2","24.2","24.7","25.5","26.3","26.5","26.8","27.2","27.3","28.0","28.2","28.3","28.4"],"there":["8.0"],"configure":["8.1","26.11","27.4"],"first":["8.1","11.1","22.2","22.4","22.5","22.6","23.4","24.0","24.2","24.4","25.2","25.5","26.2","26.7","26.8","27.4","27.5","27.6","28.3","28.5","28.12"],"thing":["8.1","19.8","22.2","24.2","25.3","25.5","26.13","27.6","28.3","28.12"],"do":["8.1","25.8","26.13"],"create":["8.1","11.1","11.2","11.3","11.5","15.16","15.21","18.13","18.24","22.2","22.4","23.0","24.2","25.5","26.8","26.11","27.2","28.3","28.9","28.10","28.14"],"new":["8.1","11.1","11.2","14.23","18.13","18.24","22.2","24.2","25.5","26.11","28.3","28.9","28.12"],"env":["8.1"],"config":["8.1","8.2","8.3","22.5","28.12"],"file":["8.1","11.2","18.6","22.3","22.5","24.4","25.7","26.7","26.12","28.9"],"proxy":["8.2"],"need":["8.2","11.2","27.3"],"be":["8.2","11.4","13.12","14.22","15.19","15.28","15.29","15.35","16.10","16.11","17.9","17.15","18.10","18.18","18.19","18.28","19.14","19.20","23.4","25.4","26.6","26.8","26.13","27.6","28.7","28.13"],"configured":["8.2","26.6"],"so":["8.2","11.2","11.4","22.2","23.3","24.6","25.8","26.5","26.8"],"it":["8.2","11.5","24.2","25.3","26.6","26.14","27.5"],"route":["8.2"],"all":["8.2","11.2","12.0","15.8","23.4","26.2","26.8","26.11","26.13","27.6","28.6","28.7","28.14","28.15"],"request":["8.2"],"configuration":["9.1","23.7"],"access":["9.4"],"internet":["9.5"],"ports":["9.10"],"issue":["9.11"],"electron":["10.0"],"updates":["10.2"],"websocket":["11.0","11.3","11.5"],"communication":["11.0","11.4"],"protocol":["11.0"],"full":["11.0"],"duplex":["11.0"],"channels":["11.0"],"let":["11.1","11.2","11.3","11.4","22.5","23.2","23.3","23.4","24.2","24.4","24.5","25.5","25.7","26.7","26.8","26.9","26.11","26.12","26.14","27.2","27.3","27.4","27.5","27.6","28.3","28.5","28.6","28.7","28.9","28.10","28.12","28.13","28.15"],"s":["11.1","11.2","11.3","11.4","22.5","23.2","23.3","23.4","24.2","24.4","24.5","25.5","25.7","26.7","26.8","26.9","26.11","26.12","26.14","27.2","27.3","27.4","27.5","27.6","28.3","28.5","28.6","28.7","28.9","28.10","28.12","28.13","28.15"],"simple":["11.1","11.2","11.5","22.2","22.5","28.0","28.10","28.14"],"sh":["11.1","13.2","14.2","15.2","16.2","17.2","18.2","19.2","22.2","22.3","22.4","23.4","27.2","28.3"],"cd":["11.1","22.2","27.2","28.3"],"path":["11.1","14.16","14.26","22.2","27.2","28.3"],"working":["11.1","22.2","25.3","28.2","28.3"],"directory":["11.1","14.23","15.20","22.2","22.3","28.3"],"npx":["11.1","22.2","27.2","28.3"],"ircam":["11.1","12.0","26.12","27.5"],"now":["11.2","11.3","11.4","14.8","22.5","24.3","24.6","25.7","26.9","27.3","27.4","27.5","27.6","28.6","28.7","28.14"],"eveything":["11.2","11.3","25.7","27.3","28.11"],"ready":["11.2","22.5","25.7","28.14"],"implement":["11.2","22.5","27.5","27.6","28.4","28.7"],"our":["11.2","11.3","11.4","22.2","22.5","23.2","23.3","23.4","25.7","25.8","26.8","26.9","26.11","26.13","27.2","27.3","27.4","27.5","27.6","28.6","28.7","28.8","28.13","28.14","28.15"],"called":["11.2","13.12","14.22","15.19","16.10","17.15","18.18","19.14","19.20"],"start":["11.2","22.5","23.2","23.3","24.4","25.7","26.12","27.2","27.3","28.13"],"with":["11.2","12.0","15.7","23.0","23.2","23.3","24.2","24.4","25.3","25.7","25.8","26.3","26.6","26.12","27.2","27.3","28.3","28.7","28.9","28.12"],"importing":["11.2"],"dependencies":["11.2"],"we":["11.2","11.4","22.0","22.5","23.0","23.3","23.6","23.8","24.6","24.7","25.0","25.4","25.8","26.0","26.3","26.6","26.8","26.13","26.15","27.0","27.3","28.0","28.6","28.7","28.9","28.10","28.14"],"import":["11.2","13.5","14.4","14.6","15.4","15.5","16.5","17.4","17.5","18.4","18.5","18.32","24.4","24.5","26.7","26.12","27.4","27.5","28.5"],"http":["11.2","22.5"],"from":["11.2","14.4","14.9","15.4","15.5","17.4","18.4","18.5","26.4","26.6","26.12","26.13","27.4","27.5","28.7","28.9","28.15"],"node":["11.2","22.1","23.0","23.3","23.4","23.7"],"websocketserver":["11.2"],"client":["11.3","11.4","13.8","14.9","14.12","15.8","15.13","15.14","15.22","16.9","16.13","17.8","18.8","18.9","19.10","19.13","22.5","23.4","23.7","24.2","25.7","26.9","26.11","26.12","26.14","28.7"],"setup":["11.3","11.4","26.9","28.7"],"running":["11.3","27.3"],"side":["11.3","13.8","13.11","14.12","14.21","15.8","15.11","15.13","15.14","15.18","15.22","15.30","16.9","17.8","17.14","18.8","18.9","18.17","19.7","19.10","19.13","19.19","22.5","24.4","24.5","25.7","26.9","27.4","28.7"],"events":["11.4","19.9"],"channel":["11.4"],"modify":["11.4","22.5"],"sligthly":["11.4"],"behavior":["11.4"],"demo":["11.4"],"app":["11.4","22.5"],"user":["11.4","26.3","27.5","28.4","28.8","28.10"],"click":["11.4","24.6"],"bang":["11.4"],"components":["11.4","26.12","27.5"],"triggered":["11.4"],"every":["11.4"],"connected":["11.4","14.9","20.0","28.7","28.9","28.10","28.15"],"not":["11.4","14.8","23.4","24.7","27.3"],"just":["11.4","11.5","22.6","26.14"],"itself":["11.4"],"data":["11.4","14.17","14.27","15.25","15.33"],"flow":["11.4"],"thus":["11.4","25.4"],"showed":["11.5"],"how":["11.5","22.0","23.0","25.4","26.4","26.15"],"however":["11.5","28.14"],"c":["12.0","22.3","23.4"],"present":["12.0"],"centre":["12.0"],"pompidou":["12.0"],"france":["12.0"],"paris":["12.0"],"rights":["12.0"],"reserved":["12.0"],"redistribution":["12.0"],"binary":["12.0"],"forms":["12.0"],"or":["12.0","24.6","25.3","27.3","28.2"],"without":["12.0"],"modification":["12.0"],"permitted":["12.0"],"provided":["12.0","26.12"],"npm":["13.0","14.0","15.0","16.0","17.0","19.0","22.4","23.4"],"version":["13.0","16.0","17.0","19.0"],"index":["13.4","13.5","14.4","14.6","15.4","15.5","16.4","16.5","17.4","17.5","18.4","18.5","19.4","19.5","22.5","24.4","24.5","24.7","25.7","26.7","26.12","27.5","28.12"],"dl":["13.7","14.11","15.13","16.8","17.7","18.8","19.12"],"dt":["13.7","14.11","15.13","16.8","17.7","18.8","19.12"],"href":["13.7","14.11","15.13","16.8","17.7","18.8","19.12"],"plugincheckinclient":["13.7"],"representation":["13.8","14.12","14.21","15.13","15.14","15.18","16.9","17.8","18.8","18.9","18.17","19.13","19.19"],"getindex":["13.9"],"number":["13.9","19.15","19.16","19.21","19.22","26.12"],"getdata":["13.10"],"mixed":["13.10"],"plugincheckinserver":["13.12"],"constructor":["13.12","14.22","15.15","15.19","16.10","17.9","17.15","18.18","19.14","19.20"],"should":["13.12","14.22","15.15","15.19","16.10","17.9","17.15","18.18","19.14","19.20","22.3"],"never":["13.12","14.22","15.19","16.10","17.9","17.15","18.18","19.14","19.20"],"contents":["14.1","15.1","16.1","18.1","19.1"],"pluginfilesystem":["14.4"],"files":["14.8","14.9","15.8","15.9","18.6","27.6"],"does":["14.8","23.4","24.6"],"provide":["14.8","16.6"],"any":["14.8","14.9","23.3","25.8","28.10"],"being":["14.9"],"able":["14.9","26.13","28.7"],"write":["14.9","15.25","15.33","23.4","24.4"],"delete":["14.9","18.15","18.26","18.37"],"pluginfilesystemclient":["14.11"],"gettree":["14.13","14.24","18.12","18.21"],"onupdate":["14.14","14.25","18.22","18.34"],"callback":["14.14","14.25","15.28","15.29","15.35","18.22","18.34","18.35","19.17"],"executelistener":["14.14","14.25","18.22","18.34"],"function":["14.14","14.25","15.28","15.29","15.35","18.22","18.34"],"register":["14.14","14.25","15.28","15.29","15.35","18.22","18.34","18.35","27.4","28.9"],"execute":["14.14","14.25","18.22","22.2"],"gettreeasurlmap":["14.15"],"filterext":["14.15"],"keepextension":["14.15"],"object":["14.15","14.16","14.26","17.11","17.13","18.10","18.12","18.19","18.21","19.18","24.7"],"findintree":["14.16","14.26"],"writefile":["14.17","14.27"],"pathname":["14.17","14.18","14.20","14.27","14.28","14.30","15.24","15.32"],"promise":["14.17","14.18","14.27","14.28","15.27","15.34","18.13","18.14","18.15","18.16","18.24","18.25","18.26","18.27","18.32"],"mkdir":["14.18","14.28"],"rename":["14.19","14.29"],"oldpath":["14.19","14.29"],"newpath":["14.19","14.29"],"rm":["14.20","14.30"],"pluginfilesystemserver":["14.22"],"manually":["14.22","15.19","16.10","17.15","18.18","19.14","19.20"],"instantiated":["14.22","16.10"],"switch":["14.23","15.20","18.23"],"options":["14.23","15.16","15.17","15.21"],"e":["14.23","25.4","28.2"],"g":["14.23","28.2"],"installation":["15.1","19.1"],"usage":["15.1","24.8"],"receipes":["15.6","19.6"],"extension":["15.7"],"writer":["15.7","15.10","15.16","15.17","15.21","15.22","15.30"],"created":["15.7","15.17","15.22","24.7","25.8","26.6"],"no":["15.7"],"extesion":["15.7"],"log":["15.8","15.9"],"default":["15.8","15.16","16.6","24.2","24.7"],"sub":["15.9","25.4"],"directories":["15.9"],"between":["15.10","19.10","25.4"],"several":["15.10","27.3"],"clients":["15.10","16.5","18.28","22.5","23.0","23.3","23.6","23.7","24.5","24.7","26.8","26.12","26.13","27.5","27.6","28.6","28.7","28.12"],"similar":["15.10","19.10"],"way":["15.10","16.6","22.2","25.3","26.3"],"buffering":["15.11"],"many":["15.11"],"cases":["15.11"],"may":["15.11"],"pluginloggerclient":["15.13","15.15"],"dd":["15.13","18.8"],"createwriter":["15.16","15.21"],"name":["15.16","15.17","15.21","15.23","15.31","18.13","18.14","18.15","18.16","18.24","18.25","18.26","18.27","22.5","24.2"],"kind":["15.16","15.21","26.6"],"instance":["15.16","15.21","28.5"],"method":["15.16","15.21","16.11","28.15"],"param":["15.16","15.21"],"type":["15.16"],"attachwriter":["15.17"],"attach":["15.17","18.16","18.27","27.5","28.6"],"pluginloggerserver":["15.19"],"dirname":["15.20","18.23"],"change":["15.20","22.5","26.9"],"stream":["15.22","15.30"],"format":["15.25","15.33"],"successive":["15.25","15.33"],"flush":["15.26"],"close":["15.27","15.34"],"onpacketsend":["15.28"],"onclose":["15.29","15.35"],"executed":["15.29","16.11"],"init":["16.0","16.6","24.0","24.5","24.6","28.12"],"features":["16.6","23.3","23.4","24.6"],"resume":["16.6","19.8"],"context":["16.6","18.10","18.19","21.3","25.8","28.12"],"shown":["16.6"],"above":["16.6","26.8","28.4"],"but":["16.6","24.6","25.8"],"pluginplatforminitclient":["16.8","16.10"],"when":["16.10","19.8","19.9","24.2","25.3","25.4","26.9","26.14"],"onusergesture":["16.11"],"featureid":["16.12"],"returns":["16.12","19.7"],"poayload":["16.12"],"pluginpositionclient":["17.7","17.9"],"setposition":["17.10"],"y":["17.10","17.12"],"getposition":["17.11"],"setnormalizedposition":["17.12"],"getnormalizedposition":["17.13"],"pluginpositionserver":["17.15"],"scripts":["18.6"],"stored":["18.6"],"raw":["18.6"],"javascript":["18.6","26.6"],"located":["18.6"],"pluginscriptingclient":["18.8"],"setglobalscriptingcontext":["18.10","18.19"],"ctx":["18.10","18.19"],"registers":["18.10","18.19"],"global":["18.10","18.19","22.4","26.8","26.12","27.3","27.5","28.4","28.6","28.7","28.13"],"getlist":["18.11","18.20"],"array":["18.11","18.20"],"createscript":["18.13","18.24"],"value":["18.13","18.14","18.24","18.25","18.36"],"updatescript":["18.14","18.25","18.36"],"update":["18.14","18.25","18.36","26.9"],"deletescript":["18.15","18.26","18.37"],"pluginscriptingserver":["18.18"],"watch":["18.23"],"can":["18.28","22.5","23.3","25.4","25.8","26.3","26.6","26.8","28.3","28.14"],"amongst":["18.28"],"different":["18.28","25.3","26.9","27.3","27.4"],"modified":["18.28"],"error":["18.30"],"transpiled":["18.31"],"dynamically":["18.32"],"detach":["18.33"],"stop":["18.33","22.3"],"ondetach":["18.35"],"alias":["18.36","18.37"],"clocks":["19.7","25.4"],"master":["19.7","28.13"],"clock":["19.7","19.8","19.21","25.8"],"used":["19.7","23.4","23.6"],"audiocontext":["19.8","24.6","25.8","28.12"],"currenttime":["19.8"],"local":["19.8","19.10","19.15","19.21"],"important":["19.8","23.7","25.3","28.16"],"consider":["19.8","23.7","25.4"],"perform":["19.8"],"synchronization":["19.8","25.8"],"starts":["19.8","22.4"],"increment":["19.8"],"await":["19.8","22.5"],"synchronized":["19.9"],"propagate":["19.9"],"event":["19.9"],"your":["19.9","22.3","22.5","22.6"],"network":["19.9","23.7"],"devices":["19.9","25.3"],"trigger":["19.9","23.3"],"specific":["19.9"],"time":["19.9","19.10","19.15","19.16","19.21","19.22","26.3","27.5"],"api":["19.10","21.1","23.4"],"pluginsyncclient":["19.12","19.14"],"getlocaltime":["19.15","19.21"],"synctime":["19.15","19.21"],"getsynctime":["19.16","19.22"],"audiotime":["19.16"],"synced":["19.16","19.22"],"onreport":["19.17"],"subscribe":["19.17"],"getreport":["19.18"],"pluginsyncserver":["19.20"],"localtime":["19.22"],"jean":["19.23"],"philippe":["19.23"],"lambert":["19.23"],"lamp":["20.0"],"contexts":["21.0","21.5"],"learn":["22.0"],"things":["22.2","28.14"],"up":["22.2","27.3","27.4","27.5","27.6"],"best":["22.2"],"most":["22.2","26.3"],"dedicated":["22.2"],"command":["22.2","22.4"],"line":["22.2","22.5"],"terminal":["22.2","22.4","26.11"],"go":["22.2","22.4","22.5","26.11","27.6","28.15"],"dir":["22.2"],"latest":["22.2","28.3"],"exploring":["22.3"],"structure":["22.3","28.14"],"press":["22.3"],"ctrl":["22.3","23.4"],"favorite":["22.3"],"text":["22.3","22.5","26.12"],"editor":["22.3","22.5"],"see":["22.3"],"where":["22.3","25.4"],"back":["22.4","22.5","27.6","28.15"],"restart":["22.4"],"run":["22.4"],"dev":["22.4"],"quite":["22.4"],"wisely":["22.4"],"make":["22.5"],"interactive":["22.5"],"logic":["22.5","23.3","27.5","27.6"],"browser":["22.5"],"then":["22.5","28.9","28.10","28.13"],"player":["22.5","24.2","24.5","24.7","26.13","28.6","28.7","28.8","28.9","28.10","28.12"],"sure":["22.5"],"act":["22.5"],"fancy":["22.5"],"black":["22.5"],"screen":["22.5","26.9","28.6"],"render":["22.5","26.12","27.5"],"html":["22.5","26.12","27.5"],"div":["22.5"],"layout":["22.5"],"hello":["22.5"],"congrats":["22.6"],"along":["22.6"],"explore":["23.0"],"control":["23.3","26.10","26.13","26.14","27.3","28.7","28.10","28.15"],"before":["23.3"],"cient":["23.3"],"have":["23.3","23.8","24.7","24.8","25.8","25.9","28.16"],"learned":["23.3","24.8","25.9","26.15","28.16"],"far":["23.3","24.6","25.8"],"controller":["23.3","26.11","26.12","26.13","27.5","28.7","28.10","28.15"],"future":["23.3"],"defining":["23.3"],"call":["23.3","26.6"],"shutdown":["23.4","26.11"],"while":["23.4"],"launch":["23.4"],"few":["23.4","27.5","27.6"],"install":["23.4","27.4"],"package":["23.4"],"allow":["23.4","28.10"],"us":["23.4","28.10"],"into":["23.4","24.3","25.3","26.0","26.7","27.6"],"save":["23.4"],"info":["23.4","26.5","26.9"],"re":["23.4"],"implementation":["23.4"],"specification":["23.4"],"within":["23.4","26.14"],"written":["23.4"],"rust":["23.4"],"language":["23.4"],"relatively":["23.4"],"recent":["23.4"],"expose":["23.4","28.15"],"yet":["23.4","24.7","25.8"],"multiple":["23.6","25.3","26.6","28.12"],"previous":["23.6"],"often":["23.6"],"another":["23.7","28.9","28.13"],"point":["23.7","26.4","28.2"],"needs":["23.7","26.13"],"explored":["23.8"],"installing":["24.2","25.7"],"generate":["24.2","28.3"],"empty":["24.2","28.3"],"wizard":["24.2","26.5","26.11","27.2","28.3"],"ask":["24.2"],"enter":["24.2"],"informations":["24.2"],"select":["24.2","28.3"],"registration":["24.4","24.5"],"part":["24.4","24.5"],"good":["24.6","25.8"],"what":["24.6","25.8","28.7"],"did":["24.6","28.7"],"until":["24.6"],"mainly":["24.6"],"slashscreen":["24.6"],"asking":["24.6"],"nothing":["24.6"],"particular":["24.6"],"stated":["24.6"],"beginning":["24.6"],"whole":["24.6"],"aim":["24.6"],"simplify":["24.6","28.16"],"initialization":["24.6"],"require":["24.6"],"views":["24.7"],"spashscreen":["24.7"],"well":["24.7"],"other":["24.7"],"inititialization":["24.7"],"seen":["24.7"],"automatically":["24.7","26.14"],"handled":["24.7"],"launcher":["24.7","26.12"],"included":["24.7"],"basics":["24.8"],"why":["25.3","26.3"],"understand":["25.3"],"composed":["25.3"],"each":["25.3","26.13","26.14","28.9"],"them":["25.3","27.3"],"live":["25.3"],"timeline":["25.3"],"say":["25.3"],"more":["25.3","25.4","26.4"],"formal":["25.3"],"observation":["25.3"],"consequence":["25.3"],"dealing":["25.3"],"independent":["25.3"],"nodes":["25.3"],"one":["25.3","28.13"],"practical":["25.4"],"manner":["25.4"],"trying":["25.4"],"synchornize":["25.4"],"face":["25.4"],"problem":["25.4","26.14"],"express":["25.4"],"form":["25.4"],"t":["25.4","25.8"],"clock1":["25.4"],"clock2":["25.4"],"b":["25.4"],"speed":["25.4"],"difference":["25.4"],"two":["25.4","28.14"],"their":["25.4","26.6","26.9"],"drift":["25.4"],"both":["25.7"],"interested":["25.8"],"too":["25.8"],"synchronize":["25.8"],"synthesis":["25.8"],"don":["25.8"],"process":["25.8"],"indeed":["25.8","27.3"],"dig":["26.0"],"think":["26.3","26.6","26.15"],"something":["26.3"],"runs":["26.3"],"computer":["26.3"],"interact":["26.3"],"technical":["26.4"],"view":["26.4","28.2"],"management":["26.4","26.15"],"proposed":["26.4"],"circular":["26.4"],"dataflow":["26.4"],"pattern":["26.4","28.16"],"loosely":["26.4"],"inspired":["26.4"],"flux":["26.4"],"section":["26.5"],"requires":["26.5"],"basic":["26.5"],"knowledge":["26.5"],"schemas":["26.6","26.7","26.8","28.9"],"objects":["26.6"],"declare":["26.6","27.3"],"attributes":["26.6"],"properties":["26.6"],"schema":["26.6","26.8","28.4","28.5","28.9"],"blueprint":["26.6"],"sharedstate":["26.6"],"instances":["26.6"],"familiar":["26.6"],"databases":["26.6"],"declarations":["26.7"],"declaration":["26.8"],"defined":["26.8","28.4","28.8"],"explained":["26.8"],"unique":["26.8"],"across":["26.8"],"entire":["26.8"],"share":["26.8","26.14"],"same":["26.8","28.14"],"simply":["26.8","28.10"],"achieved":["26.8"],"continue":["26.9","27.3"],"current":["26.9","28.6"],"monitoring":["26.10"],"boilerplate":["26.11"],"controls":["26.12","27.6"],"high":["26.12"],"level":["26.12"],"sc":["26.12","27.5"],"library":["26.12","28.10"],"polyfills":["26.12","27.4"],"lit":["26.12","27.5","28.10"],"slider":["26.12"],"controlling":["26.13"],"collections":["26.13"],"final":["26.13"],"would":["26.13"],"like":["26.13"],"frequency":["26.13"],"end":["26.13","28.2","28.9","28.10","28.15"],"track":["26.13"],"creation":["26.13"],"deletion":["26.13"],"id":["26.14"],"enhance":["26.14"],"interface":["26.14","27.5","28.10"],"fix":["26.14"],"given":["26.14"],"connects":["26.14"],"step":["27.0","27.3","27.6"],"sequencer":["27.0","27.3","27.6"],"parameters":["27.3"],"describe":["27.3"],"parameter":["27.3","28.13"],"variable":["27.3"],"define":["27.3","28.9"],"everything":["27.5","28.7"],"sketch":["27.5"],"graphical":["27.5","28.10"],"sw":["27.5"],"audit":["27.5"],"matrix":["27.5"],"engine":["27.6"],"todo":["28.0","28.3"],"noise":["28.0","28.3"],"story":["28.2","28.4","28.8"],"purposely":["28.2"],"privileges":["28.2"],"situation":["28.2"],"developer":["28.2"],"designer":["28.2"],"composer":["28.2"],"performer":["28.2"],"rather":["28.2"],"than":["28.2"],"already":["28.3"],"rely":["28.4"],"types":["28.4"],"display":["28.6"],"its":["28.6"],"similarly":["28.7"],"players":["28.9","28.15"],"snippet":["28.9"],"abstraction":["28.10"],"reuse":["28.10"],"later":["28.10"],"remotely":["28.10"],"take":["28.10"],"over":["28.10"],"synthesizers":["28.11"],"instanciate":["28.12"],"const":["28.12"],"window":["28.12"],"emulated":["28.12"],"chain":["28.13"],"bus":["28.13"],"controlled":["28.13"],"gainnode":["28.13"],"volume":["28.13"],"mute":["28.13"],"synths":["28.14"],"finally":["28.14"],"keep":["28.14"],"focus":["28.14"],"general":["28.14"],"architecture":["28.14"],"oscillators":["28.14"],"exact":["28.14"],"list":["28.15"],"getcollection":["28.15"],"allows":["28.15"],"grab":["28.15"],"collection":["28.15"],"mirror":["28.15"],"ability":["28.16"]},{"0":["19.8","28.13","28.14"],"1":["11.4","22.6","25.4","28.13"],"2":["11.4","26.8"],"3":["0.2","3.5","3.6","11.4","13.14","14.32","15.37","16.15","17.17","18.39","19.25","26.14"],"4":["24.4","24.5"],"5":["24.4","24.5"],"6":["23.6","26.14"],"26":["3.5"],"39":["18.8"],"50":["28.9"],"101":["11.1"],"200":["28.9"],"333":["3.5"],"339":["3.5"],"2000":["28.9"],"2021":["3.5"],"8002":["8.2"],"sources":["0.0","7.1","7.2"],"for":["0.0","3.5","4.2","4.9","9.1","11.2","18.33","19.0","22.2","25.4","25.7","26.6","27.3","27.6","28.3","28.7","28.14"],"soundworks":["0.1","1.5","7.0","7.3","13.4","13.5","13.8","13.13","14.6","14.22","14.31","15.5","15.13","15.14","15.18","15.19","16.5","16.9","16.14","17.5","17.8","17.15","17.16","18.4","18.5","18.8","18.18","18.38","19.4","19.5","19.13","19.14","19.19","19.20","19.24","22.0","22.5","23.1","23.2","23.4","23.8","24.0","24.4","24.5","25.1","25.5","25.7","26.0","27.0","27.1"],"size":["1.0"],"to":["1.2","4.1","4.3","4.4","4.5","4.8","4.10","5.0","6.1","6.2","6.5","6.7","7.1","7.7","11.3","11.4","13.0","14.8","14.22","15.10","15.16","15.21","15.25","15.33","16.10","16.12","18.16","18.27","18.34","21.5","22.6","23.2","23.3","23.6","24.2","24.7","24.8","25.5","26.3","26.4","26.5","26.6","27.0","28.2","28.8","28.12"],"apps":["1.2"],"ismm":["1.2"],"what":["1.3"],"plugin":["1.4","4.1","13.12","14.4","14.12","14.21","14.23","15.4","15.13","17.4","17.8","17.9","17.15","18.5","18.8","18.9","18.17","18.18","19.7","19.13","19.20","24.4","24.8","25.1","25.5","25.8","27.0","27.1","27.2","27.4"],"platform":["1.4","6.7","24.2","24.8","28.3"],"init":["1.4","24.2","24.8","28.3"],"example":["1.4"],"mixing":["1.4"],"it":["1.4","5.0","6.1","11.2","11.4","22.2","23.4","25.8","26.3","26.5","26.8","28.3"],"all":["1.4","15.20","18.13","18.24","22.3","25.2","26.6","26.9","27.3"],"todo":["1.4"],"noise":["1.4"],"application":["1.4","4.6","14.9","22.0","22.4","23.0","23.3","25.7","26.6","26.9","26.11","26.13","28.7"],"etc":["1.5"],"customize":["1.5"],"the":["1.5","3.2","4.8","5.0","6.1","6.6","7.5","11.3","11.5","13.8","13.9","13.10","14.14","14.16","14.25","14.26","15.6","15.7","15.11","15.13","15.14","15.16","15.17","15.18","15.21","15.22","15.23","15.24","15.27","15.28","15.29","15.31","15.32","15.34","15.35","16.9","17.8","17.11","17.13","18.8","18.10","18.11","18.12","18.13","18.14","18.15","18.19","18.20","18.21","18.22","18.24","18.25","18.26","18.28","18.32","18.34","18.35","19.9","19.13","19.17","19.18","19.19","23.6","23.8"],"helpers":["1.5","24.4","24.5","25.7"],"core":["1.6","6.3","13.5","14.6","15.5","16.5","17.5","18.4","18.5","24.4","24.5","25.7","27.4"],"create":["1.6","6.5","14.18","14.28","15.17","23.2","23.3","23.4","26.9","26.13","26.15","28.16"],"up":["1.7"],"a":["1.7","3.4","3.5","4.3","4.10","6.2","8.2","14.16","14.17","14.18","14.19","14.20","14.26","14.27","14.28","14.29","15.8","15.9","15.25","15.33","16.12","18.15","18.16","18.22","18.26","18.27","19.0","22.0","22.6","23.0","24.3","25.0","25.8","26.0","26.9","26.12","26.13","26.14"],"development":["1.7","5.0","23.4"],"environment":["1.7","9.9"],"some":["1.7","28.2","28.8"],"general":["1.7","25.9"],"project":["1.8","3.2","14.23","22.0","23.4"],"schnell":["3.1","19.23"],"sébastien":["3.1","19.23"],"robaszkiewicz":["3.1","19.23"],"and":["3.1","4.2","4.4","4.6","5.0","6.1","6.6","14.23","15.11","15.22","15.30","15.34","16.6","18.23","19.8","22.0","23.3","24.0","25.3","25.4","25.9","26.3","26.8","26.15","27.2","28.2","28.3","28.7","28.16"],"benjamin":["3.1"],"matuszewski":["3.1"],"at":["3.1","5.0","14.9","14.23","18.28","26.3","26.11","27.3"],"by":["3.2","4.6","8.2","13.12","15.7","15.19","15.22","15.30","17.10","17.12","17.15","18.18","19.14","19.20","22.3","22.5","23.3","24.6","26.0","26.6","26.9","28.4"],"following":["3.2","11.3","11.4","12.0","15.6","15.8","23.3","26.11","28.6","28.10"],"dots":["3.2"],"funded":["3.2"],"has":["3.3"],"also":["3.3","11.5"],"been":["3.3","15.36"],"conducted":["3.3"],"within":["3.3","23.0","25.3","25.7"],"many":["3.3"],"with":["3.3","11.3","22.5","23.4","25.0","28.10","28.14","28.15"],"web":["3.4","3.5","24.6","26.12"],"based":["3.4","3.5"],"framework":["3.4","3.5","22.5"],"press":["3.5","22.2"],"cup":["3.5"],"pp":["3.5"],"hal":["3.5"],"03575509":["3.5"],"distributed":["3.5","4.1","25.0","25.3","26.3","26.13","28.0"],"music":["3.5","5.0"],"system":["3.5","25.0","26.0","27.6"],"research":["3.5"],"creation":["3.5"],"dedicated":["4.1","4.5"],"websocket":["4.1"],"communications":["4.1"],"state":["4.1","15.10","26.6","26.13","26.14","28.14"],"management":["4.1","26.0"],"hosting":["4.1"],"loading":["4.2"],"managing":["4.2"],"buffers":["4.2"],"assigning":["4.3"],"ticket":["4.3"],"unique":["4.3","26.6","28.4"],"index":["4.3","11.2","28.5","28.6","28.7"],"parse":["4.4"],"recording":["4.5"],"of":["4.6","4.12","5.0","6.1","7.3","7.7","11.5","12.0","13.8","13.11","14.15","15.14","15.18","15.23","15.24","15.31","15.32","16.9","17.10","17.12","17.14","19.19","22.2","23.0","23.8","24.3","24.4","25.4","26.8","26.11","26.14","26.15","27.6","28.0","28.3","28.14"],"features":["4.6","28.2"],"required":["4.6","24.6"],"their":["4.6","28.8"],"initialisation":["4.6"],"locating":["4.7"],"people":["4.7"],"in":["4.7","5.0","7.5","8.2","11.0","11.1","14.22","15.7","15.19","15.36","16.10","17.10","17.11","17.12","17.15","18.10","18.19","18.28","19.7","19.8","19.14","20.0","22.2","22.5","23.3","23.7","26.6","26.9","26.10","26.12","26.13","27.6","28.5","28.6"],"an":["4.7","11.5","18.14","18.25","22.4","23.4"],"area":["4.7"],"allows":["4.8"],"define":["4.8"],"synchronizing":["4.9","19.0"],"arbitrary":["4.9"],"clocks":["4.9"],"provides":["4.10","5.0","6.1"],"clean":["4.10"],"code":["4.10","12.0","14.12","22.3","26.14","27.4","28.6","28.7","28.9","28.10","28.12"],"base":["4.10"],"start":["4.10","7.2","8.0","26.2","27.5","28.7"],"scripts":["4.11","18.10","18.19"],"common":["4.12","19.0","25.3","28.0","28.2"],"primarily":["5.0"],"focused":["5.0"],"b":["5.0"],"aims":["5.0","14.9"],"supporting":["5.0"],"rapid":["5.0"],"real":["5.0","6.1","26.4"],"time":["5.0","6.1","19.7","22.2","22.4","25.3","25.4","26.4","26.13","27.3","28.2"],"using":["5.0","6.1","11.5","19.7","22.5","23.4","26.9"],"javascript":["5.0","6.1"],"abstractions":["5.0","6.1"],"hide":["5.0","6.1"],"complexity":["5.0","6.1","8.0"],"network":["5.0","6.1","9.0","25.4","26.6","28.15"],"foster":["5.0","6.1"],"very":["5.0","6.1","25.0","28.2"],"prototyping":["5.0","6.1"],"trial":["5.0","6.1"],"error":["5.0"],"workflows":["5.0"],"that":["5.0","7.0","8.1","11.2","15.17","18.10","18.12","18.19","18.21","19.9","22.2","22.3","23.0","26.4","26.12","28.2","28.4","28.12"],"are":["5.0","6.4","7.3","15.20","15.25","15.33","22.3","22.5","26.12","28.2","28.15"],"typical":["5.0"],"artistic":["5.0"],"practices":["5.0"],"href":["5.0","27.6"],"introduction":["5.0","26.0"],"action":["5.0"],"button":["5.0","26.12"],"infos":["5.0","22.5"],"more":["5.0","6.6","24.8","26.12","27.0","28.14"],"tutorials":["5.0","23.2"],"considered":["6.2"],"which":["6.2","6.4","11.1","22.2","22.4","23.4","25.8","26.8","28.0","28.4"],"embodies":["6.2"],"dynamic":["6.2"],"relation":["6.2"],"dialog":["6.2"],"betwenn":["6.2"],"epistemic":["6.2"],"things":["6.2","22.6","25.4","27.3"],"technical":["6.2"],"objects":["6.2"],"quote":["6.2"],"rheinberger":["6.2"],"approach":["6.2"],"strong":["6.2"],"implications":["6.2"],"on":["6.2","14.14","14.25","15.28","16.11","18.6","19.0","24.0","24.4","25.8","26.0","26.12","27.5","28.8","28.15"],"design":["6.2"],"abstrations":["6.4"],"help":["6.5"],"you":["6.5","7.3","19.8","22.2","22.5","23.4","26.5","26.9","26.11","26.13","28.0","28.12"],"synchronized":["6.5","27.3"],"among":["6.5"],"your":["6.5","7.5","7.7","7.8","8.1","14.9","24.7","27.6"],"add":["6.6","7.7","11.3","26.14"],"new":["6.6","8.2","14.4","14.21","15.25","15.33","17.4","18.17","23.0","25.7","26.9","26.12","26.13","26.14","27.4","28.10"],"specific":["6.6","24.7","26.12","28.2"],"functionnalities":["6.6"],"quite":["6.7","22.2","22.6","23.4"],"abstract":["6.7"],"according":["6.7","26.4","28.15"],"low":["6.7"],"level":["6.7"],"apis":["6.7"],"about":["7.0"],"related":["7.0","14.23"],"stuff":["7.0"],"could":["7.0","22.5","28.14"],"go":["7.1","24.2"],"branch":["7.1"],"where":["7.1","26.3"],"sh":["7.2","16.6","23.2","24.2","25.5","26.11"],"git":["7.2"],"pull":["7.2"],"origin":["7.2","25.4"],"if":["7.3","14.9","15.9","19.8","19.15","19.16","19.21","19.22","22.2","22.5","26.5"],"part":["7.3"],"team":["7.3"],"markdown":["7.5","7.7"],"file":["7.5","7.8","11.3","14.14","14.17","14.19","14.25","14.27","14.29","15.16","22.4","23.3","27.6","28.6","28.10"],"lorem":["7.6"],"guide":["7.7"],"html":["7.7","26.9","28.10"],"table":["7.7","26.6"],"contents":["7.7","13.1","17.1"],"page":["7.7"],"same":["7.8","14.23","25.4","26.3","27.3","28.7"],"process":["7.8","19.7","19.8","19.17","23.0"],"as":["7.8","8.0","11.2","14.15","22.5","23.4","23.7","24.3","25.8","26.11","26.12","28.3"],"misc":["7.8"],"except":["7.8"],"should":["7.8","22.5","25.8","27.6"],"is":["8.0","8.2","9.11","14.14","14.25","15.9","15.28","15.29","15.35","18.10","18.19","18.22","18.28","18.34","18.35","22.3","22.4","24.3","24.8","26.8","26.13","26.15","28.2","28.11","28.12","28.15"],"no":["8.0","19.15","19.16","19.21","19.22"],"particular":["8.0","26.4"],"only":["8.0","15.26"],"thing":["8.0","23.3","23.4"],"will":["8.0","8.1","13.12","15.19","15.29","17.9","17.15","18.18","18.22","18.36","18.37","19.8","19.9","19.20","22.2","22.4","24.0","25.4","26.6","26.9","26.12"],"have":["8.0","14.8","25.3","26.8","26.15","28.3","28.8"],"do":["8.0","24.6","26.8"],"e":["8.1","11.4","19.7","23.8","24.7","26.6","26.8","26.13","28.4"],"g":["8.1","11.4","24.7","28.4"],"prod":["8.1"],"json":["8.1","22.3"],"contain":["8.1"],"production":["8.1"],"informations":["8.1","26.6"],"js":["8.1","11.3","13.0","16.0","16.6","17.0","19.7","19.10","22.1","23.0","26.14","28.5","28.6","28.7","28.10","28.14"],"cf":["8.1","18.6"],"my":["8.2"],"app":["8.2","27.5"],"port":["8.2"],"this":["8.2","9.0","11.1","12.0","15.8","16.11","18.36","18.37","19.9","20.0","21.0","24.6","25.3","25.4","25.7","26.3","26.6","26.10","26.12","28.12"],"done":["8.2","22.5","23.4","24.2","25.8"],"simply":["8.2","28.16"],"adding":["8.2"],"location":["8.2"],"configuration":["8.2","22.3"],"warning":["8.3"],"local":["9.0","19.9"],"tp":["9.1"],"point":["9.4"],"connection":["9.5","11.0"],"when":["9.11","11.4","11.5","14.14","14.22","14.25","15.19","15.28","15.29","15.35","17.15","18.13","18.18","18.22","18.24","18.34","18.35","19.14","19.20","22.4","23.3","23.7","25.0","26.8","26.11","26.13","27.2","28.3","28.7"],"applications":["10.0","26.3","26.4"],"over":["11.0"],"single":["11.0"],"tcp":["11.0"],"other":["11.0","19.8","22.5","25.3"],"enable":["11.0"],"bi":["11.0"],"directionnal":["11.0"],"latest":["11.1","24.2","25.5","27.2"],"websockets":["11.1"],"we":["11.1","23.7","24.0","25.3","26.10","26.12","28.8","28.15"],"wont":["11.1"],"use":["11.1","18.23","24.7","24.8","25.8","26.6","26.12","27.6"],"server":["11.1","11.4","15.1","15.17","18.6","19.1","19.10","23.3","23.7","26.11","26.14"],"command":["11.1","26.11"],"line":["11.1"],"tool":["11.1"],"propose":["11.1"],"i":["11.1","19.7","23.8","26.6","26.8","26.13"],"ws":["11.2"],"servestatic":["11.2"],"serve":["11.2"],"static":["11.2","27.6"],"finalhandler":["11.2"],"creating":["11.2","23.0"],"configuring":["11.2"],"behaves":["11.2"],"handler":["11.2"],"files":["11.2","15.17","15.20","22.3","26.12"],"const":["11.2","14.4","17.4","19.10","25.7","27.4","27.5","28.7","28.13","28.14"],"staticfilehandler":["11.2"],"communicate":["11.3"],"open":["11.3","22.4"],"main":["11.3","28.12"],"lines":["11.3"],"form":["11.4","12.0"],"sc":["11.4","26.9","28.10"],"component":["11.4"],"message":["11.4","25.4"],"trigger":["11.4"],"input":["11.4"],"sent":["11.4","15.28"],"receives":["11.4"],"output":["11.4"],"sends":["11.4","15.11"],"another":["11.4","18.23","25.8"],"socket":["11.4"],"gives":["11.5","26.13"],"idea":["11.5","26.3"],"problem":["11.5","25.0"],"might":["11.5","23.4","28.12"],"encounter":["11.5"],"raw":["11.5"],"api":["11.5","24.6"],"indeed":["11.5","23.7","28.2"],"conditions":["12.0"],"met":["12.0"],"redistributions":["12.0"],"must":["12.0","19.8"],"retain":["12.0"],"above":["12.0"],"notice":["12.0"],"list":["12.0"],"disclaimer":["12.0"],"reproduce":["12.0"],"2fplugin":["13.0","17.0","19.0"],"assign":["13.0"],"toc":["13.1","14.1","16.1","17.1","18.1"],"npm":["13.2","14.2","15.2","16.2","16.6","17.2","18.0","18.2","19.2"],"import":["13.4","16.4","19.4","19.5","25.7","28.10","28.15"],"from":["13.4","13.5","14.6","14.16","14.26","16.4","16.5","17.5","19.4","19.5","19.10","19.17","19.18","24.4","24.5","25.7","26.7","28.5","28.10"],"dd":["13.7","14.11","15.8","16.8","17.7","19.12"],"p":["13.7","14.11","16.8","17.7","19.12"],"client":["13.7","14.6","14.11","15.1","16.8","17.7","17.10","17.12","19.1","19.12","22.3","24.1","24.7","26.1","26.13","27.5","28.1","28.3"],"return":["13.9","13.10","14.13","14.16","14.24","14.26","18.12","18.21","19.8"],"representation":["13.11","16.13","17.14"],"manually":["13.12","15.15","17.9"],"instantiated":["13.12","15.19","17.15","18.18","19.14","19.20"],"version":["14.0","15.0","18.0"],"https":["14.0","15.0","16.0","18.32","26.12"],"badge":["14.0","15.0","16.0","17.0"],"installation":["14.1","16.1","18.1"],"filesystem":["14.4"],"pluginmanager":["14.4","14.22","15.19","16.10","19.14","27.4"],"register":["14.4","24.7","26.12"],"way":["14.8","22.6","24.6","24.7","28.7","28.16"],"read":["14.8"],"due":["14.8"],"impossibility":["14.8"],"poses":["14.9"],"evident":["14.9"],"questions":["14.9","25.3"],"moreover":["14.9"],"running":["14.9"],"kind":["14.12","14.15","14.17","14.21","14.23","14.27","15.27","18.9","18.16","18.17","18.23","18.27","18.29","18.30","18.31","19.13"],"global":["14.12","14.21","18.9","18.17","25.3","26.6","26.7","26.15","28.14"],"class":["14.12","14.21","18.9","18.17","27.5"],"gettree":["14.12"],"object":["14.12","14.13","14.24"],"created":["14.14","14.25","15.20","15.30","18.22","23.3","26.11","26.13","28.12","28.15"],"modified":["14.14","14.25"],"or":["14.14","14.25","18.22","22.5","24.7","25.8","26.3"],"deleted":["14.14","14.25","18.22","26.8","28.15"],"underlying":["14.14","14.25"],"directory":["14.14","14.18","14.22","14.25","14.28","18.6","18.23","24.2","25.5","27.6","28.10"],"tree":["14.15"],"flat":["14.15"],"map":["14.15"],"filename":["14.15"],"url":["14.15","23.6"],"node":["14.16","14.26","22.3"],"write":["14.17","14.27","28.6"],"promise":["14.19","14.20","14.29","14.30"],"delete":["14.20","14.30"],"switch":["14.21"],"registered":["14.22","15.19","16.10","17.15","18.18","19.14","19.20"],"available":["14.22","15.19","16.10","19.14"],"options":["14.22","16.10","19.14"],"dirname":["14.22","18.6"],"string":["14.22","15.16","15.21","18.29","18.30","18.31"],"watch":["14.22"],"into":["14.22","25.0"],"change":["14.23","24.7","27.3"],"while":["14.23","15.10","22.5","24.7","24.8","26.8","27.3","28.2"],"keeping":["14.23","25.4"],"logic":["14.23"],"hand":["14.23"],"fury":["15.0","16.0","17.0"],"notes":["15.1","19.1"],"receipes":["15.1","19.1"],"default":["15.1","15.21","17.10","17.12","22.5","23.3","25.8","26.9","26.14","28.3","28.9"],"pluginlogger":["15.4","15.5"],"logger":["15.4"],"examples":["15.6"],"its":["15.7","25.3","26.15"],"name":["15.7","18.36","18.37","22.2","23.4","27.5","28.3","28.15"],"txt":["15.7"],"extention":["15.7"],"added":["15.7","15.25","15.33"],"prefixed":["15.8"],"format":["15.8"],"yyyy":["15.8"],"mm":["15.8"],"hh":["15.8"],"ss":["15.8"],"id":["15.8","23.3","28.9"],"basename":["15.8"],"behavior":["15.8"],"path":["15.9","23.2","24.2","25.5","26.4"],"given":["15.9","16.12","17.10","17.11","17.13","28.15"],"shared":["15.10","26.6","28.14","28.16"],"most":["15.10","26.15","28.0","28.2"],"simple":["15.10","18.6","21.4","22.0","25.4","27.3"],"can":["15.10","15.17","23.4","26.12","27.6","28.12"],"attach":["15.10","26.8","26.12","28.7"],"buffer":["15.11","15.26"],"data":["15.11","26.4"],"batch":["15.11"],"sync":["15.13","19.13","19.16","19.17","19.19","19.22","25.5","25.6","25.7","25.8","27.0","27.2","27.4"],"pluginloggerserver":["15.13"],"never":["15.15"],"be":["15.15","15.17","18.34","18.35","19.8","22.4","22.5","23.3","23.7","24.6","25.8","26.9","28.4","28.14"],"called":["15.15","17.9","26.6","26.12","26.14","28.10"],"description":["15.16","15.21"],"used":["15.16","15.21","18.10","18.19","22.5","27.6","28.14"],"generate":["15.16","15.21"],"log":["15.16","15.20"],"pathname":["15.16"],"usefull":["15.17"],"gather":["15.17"],"closes":["15.20"],"existing":["15.20","18.14","18.25"],"type":["15.21","23.3","26.14","28.0","28.9"],"retrived":["15.22","15.30"],"writer":["15.23","15.24","15.27","15.29","15.31","15.32","15.34","15.35"],"calls":["15.25","15.33"],"applies":["15.26"],"executed":["15.28","15.35","18.34","18.35"],"packet":["15.28"],"closed":["15.29","15.35"],"initiated":["15.36"],"io":["16.0","17.0"],"access":["16.6","24.6","26.8","26.13"],"microphone":["16.6","24.6"],"camera":["16.6","24.6"],"streams":["16.6"],"motion":["16.6"],"sensors":["16.6"],"throught":["16.6"],"ircam":["16.6","26.9","28.10"],"devicemotion":["16.6"],"package":["16.6","22.2"],"install":["16.6","22.2","24.2","28.3"],"save":["16.6"],"side":["16.8","16.13","18.6","26.8"],"audiocontext":["16.10","28.13","28.14"],"instance":["16.10","18.16","18.23","18.27"],"audio":["16.10","24.6","28.6","28.12","28.14"],"context":["16.10","19.8","19.9"],"resumed":["16.10"],"aliases":["16.10"],"webaudio":["16.10"],"first":["16.11","26.14","28.15"],"user":["16.11","24.6","24.7"],"gesture":["16.11","24.6"],"calling":["16.11","18.36","18.37","19.8"],"several":["16.11","26.3","28.15"],"associated":["16.12","27.3"],"feature":["16.12","23.8","26.15"],"pluginposition":["17.4"],"position":["17.4","17.8","17.11","17.12","17.13"],"ranges":["17.10"],"units":["17.10","17.12"],"retrieve":["17.11","17.13"],"normalized":["17.12"],"pluginscripting":["18.4","18.5"],"defined":["18.6","24.7"],"option":["18.6"],"scripting":["18.8","18.9"],"pluginscriptingserver":["18.8"],"note":["18.10","18.19"],"store":["18.10","18.19","26.6","26.14"],"returns":["18.11","18.20","19.15","19.16","19.21","19.22"],"convenience":["18.12","18.21"],"method":["18.12","18.21","18.23","18.36","18.37"],"script":["18.13","18.14","18.15","18.16","18.22","18.24","18.25","18.26","18.27","18.28","18.34","18.35"],"returned":["18.13","18.14","18.15","18.24","18.25","18.26","28.15"],"resolves":["18.13","18.14","18.15","18.24","18.25","18.26"],"underlyings":["18.13","18.24"],"states":["18.13","18.24","26.15","28.16"],"setglobalscriptingcontext":["18.17"],"runtime":["18.28"],"source":["18.28","22.3","22.4"],"stored":["18.28"],"directly":["18.28","23.4"],"filestem":["18.28"],"transpiled":["18.32"],"module":["18.32"],"listening":["18.33"],"entirely":["18.37"],"clients":["19.0","22.3","27.3","28.4","28.8","28.10","28.16"],"master":["19.0","28.4"],"usage":["19.1","22.5","25.7"],"seconds":["19.7"],"since":["19.7"],"started":["19.7","26.5"],"hrtime":["19.7"],"fulfilled":["19.8"],"words":["19.8","25.3"],"suspended":["19.8"],"always":["19.8"],"broken":["19.8"],"hence":["19.8"],"make":["19.8","26.13","27.3","28.7"],"sure":["19.8","26.13","27.3","28.7"],"need":["19.9","28.15"],"convert":["19.9"],"information":["19.9","26.12"],"clock":["19.9","19.10","19.15","19.16","19.22","25.3","25.9"],"so":["19.9","26.14"],"speak":["19.9"],"get":["19.10","19.18","28.13","28.14"],"current":["19.10","19.15","19.16","19.21","19.22"],"reference":["19.10","25.3"],"arguments":["19.15","19.16","19.21","19.22"],"provided":["19.15","19.16","19.21","19.22"],"reports":["19.17"],"last":["19.18"],"statistics":["19.18"],"else":["19.21"],"norbert":["19.23"],"tutorial":["20.0","21.0","24.0","25.4","26.5","27.6"],"documentation":["21.1"],"works":["21.3","22.5"],"setup":["22.0","22.6"],"develop":["22.0"],"run":["22.2","23.0","23.4","26.3"],"likely":["22.2"],"tell":["22.2"],"needs":["22.2","24.7","26.4"],"just":["22.2","25.8","26.11","27.0","28.3"],"enter":["22.2","26.11"],"accept":["22.2"],"continue":["22.2"],"wizard":["22.2","23.4","25.5"],"startup":["22.2"],"ask":["22.2","27.2"],"want":["22.2","28.8","28.12"],"built":["22.3"],"config":["22.3","25.7","26.7","27.4","27.5","28.5"],"modules":["22.3"],"dependencies":["22.3"],"installed":["22.3","24.3","26.9","28.3"],"public":["22.3","27.6"],"exposed":["22.3"],"src":["22.3","22.4","23.3","26.14","28.5","28.6","28.10"],"declared":["22.3"],"components":["22.3","26.9","28.10"],"player":["22.3","26.12","26.14","28.3","28.14"],"means":["22.4","26.8"],"bundled":["22.4"],"restarted":["22.4"],"each":["22.4"],"saved":["22.4"],"expected":["22.4","22.5"],"confortable":["22.4"],"saving":["22.4"],"developping":["22.4"],"click":["22.5"],"here":["22.5","26.6","27.6"],"sw":["22.5","26.12","28.10"],"credits":["22.5"],"container":["22.5","24.7","28.12"],"reload":["22.5"],"cmd":["22.5"],"shift":["22.5"],"r":["22.5"],"see":["22.5","23.4","26.12","28.12"],"displayed":["22.5"],"top":["22.5","24.4"],"left":["22.5"],"tip":["22.5","28.12"],"rendering":["22.5","26.9","27.6"],"lit":["22.5","26.9"],"library":["22.5","23.4","26.9"],"developped":["22.5"],"google":["22.5","26.9"],"promote":["22.5"],"template":["22.5","24.2","25.7"],"does":["22.5"],"not":["22.5","24.8","26.8"],"require":["22.5"],"potentially":["22.5"],"any":["22.5"],"everything":["22.5"],"learned":["22.6","27.0"],"few":["22.6"],"how":["22.6","24.8"],"opening":["23.0"],"possibilities":["23.0"],"ouside":["23.0"],"cd":["23.2","24.2","25.5"],"npx":["23.2","23.4","24.2","25.5","26.11"],"they":["23.3","26.8"],"connect":["23.3","23.7","28.13"],"named":["23.3"],"schemas":["23.3","26.14"],"declare":["23.3"],"schema":["23.3","26.14","28.15"],"definition":["23.3"],"export":["23.3","26.14","28.9"],"integer":["23.3","28.9"],"null":["23.3","28.9"],"such":["23.4","24.6","25.8","26.12","26.13","27.3"],"audioworklet":["23.4"],"would":["23.4"],"expect":["23.4"],"browsers":["23.4","24.6"],"however":["23.4","25.8"],"already":["23.4"],"offers":["23.4"],"interesting":["23.4"],"compatibility":["23.4"],"descent":["23.4"],"performances":["23.4"],"makes":["23.4"],"usable":["23.4"],"hopefully":["23.4"],"large":["23.4"],"spectrum":["23.4"],"projects":["23.4"],"those":["23.4"],"who":["23.4"],"interested":["23.4"],"rs":["23.4"],"then":["23.4","26.12","27.2","28.3","28.14"],"second":["23.4"],"target":["23.4","24.2","28.3"],"once":["23.4","24.2"],"restart":["23.4"],"dev":["23.4"],"emulate":["23.6"],"query":["23.6"],"parameter":["23.6","26.12","26.14"],"our":["23.6","24.3","26.12","26.14","28.12"],"able":["23.7","27.6"],"launch":["23.7","24.2"],"browser":["23.7","24.2","28.3"],"important":["23.8","25.0"],"learn":["24.0"],"why":["24.0"],"working":["24.2","25.5"],"confirm":["24.2"],"again":["24.2"],"dependency":["24.3"],"polyfills":["24.4","25.7"],"launcher":["24.5"],"order":["24.6"],"properly":["24.6"],"launched":["24.6"],"let":["24.6","25.2","25.8","26.2","26.13","28.14"],"s":["24.6","25.2","25.3","25.8","26.2","26.13","28.14"],"examplify":["24.6"],"info":["24.6","26.12","27.6"],"initialize":["24.6"],"certain":["24.6"],"protect":["24.6"],"end":["24.6","26.4"],"initscreenscontainer":["24.7"],"offer":["24.7","28.15"],"numerous":["24.7","28.14"],"adapt":["24.7"],"these":["24.7","26.9","26.12"],"styles":["24.7"],"language":["24.7"],"even":["24.7"],"completely":["24.7"],"different":["24.7","26.6"],"won":["24.7","26.8","27.3"],"precisely":["24.8"],"dig":["25.0"],"dealing":["25.0"],"own":["25.3","26.8","28.8"],"notion":["25.3"],"cannot":["25.3"],"assume":["25.3"],"there":["25.3"],"something":["25.3"],"like":["25.3"],"lack":["25.3"],"leads":["25.3"],"fundamental":["25.3"],"regarding":["25.3"],"synchronization":["25.3","25.9"],"coordination":["25.3"],"maarten":["25.3"],"van":["25.3"],"steen":["25.3"],"andrew":["25.3"],"tanenbaum":["25.3"],"brief":["25.3"],"offset":["25.4"],"delta":["25.4"],"respective":["25.4"],"sake":["25.4"],"ideal":["25.4"],"case":["25.4"],"excatly":["25.4"],"propagation":["25.4"],"pluginsync":["25.7","27.4"],"configure":["25.7"],"either":["25.8"],"date":["25.8"],"now":["25.8","26.12","28.11"],"performance":["25.8"],"depending":["25.8"],"possible":["25.8"],"currenttime":["25.8"],"against":["25.8"],"thus":["25.8","26.8","26.13"],"implement":["25.8"],"reasons":["25.9"],"concepts":["25.9"],"behind":["25.9"],"proposed":["26.0","26.9"],"after":["26.0"],"short":["26.0"],"statemanager":["26.1","26.13","27.5","28.7"],"extends":["26.3"],"computers":["26.3"],"users":["26.3"],"say":["26.3"],"facebook":["26.4"],"adapted":["26.4"],"flow":["26.4"],"structured":["26.4"],"please":["26.5"],"refer":["26.5"],"getting":["26.5"],"didn":["26.5"],"t":["26.5","26.8","27.3"],"check":["26.5"],"yet":["26.5"],"database":["26.6"],"syntax":["26.6"],"described":["26.6"],"two":["26.6"],"accessible":["26.6"],"nodes":["26.6"],"across":["26.6"],"whole":["26.6"],"loadconfig":["26.7","27.4","28.5"],"utils":["26.7","27.4","28.5"],"load":["26.7","27.4","28.5"],"catch":["26.7"],"unhandled":["26.7"],"errors":["26.7"],"globalschema":["26.7"],"playerschema":["26.7"],"owner":["26.8"],"attaching":["26.8"],"full":["26.8"],"but":["26.8"],"disconnect":["26.8"],"distinction":["26.8"],"between":["26.8"],"series":["26.9"],"achieved":["26.9"],"both":["26.9"],"libraries":["26.9"],"section":["26.10","27.5"],"ctrl":["26.11"],"c":["26.11"],"beginning":["26.11"],"toggle":["26.12"],"audit":["26.12"],"importing":["26.12"],"elements":["26.12"],"templates":["26.12"],"element":["26.12"],"display":["26.12"],"names":["26.12"],"control":["26.12","28.16"],"volume":["26.12","28.4"],"mute":["26.12","28.4","28.14"],"box":["26.12"],"players":["26.12","26.13","28.7","28.10"],"frequencies":["26.12"],"developer":["26.12"],"mozilla":["26.12"],"org":["26.12"],"en":["26.12"],"us":["26.12"],"docs":["26.12"],"subject":["26.12"],"fortunately":["26.13"],"functionality":["26.13"],"sharedstatecollection":["26.13","28.1"],"interface":["26.13"],"updated":["26.13","28.7"],"connects":["26.13"],"inteeger":["26.14"],"value":["26.14","27.3","28.13","28.14"],"one":["26.15"],"powerfull":["26.15"],"versatile":["26.15"],"seen":["26.15"],"build":["27.0"],"advanced":["27.0"],"step":["27.2"],"sequencer":["27.2"],"select":["27.2"],"stop":["27.3"],"timestamp":["27.3"],"event":["27.3","28.9"],"exact":["27.3"],"bpm":["27.3"],"score":["27.3"],"keep":["27.3","28.6"],"allow":["27.3"],"having":["27.3"],"plugincheckin":["27.4"],"checkin":["27.4"],"usedefaultapplicationtemplate":["27.4"],"text":["27.5","28.10"],"transport":["27.5"],"number":["27.5"],"await":["27.5","28.6","28.7"],"update":["27.5","28.13"],"screen":["27.5","28.7"],"onupdate":["27.5","28.7","28.14"],"renderapp":["27.5","28.7"],"function":["27.5","28.7","28.12"],"div":["27.5"],"layout":["27.5"],"header":["27.5"],"h1":["27.5"],"role":["27.5"],"simplicity":["27.6"],"put":["27.6"],"them":["27.6"],"samples":["27.6"],"downloaded":["27.6"],"withbase":["27.6"],"assets":["27.6"],"zip":["27.6"],"illustrates":["28.0"],"interaction":["28.0"],"participant":["28.2"],"audience":["28.2"],"later":["28.2","28.6"],"artwork":["28.2"],"former":["28.2"],"generally":["28.2"],"requires":["28.2"],"properties":["28.2"],"relatively":["28.2"],"asks":["28.3"],"call":["28.3"],"well":["28.3"],"defining":["28.4"],"variables":["28.4"],"every":["28.4"],"connected":["28.4"],"actual":["28.6"],"snippet":["28.6"],"refreshed":["28.7"],"controls":["28.8"],"nullable":["28.9"],"true":["28.9"],"frequency":["28.9"],"float":["28.9"],"min":["28.9"],"max":["28.9"],"synthtoggle":["28.9"],"boolean":["28.9"],"false":["28.9"],"immediate":["28.9"],"synthtrigger":["28.9"],"litelement":["28.10"],"css":["28.10"],"needed":["28.10"],"gui":["28.10"],"slider":["28.10"],"ready":["28.11"],"share":["28.12"],"async":["28.12"],"outside":["28.12"],"destination":["28.13"],"creategain":["28.13","28.14"],"gain":["28.13","28.14"],"principles":["28.14"],"complex":["28.14"],"synthesizers":["28.14"],"parameters":["28.14"],"callback":["28.14"],"handle":["28.14"],"synthesis":["28.14"],"automatically":["28.15"],"kept":["28.15"],"synchonized":["28.15"],"methods":["28.15"],"work":["28.15"],"remote":["28.16"],"monitoring":["28.16"],"through":["28.16"],"along":["28.16"]},{"0":["19.7","26.14"],"1":["15.16","24.2","26.11","26.14","28.14"],"2":["1.4","22.6","24.2","26.11","28.5"],"3":["24.2","24.5","24.6","26.11","28.15"],"4":["24.6","26.8","26.13"],"5":["22.4","22.5","26.8"],"6":["26.12"],"7":["22.4"],"8":["26.7","28.15"],"9":["28.15"],"10":["25.3"],"16":["22.1"],"24":["26.13"],"39":["13.7","14.11","16.8","17.7"],"50":["26.14","27.5"],"60":["26.12"],"80":["8.0"],"98":["25.3"],"101":["11.4"],"127":["11.2"],"240":["27.5"],"440":["26.14"],"443":["8.0"],"1000":["26.14"],"2016":["25.3"],"2020":["3.5"],"3000":["11.2"],"the":["0.0","3.1","3.5","4.3","4.7","4.9","4.11","7.1","7.2","7.7","11.0","13.0","13.7","13.11","14.4","14.11","14.13","14.24","15.8","15.9","15.30","16.8","16.13","17.4","17.7","17.14","18.36","18.37","19.12","23.2"],"https":["0.0","4.10","8.0","11.3","18.0","19.17","19.18","28.10"],"dev":["0.1","13.13","14.31","16.14","17.16","18.38","19.24","28.10"],"clause":["0.2","3.6","13.14","14.32","15.37","16.15","17.17","18.39","19.25"],"735px":["1.0"],"ircam":["1.2","3.1","3.2","11.3","16.10","19.17","27.6","28.7","28.15"],"fr":["1.2"],"youtube":["1.2"],"is":["1.3","6.5","17.10","17.12","18.6","23.3","24.5","26.3","28.4","28.13"],"sync":["1.4","15.14","19.12","19.15","19.21","25.1","27.1"],"working":["1.4","25.8"],"with":["1.4","19.0","25.2","26.2","26.4","26.5","26.8"],"node":["1.4","4.5","5.0","14.8","23.2","27.6"],"clients":["1.4","5.0","6.1","13.0","16.6","23.2","23.4","23.8","24.6","25.7","26.6","26.9","26.15","27.4","28.2","28.15"],"synchronized":["1.4","26.4"],"audio":["1.4","3.5","19.23"],"scheduling":["1.4"],"css":["1.5"],"globals":["1.5"],"variables":["1.5"],"plugin":["1.6","5.0","13.5","13.8","15.5","15.14","15.15","15.18","16.5","16.9","17.5","18.4","18.28","19.8","19.19","25.6"],"helpers":["1.6"],"principles":["1.7"],"about":["1.7","22.3"],"networks":["1.7","9.1"],"creating":["1.7","15.8"],"local":["1.7","19.16","19.22"],"list":["1.8","14.14","14.25","18.11","18.20","18.22"],"ismm":["3.1"],"team":["3.1"],"centre":["3.1"],"pompidou":["3.1"],"in":["3.1","6.1","7.8","8.1","11.5","13.12","15.1","16.11","17.9","17.13","18.18","19.10","19.20","25.7","26.4","28.9","28.12","28.14"],"french":["3.2"],"national":["3.2"],"agency":["3.2"],"anr":["3.2"],"composers":["3.3"],"artists":["3.3"],"designers":["3.3"],"and":["3.3","7.3","7.8","11.0","14.8","14.14","14.25","15.29","18.13","18.14","18.15","18.22","18.24","18.25","18.26","18.37","19.21","19.22","24.6","25.8","26.0"],"researchers":["3.3"],"a":["3.3","7.3","13.0","14.22","14.30","16.10","16.11","19.14","22.1","22.3","24.7","24.8","25.2","25.9","26.2","26.5","26.8","26.10","27.2","27.4","28.16"],"number":["3.3","15.16"],"for":["3.4","4.6","4.12","6.6","8.0","14.22","15.10","15.16","15.21","17.0","19.8","19.23","25.0","28.15"],"distributed":["3.4","19.23","25.9"],"music":["3.4","25.0"],"system":["3.4","5.0","25.9","26.3"],"aes":["3.5"],"journal":["3.5"],"of":["3.5","4.8","4.11","6.3","6.4","11.3","13.7","14.11","14.14","14.17","14.18","14.23","14.25","14.27","14.28","15.8","15.17","15.20","15.25","15.27","15.33","15.36","16.8","16.12","16.13","17.7","17.15","18.11","18.16","18.20","18.22","18.23","18.27","18.28","18.34","18.36","19.0","19.12","22.4","24.7","26.7","28.6","28.9"],"engineering":["3.5"],"society":["3.5"],"accoustics":["3.5"],"application":["3.5","4.8","4.10","24.3","26.15","27.0","28.16"],"inc":["3.5"],"03033143":["3.5"],"soundworks":["3.5","6.3","8.1","13.7","13.11","13.12","14.11","16.4","16.8","17.7","17.9","17.10","17.12","17.14","19.8","19.12","24.6","25.8","26.7","26.9","28.7","28.10"],"tip":["4.1","7.5"],"note":["4.1","7.5","22.2","22.3","27.4"],"most":["4.1","25.3"],"time":["4.1","18.6","19.14","25.8","28.13"],"you":["4.1","6.7","8.1","9.1","17.10","23.2","25.5"],"won":["4.1"],"related":["4.2"],"json":["4.2","24.7"],"data":["4.2","6.1","13.10"],"currently":["4.2"],"limited":["4.2"],"to":["4.2","13.10","14.4","15.8","16.0","18.13","18.24","19.10","19.14","23.8","24.0","24.3","25.0","25.9","26.0","27.4","28.0","28.11"],"client":["4.3","11.0","14.1","16.6","23.1","26.6","27.2","27.6","28.2","28.4","28.6","28.10","28.15"],"among":["4.3","13.0","28.15"],"available":["4.3","13.0","13.12","17.15","18.18","19.20"],"watch":["4.4","23.4"],"directories":["4.4"],"distribute":["4.4"],"arbitrarily":["4.5"],"from":["4.5","11.3","15.17","16.6","22.2","23.3","23.4","25.4","26.8","27.6","28.4"],"any":["4.5","15.25","15.33","22.0"],"it":["4.6","6.2","9.11","15.25","15.33","19.9","23.3","24.4","24.5","24.6","24.8","28.9"],"also":["4.6","27.3","28.8"],"provides":["4.6"],"an":["4.6","4.8","4.10","26.4"],"entry":["4.6","4.8","6.4","24.2"],"point":["4.6","4.8","11.4"],"template":["4.7","28.3","28.6"],"default":["4.7","14.23","19.1","27.2","27.3","28.7"],"views":["4.7","4.12"],"that":["4.8","6.1","18.6","19.14","23.8","24.5","25.8","26.15","28.13"],"across":["4.9"],"devices":["4.9","6.5"],"sh":["4.10","19.8"],"git":["4.10"],"clone":["4.10"],"github":["4.10","19.17","19.18"],"com":["4.10","11.3","18.32","19.17"],"collective":["4.10"],"init":["4.12","16.5","16.9","19.8","24.4","24.7","25.8"],"etc":["4.12","5.0","8.2"],"getting":["5.0","22.2"],"started":["5.0","11.2","22.2"],"get":["5.0","26.8","26.12","27.4","27.5"],"h2":["5.0","26.12"],"main":["5.0","6.4","11.4"],"features":["5.0"],"ul":["5.0"],"li":["5.0"],"support":["5.0"],"both":["5.0","11.0"],"browser":["5.0","14.8","23.6","26.11"],"communications":["5.0"],"through":["5.0"],"websockets":["5.0","6.7","11.4"],"state":["5.0","19.9","22.5","25.8"],"management":["5.0"],"extend":["5.0"],"core":["5.0","6.1","6.6","13.4","16.4","16.6","19.4","19.5"],"functionalities":["5.0"],"clock":["5.0","19.0","25.4"],"synchronization":["5.0","6.1"],"runtime":["5.0"],"scripting":["5.0","18.4","18.5","18.10","18.19"],"error":["6.1"],"workflows":["6.1"],"are":["6.1","7.1","8.1","18.13","18.24","23.8","25.4","26.15","28.13"],"typical":["6.1"],"artistic":["6.1"],"practices":["6.1","6.2"],"its":["6.1","26.3","26.12","28.4"],"states":["6.1","18.14","18.15","18.25","18.26","26.0"],"amonst":["6.1"],"maintenance":["6.2"],"must":["6.2"],"evolve":["6.2"],"way":["6.2"],"keep":["6.2"],"questionning":["6.2"],"theory":["6.2"],"order":["6.2"],"not":["6.2","23.8"],"be":["6.2","7.0","7.8","11.1","14.4","15.8","15.10","15.11","15.25","15.33","18.12","18.21","19.9","22.0","24.7","27.0","28.2","28.8"],"reduced":["6.2"],"simple":["6.2"],"points":["6.4"],"responsible":["6.4"],"specifically":["6.5"],"designed":["6.5"],"framework":["6.6","15.36"],"example":["6.6","15.10","19.8","19.9"],"we":["6.6","15.6","20.0","21.0","24.5","26.7","27.4","28.12"],"provide":["6.6"],"plugins":["6.6","18.10","18.19","24.2","25.5","25.7","27.2"],"such":["6.7","8.2","14.9","18.6"],"as":["6.7","8.2","11.5","18.35","19.0","22.2","25.4","26.4","27.2","27.4","28.2","28.9","28.12"],"if":["6.7","7.5","14.22","15.26","25.8","28.14"],"need":["6.7","19.8","25.4","28.0","28.7"],"some":["6.7","22.5","23.4","26.4","26.11","28.7"],"refresher":["6.7"],"this":["6.7","15.10","15.11","17.10","17.12","22.2","26.11","27.3","28.2","28.4"],"useful":["7.0"],"others":["7.0"],"or":["7.0","8.0","14.19","14.20","14.29","14.30","26.13"],"would":["7.0","25.5","25.8","27.3"],"source":["7.1","18.36"],"files":["7.1","15.1","18.13","18.14","18.15","18.24","18.25","18.26","22.2"],"located":["7.1","8.2"],"server":["7.2","11.0","14.1","15.10","15.11","15.13","16.1","18.1","18.8","18.28","24.1","26.4","26.6","27.3","28.1"],"npm":["7.2","19.8"],"otherwise":["7.3","15.7"],"proceed":["7.3"],"usual":["7.3"],"steps":["7.3"],"create":["7.3","15.10","16.10","22.6","23.8","24.6","26.6","26.12","27.3","28.4","28.7"],"pull":["7.3"],"directory":["7.5","7.8","14.4","14.19","14.20","14.29","14.30","15.19","18.18","23.4","27.3"],"ipsum":["7.6"],"sidebar":["7.7"],"menu":["7.7"],"open":["7.7","23.4","24.7"],"config":["7.7","9.9","15.4","18.4","18.5","23.3","24.6","24.7","26.12","27.6"],"js":["7.7","8.2","11.4","14.0","15.0","15.7","22.4","24.6","26.9","26.13","27.3","27.6","28.15"],"path":["7.7","14.4","14.22","23.4"],"placed":["7.8"],"tutorials":["7.8","23.4"],"link":["7.8","9.1"],"port":["8.0","11.2"],"http":["8.0"],"however":["8.0"],"more":["8.0","26.3","26.8"],"common":["8.0","26.15"],"situation":["8.0"],"environement":["8.1"],"type":["8.1","14.23","15.25","15.33","18.23","22.4","27.3","28.3"],"file":["8.2","11.4","14.8","14.20","14.30","15.21","18.22","18.37","26.6","27.3"],"generally":["8.2"],"at":["8.2","22.4","26.8"],"conf":["8.2"],"cf":["8.2"],"todo":["8.3"],"page":["9.0","28.12"],"describes":["9.0"],"how":["9.0","24.0","25.0","25.9","26.0","28.16"],"mandatory":["9.11"],"between":["11.0","14.8","19.15","19.16","19.21","19.22"],"meaning":["11.0"],"e":["11.1","11.5","14.9","15.9","15.28","18.35","25.0","25.3","26.4","28.0","28.7"],"serve":["11.1"],"but":["11.1","26.11","28.8"],"will":["11.1","14.14","14.25","15.15","15.35","16.11","18.10","18.19","20.0","21.0","22.5","24.7","25.5","25.8","26.8","26.10","26.11","27.4","28.7"],"rather":["11.1","11.5"],"our":["11.1","24.5","25.0","25.3","25.4","28.3"],"own":["11.1","19.9","22.4","26.6","28.0","28.4"],"able":["11.1","22.0","22.5","28.8"],"handle":["11.1"],"websocket":["11.1"],"connections":["11.1"],"html":["11.2","11.3","11.4","28.15"],"use":["11.2","24.0","25.3","26.0","27.4","28.7"],"respond":["11.2"],"requests":["11.2"],"createserver":["11.2"],"req":["11.2"],"res":["11.2"],"listening":["11.2"],"request":["11.2"],"on":["11.2","28.12","28.13"],"listen":["11.2"],"console":["11.2","22.2","22.5","28.14"],"log":["11.2","15.1","15.19","15.21","22.5","28.6","28.14"],"code":["11.3","11.4","14.21","14.23","15.17","15.20","16.12","18.9","18.17","18.23","24.3","26.8","27.6","28.5","28.14"],"import":["11.3","16.6","23.3","27.6","28.7","28.9"],"render":["11.3","11.4"],"unpkg":["11.3"],"lit":["11.3","28.15","28.16"],"plays":["11.4"],"start":["11.4","22.4","25.2","26.8","26.9","26.13","27.6","28.4","28.6","28.14"],"by":["11.4","15.10","17.9","24.2","28.6","28.7","28.10"],"implementing":["11.4"],"side":["11.4","13.7","14.11","17.7","18.28","19.12"],"h1":["11.4","26.12"],"send":["11.4","11.5"],"const":["11.4","15.4","15.5","15.7","18.4","18.5","19.7","22.4","22.5","24.6","26.8","26.9","26.12","26.13","27.6","28.6"],"src":["11.4","16.6","24.6","26.6","26.9","26.13","27.3","28.15"],"audiocontext":["11.4","19.1","27.6"],"low":["11.5"],"level":["11.5"],"g":["11.5","15.9","26.4"],"implies":["11.5"],"messages":["11.5"],"strings":["11.5"],"route":["11.5","14.22"],"them":["11.5","26.7","26.15","28.15"],"all":["11.5","14.9","18.11","18.14","18.15","18.20","18.25","18.26","26.15","28.13"],"manually":["11.5"],"documentation":["12.0"],"other":["12.0","14.9"],"materials":["12.0"],"distribution":["12.0"],"neither":["12.0"],"name":["12.0","15.9","15.22","26.8","26.11","26.12"],"unique":["13.0","13.9","27.4"],"index":["13.0","13.9","16.6","22.4","23.3","24.6","26.8","26.13","27.4","28.9","28.15"],"installation":["13.1","17.1","24.2"],"usage":["13.1","14.1","16.1","17.1","18.1"],"install":["13.2","14.2","15.2","16.2","17.2","18.2","19.2","19.8","25.8"],"plugincheckin":["13.5"],"checkin":["13.5","13.8","13.11","27.2"],"representation":["13.7","14.8","14.11","16.8","17.7","19.12"],"kind":["13.8","14.16","14.18","14.19","14.20","14.26","14.28","14.29","15.14","15.17","15.18","15.20","15.23","15.24","15.31","15.32","15.34","16.12","17.8","17.13","18.13","18.24","18.32","18.33","18.34","19.19"],"global":["13.8","15.14","15.18","17.8","19.13","19.19","22.5","24.6","26.9","26.13","27.4","28.5","28.9"],"given":["13.9","13.10","14.16","14.26","15.7","19.15","19.16","19.21","19.22"],"associated":["13.10"],"when":["13.12","15.8","17.9","18.14","18.15","18.25","18.26","23.2","25.5","26.4","28.12"],"registered":["13.12","17.9","26.8"],"pluginmanager":["13.12","15.4","17.4","17.15","18.18","19.20","24.1","24.4","24.5","24.6","25.7"],"fury":["14.0","18.0"],"io":["14.0","15.0"],"watched":["14.4"],"can":["14.4","15.8","15.11","15.25","15.33","18.12","18.21","23.0","24.2","24.5","24.7","24.8","26.7","28.2"],"relative":["14.4"],"process":["14.4","19.18"],"cwd":["14.4"],"pluginfilesystem":["14.6"],"filesystem":["14.6","14.13","14.24","18.12","18.21","27.6"],"consistent":["14.8"],"online":["14.9"],"prevent":["14.9"],"issues":["14.9"],"sensible":["14.9"],"operations":["14.9"],"i":["14.9","15.28","18.35","25.0","25.3","28.0","28.4","28.7"],"than":["14.9"],"onupdate":["14.12","14.21","28.10","28.13"],"callback":["14.12","14.21","28.10","28.13"],"executelistener":["14.12"],"function":["14.12","19.14","19.20","26.12","28.6"],"gettreeasurlmap":["14.12"],"current":["14.13","14.24","25.8"],"receive":["14.14","14.25","18.22"],"updated":["14.14","14.25","18.22","18.34"],"tree":["14.14","14.16","14.25","14.26","18.12","18.21"],"instance":["14.15","14.17","14.18","14.19","14.23","14.27","14.28","14.29","15.17","15.20","15.23","15.24","15.27","15.31","15.32","15.34","16.12","17.13","18.29","18.30","18.31","18.32","18.33","18.34","26.6","26.7","26.8","28.4"],"method":["14.15","14.17","14.18","14.19","14.23","14.27","14.28","14.29","15.17","15.20","15.27","16.12","17.10","17.12","18.16","18.27","18.34","24.6"],"returns":["14.15","19.14"],"matching":["14.16","14.26"],"options":["14.21","15.19","17.15","18.18","19.20"],"gettree":["14.21","18.9","18.17"],"object":["14.21","15.16","15.21","18.17"],"publicpath":["14.22"],"optionnal":["14.22"],"public":["14.22"],"assets":["14.22"],"set":["14.22","19.9"],"param":["14.23","18.23"],"description":["14.23","18.23"],"2fplugin":["15.0","16.0"],"extension":["15.1"],"prefix":["15.1"],"new":["15.4","17.8","18.4","18.5","19.13","24.6","26.5","28.15"],"register":["15.4","17.4","23.3","24.3","24.4","24.5","24.6","26.7","28.5"],"logger":["15.5","15.13","15.18","15.22","15.30"],"assume":["15.6","19.9"],"kept":["15.7"],"intact":["15.7"],"turned":["15.8"],"seeting":["15.8"],"useprefix":["15.8","15.21"],"option":["15.8","15.26","18.28","28.3"],"false":["15.8"],"writer":["15.8"],"my":["15.9"],"dir":["15.9"],"created":["15.10","22.3","22.5","23.4"],"used":["15.10","25.8"],"avoid":["15.11"],"network":["15.11","15.28"],"congestion":["15.11"],"done":["15.11","26.7","27.2"],"buffersize":["15.16","15.22","15.26"],"informations":["15.17","27.3"],"multiple":["15.17"],"nodes":["15.17","19.0","28.13"],"dirname":["15.19","18.18","18.28"],"null":["15.19","28.10","28.14"],"string":["15.19","18.18"],"which":["15.19","19.9","24.0","27.4","28.7"],"writers":["15.20"],"pathname":["15.21"],"createwriter":["15.22","15.30"],"property":["15.23","15.24","15.31","15.32","18.29","18.30","18.31"],"line":["15.25","15.33"],"buffer":["15.28","15.29"],"after":["15.29","16.11","24.2"],"has":["15.29","24.2"],"been":["15.29"],"flushed":["15.29"],"underlying":["15.34","15.35","18.12","18.21","26.0"],"stream":["15.34","15.35","16.10"],"pluginplatforminit":["16.5","16.6","24.4","24.5"],"platform":["16.5","16.8","16.9","19.8","24.4","25.8"],"devicemotion":["16.10"],"module":["16.10"],"device":["16.10","19.9","25.3"],"motion":["16.10"],"micro":["16.10"],"boolean":["16.10","22.4","23.3","27.3"],"microphone":["16.10"],"times":["16.11"],"result":["16.11"],"no":["16.11","25.3"],"op":["16.11"],"locating":["17.0"],"people":["17.0"],"these":["17.4","22.3","25.4","27.3","27.6"],"values":["17.4","26.12"],"define":["17.4","27.2"],"coordinates":["17.4"],"pluginposition":["17.5"],"position":["17.5","17.14"],"class":["17.8","19.13","19.19","26.12","28.10"],"instantiated":["17.9"],"automatically":["17.10","17.12","22.2"],"called":["17.10","17.12"],"launcher":["17.10","17.12"],"ranges":["17.11"],"units":["17.11","17.13"],"normalized":["17.13"],"xrange":["17.15"],"array":["17.15","18.9","18.17"],"range":["17.15"],"area":["17.15"],"badge":["18.0"],"modules":["18.6"],"re":["18.6"],"bundled":["18.6"],"using":["18.6","19.1","22.6","24.2","28.16"],"esbuild":["18.6"],"each":["18.6","19.0","19.9","28.4","28.13"],"their":["18.6"],"content":["18.6"],"modified":["18.6"],"setglobalscriptingcontext":["18.9"],"ctx":["18.9","18.17"],"getlist":["18.9","18.17"],"globally":["18.10","18.19"],"so":["18.10","18.19","23.4","25.4","28.13"],"several":["18.10","18.19","23.6","28.12"],"running":["18.10","18.19","27.5"],"parallel":["18.10","18.19"],"instances":["18.13","18.14","18.24","18.25"],"up":["18.13","18.24","19.9"],"date":["18.13","18.24"],"underlyings":["18.14","18.15","18.25","18.26"],"names":["18.22"],"see":["18.28","19.17","19.18","22.2","24.7","26.0"],"shared":["18.28","19.9","22.5","26.0","26.14"],"caniuse":["18.32"],"search":["18.32"],"updates":["18.33","22.5","28.13","28.14"],"detached":["18.35"],"detach":["18.35"],"script":["18.36","18.37"],"because":["19.0"],"consequence":["19.0"],"dealing":["19.0"],"independent":["19.0"],"clocks":["19.1","25.3"],"currenttime":["19.1"],"starttime":["19.7"],"gettimefunction":["19.7","19.14","19.20"],"now":["19.7","23.3","23.4","24.5","28.13"],"return":["19.7"],"first":["19.8","24.6","25.8","26.5","26.9","28.7"],"soudnworks":["19.8"],"before":["19.8"],"starting":["19.8"],"save":["19.8","24.8"],"s":["19.9","24.3","24.7","26.5","26.6","28.4"],"reference":["19.9","25.4","28.10"],"wont":["19.9"],"same":["19.9","22.5","28.12"],"next":["19.9"],"have":["19.9","22.5"],"localtime":["19.10"],"getlocaltime":["19.10"],"according":["19.10"],"second":["19.14","26.10","26.14","28.3"],"defaults":["19.14"],"else":["19.15","19.16","19.22"],"performs":["19.15","19.16","19.21","19.22"],"convertion":["19.15","19.16","19.21","19.22"],"synchronaization":["19.18"],"synchronisation":["19.23","25.1"],"step":["20.0"],"router":["21.4"],"model":["21.5"],"where":["22.0","23.7"],"connected":["22.0","23.4"],"user":["22.0","26.4","28.12"],"trigger":["22.0","22.4"],"write":["22.2","23.7","24.3"],"copy":["22.2"],"bunch":["22.2"],"required":["22.2"],"dependencies":["22.2","28.15"],"illustrated":["22.2","26.4"],"screenshot":["22.2"],"below":["22.2"],"info":["22.2"],"screenshots":["22.2"],"guide":["22.2"],"may":["22.2"],"differ":["22.2"],"slightly":["22.2"],"what":["22.2"],"actually":["22.2"],"your":["22.2","22.4","23.4","28.0"],"cli":["22.2"],"tool":["22.2"],"just":["22.3","23.3","24.7","26.8","28.9"],"styles":["22.3"],"utils":["22.3","23.3","27.6"],"package":["22.3"],"contains":["22.3","26.13"],"declaration":["22.3"],"readme":["22.3"],"md":["22.3"],"general":["22.3"],"infos":["22.3"],"there":["22.3"],"few":["22.3"],"thing":["22.3","26.5","27.4"],"add":["22.4","22.5","26.8"],"following":["22.4","22.5","23.4","26.8","27.6"],"lines":["22.4","26.8"],"end":["22.4"],"await":["22.4","26.8","26.9","26.12","26.13","27.6"],"do":["22.4"],"stuff":["22.4"],"globalschema":["22.4","27.4","28.5","28.9"],"control":["22.5","28.8"],"over":["22.5","27.3"],"behavior":["22.5"],"web":["22.5","23.0","27.6","28.15","28.16"],"statemanager":["22.5","26.7","26.8","26.9","26.12","27.4","28.6","28.9"],"attach":["22.5","26.6","26.9","26.13"],"getvalues":["22.5"],"simply":["22.5"],"means":["22.5"],"apply":["22.5"],"wizard":["22.6","23.2","26.9","28.7"],"browsers":["23.0"],"indeed":["23.0","25.3"],"functionality":["23.0","27.3"],"allows":["23.0","28.12"],"applications":["23.0","28.0"],"work":["23.0"],"screenless":["23.0"],"embedded":["23.0"],"latest":["23.2"],"asks":["23.2"],"nullable":["23.3"],"true":["23.3","25.4","28.7","28.13","28.14"],"triggersound":["23.3"],"event":["23.3"],"declared":["23.3"],"into":["23.3","24.4","24.5","26.8","27.3","28.5","28.7"],"manager":["23.3"],"loadconfig":["23.3","27.6"],"load":["23.3","27.6"],"catch":["23.3","28.5"],"terminal":["23.4"],"go":["23.4"],"tutorial":["23.4","24.7","26.11","27.3","28.12"],"cd":["23.4"],"newly":["23.4"],"mode":["23.4"],"tada":["23.4"],"should":["23.4"],"eveything":["23.4"],"setup":["23.4"],"ready":["23.4"],"needed":["23.4"],"react":["23.4","28.11"],"instructions":["23.4"],"controller":["23.4","27.2","27.4","28.2","28.3"],"play":["23.4","27.5"],"sound":["23.4"],"only":["23.6"],"one":["23.6"],"window":["23.6","24.6"],"human":["23.7"],"tell":["23.7"],"reach":["23.7"],"url":["23.7"],"address":["23.7"],"bar":["23.7","24.2"],"possibility":["23.8"],"aims":["24.0"],"uninstall":["24.2"],"space":["24.2"],"completed":["24.2"],"exit":["24.2"],"pressing":["24.2"],"ctrl":["24.2"],"c":["24.2"],"let":["24.3","24.7","26.5","26.6","28.4"],"then":["24.4","24.7","25.7","25.8","26.6","28.6","28.7"],"component":["24.4","26.12","28.15","28.16"],"imported":["24.5"],"users":["24.6","28.2"],"against":["24.6"],"intrusive":["24.6"],"ads":["24.6"],"obvious":["24.6"],"privacy":["24.6"],"reasons":["24.6"],"player":["24.6","25.7","26.6","26.7","26.9","28.2","28.4","28.15"],"context":["24.6"],"pass":["24.6","26.14"],"third":["24.6"],"argument":["24.6"],"t":["24.7","25.3"],"cover":["24.7"],"advanced":["24.7"],"case":["24.7","28.14"],"here":["24.7"],"they":["24.7"],"subject":["24.7"],"dedicated":["24.7","28.2"],"minimal":["24.7"],"changes":["24.7"],"make":["24.7"],"customize":["24.7"],"view":["24.7","28.13"],"per":["24.8"],"se":["24.8"],"very":["24.8"],"complex":["24.8"],"lot":["24.8"],"quite":["24.8"],"boring":["24.8"],"development":["24.8","28.3"],"creation":["25.0"],"synchronize":["25.0","27.3"],"musical":["25.0"],"introduction":["25.3"],"systems":["25.3"],"computing":["25.3","26.3"],"october":["25.3"],"physical":["25.3"],"having":["25.3"],"origin":["25.3"],"furthermore":["25.3"],"speed":["25.3"],"computers":["25.3"],"daily":["25.3"],"life":["25.3","25.4"],"don":["25.3"],"constant":["25.4"],"disclaimer":["25.4"],"none":["25.4"],"assumptions":["25.4"],"real":["25.4"],"hence":["25.4"],"goal":["25.4"],"estimate":["25.4"],"calculate":["25.4"],"inversely":["25.4"],"achieve":["25.4"],"ask":["25.5","26.11"],"select":["25.5","26.11"],"like":["25.5","27.6"],"usedefaultapplicationtemplate":["25.7"],"allow":["25.8"],"us":["25.8"],"resume":["25.8"],"suspended":["25.8"],"always":["25.8","26.4"],"zero":["25.8"],"fail":["25.8"],"concepts":["26.0"],"sharedstate":["26.1","26.8","28.10"],"bit":["26.2","26.8"],"formal":["26.3"],"collection":["26.3","26.13"],"autonomous":["26.3"],"elements":["26.3"],"appears":["26.3"],"single":["26.3","26.6"],"coherent":["26.3"],"maarten":["26.3"],"van":["26.3"],"steen":["26.3"],"figure":["26.4"],"above":["26.4"],"input":["26.4"],"gesture":["26.4","28.12"],"triggers":["26.4"],"change":["26.4"],"generate":["26.5"],"empty":["26.5"],"describe":["26.6","26.15"],"role":["26.6","26.12"],"scheme":["26.6"],"once":["26.7","27.2","28.3"],"confusing":["26.8"],"clear":["26.8"],"writing":["26.8"],"modify":["26.9","28.6","28.13"],"renderapp":["26.9","26.12","28.6","28.13"],"provided":["26.9","28.6","28.7"],"boilerplate":["26.9"],"two":["26.9","27.4","28.2"],"implement":["26.10","28.0"],"questions":["26.11"],"target":["26.11"],"displays":["26.12"],"div":["26.12"],"layout":["26.12","28.13"],"header":["26.12"],"app":["26.12"],"section":["26.12"],"p":["26.12","27.5"],"hello":["26.12","27.5"],"style":["26.12","27.5"],"padding":["26.12"],"bottom":["26.12","27.5"],"4px":["26.12","27.5"],"readonly":["26.12"],"value":["26.12","27.5"],"db":["26.12"],"min":["26.12","26.14","27.5"],"max":["26.12","26.14","27.5"],"deleted":["26.13"],"disconnects":["26.13"],"integer":["26.14"],"frequency":["26.14"],"float":["26.14"],"review":["26.14"],"based":["27.0"],"imply":["27.3"],"amongst":["27.3"],"every":["27.3"],"lead":["27.3"],"complicate":["27.3"],"thus":["27.3"],"named":["27.3"],"schemas":["27.3","28.5"],"translate":["27.3"],"schema":["27.3"],"definition":["27.3"],"export":["27.3"],"registerschema":["27.4","28.9"],"margin":["27.5"],"buttons":["27.5"],"stop":["27.5"],"bpm":["27.5"],"look":["27.6"],"api":["27.6"],"audiobufferloader":["27.6"],"sc":["27.6","28.7","28.15"],"loader":["27.6"],"audiofiles":["27.6"],"remote":["28.0"],"monitoring":["28.0"],"illustrate":["28.2"],"roles":["28.2"],"composed":["28.2"],"different":["28.2"],"types":["28.2"],"envisioned":["28.2"],"ended":["28.3"],"launch":["28.3"],"tools":["28.3"],"inside":["28.3"],"tied":["28.4"],"unhandled":["28.5"],"errors":["28.5"],"interface":["28.7","28.8"],"again":["28.7"],"components":["28.7","28.15"],"compoents":["28.7"],"library":["28.7","28.16"],"installed":["28.7"],"text":["28.7","28.15"],"slider":["28.7","28.15"],"toggle":["28.7","28.10"],"importantly":["28.8"],"take":["28.8"],"playerschema":["28.9"],"parameters":["28.9"],"bang":["28.10"],"swplayer":["28.10"],"extends":["28.10"],"constructor":["28.10"],"super":["28.10"],"stores":["28.10"],"unsubscribe":["28.10"],"returned":["28.10"],"methos":["28.10"],"unobserve":["28.10"],"connectedcallback":["28.10"],"emulate":["28.12"],"seen":["28.12"],"needs":["28.12"],"changed":["28.13"],"requestupdate":["28.13"],"applied":["28.13"],"key":["28.13","28.14"],"connect":["28.14"],"master":["28.14"],"synthtoggle":["28.14"],"switch":["28.14"],"nothing":["28.15"],"reusable":["28.16"],"while":["28.16"],"purposely":["28.16"],"simplified":["28.16"],"aspects":["28.16"]},{"0":["5.0","7.2","11.2","26.6"],"1":["11.2","19.7","26.4","26.12"],"2":["22.5","26.4"],"4":["28.5"],"5":["24.6","28.5","28.6"],"6":["26.6"],"8":["28.5"],"9":["19.7"],"10":["26.3","28.5"],"16":["28.6"],"60":["26.6"],"80":["8.2"],"98":["26.3"],"120":["27.3"],"127":["7.2"],"443":["8.2"],"2016":["26.3"],"2019":["3.5"],"8002":["8.1"],"dev":["0.0","7.2"],"channel":["1.2"],"soundworks":["1.3","1.7","13.2","14.2","15.2","15.15","16.2","16.13","17.2","18.2","22.3","22.4","25.9","28.0","28.1"],"building":["1.4"],"a":["1.4","3.2","4.6","4.9","6.7","19.20","23.6","23.8","25.7"],"distributed":["1.4","18.8","23.6","25.1"],"step":["1.4","11.4"],"sequencer":["1.4"],"contexts":["1.4","26.3"],"what":["1.4","11.5"],"are":["1.4","14.9","18.14","18.15","18.18","18.25","18.26","22.4","22.6","25.3","26.13"],"note":["1.4","24.2"],"relation":["1.4"],"to":["1.4","6.4","7.2","9.0","11.0","12.0","13.9","17.10","17.12","18.12","18.14","18.15","18.21","18.25","18.26","18.36","19.20","26.2"],"text":["1.5"],"language":["1.5"],"eject":["1.5"],"build":["1.6"],"related":["1.6"],"libraries":["1.6","22.2"],"and":["1.6","1.7","3.4","6.5","14.22","15.13","15.35","15.36","17.4","19.14","19.15","19.16","25.5","28.0","28.5","28.12"],"network":["1.7","4.5","22.5","25.3"],"deploying":["1.7"],"application":["1.7","4.1","23.6","26.7"],"context":["3.1","11.3"],"of":["3.1","4.3","4.5","13.12","14.8","14.9","14.16","14.19","14.20","14.26","14.29","15.34","16.0","17.4","17.11","17.13","18.13","18.24","18.29","18.30","18.31","18.32","18.33","22.0","22.6","23.7","24.0","26.12","27.0"],"cosima":["3.1"],"research":["3.1","3.4"],"project":["3.1","22.2"],"become":["3.2"],"so":["3.2","19.8","22.5","28.12"],"p":["3.2","26.9","28.6"],"constella":["3.2"],"c":["3.2"],"tions":["3.2"],"musical":["3.3"],"pieces":["3.3"],"artworks":["3.3"],"created":["3.3","15.11","15.13","15.19","18.12","18.21","26.8","26.14","28.3"],"using":["3.3","25.3","26.15","28.15"],"can":["3.3","6.7","7.5","9.1","11.0","18.6","18.8","26.0","28.9"],"creation":["3.4","28.8"],"aes":["3.4"],"systems":["3.5","26.3"],"state":["3.5","15.29","23.4","26.5","28.0","28.5"],"affairs":["3.5"],"new":["3.5","13.5","14.6","15.5","15.14","15.18","16.5","16.6","17.5","19.19","23.3","24.4","24.5","26.7","27.6","28.4"],"developments":["3.5"],"proceedings":["3.5"],"conference":["3.5"],"wac":["3.5"],"dec":["3.5"],"t":["4.1","23.7"],"need":["4.1","6.2","8.0","27.2"],"install":["4.1","11.1","22.3","25.5","27.2","28.12"],"manually":["4.1","17.10","17.12","18.28","22.3"],"as":["4.1","19.1","23.0","24.0"],"mp3":["4.2"],"wav":["4.2","27.6"],"or":["4.2","6.1","6.6","14.4","15.11","15.28","18.6","18.35","19.14","24.2","26.12"],"formats":["4.2"],"ones":["4.3","13.0"],"number":["4.3","13.12","19.13","28.2","28.16"],"tickets":["4.3"],"their":["4.4","6.1"],"content":["4.4"],"all":["4.4","6.4","14.4","15.10","16.10","18.36","18.37","19.9","22.0","24.3","25.4"],"the":["4.5","14.9","15.4","18.4","18.5","19.1","22.0","23.0"],"may":["4.6","12.0"],"require":["4.6","14.8"],"user":["4.6","4.8"],"gesture":["4.6"],"e":["4.6","11.2","16.10","18.6","22.3","25.7","26.12","28.9"],"g":["4.6","11.2","26.12","28.9"],"clicking":["4.6","26.12"],"on":["4.6","4.12","7.3","15.11","19.14","22.0","22.3","27.0","27.4","28.16"],"is":["4.7","4.9","7.5","12.0","15.19","15.26","16.11","19.9","19.14","23.6","24.7","26.12","28.9","28.10"],"associated":["4.7","18.37","19.15","19.16","19.21","19.22"],"with":["4.7","6.2","6.6","15.8","15.21","16.10","18.4","19.7","26.14","27.4","28.4","28.16"],"initialization":["4.7","16.0","24.8"],"enables":["4.8"],"end":["4.8","22.6","26.8"],"modify":["4.8","28.7"],"basically":["4.9"],"wrapper":["4.9"],"my":["4.10","15.8"],"cd":["4.10","26.5"],"sh":["4.11","7.1","26.5"],"applications":["4.12","8.0","20.0"],"based":["4.12"],"high":["5.0"],"level":["5.0"],"architecture":["5.0"],"projects":["5.0"],"demos":["5.0"],"iframe":["5.0"],"www":["5.0"],"youtube":["5.0"],"nocookie":["5.0"],"com":["5.0","19.18"],"embed":["5.0"],"videoseries":["5.0"],"list":["5.0"],"plt5gv5ypsj0w":["5.0"],"wgzuzle1an6ykwbiknyn":["5.0"],"title":["5.0"],"video":["5.0"],"player":["5.0","26.8","28.11"],"frameborder":["5.0"],"allow":["5.0","27.4","28.9"],"encrypted":["5.0"],"media":["5.0"],"picture":["5.0"],"allowfullscreen":["5.0"],"details":["5.0"],"h3":["5.0"],"nbsp":["5.0"],"installations":["5.0"],"performances":["5.0"],"concerts":["5.0"],"experimental":["5.0"],"settings":["5.0"],"simplifying":["6.1","24.8"],"control":["6.1","6.5","26.0","26.15","28.0"],"both":["6.1","28.11"],"localy":["6.1"],"remotely":["6.1","28.8"],"another":["6.1","22.5"],"important":["6.1","26.3"],"feature":["6.1","16.10"],"one":["6.1","19.0","26.11","28.9"],"make":["6.1","22.3","23.4"],"no":["6.1","17.4","18.18","26.3"],"distinction":["6.1"],"between":["6.1","19.9","26.12"],"browsers":["6.1"],"node":["6.1","18.6","23.1","27.0"],"js":["6.1","15.8","18.0","19.8","19.9","25.8","26.6","27.0","28.4"],"runtimes":["6.1"],"demonstration":["6.2"],"phenomenon":["6.2"],"again":["6.2"],"mitigate":["6.2"],"this":["6.2","8.0","23.3","24.7","26.7","28.3"],"change":["6.2","27.5","28.10"],"mutation":["6.2"],"contradictory":["6.2"],"stability":["6.2"],"required":["6.2"],"by":["6.2","8.0","11.2","15.11","15.15","18.28","24.3","24.7","24.8","25.4","25.9","28.9","28.12"],"software":["6.2","12.0"],"development":["6.2","28.8"],"we":["6.2","11.5","19.0","22.4","24.2","27.2"],"opted":["6.2"],"modular":["6.2"],"framework":["6.3"],"do":["6.4"],"nitty":["6.4"],"gritty":["6.4"],"implement":["6.5","11.4","16.10","26.0","26.15","28.9"],"remote":["6.5","26.0","26.15"],"monitoring":["6.5","26.0","26.15"],"which":["6.5","11.0","15.4","18.18","23.6","24.7","26.4"],"synchronizing":["6.6","25.3"],"clocks":["6.6"],"working":["6.6","26.5"],"filesystem":["6.6","14.11"],"point":["6.7"],"have":["6.7","17.4","17.10","17.12","19.0","22.2","23.7","26.3","28.12"],"look":["6.7","24.7"],"here":["6.7","22.4"],"also":["6.7","24.8"],"like":["7.0","24.7"],"fix":["7.0"],"even":["7.0"],"improve":["7.0"],"existing":["7.0"],"git":["7.1"],"github":["7.1"],"go":["7.2","9.1","27.2"],"http":["7.2","8.2"],"request":["7.3"],"for":["7.3","8.2","18.6","23.3","24.7","25.1","26.7","28.10"],"changes":["7.3","27.5"],"push":["7.3","26.6"],"your":["7.3","11.2","26.8","26.12","27.5"],"quite":["7.5","11.4"],"long":["7.5","24.2"],"it":["7.5","13.0","17.10","17.12","18.28","19.8","25.4","26.11","28.2","28.4","28.12"],"dolor":["7.6"],"file":["7.7","9.9","14.4","23.4","24.7","25.8","26.8","28.4","28.7"],"children":["7.7"],"entry":["7.7","7.8","14.22","24.7"],"misc":["7.7"],"object":["7.7","14.23","18.9","18.23","22.4"],"side":["7.8","15.6","26.4"],"bar":["7.8"],"several":["8.0","24.6"],"same":["8.0","18.10","18.19","28.3"],"generally":["8.0"],"done":["8.0","22.2"],"having":["8.0"],"proxy":["8.0"],"server":["8.1","13.1","15.6","15.16","17.1","25.4","25.8","28.4"],"listen":["8.1","8.2"],"port":["8.1"],"be":["8.1","12.0","15.4","15.9","15.21","18.8","18.36","19.7","22.3","26.11","27.4","28.9","28.12"],"accessible":["8.1"],"map":["8.2"],"upgrade":["8.2"],"connection":["8.2"],"default":["8.2","14.15","15.17","16.11","18.13","18.24","23.2","24.6","26.6","26.8","26.11","26.12"],"close":["8.2","15.28","15.29","15.35"],"create":["9.0","26.5","26.14","28.15"],"motion":["9.11"],"sensors":["9.11"],"send":["11.0"],"data":["11.0","22.4"],"not":["11.0","17.10","17.12","26.12"],"possible":["11.0"],"then":["11.1","19.8","25.4","27.3","28.15"],"some":["11.1","11.5","15.19","22.3","22.6","23.0"],"dependencies":["11.1","18.6","27.2"],"simplifies":["11.1"],"process":["11.1","19.20","25.4"],"npm":["11.1","22.3","27.2"],"save":["11.1","19.2"],"ws":["11.1"],"if":["11.2","11.5","13.10","15.19","18.18","18.37","23.4","23.7","24.2","25.7","26.11","26.12","27.5"],"you":["11.2","17.12","18.37","19.7","23.7","24.7","25.7","26.0","26.8","26.12","27.5"],"open":["11.2","26.8","27.5"],"url":["11.2","14.22"],"in":["11.2","14.4","15.4","17.0","27.5","28.4","28.13"],"browser":["11.2","16.0","19.14","23.8","24.7","24.8","27.5","28.12"],"should":["11.2","15.21","17.10","17.12","24.7","26.8","26.12","27.5"],"retrieve":["11.2"],"requested":["11.2"],"client":["11.2","13.0","13.1","13.9","13.10","16.0","16.1","17.1","18.1","18.28","19.8","19.9","23.2","23.3","24.6","25.4","26.4","26.10","26.15","27.4"],"main":["11.2"],"sc":["11.3"],"components":["11.3","18.12","18.21"],"latest":["11.3","26.5"],"resumeaudiocontext":["11.3"],"lib":["11.3"],"resume":["11.3"],"audio":["11.3","25.0"],"loadaudiobuffer":["11.3"],"load":["11.3","27.3"],"buffer":["11.3","11.4"],"createbuffersource":["11.4"],"connect":["11.4"],"destination":["11.4"],"document":["11.4"],"body":["11.4"],"easy":["11.4"],"through":["11.4","25.3","26.4"],"instance":["11.4","14.13","14.14","14.16","14.20","14.24","14.25","14.26","14.30","15.28","17.11","18.13","18.14","18.22","18.24","18.25","19.15","19.16","19.21","19.22"],"where":["11.5","15.10"],"deliberately":["11.5"],"but":["11.5","23.8","25.3"],"want":["11.5","24.2","26.11"],"variables":["11.5"],"frequency":["11.5","28.14"],"values":["11.5","22.5","26.13"],"nor":["12.0"],"names":["12.0"],"its":["12.0","19.0","23.4","25.4"],"contributors":["12.0"],"used":["12.0","22.3"],"endorse":["12.0"],"promote":["12.0"],"products":["12.0"],"derived":["12.0","26.6"],"from":["12.0","19.8","22.5","25.8","27.3"],"specific":["12.0"],"prior":["12.0"],"written":["12.0","15.4"],"permission":["12.0"],"when":["13.0","15.15","17.0","22.5","23.6","28.10"],"disconnects":["13.0"],"s":["13.0","26.3"],"plugincheckin":["13.4"],"const":["13.5","14.6","15.8","16.5","16.6","17.5","19.9","23.3","23.4","24.4","24.5","26.7","26.14","27.3","28.15"],"checkin":["13.7","27.1"],"plugin":["13.7","13.11","14.9","14.11","16.8","17.7","17.14","19.12","24.7","25.9"],"class":["13.8","15.14","15.18","16.9","26.9","28.6"],"getindex":["13.8"],"kind":["13.11","14.13","14.14","14.24","14.25","14.30","15.22","15.26","15.28","15.30","16.9","17.11","17.14","18.11","18.14","18.20","18.22","18.25","19.15","19.16","19.21","19.22"],"options":["13.12","17.9"],"capacity":["13.12"],"infinity":["13.12"],"2fplugin":["14.0"],"notes":["14.1","18.1"],"reading":["14.1"],"absolute":["14.4"],"cases":["14.4"],"paths":["14.4"],"tree":["14.4","14.13","14.24","18.22"],"will":["14.4","15.4","15.9","15.25","15.33","19.0","19.7","27.2","28.3"],"large":["14.8"],"type":["14.8","14.15","14.17","14.27","15.17","15.20","16.12","18.13","18.24","26.6","26.10"],"that":["14.8","18.16","18.27","18.34","19.20","22.4","22.6","24.2","25.0"],"would":["14.8"],"different":["14.8","25.0","28.9"],"handling":["14.8"],"listing":["14.9"],"blocked":["14.9"],"env":["14.9"],"filterext":["14.12"],"keepextension":["14.12"],"findintree":["14.12","14.21"],"path":["14.12","14.21","18.23","26.5"],"events":["14.14","14.25","25.0"],"describing":["14.14","14.25"],"modifications":["14.14","14.25"],"made":["14.14","14.25","22.2","22.5","27.5"],"method":["14.14","14.16","14.20","14.25","14.26","14.30","15.28","15.30","15.34","17.11","17.13","18.13","18.14","18.22","18.24","18.25","18.32","18.33","19.15","19.16","19.21","19.22","24.4","26.12"],"param":["14.15","14.17","14.18","14.19","14.27","14.28","14.29","15.17","15.20","16.12","18.13","18.24"],"description":["14.17","14.27","15.17","15.20","16.12"],"executelistener":["14.21","18.17"],"function":["14.21","18.10","18.17","18.19","26.9","26.13"],"added":["14.22"],"router":["14.22"],"serve":["14.22"],"an":["14.22","17.0","18.4","28.9"],"dirname":["14.23","18.4"],"string":["14.23","15.17","15.20","18.23"],"watch":["14.23"],"creating":["15.1","22.4","24.2"],"sub":["15.1"],"define":["15.4"],"directory":["15.4","26.5","27.2","28.4"],"files":["15.4","15.19","18.18"],"config":["15.5","16.5","16.6","24.4","24.5","26.9","27.3","28.6"],"pluginmanager":["15.5","16.6","17.9","18.5","19.9","25.8"],"register":["15.5","16.6","18.4","18.5","19.8","25.8","27.3"],"await":["15.7","15.8","18.5","19.9","23.4","26.14","28.15"],"logger":["15.7","15.8"],"createwriter":["15.7","15.8"],"first":["15.7"],"log":["15.7","23.4","26.8","27.6"],"console":["15.7","15.8","23.4","26.8","27.6"],"true":["15.8","15.16","15.21","16.6","22.4","24.7","26.6","27.3"],"txt":["15.8"],"global":["15.10","15.30","16.9","26.14","28.15"],"logs":["15.10","15.16"],"informations":["15.10"],"contribute":["15.10"],"writers":["15.11"],"attach":["15.11","26.14","28.15"],"writerclient":["15.13"],"stream":["15.13"],"writer":["15.13"],"instantiated":["15.15"],"writes":["15.16"],"buffered":["15.16"],"before":["15.16","15.25","15.29","15.33","15.35"],"sending":["15.16"],"useprefix":["15.16"],"boolean":["15.16","15.21","17.9","26.6"],"whether":["15.21"],"prefixed":["15.21"],"attachwriter":["15.22"],"methods":["15.22"],"code":["15.23","15.24","15.31","15.32","19.9","19.13","23.3","24.6","25.8","26.6","26.13","27.3","28.15"],"stringified":["15.25","15.33"],"typedarrays":["15.25","15.33"],"set":["15.26","16.10"],"returns":["15.27","18.16","18.22","18.27","18.34","19.20"],"full":["15.28"],"flushed":["15.28"],"underlying":["15.29","18.10","18.19"],"deleted":["15.29"],"name":["15.30","18.9","24.7","26.9"],"promise":["15.35"],"wave":["15.36"],"handle":["16.0"],"available":["16.1","17.9","18.11","18.20"],"pluginplatforminit":["16.4","24.6","25.8"],"init":["16.8","22.2","25.5"],"i":["16.10","18.6","22.3","22.5","25.7"],"echocancellation":["16.10"],"noisereduction":["16.10"],"autogaincontrol":["16.10"],"false":["16.10","26.6","27.3"],"mic":["16.10"],"todo":["16.10"],"deviceid":["16.10"],"call":["16.11","17.10","17.12"],"automatically":["16.11","26.4"],"called":["16.11","18.35"],"platform":["16.13","24.7","25.5"],"area":["17.0","17.4"],"registered":["17.0"],"system":["17.4"],"they":["17.4","18.6","22.3"],"special":["17.4"],"meaning":["17.4","26.11"],"position":["17.7"],"setposition":["17.8"],"x":["17.8","17.15"],"y":["17.8"],"randomize":["17.9"],"autoamtically":["17.9"],"most":["17.10","19.7"],"axis":["17.15"],"yrange":["17.15"],"io":["18.0"],"optionnal":["18.4"],"import":["18.6","19.8","25.8","27.3","28.12"],"installed":["18.6"],"other":["18.6"],"now":["18.6","19.14","22.2","26.8"],"sharedscript":["18.8"],"amongst":["18.8"],"createscript":["18.9"],"value":["18.9"],"share":["18.10","18.19"],"getglobalscriptingcontext":["18.10","18.19"],"scripts":["18.11","18.20","18.37"],"usefull":["18.12","18.21"],"reuse":["18.12","18.21"],"up":["18.14","18.15","18.25","18.26"],"date":["18.14","18.15","18.25","18.26","19.14"],"instances":["18.15","18.26"],"onupdate":["18.17","19.9","23.4","26.13"],"callback":["18.17"],"script":["18.18"],"located":["18.18"],"cannot":["18.28","19.0"],"instatiated":["18.28"],"retrieved":["18.28"],"calling":["18.28"],"unregister":["18.34"],"been":["18.35","22.2","22.5","24.7"],"propagated":["18.36"],"attached":["18.36","22.5"],"own":["19.0"],"notion":["19.0"],"time":["19.0","19.20","24.7","24.8","26.11","28.3"],"local":["19.1"],"clock":["19.1"],"scheduling":["19.1"],"pluginsync":["19.4","19.5","25.8"],"1e":["19.7"],"case":["19.7","28.13"],"perfectly":["19.7"],"fine":["19.7"],"configure":["19.8","23.3","26.7","28.12"],"resumes":["19.8"],"core":["19.8","25.8"],"pluginplatform":["19.8"],"clients":["19.9","19.14","22.0","25.4","26.14","27.0"],"pseudo":["19.9"],"sync":["19.9","19.18","25.4","25.9"],"get":["19.9","26.9","28.10"],"mysharedstate":["19.9"],"updates":["19.9","23.4"],"synctriggertime":["19.9"],"given":["19.10"],"synchronized":["19.10"],"synctime":["19.10","19.13"],"getlocaltime":["19.13","19.19"],"performance":["19.14"],"ismm":["19.17","19.18"],"syncclient":["19.17","19.18"],"reportfunction":["19.17"],"ircam":["19.18"],"second":["19.20","22.5","28.9"],"defaults":["19.20"],"rendering":["19.23"],"over":["19.23","28.8"],"heterogeneous":["19.23"],"devices":["19.23","25.0"],"aside":["20.0"],"music":["20.0"],"learn":["21.0"],"how":["21.0","24.2"],"sections":["21.5"],"flash":["22.0"],"screen":["22.0"],"modern":["22.1"],"might":["22.2"],"evolved":["22.2"],"bit":["22.2","25.2","25.3","27.5"],"since":["22.2"],"once":["22.2"],"installation":["22.2"],"propose":["22.2"],"plugins":["22.2"],"curated":["22.2"],"skip":["22.2"],"steps":["22.2"],"deps":["22.2"],"after":["22.2","25.0"],"directories":["22.3"],"never":["22.3"],"edited":["22.3"],"repspectively":["22.3"],"manager":["22.3","24.4","24.5","24.6","26.5","28.5"],"tools":["22.3","22.6"],"transformation":["22.3"],"event":["22.4"],"just":["22.4","22.5","23.2","24.2","27.5","28.12"],"plain":["22.4"],"old":["22.4"],"javascript":["22.4","22.5"],"follows":["22.4"],"schema":["22.4"],"definition":["22.4"],"structure":["22.4"],"declares":["22.4"],"parameter":["22.4","28.2"],"named":["22.4","28.4"],"configured":["22.4"],"notified":["22.5"],"current":["22.5","25.4"],"into":["22.5","24.6","26.6","27.2"],"has":["22.5","24.7","28.2"],"successfully":["22.5"],"press":["22.5"],"alt":["22.5"],"j":["22.5"],"chrome":["22.5"],"firefox":["22.5"],"select":["22.5"],"tab":["22.5"],"write":["22.5"],"allows":["22.5"],"use":["22.6","24.2","25.4","25.9"],"at":["22.6","25.3","25.4","28.12"],"hardware":["23.0"],"such":["23.0","24.0"],"raspberry":["23.0"],"pi":["23.0"],"allowing":["23.0"],"access":["23.0","28.2"],"fonctionnalities":["23.0"],"controlling":["23.0"],"unhandled":["23.3","27.3"],"errors":["23.3","27.3"],"thingschema":["23.3"],"usage":["23.3","26.7","26.12"],"within":["23.3","24.2","26.7"],"template":["23.3","26.7","26.11"],"usedefaultapplicationtemplate":["23.3","24.4","26.7"],"statemanager":["23.3","23.4","26.14","28.15"],"registerschema":["23.3"],"thus":["23.4"],"initialize":["23.4"],"id":["23.4","28.10"],"field":["23.4"],"idea":["23.4"],"src":["23.4","25.8","27.4","28.4"],"index":["23.4","25.8","26.14","27.3"],"add":["23.4","25.8"],"snippet":["23.4"],"start":["23.4","27.4","28.2","28.15"],"triggered":["23.4","28.9"],"triggersound":["23.4"],"noise":["23.4"],"very":["23.6","28.9"],"practical":["23.6"],"developing":["23.6"],"web":["23.7","23.8","27.5"],"however":["23.7","26.12"],"don":["23.7"],"any":["23.7","27.3","28.2","28.8"],"hence":["23.7"],"doesn":["23.7"],"running":["23.8"],"rather":["23.8"],"simplify":["24.0","28.8"],"certain":["24.0"],"features":["24.0","24.8","28.16"],"selecting":["24.2"],"tip":["24.2"],"asks":["24.2","25.4"],"followed":["24.2"],"show":["24.2"],"info":["24.2"],"design":["24.3"],"provides":["24.6"],"simplified":["24.6"],"author":["24.7"],"target":["24.7"],"generated":["24.7"],"wizard":["24.7","28.12"],"updated":["24.7"],"each":["24.7","25.4","26.15","27.0","28.2"],"certains":["24.8"],"along":["24.8"],"way":["24.8"],"across":["25.0"],"compose":["25.0"],"theory":["25.2","26.2"],"perceive":["25.3"],"users":["25.3"],"only":["25.3","27.4"],"because":["25.3"],"constently":["25.3"],"themselves":["25.3"],"distant":["25.3"],"protocol":["25.3"],"ntp":["25.3"],"could":["25.3","28.16"],"consider":["25.3"],"problem":["25.3"],"solved":["25.3"],"let":["25.3"],"unfortunately":["25.3"],"complicated":["25.3"],"provided":["25.4","25.9"],"connected":["25.4"],"shown":["25.4"],"figure":["25.4"],"below":["25.4"],"periodically":["25.4"],"precisely":["25.4"],"iteration":["25.4"],"takes":["25.4"],"launcher":["25.7"],"launch":["25.7"],"following":["25.8","26.6","27.5","28.2"],"pattern":["26.0"],"help":["26.0"],"sharedstatecollection":["26.1"],"andrew":["26.3"],"tanenbaum":["26.3"],"brief":["26.3"],"introduction":["26.3"],"october":["26.3"],"additionally":["26.3"],"creative":["26.3"],"arrow":["26.4"],"red":["26.4"],"representation":["26.4"],"websockets":["26.4"],"npx":["26.5"],"export":["26.6"],"volume":["26.6","26.9"],"db":["26.6"],"float":["26.6","27.3"],"min":["26.6"],"max":["26.6"],"mute":["26.6","26.9"],"see":["26.6","26.8","27.5","28.9"],"getvalues":["26.8"],"terminal":["26.8"],"window":["26.8"],"displayed":["26.8","26.12"],"render":["26.9","28.6","28.7","28.10"],"div":["26.9","28.6","28.10"],"simple":["26.9","28.6","28.9","28.16"],"layout":["26.9","28.6"],"hello":["26.9","28.6"],"app":["26.9"],"h2":["26.9","28.10"],"ul":["26.9"],"li":["26.9"],"od":["26.10"],"additionnally":["26.11"],"active":["26.12"],"container":["26.12","27.5","28.6"],"refresh":["26.12"],"page":["26.12"],"interface":["26.12"],"correctly":["26.12"],"still":["26.12"],"missing":["26.12"],"interacting":["26.12"],"moving":["26.12"],"does":["26.12"],"getcollection":["26.13"],"renderapp":["26.13"],"update":["26.13","28.2","28.10"],"shared":["26.13","28.9"],"onattach":["26.13"],"ondetach":["26.13"],"interfaces":["26.15"],"collections":["26.15"],"representing":["27.0"],"track":["27.0","27.4"],"our":["27.0"],"few":["27.2"],"more":["27.2"],"starttime":["27.3"],"null":["27.3"],"nullable":["27.3"],"integer":["27.3"],"loadconfig":["27.3"],"utils":["27.3"],"catch":["27.3"],"globalschema":["27.3"],"us":["27.4","28.9"],"score":["27.4","27.5"],"played":["27.4"],"propagate":["27.5"],"hh":["27.6"],"clap":["27.6"],"rimshot":["27.6"],"snare":["27.6"],"kick":["27.6"],"audiobuffers":["27.6"],"requires":["28.0"],"basic":["28.0"],"knowledge":["28.0"],"accept":["28.2"],"players":["28.2"],"fonctionalities":["28.2"],"trigger":["28.2"],"sound":["28.2","28.9","28.12"],"stop":["28.2","28.10","28.14"],"synthesizer":["28.2","28.9"],"devtools":["28.3"],"devtool":["28.3"],"ask":["28.3"],"questions":["28.3"],"schemas":["28.4"],"fill":["28.4"],"createlayout":["28.6"],"html":["28.6","28.7"],"lit":["28.7"],"sw":["28.7","28.15"],"audit":["28.7"],"finally":["28.7"],"fasten":["28.8"],"two":["28.9"],"types":["28.9"],"common":["28.9"],"behavior":["28.9"],"playing":["28.9"],"back":["28.9"],"started":["28.9"],"stopped":["28.9"],"occurs":["28.10"],"requestupdate":["28.10"],"disconnectedcallback":["28.10"],"reacting":["28.10"],"element":["28.10"],"removed":["28.10"],"dom":["28.10"],"controls":["28.10"],"return":["28.10"],"style":["28.10"],"allowed":["28.12"],"produce":["28.12"],"properly":["28.12"],"remind":["28.12"],"already":["28.12"],"asked":["28.12"],"switch":["28.13"],"currenttime":["28.13"],"settargetattime":["28.13"],"02":["28.13"],"break":["28.13","28.14"],"synth":["28.14"],"createoscillator":["28.14"],"else":["28.14"],"toggle":["28.15"],"focus":["28.16"],"these":["28.16"],"key":["28.16"],"points":["28.16"],"improved":["28.16"]},{"0":["25.7","26.8","28.4"],"1":["7.2","25.7","28.4"],"2":["22.2","24.4","24.5","24.7","26.7","26.14","28.15"],"3":["15.7","15.8","22.6","25.4","26.4"],"4":["25.4"],"5":["27.3"],"6":["22.5"],"7":["24.6"],"8":["22.5","24.6","27.3"],"16":["15.7","15.8"],"23":["24.6"],"30":["28.15"],"35":["28.15"],"39":["15.7","15.8"],"43":["15.7","15.8","28.15"],"50":["26.6"],"127":["25.7","26.8"],"400":["28.10"],"440":["26.6"],"1000":["26.6"],"2023":["15.7","15.8"],"8000":["25.7","26.8"],"8080":["7.2"],"built":["0.0"],"html":["0.1","13.13","14.31","16.14","17.16","18.38","19.24","26.13","26.14","27.4"],"github":["1.2","5.0"],"io":["1.2"],"experience":["1.4"],"context":["1.4","4.6","25.3"],"simple":["1.4","26.3","26.4","26.14"],"router":["1.4"],"switch":["1.4","15.18","18.17"],"between":["1.4","15.1","19.1"],"music":["1.4","3.3"],"parts":["1.4","6.6"],"paragraph":["1.4"],"on":["1.4","1.7","3.3","18.16","18.27","23.4","25.0","28.9"],"locking":["1.4"],"understand":["1.5","25.2","26.2"],"and":["1.5","4.3","8.0","13.0","15.19","18.8","20.0","25.0","26.14","28.11"],"configure":["1.5","22.2"],"tools":["1.6"],"sc":["1.6","26.13","27.1","27.2"],"node":["1.6","14.22","19.14","22.0","23.8","26.4","27.2"],"an":["1.7","6.4","19.9","19.14","19.20","24.4","24.5","25.0"],"the":["1.7","3.4","4.12","16.5","17.0","21.0","25.2","26.2"],"internet":["1.7","25.3"],"founded":["3.1"],"french":["3.1"],"national":["3.1"],"agency":["3.1"],"residency":["3.2"],"starts":["3.2","19.20"],"program":["3.2"],"of":["3.2","3.4","6.6","6.7","7.8","13.0","13.9","14.13","14.22","14.24","14.30","15.4","15.26","15.28","15.29","15.35","18.6","18.14","18.15","18.25","18.26","18.35","19.14","19.17","19.18","21.5","25.5","25.7","28.12"],"european":["3.2"],"commission":["3.2"],"be":["3.3","4.3","6.1","7.5","7.7","15.16","17.4","25.0","25.3","26.4","28.3"],"found":["3.3"],"ircam":["3.3","4.9","5.0","27.1","27.2"],"sound":["3.3","14.8","24.6"],"movement":["3.3"],"journal":["3.4"],"audio":["3.4","4.6","9.11","16.5","19.1","24.0","25.1","26.4","27.2","28.9"],"engineering":["3.4"],"trondheim":["3.5"],"norway":["3.5"],"02387783":["3.5"],"frédéric":["3.5"],"interaction":["3.5","16.0"],"topologies":["3.5"],"in":["3.5","4.4","7.2","15.15","17.4","18.8","19.9","19.23","26.11","26.14"],"mobile":["3.5"],"situated":["3.5"],"wireless":["3.5"],"communications":["3.5"],"template":["4.1","22.2","23.2","26.13"],"already":["4.1"],"takes":["4.1","24.4","26.7"],"care":["4.1"],"that":["4.1","6.7","8.0","11.1","11.5","14.14","14.25","15.27","15.28","16.0","18.22","19.0","24.0","24.4","24.8","26.7","26.11"],"sh":["4.1","7.3"],"npm":["4.1","4.10","4.11","24.2"],"enforce":["4.2"],"browser":["4.2","22.1","22.2","23.2","26.8"],"compatibility":["4.2"],"support":["4.2"],"meaning":["4.2","11.5"],"can":["4.3","6.1","11.2","22.4","25.0","26.4","26.11"],"limited":["4.3","12.0"],"clients":["4.4","18.8","19.7","25.8","26.3","26.11"],"real":["4.4","6.5"],"time":["4.4","22.3","23.4","27.6"],"into":["4.5","13.0","23.7"],"plain":["4.5"],"old":["4.5"],"files":["4.5","14.1"],"screen":["4.6","4.7","11.2","25.7","25.8"],"to":["4.6","4.7","7.5","9.1","13.12","14.0","14.15","15.4","15.19","15.20","17.9","17.15","18.37","19.21","19.22","20.0","21.0","24.4","24.5","25.2","25.7","28.13"],"resume":["4.6"],"where":["4.7"],"are":["4.7","11.0","23.0"],"asked":["4.7"],"behavior":["4.8"],"distributed":["4.8","6.4"],"around":["4.9"],"rm":["4.10"],"rf":["4.10"],"install":["4.10","4.11"],"run":["4.10","23.7"],"dev":["4.10"],"what":["5.0"],"is":["5.0","13.0","14.9","14.23","16.10","18.5","18.8","18.18","19.0","24.2","24.4"],"not":["5.0","12.0","16.11"],"develop":["5.0","6.1"],"regular":["5.0"],"websites":["5.0"],"although":["5.0"],"its":["5.0","26.8"],"probably":["5.0"],"feasible":["5.0"],"do":["5.0","22.5"],"so":["5.0","28.0","28.16"],"if":["5.0","14.4","14.23","19.9","22.4","26.8","26.9","28.3","28.15"],"you":["5.0","11.1","16.11","17.4","22.4","25.3","27.6","28.8"],"adventurous":["5.0"],"ready":["5.0"],"application":["5.0","6.2","6.4","6.6","17.4","24.6","28.9"],"will":["5.0","6.2","17.0","18.13","18.24","22.3","23.7","24.6","26.5"],"have":["5.0","11.1","16.11"],"code":["5.0","13.8","15.13","15.28","15.29","15.35","17.8","17.10","17.12","18.6","18.33","18.36","19.17","19.19","28.4"],"however":["5.0","24.7"],"we":["5.0"],"maintain":["5.0"],"set":["5.0","11.4","14.9","19.20","26.12","28.10"],"quite":["5.0"],"generic":["5.0"],"could":["5.0","17.4"],"fit":["5.0"],"your":["5.0","7.2","14.8","17.4","23.7","26.0","26.9","26.11","26.15"],"case":["5.0"],"as":["6.1","8.1","12.0","15.6","15.20","18.23","22.4","24.4"],"such":["6.1","25.9"],"used":["6.1","15.17","24.4","24.7","26.8","28.3"],"prototype":["6.1"],"running":["6.1","6.4","27.6"],"exclusively":["6.1"],"partly":["6.1"],"embedded":["6.1"],"hardware":["6.1"],"rapberry":["6.1"],"pi":["6.1"],"while":["6.1","6.2"],"architecture":["6.2","28.9"],"follow":["6.2"],"semver":["6.2"],"hope":["6.2"],"choice":["6.2"],"minimize":["6.2"],"burden":["6.2"],"existing":["6.2"],"allowing":["6.2"],"framework":["6.2"],"according":["6.2","14.8"],"novel":["6.2"],"questions":["6.2","22.2"],"finally":["6.2","24.6","25.7","26.13","27.2","28.6","28.15"],"mainly":["6.3"],"provides":["6.3"],"creating":["6.4","11.0"],"a":["6.4","6.5","7.0","7.7","12.0","15.1","15.5","16.0","17.9","17.15","18.18","18.23","23.2","24.0","24.4","26.7","28.14"],"key":["6.5"],"feature":["6.5","26.4"],"for":["6.5","11.0","11.4","12.0","15.0","17.4","18.12","18.18","18.21","22.4","22.5","25.3","25.5","26.5","26.13","27.0","28.16"],"rapid":["6.5"],"prototyping":["6.5"],"dynamically":["6.6"],"script":["6.6","18.4","18.8"],"at":["6.6","8.1","18.8","22.3","22.5","24.4","25.7","28.3"],"runtime":["6.6","18.8"],"all":["6.6","19.14"],"assume":["6.7","19.0"],"familiarity":["6.7"],"with":["6.7","11.0","15.16","19.14","19.20","22.4","24.3","28.8"],"usage":["6.7"],"content":["7.0"],"which":["7.0","7.7","23.0","25.4"],"might":["7.0"],"great":["7.0"],"challenge":["7.0"],"com":["7.1"],"collective":["7.1"],"soundworks":["7.1","14.9","16.11","19.2","24.1"],"favorite":["7.2"],"source":["7.3","18.8"],"branch":["7.3","27.3"],"git":["7.3"],"add":["7.3","11.4","28.7","28.15"],"commit":["7.3"],"nice":["7.5"],"insert":["7.5"],"table":["7.5","22.4"],"sit":["7.6"],"title":["7.7","7.8"],"required":["7.7","7.8"],"optional":["7.7"],"should":["7.7","11.1","15.16","16.11","24.2","25.7","28.3"],"absolute":["7.7"],"config":["7.8","14.9","19.8","23.4","28.7"],"js":["7.8","15.9","15.10","15.11","22.0","23.8"],"path":["7.8","15.20","17.15"],"nginx":["8.0"],"apache":["8.0"],"handle":["8.0","11.2"],"requests":["8.0","8.2"],"possibly":["8.0"],"certificates":["8.0"],"internally":["8.0"],"route":["8.0"],"subpath":["8.1"],"my":["8.1","18.4"],"app":["8.1","23.4","28.6","28.7"],"no":["8.1","11.5","26.11","28.3","28.16"],"need":["8.1","23.7","26.12"],"use":["8.1","18.5","21.0","22.5","24.4","26.8","28.9"],"https":["8.1","8.2"],"internaly":["8.2"],"redirects":["8.2"],"rewrite":["8.2"],"wifi":["9.0"],"worklet":["9.11"],"local":["9.11","19.7","25.3","25.4"],"traditionnal":["11.0"],"http":["11.0","11.3","25.7","26.8"],"they":["11.0"],"particularly":["11.0"],"useful":["11.0","17.4"],"applications":["11.0","26.0"],"requiring":["11.0"],"static":["11.1"],"finalhandler":["11.1"],"after":["11.1"],"last":["11.1"],"see":["11.1","11.2","20.0","24.2","25.7","26.11","27.6"],"file":["11.1","14.15","15.17","24.2"],"called":["11.1"],"package":["11.1","24.2"],"json":["11.1","24.2"],"been":["11.1","15.6"],"created":["11.1","11.4","15.9"],"by":["11.1","12.0","15.13","22.6"],"etc":["11.2","27.0"],"thus":["11.2","25.3"],"following":["11.2","28.4"],"homepage":["11.2"],"then":["11.2","22.2","25.5","27.4","27.6"],"just":["11.2","18.37","23.4","26.13","27.2","28.15"],"modify":["11.2"],"bit":["11.2","23.7","25.7"],"websockets":["11.2"],"connection":["11.2","11.4"],"well":["11.2","24.6","26.6"],"const":["11.3","15.9","15.10","15.11","19.8","28.5"],"url":["11.3","26.8"],"window":["11.3"],"location":["11.3"],"origin":["11.3","19.14","19.20"],"replace":["11.3"],"ws":["11.3"],"wss":["11.4"],"new":["11.4","15.20","16.9","18.16","18.23","18.27","19.8","24.7","27.3","28.5"],"websocketserver":["11.4"],"store":["11.4"],"instances":["11.4"],"sockets":["11.4"],"listen":["11.4"],"event":["11.4"],"websocket":["11.4"],"console":["11.4","24.6"],"log":["11.4","15.17","28.13"],"list":["11.4"],"or":["11.5","14.8","15.19","18.28","23.0","26.4","28.15"],"more":["11.5","22.5","24.4","24.6"],"complex":["11.5"],"data":["11.5","13.12","14.12","14.21","15.0"],"structure":["11.5","28.16"],"another":["11.5"],"issue":["11.5","25.0"],"completely":["11.5"],"stateless":["11.5"],"there":["11.5","19.0","22.5"],"history":["11.5"],"holders":["12.0"],"any":["12.0","13.10","15.19","17.4","26.4","28.15"],"express":["12.0"],"implied":["12.0"],"warranties":["12.0"],"including":["12.0"],"but":["12.0","22.5","23.7","27.6"],"merchantability":["12.0"],"fitness":["12.0"],"particular":["12.0"],"recycled":["13.0"],"pool":["13.0"],"indexes":["13.0","13.12"],"api":["13.1","14.1","16.1","17.1","18.1","22.4","24.0","27.2"],"classes":["13.1","16.1","17.1","18.1"],"plugin":["13.2","13.4","14.2","15.2","16.2","16.4","16.13","17.2","18.2","19.4","19.5","28.0","28.1"],"checkin":["13.4"],"pluginmanager":["13.5","14.6","15.15","17.5","18.4","27.5"],"register":["13.5","14.6","17.5","22.5","28.6"],"plugincheckinserver":["13.7"],"number":["13.8","19.19"],"kind":["13.9","13.10","15.4","15.25","15.29","15.33","15.35","17.10","17.12","18.15","18.26","18.28","18.35","18.36","19.17","19.18"],"instance":["13.9","13.10","15.25","15.26","15.29","15.33","15.35","17.10","17.12","18.11","18.15","18.20","18.26","18.35","18.36","19.17","19.18","24.4"],"method":["13.9","14.13","14.24","15.26","15.29","15.35","18.11","18.15","18.20","18.26","18.28","18.35","19.17","19.18","22.5","24.5","26.7","26.8","28.13"],"global":["13.11","15.22","17.14","18.28","19.0","28.11","28.12"],"class":["13.11","15.22","15.30","17.14","18.28","26.14","28.7"],"array":["13.12","15.25","15.33"],"optionnal":["13.12","14.23"],"associated":["13.12"],"watch":["14.0"],"security":["14.1"],"normalized":["14.4"],"dirname":["14.4","15.18","18.17"],"defined":["14.4","19.9","24.4","24.5","26.7"],"await":["14.6","15.5","15.9","15.10","15.11","16.6","18.4","23.3","27.4"],"processing":["14.8"],"e":["14.8","15.4","18.12","18.21","22.1","22.2","26.3","26.15","27.0","27.6","28.10"],"g":["14.8","18.12","18.21","25.3","26.3"],"image":["14.8"],"text":["14.8","26.13"],"type":["14.9","14.16","14.18","14.19","14.20","14.26","14.28","14.29","17.10","18.14","18.25","18.34","22.2","28.4"],"option":["14.9","15.11","18.18"],"passed":["14.9","24.5"],"server":["14.9","24.3","25.3","26.1","28.12"],"pluginfilesystemserver":["14.11"],"writefile":["14.12","14.21"],"pathname":["14.12","14.21","15.7","15.8","15.17","15.22","15.30"],"promise":["14.12","14.21","15.29","18.9","18.17"],"returns":["14.14","14.25","15.28","15.34","17.11","17.13","18.32"],"unregister":["14.14","14.25","15.28","18.22"],"listener":["14.14","14.25","18.22"],"description":["14.15","14.16","14.18","14.19","14.26","14.28","14.29","18.13","18.14","18.24","18.25","18.34"],"string":["14.15","14.17","14.19","14.27","14.29","16.12","17.15","18.13","18.24"],"extension":["14.15"],"retrieve":["14.15","18.10","18.19","24.4"],"param":["14.16","14.20","14.26","17.10","18.14","18.22","18.25","18.34"],"mkdir":["14.21"],"each":["14.22","23.4","27.3","28.15"],"tree":["14.22"],"depth":["14.22"],"maximum":["14.22"],"idle":["14.23","15.4","15.19"],"null":["14.23","15.4"],"publicpath":["14.23"],"public":["14.23"],"recording":["15.0"],"arbitrary":["15.0"],"directories":["15.1"],"share":["15.1"],"writer":["15.1","15.9"],"defaults":["15.4"],"i":["15.4","22.2","26.15","27.0","27.6","28.2"],"state":["15.4","15.19","26.3"],"start":["15.5","16.6","18.5","28.8","28.10","28.12","28.16"],"create":["15.5","19.8","24.7","25.3","27.6"],"logger":["15.6","15.10"],"logs":["15.7","15.8"],"07":["15.7","15.8"],"0001":["15.8"],"automatically":["15.9","17.0","23.4","24.8"],"usual":["15.10"],"side":["15.10","15.19","25.8","28.12"],"sharedwrite":["15.10"],"createwriter":["15.10","15.13","15.14","15.19"],"defining":["15.11"],"buffersize":["15.11","15.13"],"mywriter":["15.11"],"retrived":["15.13"],"name":["15.13","15.14","18.17","26.5","26.7","28.6","28.7"],"attachwriter":["15.13","15.19"],"options":["15.14"],"registered":["15.15"],"example":["15.15","18.18","28.16"],"whether":["15.16"],"prefixed":["15.16"],"yyyy":["15.16","15.21"],"mm":["15.16","15.21"],"dd":["15.16","15.21"],"hh":["15.16","15.21"],"ss":["15.16","15.21"],"uid":["15.16","15.21"],"generate":["15.17"],"call":["15.19","22.2","26.10"],"client":["15.19","22.2","25.5","25.8","26.5","26.8"],"object":["15.20","17.8"],"allowreuse":["15.21"],"write":["15.22","15.30"],"read":["15.23","15.24","15.31","15.32","18.29","18.30","18.31"],"converted":["15.25","15.33"],"being":["15.25","15.33"],"resolves":["15.29","18.16","18.27"],"resolved":["15.35"],"cosima":["15.36"],"research":["15.36"],"projects":["15.36"],"features":["16.0","16.1"],"require":["16.0","24.0"],"user":["16.0","18.18","24.0","24.4","24.5","25.8","26.7"],"platform":["16.2","16.4","28.0","28.1"],"init":["16.4","16.13","28.0"],"audiocontext":["16.5"],"pass":["16.5"],"platforminit":["16.6"],"get":["16.6","28.6"],"micstream":["16.6"],"camerastream":["16.6"],"pluginplatforminitserver":["16.8"],"onusergesture":["16.9"],"video":["16.10"],"camera":["16.10"],"oncheck":["16.10"],"function":["16.10","22.5","24.5","26.14"],"executed":["16.10","18.22","22.5"],"launcher":["16.11","17.0","24.6","24.8","27.4"],"id":["16.12","24.4","24.5"],"provide":["17.0","27.6"],"unit":["17.4"],"find":["17.4"],"pluginpositionserver":["17.7"],"getposition":["17.8"],"setnormalizedposition":["17.8"],"give":["17.9"],"random":["17.9"],"position":["17.9"],"cases":["17.10","17.12","24.4"],"most":["17.12","22.3"],"y":["17.15"],"backgroundimage":["17.15"],"background":["17.15"],"2fplugin":["18.0"],"pluginscriptingclient":["18.1"],"once":["18.5"],"only":["18.6","18.29","18.30","18.31"],"named":["18.6"],"exports":["18.6"],"supported":["18.6"],"this":["18.6","19.7","22.3","23.4","23.6","24.2","26.4"],"responsibility":["18.6"],"consuming":["18.6"],"different":["18.8"],"modified":["18.8"],"stored":["18.8"],"directly":["18.8"],"updatescript":["18.9"],"allow":["18.10","18.19","26.6"],"given":["18.10","18.18","18.19"],"from":["18.10","18.19","28.12"],"within":["18.10","18.19","26.15"],"createscript":["18.17"],"value":["18.17","28.3","28.9","28.10"],"before":["18.18"],"selects":["18.18"],"convenience":["18.23"],"s":["18.28","22.2"],"pluscritping":["18.28"],"attach":["18.28"],"default":["18.34","22.2","25.5","26.5","28.4"],"has":["18.35","27.3"],"deleted":["18.35"],"scripts":["18.36"],"want":["18.37","25.3"],"stop":["18.37","28.16"],"using":["18.37","24.7"],"something":["19.0","22.5"],"like":["19.0"],"m":["19.0"],"van":["19.0"],"synchronized":["19.1","27.6"],"events":["19.1","27.6"],"correspondances":["19.1"],"sync":["19.4","19.5","19.8","27.5"],"pluginsync":["19.8"],"even":["19.9"],"synctime":["19.9","19.19"],"getsynctime":["19.10","19.13"],"pluginsyncserver":["19.12"],"audiotime":["19.13"],"process":["19.14","23.4","23.8","25.7","28.8"],"hrtime":["19.14","19.20"],"them":["19.14","26.6"],"reportfunction":["19.18"],"corresponding":["19.21","19.22","27.6"],"html5":["19.23"],"2nd":["19.23"],"web":["19.23","23.1","24.0","26.9","27.2"],"system":["20.0"],"requires":["22.0"],"basic":["22.0"],"knowledge":["22.0"],"javascript":["22.0"],"let":["22.2"],"player":["22.2","25.8"],"show":["22.2","24.6"],"few":["22.2"],"again":["22.2"],"select":["22.2"],"values":["22.2","27.3","28.13"],"contrary":["22.3"],"work":["22.3"],"network":["22.3","26.4"],"familiar":["22.4"],"databases":["22.4"],"think":["22.4"],"these":["22.4"],"curious":["22.4"],"full":["22.4"],"documentation":["22.4","24.6"],"declaring":["22.4"],"schemas":["22.4","28.12"],"us":["22.5","24.6","26.6","27.6"],"react":["22.5"],"onupdate":["22.5"],"snippet":["22.5"],"update":["22.5","23.3","26.12","28.14"],"callback":["22.5"],"come":["22.5","24.3"],"later":["22.5"],"point":["22.5","24.5"],"simplify":["22.6","26.0"],"development":["22.6","26.3"],"discovered":["22.6","24.8"],"shared":["22.6"],"states":["22.6","23.3","28.11"],"provided":["22.6","24.8"],"motor":["23.0"],"led":["23.0"],"hard":["23.0"],"achieve":["23.0","25.9"],"sandboxed":["23.0"],"environment":["23.0"],"controller":["23.2","26.10"],"go":["23.3"],"first":["23.3","24.7","25.3"],"collection":["23.3"],"gui":["23.3"],"every":["23.3"],"thingcollection":["23.3"],"hello":["23.4"],"launched":["23.4"],"restarted":["23.4"],"saved":["23.4"],"goal":["23.4"],"command":["23.4"],"back":["23.4","25.4"],"interface":["23.4","28.15"],"updated":["23.4","28.15"],"click":["23.4","28.16"],"trigger":["23.4","28.14"],"button":["23.4"],"turn":["23.4"],"appear":["23.4"],"similar":["23.6"],"manner":["23.6"],"also":["23.6"],"possible":["23.6"],"computer":["23.7"],"remote":["23.7"],"device":["23.7"],"it":["23.7","24.7","26.4","28.14","28.16"],"know":["23.7"],"next":["23.8","25.9"],"gesture":["24.0"],"specific":["24.2"],"functionnality":["24.2"],"mere":["24.2"],"alias":["24.2"],"equivalent":["24.2"],"doing":["24.2"],"save":["24.2","27.2"],"open":["24.2"],"plugins":["24.3"],"always":["24.3","25.3"],"both":["24.3","26.3"],"least":["24.4"],"arguments":["24.4","24.5","26.7"],"here":["24.4","24.5"],"internal":["24.4"],"identifier":["24.4"],"advanced":["24.4"],"factory":["24.5"],"important":["24.5","26.4"],"motion":["24.6"],"sensors":["24.6"],"refer":["24.6","28.0"],"information":["24.6"],"some":["24.6","24.8","27.3"],"welcoming":["24.6"],"everything":["24.6"],"works":["24.6"],"our":["24.6"],"resumed":["24.6"],"initscreenscontainer":["24.6"],"container":["24.6","26.9"],"launch":["24.6"],"lines":["24.7","26.12"],"safely":["24.7"],"splashscreen":["24.7"],"entries":["24.7"],"action":["24.7"],"functionalities":["24.8"],"component":["24.8","28.7"],"included":["24.8"],"short":["25.0"],"introduction":["25.0"],"why":["25.0"],"rendering":["25.1","26.4"],"connected":["25.3"],"able":["25.3"],"connect":["25.3"],"many":["25.3"],"situations":["25.3"],"several":["25.3"],"reasons":["25.3"],"ping":["25.4"],"sends":["25.4"],"tag":["25.4"],"reception":["25.4"],"tagged":["25.4"],"pong":["25.4"],"configuration":["25.5","26.5"],"startup":["25.7"],"telling":["25.7"],"synchronizing":["25.7"],"going":["25.7"],"display":["25.7","26.13","26.14"],"when":["25.8","26.5","28.16"],"clicks":["25.8"],"along":["26.0","26.15"],"way":["26.0","26.15"],"concepts":["26.2"],"very":["26.3","28.13"],"ways":["26.3"],"monitor":["26.3"],"control":["26.3","26.6","28.13"],"distant":["26.3"],"true":["26.3"],"during":["26.3","28.2"],"artwork":["26.3"],"tweak":["26.3"],"done":["26.4"],"visual":["26.4"],"enables":["26.4"],"other":["26.4"],"ask":["26.5"],"unmute":["26.6"],"second":["26.6","28.14"],"containing":["26.6"],"frequency":["26.6","26.9","28.2","28.10"],"registerschema":["26.7","27.3","28.5"],"note":["26.7","26.8","27.3","28.9"],"instead":["26.8"],"conterpart":["26.8"],"sw":["26.9","28.6"],"credits":["26.9","28.6"],"infos":["26.9","28.6"],"refresh":["26.9","28.15"],"dedicated":["26.10"],"accessible":["26.11","28.3"],"root":["26.11","28.3"],"website":["26.11"],"choose":["26.11"],"confirm":["26.11"],"editor":["26.11"],"directory":["26.11"],"src":["26.11"],"yet":["26.12"],"fix":["26.12"],"simply":["26.12"],"input":["26.12","28.10"],"detail":["26.12","28.10"],"render":["26.13","26.14","27.4"],"header":["26.13","28.7"],"section":["26.13"],"div":["26.13","26.14","28.7"],"h2":["26.13","28.6"],"map":["26.13"],"return":["26.13"],"renderapp":["26.14"],"layout":["26.14","28.7"],"h1":["26.14","28.7"],"wizard":["26.15"],"one":["27.0","28.8"],"kick":["27.0"],"snare":["27.0"],"scheduling":["27.2","27.6"],"loader":["27.2"],"usedefaultapplicationtemplate":["27.3","28.5"],"statemanager":["27.3","28.5"],"tracks":["27.3"],"consider":["27.3"],"steps":["27.3"],"initialize":["27.3"],"debug":["27.3"],"mode":["27.3"],"filled":["27.3"],"lit":["27.4"],"logged":["27.6"],"loaded":["27.6"],"buffers":["27.6"],"scheduler":["27.6"],"timeline":["27.6"],"manager":["28.0"],"please":["28.0"],"synths":["28.2","28.9"],"creation":["28.2"],"performance":["28.2"],"tool":["28.3"],"tip":["28.3","28.9","28.13"],"selecting":["28.3"],"means":["28.3"],"export":["28.4"],"float":["28.4"],"min":["28.4","28.10"],"max":["28.4","28.10"],"master":["28.6"],"mute":["28.6"],"role":["28.7"],"indeed":["28.8"],"working":["28.8"],"multiple":["28.8"],"physical":["28.8"],"devices":["28.8"],"smartphones":["28.8"],"tablets":["28.8"],"loop":["28.9"],"keep":["28.9"],"focus":["28.9"],"logic":["28.9"],"synthesizers":["28.9"],"based":["28.9"],"oscillators":["28.9"],"same":["28.9"],"attribute":["28.9"],"padding":["28.10"],"bottom":["28.10"],"4px":["28.10"],"width":["28.10"],"getschema":["28.10"],"synth":["28.10","28.16"],"changes":["28.11"],"beginning":["28.12"],"pluginplatforminit":["28.12"],"globalschema":["28.12"],"current":["28.13"],"audioparam":["28.13"],"usefull":["28.13"],"automation":["28.13"],"parameters":["28.13"],"runnings":["28.14"],"currenttime":["28.14"],"settargetattime":["28.14"],"02":["28.14"],"synthtrigger":["28.14"],"connects":["28.15"],"disconnects":["28.15"],"modification":["28.16"],"improve":["28.16"],"occurs":["28.16"]},{"0":["17.4","24.2","24.6","24.7","26.12","27.3","27.5"],"1":["8.2","17.4","24.7","27.3"],"2":["17.4","23.3"],"3":["1.4","22.2"],"4":["24.2"],"5":["24.2","27.5"],"6":["24.2"],"10":["15.11","22.5"],"12":["22.5"],"44":["24.2"],"50":["26.13"],"127":["24.7","26.12"],"1000":["26.13"],"2016":["19.23"],"8000":["24.7","26.12"],"with":["0.0","4.3","22.0","26.15"],"team":["1.2","3.3"],"web":["1.2","1.6","6.2","6.7","28.1"],"site":["1.2","7.0"],"specific":["1.4","14.8"],"roles":["1.4"],"creating":["1.4","26.7"],"and":["1.4","14.0","19.1","22.6","23.0","24.3","25.2","26.2","26.4","26.7","27.0"],"start":["1.4","13.5","14.6","15.4","17.5","18.4","24.6","28.5"],"build":["1.5"],"system":["1.5"],"create":["1.5","15.4","23.7","25.8"],"audio":["1.6","6.1","6.7","16.0","23.1","26.6","27.4","28.16"],"api":["1.6","6.7","15.20","18.6","18.23"],"dot":["1.6"],"nginx":["1.7"],"configuration":["1.7","27.4"],"apache":["1.7"],"conventions":["1.7","9.1"],"anr":["3.1"],"is":["3.1","7.0","14.22","15.11","15.16","15.21","18.4","26.11","28.3","28.6","28.16"],"now":["3.1","24.7","26.11","26.13","27.2"],"led":["3.1"],"rapid":["3.2"],"mix":["3.2"],"union":["3.2"],"interaction":["3.3"],"youtube":["3.3"],"channel":["3.3"],"https":["3.3","16.6"],"www":["3.3"],"com":["3.3"],"society":["3.4"],"accoustics":["3.4"],"application":["3.4","11.1"],"computing":["3.5"],"hindawi":["3.5"],"publishing":["3.5"],"corporation":["3.5"],"02086673":["3.5"],"jean":["3.5"],"philippe":["3.5"],"lambert":["3.5"],"sébastien":["3.5"],"robaszkiewicz":["3.5"],"synchronisation":["3.5"],"rendering":["3.5"],"over":["3.5","25.1","25.3"],"heterogeneous":["3.5","25.1"],"devices":["3.5"],"save":["4.1","4.11","4.12"],"documentation":["4.1"],"github":["4.1","7.3"],"safari":["4.2","7.2"],"sh":["4.2","4.4","4.5","4.9","4.12"],"npm":["4.2","4.4","4.5","4.9","4.12"],"install":["4.2","4.4","4.5","4.9","4.12"],"associated":["4.3"],"additional":["4.3","16.6"],"data":["4.3","15.22","15.30"],"can":["4.6","11.5","13.0","14.8","15.19","16.6","17.0","20.0","22.3","23.7","27.2"],"be":["4.6","7.2","11.5","13.0","14.23","18.13","18.24","22.2","24.0","26.12"],"used":["4.6","18.13","18.24","24.5","25.3"],"simply":["4.6","8.1"],"add":["4.6","11.1","14.4","16.6","27.5","28.13"],"splash":["4.6"],"provide":["4.7"],"their":["4.7","6.6"],"on":["4.7","7.5","14.8","15.10","24.5","25.3","26.4","26.6"],"a":["4.7","13.11","13.12","14.9","14.13","14.24","15.4","15.18","15.20","15.23","15.24","15.31","15.32","16.9","17.14","18.29","18.30","18.31","18.33","28.6","28.8"],"map":["4.7","26.14","28.15"],"at":["4.8","14.4","15.19","23.0","24.5","28.13","28.14"],"following":["4.8","11.1","23.7","26.9"],"programming":["4.8"],"library":["4.9"],"additionally":["4.10"],"core":["4.10","23.4","24.2"],"package":["4.10"],"installs":["4.10"],"ismm":["5.0","9.1"],"como":["5.0"],"elements":["5.0"],"playground":["5.0"],"or":["5.0","11.0","22.3","26.8"],"koryphaios":["5.0"],"lot":["5.0"],"other":["5.0","11.1","14.8","28.3"],"things":["5.0","11.1"],"e":["5.0","16.6","24.4","27.5"],"g":["5.0","22.1"],"teapot":["5.0"],"related":["5.0"],"links":["5.0","9.1"],"work":["5.0"],"apps":["5.0"],"fr":["5.0"],"target":["5.0","25.5","26.5"],"blank":["5.0"],"span":["5.0"],"same":["6.1","23.6","24.4","24.5","26.4"],"architecture":["6.1","27.0"],"codebase":["6.1"],"principles":["6.1"],"high":["6.1"],"level":["6.1"],"despite":["6.1"],"sound":["6.1","22.3","28.14"],"doesn":["6.1"],"t":["6.1","19.20","28.0"],"do":["6.1","28.12"],"any":["6.1","15.0","16.6"],"choice":["6.1","26.8"],"you":["6.1","14.8","16.6","19.20","22.0","23.0","24.4","24.5","27.4"],"regarding":["6.1"],"both":["6.2","24.5"],"philosophical":["6.2"],"reasons":["6.2"],"one":["6.2"],"goal":["6.2"],"standarts":["6.2"],"close":["6.2","15.22","15.30"],"possible":["6.2"],"pure":["6.2"],"javascript":["6.2","26.8"],"http":["6.4","24.7","26.12"],"setting":["6.4"],"up":["6.4","26.9","26.11"],"websockets":["6.4"],"properly":["6.4","24.0","25.3"],"time":["6.5","19.1","25.7","28.6"],"applications":["6.5","24.8"],"where":["6.5","23.4","25.3","26.11"],"want":["6.5","27.4"],"live":["6.6"],"in":["6.6","8.0","14.9","14.15","28.3"],"own":["6.6"],"repository":["6.6"],"are":["6.6","19.21","22.0","26.11"],"please":["7.0"],"contribute":["7.0"],"tip":["7.0","26.8"],"note":["7.0","15.10","16.6","19.21","19.22","28.6"],"io":["7.1"],"cd":["7.1"],"browser":["7.2","19.7","25.5","26.5","26.13","27.0"],"which":["7.2","7.8","11.5","14.4","18.32","24.4","26.12","28.3"],"shall":["7.2","12.0"],"not":["7.2"],"m":["7.3"],"message":["7.3"],"origin":["7.3"],"sources":["7.3"],"of":["7.5","8.0","11.1","13.10","15.0","18.10","18.19","25.0","26.0","28.8","28.13"],"content":["7.5"],"top":["7.5"],"amet":["7.6"],"collapsable":["7.7","7.8"],"false":["7.7","7.8","8.1","15.16","15.21","27.5","28.4"],"defaults":["7.7","17.4"],"true":["7.7","15.23","15.24","15.31","15.32","18.29","18.30","18.31","22.5","27.5","28.6"],"sidebardepth":["7.7"],"optional":["7.8"],"absolute":["7.8"],"proper":["8.0"],"node":["8.0","14.4","15.0","23.6"],"js":["8.0","13.12","15.15","17.9","17.15","23.2"],"soundworks":["8.0","20.0"],"remaining":["8.0"],"page":["8.0","26.9"],"we":["8.0","23.2","24.8","25.9","26.9","26.11"],"assume":["8.0"],"your":["8.0","9.0","11.1","11.5","25.3"],"domain":["8.0","28.3"],"this":["8.1","24.5","27.4","28.9"],"handled":["8.1"],"by":["8.1","14.9","15.36","24.4","25.7","26.11","27.3"],"proxy":["8.1"],"usehttps":["8.1"],"then":["8.1","22.4","26.8"],"launch":["8.1","26.13"],"break":["8.2"],"pass":["8.2"],"localhost":["8.2"],"version":["8.2"],"set":["8.2","14.23","19.14","22.2","22.5","26.9","26.11","26.13"],"header":["8.2","23.3","28.15"],"deploy":["9.0"],"settings":["9.11"],"requirements":["9.11"],"instant":["11.0"],"updates":["11.0"],"such":["11.0","16.0","22.3"],"as":["11.0","16.0","16.12","18.13","18.24","22.3","25.7","28.13"],"chats":["11.0"],"multiplayer":["11.0"],"games":["11.0"],"our":["11.0","23.8"],"case":["11.0","14.9","27.4","28.3","28.9"],"distributed":["11.0"],"order":["11.1"],"amongst":["11.1","28.2"],"track":["11.1","28.4"],"just":["11.1","22.0","26.12"],"socket":["11.3"],"new":["11.3","13.4","13.11","16.4","17.14","19.4","19.5","22.5","25.8"],"addeventlistener":["11.3","11.4","16.6","22.5"],"console":["11.3","16.6"],"log":["11.3","16.6","24.6"],"connected":["11.3","13.0","22.3"],"from":["11.4","15.0","26.3","28.8"],"received":["11.4"],"if":["11.4","15.16","15.21","16.10","22.0","24.5","24.7","25.4","26.13","28.0"],"equal":["11.4"],"loop":["11.4"],"though":["11.4"],"all":["11.4","22.5","24.8","27.0","28.2"],"dispatch":["11.4"],"happened":["11.5"],"past":["11.5"],"comple":["11.5"],"situations":["11.5"],"for":["11.5","14.23","15.17","16.10","17.9","26.8","26.11"],"example":["11.5","13.12","14.22","16.10","17.9","17.15","28.3"],"clients":["11.5","14.9","15.1"],"purpose":["12.0"],"disclaimed":["12.0"],"no":["12.0","14.22"],"event":["12.0"],"holder":["12.0"],"liable":["12.0"],"direct":["12.0"],"indirect":["12.0"],"incidental":["12.0"],"special":["12.0"],"exemplary":["12.0"],"consequential":["12.0"],"damages":["12.0"],"re":["13.0","26.12"],"assigned":["13.0"],"newly":["13.0"],"plugincheckinclient":["13.1"],"plugincheckinserver":["13.1"],"checkin":["13.2"],"const":["13.4","16.4","19.4","19.5","25.8"],"await":["13.5","15.4","17.5","24.6","25.7","27.3","28.5"],"server":["13.7","13.12","14.11","17.7","19.12","19.21","19.22","27.2"],"getdata":["13.8"],"mixed":["13.8"],"method":["13.10","15.25","15.33","18.10","18.19","28.6"],"name":["13.11","15.18","17.14","18.33","23.3","25.5","27.2"],"given":["13.12","14.22"],"index":["13.12"],"directories":["14.0"],"update":["14.0"],"classes":["14.1","23.4"],"pluginfilesystemclient":["14.1"],"filesystem":["14.2","15.20","18.23"],"an":["14.4","15.16","15.19","15.21","18.23","18.32","21.5","26.6","27.5","28.3"],"url":["14.4","28.3"],"each":["14.4","26.6","28.6","28.8"],"that":["14.4","14.9","15.29","15.34","15.35","16.6","17.0","28.6"],"defines":["14.4"],"route":["14.4","14.23","28.3"],"needs":["14.8"],"rely":["14.8"],"plugins":["14.8","24.7","25.8"],"production":["14.9"],"only":["14.9","15.23","15.24","15.31","15.32","26.9"],"trusted":["14.9"],"authentified":["14.9"],"login":["14.9"],"mkdir":["14.12"],"rename":["14.12","14.21"],"oldpath":["14.12","14.21"],"executed":["14.14","14.25","24.4"],"param":["14.14","14.25","14.30","15.25","15.28","15.33","17.12","18.10","18.15","18.16","18.19","18.26","18.27","18.35","18.36","19.15","19.16","19.17"],"type":["14.14","14.25","14.30","15.28","17.12","18.15","18.16","18.22","18.26","18.27","18.35","18.36","19.15","19.16","19.17"],"default":["14.14","14.25","18.22"],"description":["14.14","14.20","14.25","14.30","15.28","17.10","17.12","18.15","18.16","18.22","18.26","18.27","18.35","18.36"],"list":["14.15"],"boolean":["14.15","18.34","28.4"],"string":["14.16","14.18","14.20","14.26","14.28","18.14","18.25","18.28","18.36"],"blob":["14.17","14.27"],"path":["14.18","14.23","14.28"],"current":["14.19","14.29","18.37","25.7","26.8","27.5"],"pathname":["14.19","14.29"],"newpath":["14.21"],"file":["14.22"],"structure":["14.22","26.6"],"option":["14.22","18.8"],"before":["14.22","24.6","28.9"],"user":["14.22","22.5"],"selects":["14.22"],"assets":["14.23","22.3"],"will":["14.23","23.2","23.8","24.8","25.9","26.4","26.15"],"added":["14.23"],"several":["15.1","24.4"],"side":["15.1","19.21","19.22","24.3"],"buffering":["15.1"],"logger":["15.2","15.9","15.11"],"dirname":["15.4","18.8"],"logs":["15.4"],"get":["15.5","16.9","18.5","25.7","26.3","26.13","26.14","27.6","28.7"],"configured":["15.6"],"to":["15.6","16.5","17.4","18.6","18.32","19.15","19.16","26.7","26.10"],"0001":["15.7","24.6"],"second":["15.7","19.7","25.3"],"createwriter":["15.9","15.11","15.18"],"client":["15.10","15.15","17.9","24.3","27.0","28.12"],"size":["15.10"],"attachwriter":["15.10","15.14"],"buffered":["15.11"],"writer":["15.11"],"methods":["15.13"],"writerserver":["15.13"],"register":["15.15","16.5","22.4","28.10","28.12"],"allowreuse":["15.16"],"allow":["15.16","15.21","22.6"],"reuse":["15.16","15.21"],"existing":["15.16","15.21"],"object":["15.17","18.32"],"buffersize":["15.17"],"number":["15.17","17.10","17.12","26.13"],"options":["15.18","28.9"],"throw":["15.19"],"error":["15.19","18.28"],"changed":["15.19"],"convenience":["15.20"],"match":["15.20","18.23","24.5"],"plugin":["15.20","18.6","19.2","24.1","27.6"],"underlying":["15.21","25.0"],"flush":["15.22"],"code":["15.22","15.25","15.26","15.30","15.33","18.8","18.10","18.19","18.28","18.35","24.7"],"promise":["15.22","15.30","16.10"],"resolves":["15.27","15.34"],"when":["15.27","15.34","26.12"],"stream":["15.27"],"listener":["15.28","15.29","15.35"],"returns":["15.29","15.35","19.18"],"unregister":["15.29","15.35"],"funded":["15.36"],"resuming":["16.0"],"context":["16.0","16.5","21.0"],"pluginplatforminitclient":["16.1"],"pluginplatforminitserver":["16.1"],"init":["16.2","28.1"],"pluginmanager":["16.5","19.8","27.6","28.12"],"these":["16.6","26.6","28.2"],"require":["16.6","27.4"],"connection":["16.6"],"featureid":["16.9"],"started":["16.10","18.5","19.8"],"check":["16.10","28.0"],"provided":["16.10"],"return":["16.10","26.14","28.15"],"it":["16.11","18.37","22.3","25.5","25.7","26.9"],"manually":["16.11"],"most":["16.11","19.20"],"cases":["16.11","19.20"],"kind":["16.11","16.13","18.10","18.12","18.19","18.21"],"instance":["16.11","18.10","18.12","18.19","18.21","25.7","25.8"],"global":["16.13","28.2"],"interface":["17.0","23.3","28.9"],"so":["17.0","22.3","26.9"],"pluginpositionclient":["17.1"],"pluginpositionserver":["17.1"],"position":["17.2"],"xrange":["17.4"],"yrange":["17.4"],"getnormalizedposition":["17.8"],"useful":["17.9"],"testing":["17.9"],"x":["17.11","17.13"],"y":["17.11","17.13"],"image":["17.15"],"displayed":["17.15"],"launcher":["17.15","23.4"],"view":["17.15"],"pluginscriptingserver":["18.1"],"sharedscript":["18.1"],"scripting":["18.2","18.6"],"use":["18.4","19.8","22.3"],"once":["18.4"],"define":["18.6","26.7"],"should":["18.6","26.9"],"expose":["18.6"],"internally":["18.6"],"relies":["18.6"],"filestem":["18.8"],"see":["18.8","26.9","26.15"],"shared":["18.8"],"deletescript":["18.9","18.17"],"sc":["18.12","18.21","24.2","26.14"],"actual":["18.13","18.24","24.4"],"filename":["18.13","18.24"],"updatescript":["18.17"],"project":["18.18"],"stay":["18.18"],"idle":["18.18"],"until":["18.18"],"transpiled":["18.28"],"fulfills":["18.32"],"containing":["18.32"],"without":["18.37","28.13"],"deleting":["18.37"],"call":["18.37"],"steen":["19.0"],"s":["19.0"],"tanenbaum":["19.0"],"the":["19.0"],"synchronizes":["19.0"],"local":["19.0","25.7"],"sync":["19.1","27.6"],"performance":["19.7"],"finally":["19.8","22.2","22.4","23.4","25.8","26.12","26.14"],"after":["19.8","24.6"],"audiotime":["19.9"],"getlocaltime":["19.9","19.22"],"src":["19.9"],"audiocontext":["19.9","23.4"],"createbuffersource":["19.9"],"buffer":["19.9"],"someaudiobuffer":["19.9"],"connect":["19.9","24.6"],"onreport":["19.13","19.14"],"callback":["19.13","28.6"],"getreport":["19.13"],"starts":["19.14"],"null":["19.14"],"execute":["19.14"],"corresponding":["19.15","19.16"],"sec":["19.15","19.16","19.21","19.22"],"getsynctime":["19.19","19.21","27.5"],"localtime":["19.19"],"shouldn":["19.20"],"have":["19.20","23.0","26.9"],"identical":["19.21"],"conference":["19.23"],"apr":["19.23"],"how":["20.0"],"class":["21.0","23.3","28.15"],"command":["22.0","23.7"],"line":["22.0"],"starting":["22.0"],"confirm":["22.2"],"choices":["22.2"],"ready":["22.2"],"launched":["22.2"],"make":["22.2","25.3","26.4"],"sure":["22.2","25.3"],"correctly":["22.2"],"installed":["22.2"],"follow":["22.2"],"proposed":["22.2"],"place":["22.3"],"put":["22.3"],"static":["22.3"],"images":["22.3"],"download":["22.3"],"them":["22.3","27.0","28.0","28.2","28.8"],"warning":["22.3"],"very":["22.3"],"important":["22.3"],"understand":["22.3"],"keep":["22.3","28.4"],"mind":["22.3"],"found":["22.4"],"need":["22.4","22.5","28.3"],"declaration":["22.4"],"into":["22.4","23.8"],"manager":["22.4"],"statemanager":["22.4"],"registerschema":["22.4"],"nothing":["22.5"],"actually":["22.5","23.4"],"trigger":["22.5","26.4","28.10"],"value":["22.5","26.13","28.7"],"parameter":["22.5"],"clicks":["22.5"],"again":["22.5"],"anywhere":["22.5"],"they":["22.6"],"illustrate":["23.0"],"possibility":["23.0"],"discover":["23.0"],"tools":["23.0"],"hand":["23.0"],"afterward":["23.2"],"getcollection":["23.3"],"onupdate":["23.3","26.12","28.6"],"renderapp":["23.3","25.7","28.15"],"onattach":["23.3"],"ondetach":["23.3"],"function":["23.3","24.4","25.7","28.15"],"modify":["23.3"],"simple":["23.3","24.6","26.7","28.3","28.13"],"graphical":["23.3","26.9"],"render":["23.3","28.15"],"html":["23.3"],"div":["23.3","28.15"],"layout":["23.3","28.15"],"h1":["23.3","28.15"],"app":["23.3","28.15"],"import":["23.4"],"helpers":["23.4","24.2"],"gainnode":["23.4","26.6"],"oscillatornode":["23.4","26.6"],"run":["23.6"],"terminal":["23.6"],"ip":["23.7"],"end":["23.7"],"tutorials":["23.8","28.0"],"continue":["23.8"],"journey":["23.8"],"initialized":["24.0","27.6"],"requires":["24.0"],"basic":["24.0"],"knowledge":["24.0"],"platform":["24.1"],"appearing":["24.2"],"under":["24.2","24.4"],"dependencies":["24.2"],"key":["24.2"],"ircam":["24.2"],"components":["24.2","24.5"],"alpha":["24.2"],"json5":["24.2"],"component":["24.3"],"hence":["24.3"],"also":["24.4"],"allows":["24.4","24.5","26.7"],"times":["24.4"],"different":["24.4"],"ids":["24.4"],"factory":["24.4"],"i":["24.4"],"automatically":["24.4","24.5"],"associate":["24.5"],"two":["24.5","26.13"],"state":["24.6"],"currenttime":["24.6"],"envelop":["24.6"],"env":["24.6","28.14"],"creategain":["24.6"],"destination":["24.6","26.6"],"gain":["24.6"],"setvalueattime":["24.6","28.14"],"linearramptovalueattime":["24.6","28.14"],"01":["24.6","28.14"],"exponentialramptovalueattime":["24.6"],"hello":["24.7","28.7"],"me":["24.7"],"myself":["24.7"],"tada":["24.7"],"go":["24.7","25.9"],"something":["24.7"],"homepage":["24.7"],"custom":["24.7"],"info":["24.7"],"created":["24.8"],"using":["24.8","26.12"],"wizard":["24.8"],"next":["24.8","26.15"],"concepts":["25.0","25.2"],"involved":["25.0"],"synchronizing":["25.0"],"general":["25.2","26.2"],"venue":["25.3"],"artwork":["25.3"],"presented":["25.3"],"has":["25.3","26.11"],"poor":["25.3"],"installation":["25.3"],"some":["25.3","26.9","28.11"],"control":["25.3"],"what":["25.3"],"happen":["25.3"],"bandwidth":["25.3"],"etc":["25.3","28.8"],"produce":["25.3"],"sounds":["25.3"],"synchronized":["25.3","28.2"],"interest":["25.3"],"travel":["25.4"],"messages":["25.4","26.0"],"compute":["25.4"],"player":["25.5","26.5"],"template":["25.5","26.5"],"reference":["25.7","27.6"],"estimated":["25.7"],"alongside":["25.7"],"retrieve":["25.7","27.6"],"config":["25.8","28.15"],"window":["25.8"],"configure":["25.8"],"further":["25.8","25.9"],"uses":["25.8"],"development":["26.0","27.3"],"abstracting":["26.0"],"network":["26.0","27.5","28.9"],"communications":["26.0"],"logic":["26.2","26.11"],"synthesizer":["26.3"],"machines":["26.3"],"central":["26.3","28.8"],"point":["26.3"],"even":["26.3"],"studio":["26.3"],"modifying":["26.3"],"parameters":["26.3","28.2"],"cumbersome":["26.3"],"quite":["26.3"],"quickly":["26.3"],"well":["26.3"],"blue":["26.4"],"completely":["26.4"],"transparent":["26.4"],"select":["26.5","26.8"],"every":["26.6"],"oscillator":["26.6","28.13"],"definitions":["26.6","28.9"],"already":["26.6"],"foresee":["26.6"],"graph":["26.6"],"could":["26.6"],"controlled":["26.6"],"states":["26.6"],"here":["26.7"],"schema":["26.7"],"definition":["26.7"],"signature":["26.7"],"friendly":["26.7"],"names":["26.7"],"press":["26.8"],"cmd":["26.8","26.9"],"alt":["26.8"],"j":["26.8"],"chrome":["26.8"],"alternatively":["26.8"],"firefox":["26.8"],"tab":["26.8"],"shift":["26.9"],"r":["26.9"],"far":["26.9"],"good":["26.9"],"indeed":["26.9"],"monitor":["26.10"],"been":["26.11"],"implement":["26.11"],"eveything":["26.11","28.13"],"change":["26.12"],"tell":["26.12"],"itself":["26.12"],"updated":["26.12","28.6"],"achieved":["26.12"],"min":["26.13","28.7"],"max":["26.13","28.7"],"input":["26.13"],"detail":["26.13","27.5"],"container":["26.13","26.14"],"open":["26.13"],"windows":["26.13"],"h2":["26.14","28.7","28.15"],"information":["26.14"],"controller":["26.14","27.0"],"players":["26.14"],"text":["26.14"],"npx":["26.15"],"extend":["26.15"],"possibilities":["26.15"],"rule":["27.0"],"along":["27.0","28.0"],"scheduling":["27.1"],"thing":["27.2"],"according":["27.3"],"flag":["27.3"],"ease":["27.3"],"empty":["27.3"],"fill":["27.3"],"may":["27.4"],"recall":["27.4"],"last":["27.4"],"tutorial":["27.4"],"synchronize":["27.4"],"clock":["27.4"],"thus":["27.4"],"bit":["27.4"],"more":["27.4","28.3","28.9","28.16"],"else":["27.5"],"grab":["27.5"],"synctime":["27.5"],"offset":["27.5"],"handle":["27.5"],"latency":["27.5","28.9"],"starttime":["27.5"],"values":["27.5"],"relevant":["28.0"],"didn":["28.0"],"yet":["28.0"],"controllers":["28.2"],"controls":["28.2"],"mute":["28.2"],"master":["28.2","28.7","28.16"],"volume":["28.2"],"must":["28.2"],"share":["28.3"],"public":["28.3"],"access":["28.3"],"derived":["28.4"],"refresh":["28.6"],"section":["28.7","28.15"],"p":["28.7"],"style":["28.7"],"padding":["28.7"],"bottom":["28.7"],"4px":["28.7"],"getschema":["28.7"],"being":["28.8","28.9"],"single":["28.8"],"applied":["28.9"],"tweak":["28.9"],"means":["28.9"],"propagated":["28.9"],"locally":["28.9"],"responsiveness":["28.9"],"minimum":["28.9"],"informations":["28.9"],"active":["28.10"],"synthtoggle":["28.10"],"synthtrigger":["28.10"],"play":["28.11"],"playerschema":["28.12"],"usedefaultapplicationtemplate":["28.12"],"real":["28.13"],"click":["28.13"],"pops":["28.13"],"test":["28.13"],"works":["28.13"],"expected":["28.13"],"beginning":["28.13"],"twice":["28.14"],"role":["28.15"],"audit":["28.15"],"stopped":["28.16"],"complex":["28.16"],"synthesizers":["28.16"],"chains":["28.16"]},{"0":["17.15","23.4","24.5","26.11","26.13","28.15"],"1":["7.7","7.8","15.11","15.17","17.15","23.4","24.5","25.3","26.13"],"2":["7.8","15.11","17.15","25.3","26.12","26.13","28.14"],"3":["6.2","13.12"],"4":["23.6"],"5":["27.2","28.9"],"7":["28.9"],"10":["23.4","24.6"],"50":["22.5","23.4"],"60":["25.7"],"127":["24.5","26.11","26.13","28.13","28.15"],"150":["24.6"],"300":["24.6"],"450":["24.6"],"2016":["3.5"],"2020":["3.2"],"8000":["24.5","26.13","28.13"],"vitepress":["0.0"],"vuejs":["0.0"],"com":["1.2","8.0","28.3"],"collective":["1.2","5.0"],"scripting":["1.4","18.18"],"live":["1.4"],"graphics":["1.4"],"max":["1.4"],"sharing":["1.4","6.4"],"msp":["1.4"],"an":["1.5","8.0","14.23","15.20","26.13"],"embedded":["1.5"],"distributed":["1.5","18.0","26.6"],"with":["1.5","25.4","26.9","26.13"],"generic":["1.6","3.3"],"applications":["1.6","3.3"],"playground":["1.6","3.5"],"naming":["1.7"],"in":["1.7","24.2","25.1","25.5","26.5","26.7","27.2"],"packages":["1.7"],"client":["1.7","17.11","17.13","19.0","19.14","23.0","28.9"],"server":["1.7","14.22","15.19","17.15","18.18","19.0","19.20","22.2"],"node":["1.7","8.1","11.1","19.7","27.4"],"sound":["3.1","11.5"],"music":["3.1","11.0"],"movement":["3.1"],"interaction":["3.1"],"s":["3.2","8.0","8.2","11.0","18.8","22.4"],"horizon":["3.2"],"innovation":["3.2"],"cosima":["3.2"],"ismm":["3.3"],"some":["3.3","6.2","15.8","19.14"],"are":["3.3","14.4","19.22","24.4","26.8","28.4"],"accessible":["3.3","14.4","22.3"],"inc":["3.4"],"html5":["3.5"],"2nd":["3.5"],"apr":["3.5"],"atlanta":["3.5","19.23"],"ga":["3.5","19.23"],"united":["3.5","19.23"],"states":["3.5","19.23","26.12"],"01304889":["3.5"],"artists":["3.5"],"functionalities":["4.1"],"can":["4.1","7.0","11.1","15.16","15.20","15.21","18.23","26.13","28.8","28.13"],"be":["4.1","14.9","14.16","14.26","18.23","20.0","24.2","24.4","28.6"],"extended":["4.1"],"by":["4.1","17.4","18.8","21.0","22.2","23.8","24.5","26.3"],"installing":["4.1"],"plugins":["4.1","26.15"],"here":["4.1"],"save":["4.2","4.4","4.5","4.9","13.2","14.2","15.2","16.2","17.2","18.2","28.8"],"github":["4.2","4.4","4.5","4.11"],"sh":["4.3","4.6","4.7","4.8","8.1","8.2","23.6","23.7"],"npm":["4.3","4.6","4.7","4.8","22.2","23.6","24.5","26.11","28.5"],"install":["4.3","4.6","4.7","4.8"],"strategy":["4.8","19.9"],"and":["4.10","7.2","8.2","9.11","11.1","26.5","28.10"],"uses":["4.10"],"build":["4.10","7.3","8.1","23.0"],"team":["5.0"],"website":["5.0","7.3"],"libs":["5.0"],"footer":["5.0"],"credits":["5.0","13.1","14.1","16.1","17.1","18.1","25.7","28.10"],"license":["5.0","13.1","14.1","16.1","17.1","18.1"],"library":["6.1","24.2","26.0"],"might":["6.1","24.2"],"use":["6.1","15.6","25.0","26.7","28.16"],"low":["6.1","28.16"],"api":["6.1","15.1","19.1","23.1","27.4"],"higher":["6.1"],"libraries":["6.1"],"more":["6.1","11.1","22.6","25.9","26.7"],"generally":["6.1"],"rendering":["6.1"],"aspects":["6.1"],"your":["6.1","25.5","26.5"],"application":["6.1","9.0","11.0","24.8","28.10"],"therefore":["6.1","25.4"],"only":["6.2","24.7","25.8","28.10"],"integrate":["6.2"],"language":["6.2"],"features":["6.2"],"that":["6.2","17.4","19.10","28.8"],"have":["6.2","24.3","26.6"],"reach":["6.2"],"stage":["6.2"],"example":["6.2","15.19","16.11","19.14","19.20","23.6"],"propose":["6.2"],"type":["6.2","15.29","15.35","18.10","18.19","19.21","19.22"],"files":["6.2","14.4"],"derived":["6.2"],"from":["6.2","6.5","11.0","14.0","14.15","19.0","19.15","19.16","19.21","22.4","24.6"],"jsdoc":["6.2"],"typescript":["6.2"],"users":["6.2"],"near":["6.2"],"following":["6.3","22.0"],"fonctionnalities":["6.3"],"configuration":["6.4"],"objets":["6.4"],"handling":["6.4"],"initialization":["6.4"],"process":["6.4"],"etc":["6.4","16.0","24.6","26.3"],"many":["6.5","19.7"],"single":["6.5"],"point":["6.5","25.4","28.8"],"see":["6.5","7.2","14.9","24.5","26.13"],"versionned":["6.6"],"pace":["6.6"],"simplify":["6.6"],"future":["6.6","24.2"],"there":["6.7","26.13"],"else":["6.7","27.3"],"generated":["7.0"],"using":["7.0","7.5","8.1","28.5"],"vuepress":["7.0"],"full":["7.0","24.4","28.2"],"checkout":["7.1"],"preview":["7.2"],"action":["7.3"],"deploy":["7.3"],"it":["7.3","18.6","18.8","19.10","22.4","22.5","28.10"],"toc":["7.5"],"macro":["7.5"],"md":["7.5","15.7"],"setting":["7.7"],"up":["7.7","22.0","24.8"],"environment":["7.7","22.0","23.7"],"local":["7.7","27.6"],"deployment":["7.7"],"defaults":["7.8"],"to":["7.8","14.16","14.26","19.7"],"true":["7.8","14.14","14.25","17.9","18.22","18.34","28.15"],"sidebardepth":["7.8"],"my":["8.0","15.5","18.5","28.3"],"run":["8.0","24.5","26.11","27.2","28.5"],"behind":["8.0","26.2"],"path":["8.0"],"app":["8.0","25.7"],"so":["8.0","11.1","24.0","24.8","26.12","28.9"],"index":["8.1","28.10"],"then":["8.2","11.0","23.2","26.5","26.11"],"reload":["8.2","24.6"],"warning":["9.0"],"work":["9.0"],"how":["9.11","27.5","28.0"],"systems":["11.0"],"let":["11.0","16.6"],"create":["11.0","24.4","28.0"],"very":["11.0","23.0"],"simple":["11.0","19.9","23.0","25.7","27.6"],"modern":["11.1"],"compliant":["11.1"],"javascript":["11.1"],"syntax":["11.1"],"within":["11.1"],"js":["11.1","14.22","15.19","16.11","18.18","19.14","19.20","27.2"],"websocket":["11.2"],"code":["11.2","16.11"],"wss":["11.2"],"event":["11.2","11.5","28.15"],"when":["11.2","16.12"],"created":["11.2","24.4","25.3"],"socket":["11.2"],"any":["11.2","22.3"],"error":["11.3","18.29"],"err":["11.3"],"message":["11.3"],"close":["11.3","11.4"],"closed":["11.3","11.4","15.27","15.34"],"if":["11.3","14.14","14.25","18.22","18.34","24.4","26.14","28.13"],"you":["11.3","24.3","24.6","26.14","28.5","28.13","28.15"],"foreach":["11.4"],"delete":["11.4"],"finally":["11.4","22.5","25.5"],"go":["11.4","24.5","26.9","26.12"],"back":["11.4","24.7","26.11","26.12"],"make":["11.4","28.16"],"react":["11.4"],"playback":["11.5"],"file":["11.5","23.7"],"together":["11.5"],"one":["11.5","23.4"],"connected":["11.5"],"after":["11.5"],"was":["11.5","16.12"],"should":["11.5","22.2","24.5","24.6","28.13"],"procurement":["12.0"],"substitute":["12.0"],"goods":["12.0"],"services":["12.0"],"loss":["12.0"],"data":["12.0","15.16","15.21"],"profits":["12.0"],"business":["12.0"],"interruption":["12.0"],"however":["12.0","26.9","26.13"],"caused":["12.0"],"on":["12.0","16.10","17.0","19.10","22.6","24.6","28.11"],"theory":["12.0"],"liability":["12.0"],"whether":["12.0"],"contract":["12.0"],"strict":["12.0"],"number":["13.0","26.14"],"limited":["13.0"],"pluginmanager":["13.4","16.4","19.4","19.5"],"register":["13.4","13.12","15.19","16.4","17.9","17.15","18.18","19.4","19.5","19.14","19.20"],"get":["13.5","14.6","15.4","17.5","18.4","23.3"],"a":["13.8","13.9","13.10","15.14","15.15","15.22","15.26","15.27","15.30","15.34","17.4","17.8","17.11","17.13","18.11","18.12","18.20","18.21","18.32","19.13","19.17","19.19"],"name":["13.8","13.9","13.10","14.13","14.18","14.20","14.24","14.28","15.15","15.24","15.26","15.27","15.32","15.34","16.9","17.8","17.11","18.11","18.20","18.29","18.30","18.31","19.13","19.17","19.19"],"checkin":["13.12","27.0"],"plugincheckin":["13.12"],"color":["13.12","22.5"],"their":["14.0","17.0"],"contents":["14.0"],"pluginfilesystemserver":["14.1"],"publicly":["14.4"],"publicpath":["14.4"],"await":["14.4","16.5","28.9"],"start":["14.4","16.5","19.8","19.9","24.5","28.9"],"writefile":["14.6"],"audio":["14.8","25.3","25.4","26.9"],"buffer":["14.8"],"loader":["14.8","27.1"],"state":["14.8","26.7","26.10","28.2"],"manager":["14.8"],"password":["14.9"],"will":["14.9","15.16","15.21","17.4","22.6","24.3","24.4","26.13","28.8"],"perform":["14.9"],"these":["14.9","25.3","26.4"],"newpath":["14.12"],"rm":["14.12","14.21"],"onupdate":["14.13","14.24","18.28","18.33","28.15"],"boolean":["14.14","14.25","18.22"],"false":["14.14","14.15","14.25","16.6","18.22","18.34"],"keep":["14.15","26.6","26.9"],"or":["14.15","18.8","19.7","25.4","28.4","28.13"],"remove":["14.15","28.6"],"retrieved":["14.16","14.26","18.8"],"content":["14.17","14.27"],"the":["14.17","14.18","14.27","14.28","15.0","18.16","18.27","26.10"],"new":["14.19","14.29","15.16","15.21","18.14","18.25","18.36","23.4","25.9"],"project":["14.22"],"stay":["14.22"],"idle":["14.22"],"until":["14.22"],"switch":["14.22","15.19","18.18","26.3"],"router":["14.23"],"serve":["14.23"],"url":["14.23","26.12"],"entry":["14.23"],"string":["14.30","18.15","18.16","18.26","18.27"],"network":["15.0","22.6","25.0"],"into":["15.0","26.9","26.15","28.10"],"plain":["15.0"],"classes":["15.1","19.1"],"pluginloggerclient":["15.1"],"pluginloggerserver":["15.1"],"writerclient":["15.1"],"writer":["15.4","15.5"],"createwriter":["15.5"],"logs":["15.6","15.9"],"while":["15.8","25.4"],"usefull":["15.8","15.16","15.21"],"situations":["15.8"],"console":["15.9","28.5"],"pathname":["15.9","15.23","15.31"],"method":["15.10","15.19","19.8"],"sharedwriter":["15.10"],"write":["15.11","15.24","15.32"],"logger":["15.15","15.19"],"pluginlogger":["15.15"],"underlying":["15.16"],"appended":["15.16","15.21"],"writes":["15.17"],"buffered":["15.17"],"before":["15.17"],"sending":["15.17"],"runtime":["15.19","18.0"],"usin":["15.19"],"containing":["15.20","18.23"],"key":["15.20","18.23"],"also":["15.20","18.23","26.7"],"onpacketsend":["15.22"],"callback":["15.22","15.30","18.28"],"onclose":["15.22","15.30"],"description":["15.25","15.29","15.33","15.35","18.10","18.19","19.15","19.16","19.21","19.22"],"is":["15.27","15.34","26.9"],"execute":["15.28","18.34"],"param":["15.29","15.35","19.21","19.22"],"french":["15.36","24.7"],"national":["15.36"],"tutorial":["16.0","22.6","26.6","26.9"],"dev":["16.0","22.2","24.5","26.11","27.2","28.5"],"tutorials":["16.0","26.4"],"config":["16.4","19.4","23.7"],"arbitraty":["16.6"],"logic":["16.6","26.12"],"passing":["16.6"],"function":["16.6","18.28","18.35","19.17","27.6","28.10"],"oncheck":["16.6"],"onactivate":["16.6"],"options":["16.6"],"oncheckcalled":["16.6"],"onactivatecalled":["16.6"],"onactive":["16.10"],"user":["16.10"],"gesture":["16.10"],"init":["16.10","23.2","24.1","26.15"],"of":["16.11","18.12","18.21","18.37","26.10"],"myview":["16.11"],"addeventlistener":["16.11"],"e":["16.11","19.8","23.3","24.5","26.14","28.16"],"plugin":["16.12","26.15"],"registered":["16.12"],"class":["16.13","25.7"],"apistop":["16.13"],"give":["17.0"],"approximate":["17.0"],"background":["17.4","22.5"],"image":["17.4"],"displayed":["17.4"],"launcher":["17.4","28.12"],"view":["17.4"],"positionplugin":["17.9","17.15"],"position":["17.15"],"for":["18.0","23.6","26.15"],"started":["18.4","24.0"],"script":["18.5","18.32"],"attach":["18.5","18.9","18.17","28.9"],"constants":["18.5"],"mod":["18.5"],"soundworks":["18.6","23.7","25.0","26.2","26.3"],"filesystem":["18.6"],"provide":["18.6","24.7"],"same":["18.6","22.3","25.3","26.7","26.9","26.12"],"security":["18.6"],"restrictions":["18.6"],"cannot":["18.8"],"instatiated":["18.8"],"manually":["18.8"],"calling":["18.8"],"quot":["18.13","18.24"],"x27":["18.13","18.24"],"initial":["18.13","18.24"],"import":["18.28","18.31"],"promise":["18.28"],"detach":["18.28","18.37"],"executelistener":["18.28"],"transpiled":["18.30"],"all":["18.32","28.4"],"exports":["18.32"],"given":["18.34","28.6"],"instead":["18.37","22.5"],"kind":["18.37"],"instance":["18.37","22.4"],"pluginsyncclient":["19.1"],"pluginsyncserver":["19.1"],"resources":["19.1"],"sync":["19.2"],"want":["19.7"],"itself":["19.8"],"fully":["19.8","26.12"],"end":["19.8","22.2","26.12"],"last":["19.8","28.6"],"argument":["19.8"],"passed":["19.8","28.6"],"i":["19.8","24.5"],"specifically":["19.8"],"tells":["19.8"],"once":["19.8","28.10"],"destination":["19.9","23.4"],"note":["19.9","19.10","27.5"],"effectively":["19.9"],"logical":["19.9"],"as":["19.10","24.2","28.6"],"object":["19.13","24.4"],"synchronization":["19.14"],"reports":["19.14"],"statistics":["19.14"],"optionnal":["19.15","19.16","19.21"],"report":["19.18"],"modify":["19.20"],"this":["19.20","26.9","28.6"],"default":["19.20","24.5"],"behavior":["19.20","28.16"],"identical":["19.22"],"used":["20.0"],"proposed":["21.0","26.3"],"experience":["21.5"],"development":["22.0","22.2","26.11"],"please":["22.0","24.0"],"first":["22.0","26.11","26.15","28.9"],"set":["22.0","23.3","26.14","28.7"],"working":["22.0","24.8"],"chrome":["22.1"],"firefox":["22.1"],"next":["22.2","22.6"],"optionally":["22.2"],"git":["22.2"],"add":["22.2","28.9","28.16"],"commit":["22.2"],"m":["22.2"],"launch":["22.2","25.5","26.5"],"mode":["22.2"],"seconds":["22.2"],"running":["22.2"],"exposing":["22.3"],"means":["22.3","28.6"],"located":["22.3"],"computer":["22.3"],"do":["22.3","24.7"],"not":["22.3","25.3","28.4"],"expose":["22.3"],"sensitive":["22.3"],"private":["22.3"],"information":["22.3","25.4"],"appear":["22.5"],"each":["22.5","26.8"],"review":["22.5"],"inside":["22.5"],"logging":["22.5"],"style":["22.5"],"backgroundcolor":["22.5"],"white":["22.5"],"settimeout":["22.5"],"whenever":["22.5"],"put":["22.5"],"hide":["22.6"],"complexity":["22.6"],"we":["22.6","26.4","27.5"],"explore":["22.6"],"help":["23.0"],"where":["23.0"],"browser":["23.0"],"controller":["23.0","28.13"],"role":["23.3"],"sw":["23.3","25.7"],"audit":["23.3"],"section":["23.3"],"p":["23.3","25.7"],"hello":["23.3"],"map":["23.3","27.6"],"return":["23.3"],"sc":["23.3","26.0","26.1"],"text":["23.3"],"button":["23.3"],"input":["23.3","26.14","28.7"],"currenttime":["23.4","25.3"],"env":["23.4","23.7"],"gain":["23.4","28.4"],"connect":["23.4"],"setvalueattime":["23.4"],"linearramptovalueattime":["23.4"],"01":["23.4"],"exponentialramptovalueattime":["23.4","28.14"],"0001":["23.4"],"randomly":["23.4","24.6"],"pick":["23.4","24.6"],"harmonics":["23.4"],"at":["23.4","24.7","26.6","26.12","28.6"],"50hz":["23.4"],"frequency":["23.4","24.6"],"math":["23.4","24.6"],"floor":["23.4","24.6"],"random":["23.4","24.6"],"osc":["23.4","28.13","28.14"],"watch":["23.6"],"consume":["23.7"],"npx":["23.7"],"tackling":["23.8"],"question":["23.8"],"wizard":["24.0"],"refer":["24.0"],"getting":["24.0"],"lit":["24.2","28.1"],"actual":["24.2"],"list":["24.2"],"version":["24.2"],"numbers":["24.2"],"change":["24.2","28.2","28.7"],"compared":["24.2"],"ones":["24.2"],"listed":["24.2"],"above":["24.2"],"versions":["24.2","24.7"],"released":["24.2"],"info":["24.4","26.4","27.5"],"common":["24.4","26.6"],"design":["24.4"],"pattern":["24.4"],"featured":["24.4"],"call":["24.4"],"interested":["24.4"],"http":["24.5","26.11","26.13","28.3","28.13","28.15"],"splashscreen":["24.5"],"provided":["24.5","25.8"],"screen":["24.5","26.12","28.15"],"createoscillator":["24.6","28.13"],"harmonic":["24.6"],"spectrum":["24.6"],"value":["24.6"],"stop":["24.6"],"page":["24.6","26.11"],"cmd":["24.6"],"r":["24.6"],"ear":["24.6","28.13"],"incredibly":["24.6"],"nice":["24.6"],"coming":["24.6"],"try":["24.7"],"locale":["24.7"],"falls":["24.7"],"english":["24.7"],"localized":["24.7"],"texts":["24.7"],"exist":["24.7"],"writing":["24.7"],"wrap":["24.8"],"what":["24.8","26.9"],"far":["24.8"],"creating":["24.8"],"small":["24.8"],"learn":["25.0"],"devices":["25.1"],"behing":["25.2"],"two":["25.3","26.3","26.12"],"share":["25.3"],"audiocontext":["25.3","27.4"],"defined":["25.3"],"they":["25.3","28.4"],"even":["25.3"],"advance":["25.3"],"possible":["25.4"],"estimation":["25.4"],"such":["25.4"],"schedule":["25.4"],"musical":["25.4","25.9"],"events":["25.4"],"infered":["25.4"],"confirm":["25.5","26.5"],"open":["25.5","26.5","26.11","28.13","28.15"],"favorite":["25.5","26.5"],"editor":["25.5","26.5"],"render":["25.7"],"html":["25.7"],"div":["25.7"],"layout":["25.7"],"localtime":["25.7"],"getlocaltime":["25.7","27.6"],"synctime":["25.7","27.6"],"getsynctime":["25.7","27.6"],"infos":["25.7"],"container":["25.7","28.15"],"refresh":["25.7"],"fps":["25.7"],"window":["25.7"],"requestanimationframe":["25.7"],"starts":["25.8"],"properly":["25.8"],"resumed":["25.8"],"gettimefunction":["25.8"],"declare":["25.8"],"tool":["25.9"],"way":["25.9","26.4","27.0","28.0"],"routing":["26.0"],"discover":["26.0","28.0"],"related":["26.0"],"ircam":["26.0","26.1"],"performance":["26.3"],"general":["26.3","26.9","26.10"],"volume":["26.3","28.16"],"between":["26.3","28.4"],"sections":["26.3"],"statemanager":["26.3"],"sharedstate":["26.3"],"abstractions":["26.3"],"speak":["26.4"],"consider":["26.4"],"both":["26.4","26.12"],"clients":["26.4","27.2","28.9"],"form":["26.4"],"being":["26.6"],"able":["26.6"],"values":["26.6"],"contrary":["26.6"],"globally":["26.6"],"things":["26.6","26.9"],"focused":["26.6","26.9"],"management":["26.6"],"system":["26.6"],"won":["26.6","26.9"],"t":["26.6","26.9"],"actually":["26.6"],"attaching":["26.7"],"shared":["26.7"],"but":["26.7","26.9"],"under":["26.7"],"different":["26.7","27.2"],"advanced":["26.7"],"cases":["26.7"],"now":["26.7","26.14","28.5","28.15"],"them":["26.8"],"line":["26.8","28.3","28.6"],"details":["26.9"],"idea":["26.9"],"would":["26.9","28.3"],"exactly":["26.9"],"miss":["26.9"],"implementation":["26.11"],"restart":["26.11"],"emulate":["26.12","27.2"],"side":["26.12","28.13"],"interfaces":["26.12"],"synchronized":["26.12"],"through":["26.12"],"ready":["26.12"],"implement":["26.12"],"still":["26.13"],"issue":["26.13"],"detail":["26.14","28.7"],"dive":["26.15"],"platform":["26.15"],"another":["27.0"],"which":["27.0"],"terminal":["27.2"],"web":["27.4","28.0"],"disabled":["27.5"],"transfert":["27.6"],"allow":["27.6"],"its":["27.6"],"current":["27.6"],"currenttimetoaudiotimefunction":["27.6"],"our":["28.0","28.5","28.10","28.11"],"reusable":["28.0"],"components":["28.0","28.1"],"take":["28.2"],"control":["28.2"],"over":["28.2"],"done":["28.3","28.10"],"exit":["28.3"],"command":["28.3"],"applied":["28.4"],"wether":["28.4"],"muted":["28.4"],"log":["28.5"],"getvalues":["28.5"],"second":["28.6"],"parameter":["28.6"],"executed":["28.6"],"immediately":["28.6"],"registration":["28.6"],"allows":["28.6"],"us":["28.6"],"know":["28.6"],"mute":["28.7"],"active":["28.7"],"lot":["28.8"],"testing":["28.8"],"time":["28.8"],"const":["28.9"],"custom":["28.10"],"elements":["28.10"],"registry":["28.10"],"customelements":["28.10"],"define":["28.10"],"need":["28.10"],"insert":["28.10"],"template":["28.10"],"renderapp":["28.10","28.14"],"sounds":["28.11"],"core":["28.12"],"helpers":["28.12"],"several":["28.13"],"players":["28.13"],"001":["28.14"],"onattach":["28.15"],"ondetach":["28.15"],"chain":["28.16"],"g":["28.16"],"decibels":["28.16"],"slider":["28.16"],"natural":["28.16"]},{"0":["11.1","22.2","23.3","28.6","28.7"],"1":["11.1","23.3","24.6","27.5","28.6","28.7","28.15"],"2":["11.1","27.5"],"3":["5.0","7.7"],"6":["26.13"],"8":["11.1"],"15":["3.5","11.1"],"16":["11.1"],"42":["18.4"],"127":["22.2","23.3","24.6","26.14","27.5","28.6","28.7"],"2015":["3.5"],"2020":["3.4"],"8000":["22.2","23.3","24.6","26.11","26.14","27.5","28.6","28.7","28.15"],"org":["0.0","7.0"],"soundworks":["1.2","11.5","21.0","25.4","28.9"],"connected":["1.4"],"lamp":["1.4"],"rpi":["1.4"],"anatomy":["1.4"],"of":["1.4","4.10","11.0","28.5"],"default":["1.4","8.0","28.0","28.5"],"template":["1.4","26.6"],"app":["1.4","28.10"],"dotpi":["1.5"],"working":["1.5","11.4"],"osc":["1.5"],"como":["1.6"],"elements":["1.6"],"koryphaios":["1.6"],"browser":["1.7","22.4","23.4","25.7","26.12"],"runtimes":["1.7"],"for":["1.7","19.9","24.4"],"clients":["1.7","18.6","24.8","28.11"],"from":["3.1","19.22","28.14"],"s":["3.1","22.3","25.4"],"stms":["3.1","5.0"],"lab":["3.1","5.0"],"online":["3.3"],"at":["3.3","7.0","8.0","24.6","28.2"],"apps":["3.3"],"fr":["3.3"],"hal":["3.4","19.23"],"03033143":["3.4"],"developers":["3.5"],"to":["3.5","9.11"],"create":["3.5","26.0","26.7"],"collaborative":["3.5","6.1"],"performances":["3.5"],"paris":["3.5"],"france":["3.5"],"01580797":["3.5"],"a":["4.1","14.12","14.15","14.21","15.19","17.0","17.10","17.12","18.9","18.14","18.17","18.25","18.36","19.15","19.16","19.18","19.21","24.5","28.7"],"list":["4.1"],"available":["4.1"],"so":["4.1"],"far":["4.1"],"example":["4.2","4.3","4.4","4.5","4.6","4.7","4.8","4.9"],"w":["4.2","4.6"],"filesystem":["4.2","14.22"],"save":["4.3","4.6","4.7","4.8"],"github":["4.3","4.6","4.7","4.8","4.9","4.12"],"devicemotion":["4.6"],"helpers":["4.10"],"simplify":["4.10","26.15"],"set":["4.10","28.2"],"common":["4.10","25.7"],"tasks":["4.10","26.15"],"blob":["5.0"],"bsd":["5.0"],"clause":["5.0"],"sound":["5.0","23.0"],"movement":["5.0"],"interaction":["5.0"],"tutelles":["5.0"],"http":["5.0","22.2","23.3","24.6","26.14","27.5","28.6","28.7"],"cnrs":["5.0"],"sorbonne":["5.0"],"universite":["5.0"],"su":["5.0"],"culture":["5.0"],"gouv":["5.0"],"also":["6.1","24.6"],"suited":["6.1"],"outside":["6.1"],"realm":["6.1"],"graphics":["6.1"],"multi":["6.1"],"user":["6.1","26.0"],"games":["6.1"],"future":["6.2","23.7"],"fact":["6.2"],"works":["6.2","11.2"],"or":["6.2","17.0","28.3"],"our":["6.2","26.7"],"hands":["6.2"],"won":["6.2","25.3"],"t":["6.2","24.0","28.13"],"implemented":["6.2"],"into":["6.2","25.4"],"until":["6.2"],"annotation":["6.2"],"proposal":["6.2"],"evolved":["6.2"],"see":["6.4","6.6","11.3","22.4","24.6","25.4","28.5","28.6","28.15"],"getting":["6.4","6.7"],"started":["6.4","6.7"],"tutorial":["6.4","6.5","6.6","6.7","14.9","23.7","24.4"],"state":["6.5","7.8","16.5","22.6","27.6","28.3"],"manager":["6.5","7.8","24.2"],"evolutions":["6.6"],"platform":["6.6","16.10","23.4"],"init":["6.6"],"just":["6.7","26.4","26.6"],"jump":["6.7"],"found":["7.0"],"https":["7.0"],"vuejs":["7.0"],"npm":["7.1","23.2","25.5","26.5"],"edit":["7.2"],"some":["7.2","25.4","26.15"],"content":["7.2"],"cf":["7.2"],"examples":["7.2"],"automatically":["7.3","26.11","26.12"],"this":["7.3","7.7","24.4","26.13","28.13"],"can":["7.3","24.4","27.5"],"take":["7.3"],"few":["7.3"],"minutes":["7.3"],"my":["7.5","14.4","14.6","14.22","15.4","15.19"],"awesome":["7.5"],"document":["7.5"],"contributing":["7.7"],"site":["7.7"],"here":["7.7","7.8","22.0","26.8","28.9"],"publish":["7.7"],"children":["7.8"],"add":["7.8"],"client":["8.0","16.10","22.4","24.4","28.13","28.14"],"should":["8.0","8.2","11.3","22.4","26.14","28.2","28.5","28.6","28.7","28.10","28.15"],"be":["8.0","15.20","24.8","27.5"],"accessible":["8.0","8.2"],"tip":["8.1","24.6","26.11","27.2"],"an":["8.1","22.3","24.7","26.8","27.6"],"interesting":["8.1","26.6","28.8"],"free":["8.1"],"tool":["8.1"],"deploy":["8.1"],"and":["8.1","18.6","23.8"],"monitor":["8.1"],"several":["8.1","22.5","24.8","25.7","26.13","26.14","28.2"],"applications":["8.1","22.3","28.2"],"pm2":["8.1"],"your":["8.2","24.2","24.3","24.6","26.6","28.8","28.10"],"application":["8.2","11.4","23.7","26.10","28.6","28.15"],"on":["8.2","15.29","15.35","24.3","26.7"],"internets":["8.2"],"domain":["8.2"],"com":["8.2"],"in":["9.0","11.3","15.16","15.21","28.7","28.15"],"progress":["9.0"],"unify":["9.1"],"groundup":["11.0"],"have":["11.0","11.4","22.3","23.4","26.13","26.14"],"taste":["11.0"],"what":["11.0"],"using":["11.0","25.8","28.0"],"raw":["11.0"],"means":["11.0"],"type":["11.1"],"module":["11.1"],"code":["11.1","18.37","25.4"],"easily":["11.2","27.2","28.9"],"expected":["11.2"],"restart":["11.2"],"changes":["11.2"],"terminal":["11.2","28.5"],"press":["11.2"],"ctrl":["11.2","28.3"],"c":["11.2","28.3"],"close":["11.2","15.26","15.33"],"sh":["11.2"],"reload":["11.3"],"page":["11.3","22.4","28.10"],"displayed":["11.3"],"await":["11.4","17.4"],"resumeaudiocontext":["11.4"],"loadaudiobuffer":["11.4"],"assets":["11.4"],"sample":["11.4"],"wav":["11.4"],"samplerate":["11.4"],"congrats":["11.4","22.2"],"you":["11.4","23.3","24.0","25.4","27.2","28.6","28.7"],"simple":["11.4","23.4","26.12"],"distributed":["11.4","22.6","24.8","28.2"],"do":["11.5","26.6"],"such":["11.5","12.0","19.7","25.3","26.15"],"case":["11.5"],"designed":["11.5"],"hopefully":["11.5","26.0"],"help":["11.5"],"handle":["11.5"],"cases":["11.5"],"manner":["11.5","23.4"],"tort":["12.0"],"negligence":["12.0"],"otherwise":["12.0"],"arising":["12.0"],"way":["12.0","22.5","26.9","26.13"],"out":["12.0"],"even":["12.0"],"if":["12.0","15.8","23.3","24.0","24.6","28.2","28.6","28.7"],"advised":["12.0"],"possibility":["12.0"],"damage":["12.0"],"associated":["13.0","27.6"],"additional":["13.0"],"data":["13.0"],"tocstop":["13.1","14.1","15.1","16.1","17.1","18.1","19.1"],"getindex":["13.5"],"name":["13.7","14.11","14.12","14.14","14.15","14.16","14.17","14.19","14.21","14.22","14.23","14.25","14.26","14.27","14.29","15.8","15.19","15.20","15.25","15.28","15.29","15.33","16.8","16.10","16.11","16.12","17.7","17.9","17.10","17.12","17.13","18.8","18.10","18.12","18.18","18.19","18.21","18.22","18.23","18.28","18.32","18.34","18.35","19.12","19.14","19.15","19.16","19.18","19.20","19.21"],"getdata":["13.9"],"plugincheckinserver":["13.10"],"green":["13.12"],"yellow":["13.12"],"pink":["13.12"],"apistop":["13.12","14.30","15.35","17.15","18.37","19.22"],"any":["14.0","28.14"],"node":["14.0","14.23","24.2","26.8"],"get":["14.4","16.11","27.2"],"writefile":["14.4","14.16","14.26"],"txt":["14.4","14.6","15.9"],"hello":["14.4","14.6","15.4","15.5"],"file":["14.6"],"share":["14.8"],"js":["14.9","16.10"],"configure":["14.9","19.7","23.7"],"todo":["14.9","28.15"],"given":["14.14","14.25","18.22","27.6"],"immediately":["14.14","14.25","18.22","18.34"],"gettreeasurlmap":["14.14"],"keys":["14.15"],"findintree":["14.15","14.25"],"mkdir":["14.17","14.27"],"rename":["14.18","14.28"],"rm":["14.19","14.29"],"pluginfilesystemserver":["14.20"],"register":["14.22","16.10"],"filesystemplugin":["14.22"],"dir":["14.22"],"each":["14.23","24.6","28.3"],"tree":["14.23"],"gettree":["14.23","18.11","18.20"],"old":["15.0"],"files":["15.0"],"writerserver":["15.1","15.29"],"credits":["15.1","19.1"],"license":["15.1","19.1"],"createwriter":["15.4","15.15","15.20"],"log":["15.4","15.5","16.5","18.5"],"write":["15.4","15.5","22.3"],"directory":["15.6","26.6"],"0002":["15.7"],"lead":["15.8"],"errors":["15.8"],"two":["15.8","27.5","28.7"],"writers":["15.8","15.10"],"created":["15.8"],"same":["15.8","15.16","15.21","22.4","23.4","24.6"],"attached":["15.10"],"sent":["15.11"],"method":["15.13","18.8","28.9"],"global":["15.16","15.21","27.6","28.3","28.10"],"informations":["15.16","15.21"],"amongst":["15.16","15.21"],"different":["15.16","15.21","23.8","25.4","28.7","28.15"],"sessions":["15.16","15.21"],"attachwriter":["15.16"],"logs":["15.17","15.19"],"pluginloggerserver":["15.17"],"pluginlogger":["15.19"],"passed":["15.20","18.23","28.9"],"writerclient":["15.21"],"written":["15.25","15.33"],"flush":["15.25"],"onpacketsend":["15.27"],"onclose":["15.28","15.34"],"execute":["15.29","15.35"],"agency":["15.36"],"anr":["15.36"],"html":["16.0"],"console":["16.5","18.5"],"running":["16.5","23.0"],"return":["16.6"],"promise":["16.6"],"resolve":["16.6"],"pluginplatforminit":["16.10"],"onusergesture":["16.10"],"platformplugin":["16.11"],"pluginplatforminitserver":["16.12"],"map":["17.0","17.4","17.15"],"backgroundimage":["17.4"],"public":["17.4","17.15"],"path":["17.4"],"png":["17.4","17.15"],"start":["17.4"],"clientposition":["17.5"],"getposition":["17.5","17.10"],"setposition":["17.9"],"setnormalizedposition":["17.11"],"getnormalizedposition":["17.12"],"pluginpositionserver":["17.13"],"createscript":["18.4","18.12","18.23"],"constants":["18.4"],"export":["18.4"],"answer":["18.4","18.5"],"production":["18.6","23.7"],"mode":["18.6","25.5","26.5"],"authentified":["18.6"],"trusted":["18.6"],"allowed":["18.6"],"modify":["18.6"],"pluscritping":["18.8"],"attach":["18.8","18.15","18.26","27.6","28.4"],"getlist":["18.10","18.19"],"updatescript":["18.13","18.24"],"deletescript":["18.14","18.25"],"pluginscriptingserver":["18.16"],"scriptingplugin":["18.18"],"setglobalscriptingcontext":["18.18"],"onupdate":["18.21"],"switch":["18.22"],"sharedscript":["18.27"],"ondetach":["18.28","18.34"],"update":["18.28","18.35"],"value":["18.28"],"delete":["18.28","18.36"],"detach":["18.32"],"wrapper":["19.0"],"around":["19.0"],"ircam":["19.0"],"library":["19.0","28.0"],"synchronize":["19.7","26.3"],"another":["19.7","23.0","24.7","26.8"],"as":["19.7","24.8","26.15"],"audiocontext":["19.7","19.14"],"currenttime":["19.7","19.14","27.4"],"resumed":["19.8","28.12"],"gettimefunction":["19.8","27.4"],"but":["19.9","23.3","26.6"],"unfortunately":["19.9"],"not":["19.9","22.2","26.6"],"compensate":["19.9"],"output":["19.9"],"latency":["19.9"],"may":["19.9"],"differ":["19.9"],"great":["19.9"],"extent":["19.9"],"master":["19.10","28.10"],"there":["19.10"],"no":["19.10","22.4","26.13"],"difference":["19.10"],"sync":["19.14","19.20","25.2"],"pluginsync":["19.14","19.20"],"getlocaltime":["19.14","19.20"],"getsynctime":["19.15"],"onreport":["19.16"],"getreport":["19.17"],"pluginsyncserver":["19.18"],"optionnal":["19.22"],"01304889v1":["19.23"],"prototype":["20.0"],"build":["20.0"],"instructions":["22.0"],"come":["22.0"],"back":["22.0"],"when":["22.0","27.5"],"done":["22.0","28.4"],"favorite":["22.2"],"shall":["22.2"],"probably":["22.2"],"safari":["22.2"],"tada":["22.2"],"rather":["22.2"],"pretty":["22.2"],"almost":["22.2"],"black":["22.2","22.4"],"screen":["22.2","23.3"],"fancy":["22.2","22.4"],"configured":["22.2"],"ran":["22.2"],"closer":["22.2"],"look":["22.2","28.10"],"codebase":["22.2"],"whenever":["22.3"],"deal":["22.3"],"with":["22.3","24.7"],"servers":["22.3"],"networks":["22.3"],"specific":["22.3"],"now":["22.3","24.4","25.4","28.3","28.10"],"we":["22.3"],"overviewed":["22.3"],"let":["22.3","25.4"],"side":["22.4","26.14","27.5"],"logic":["22.4","25.4"],"everything":["22.4","23.3"],"went":["22.4"],"well":["22.4","24.2","28.13"],"error":["22.4"],"launching":["22.4"],"still":["22.4"],"show":["22.4"],"after":["22.5","28.10"],"50ms":["22.5"],"action":["22.5","26.12"],"understand":["22.5"],"precisely":["22.5"],"why":["22.5"],"keep":["22.5","24.2"],"calling":["22.5"],"emulate":["22.5","24.6","26.13","26.14","27.5","28.15"],"parallel":["22.5","23.6"],"window":["22.5","28.15"],"end":["22.5"],"note":["22.5","24.6","26.6","26.11"],"url":["22.5","26.11"],"emulated":["22.5"],"these":["22.5","26.7"],"them":["22.5","24.6","26.12","28.13"],"blink":["22.5"],"indeed":["22.5","23.4","25.4","26.4"],"exactly":["22.5","23.4"],"possibilities":["22.6"],"proposed":["22.6","25.0","26.6","28.0"],"management":["22.6"],"system":["22.6"],"trigger":["23.0"],"synthesized":["23.0"],"by":["23.0","27.5","28.0","28.3","28.14"],"run":["23.2","25.5","26.5"],"dev":["23.2","25.5","26.5"],"container":["23.3","28.7","28.10"],"course":["23.3"],"launch":["23.3","23.6"],"right":["23.3"],"empty":["23.3","26.6"],"ready":["23.3"],"stop":["23.4"],"runs":["23.4"],"wrote":["23.4"],"abstracting":["23.4","26.3"],"important":["23.4","28.2"],"related":["23.4"],"libraries":["23.4"],"thing":["23.6"],"four":["23.6"],"explain":["23.7"],"more":["23.7","26.14","28.8"],"detail":["23.7"],"about":["23.7"],"how":["23.7","24.6","25.7","26.8","28.15"],"setting":["23.7"],"synchronization":["23.8","25.4","25.7"],"between":["23.8"],"processes":["23.8"],"machines":["23.8"],"didn":["24.0"],"check":["24.0","24.4"],"it":["24.0"],"yet":["24.0"],"allows":["24.2","25.7","27.0","28.9"],"i":["24.2","24.6"],"e":["24.2","24.6"],"track":["24.2","27.6","28.9"],"project":["24.2","28.3","28.14"],"then":["24.2"],"need":["24.2"],"re":["24.2"],"installed":["24.2"],"information":["24.4"],"subject":["24.4"],"all":["24.4","24.6","25.3","25.8","26.3","26.12"],"install":["24.4"],"requires":["24.5"],"gesture":["24.5"],"click":["24.5"],"event":["24.5"],"shown":["24.5"],"because":["24.5"],"has":["24.5"],"been":["24.5"],"registered":["24.5","26.7"],"homepage":["24.5","24.6"],"speakers":["24.6","24.8"],"multiple":["24.6","26.3"],"helps":["24.6"],"once":["24.6","28.4","28.13"],"without":["24.6","25.3"],"requiring":["24.6"],"likely":["24.7","25.3"],"version":["24.7"],"confortable":["24.7"],"willing":["24.7"],"contribute":["24.7"],"please":["24.7"],"issue":["24.7"],"pull":["24.7"],"request":["24.7"],"repository":["24.7"],"where":["24.8"],"used":["24.8","28.8"],"central":["24.8","26.4"],"controller":["24.8","28.14"],"which":["25.0","26.13","27.6"],"is":["25.0"],"solve":["25.0"],"particular":["25.0"],"html5":["25.1"],"plugin":["25.2","25.4"],"soundcard":["25.3"],"reason":["25.3"],"arbitrary":["25.3"],"relying":["25.3"],"external":["25.3"],"resources":["25.3"],"scheduling":["25.4"],"actual":["25.4"],"synthesis":["25.4"],"own":["25.4"],"explanation":["25.4"],"simplified":["25.4"],"hope":["25.4"],"gives":["25.4","26.4"],"intuition":["25.4"],"behind":["25.4"],"nodes":["25.4"],"experiement":["25.4"],"ideas":["25.4"],"translate":["25.4"],"development":["25.5","26.5"],"windows":["25.7","26.12","28.7"],"estimate":["25.7"],"clock":["25.7"],"dependency":["25.8"],"estimating":["25.8"],"reference":["25.8"],"implemeting":["25.9"],"step":["25.9","27.5","28.13"],"sequencer":["25.9","27.5"],"components":["26.0","26.1","28.16"],"simply":["26.0","28.9"],"usable":["26.0"],"elegant":["26.0"],"graphical":["26.0"],"interfaces":["26.0"],"shared":["26.2","28.15"],"states":["26.2","28.3"],"provide":["26.3","28.2"],"define":["26.3"],"sets":["26.3"],"are":["26.3","26.7","28.14"],"interest":["26.3"],"while":["26.3","26.9"],"network":["26.3"],"communications":["26.3"],"involved":["26.3"],"however":["26.4"],"its":["26.4"],"role":["26.4"],"abilities":["26.4"],"features":["26.4"],"exercise":["26.6"],"info":["26.6"],"included":["26.6"],"mandatory":["26.6"],"declarations":["26.6"],"potentially":["26.6"],"live":["26.6"],"anywhere":["26.6"],"good":["26.6","28.2"],"practice":["26.6"],"organized":["26.6"],"safely":["26.7"],"instances":["26.7"],"sharedstate":["26.7"],"based":["26.7"],"methods":["26.8"],"relate":["26.8"],"creates":["26.8"],"new":["26.8"],"owned":["26.8"],"existing":["26.8"],"could":["26.9"],"implement":["26.9"],"directly":["26.9"],"bit":["26.9","26.13"],"deeper":["26.9"],"dedicated":["26.9"],"task":["26.9"],"part":["26.11"],"according":["26.11","27.6"],"names":["26.11"],"anytime":["26.12"],"modified":["26.12"],"one":["26.12"],"other":["26.12"],"g":["26.13","27.5"],"know":["26.13"],"correspond":["26.13"],"badly":["26.13"],"defined":["26.13"],"review":["26.13"],"takle":["26.13"],"open":["26.14","28.6"],"usefull":["26.14"],"final":["26.14"],"meant":["26.15"],"redondant":["26.15"],"cumbersome":["26.15"],"resuming":["26.15"],"audio":["26.15","28.2"],"context":["26.15"],"etc":["26.15","28.16"],"us":["27.0"],"assign":["27.0"],"unique":["27.0"],"index":["27.0","27.6"],"watch":["27.2"],"current":["27.2","28.5"],"use":["27.2"],"pwd":["27.2"],"command":["27.2"],"syncplugin":["27.4"],"box":["27.5"],"make":["27.5","28.8"],"clear":["27.5"],"changed":["27.5"],"only":["27.5"],"stopped":["27.5"],"controllers":["27.5","28.4","28.14"],"stay":["27.5"],"perfectly":["27.5"],"synchronized":["27.5","28.15"],"synced":["27.5"],"play":["27.6"],"score":["27.6"],"buffer":["27.6"],"finally":["27.6"],"react":["27.6"],"updates":["27.6"],"lit":["28.0"],"he":["28.2"],"was":["28.2"],"itself":["28.2"],"minimal":["28.2"],"functionalities":["28.2"],"overview":["28.2"],"recurring":["28.2"],"patterns":["28.2"],"stake":["28.2"],"real":["28.2"],"typing":["28.3"],"entry":["28.3"],"that":["28.3"],"scaffolded":["28.3"],"schemas":["28.3"],"describing":["28.3"],"instaciate":["28.4"],"players":["28.4","28.14"],"values":["28.5","28.9"],"logged":["28.5"],"excuted":["28.6"],"startup":["28.6"],"remote":["28.7","28.14"],"better":["28.8"],"artwork":["28.8"],"experience":["28.8"],"argument":["28.9"],"initialization":["28.9"],"pass":["28.9","28.12","28.16"],"generated":["28.9"],"bound":["28.9"],"layout":["28.10"],"p":["28.10"],"mute":["28.10"],"infos":["28.10"],"config":["28.10"],"refreshing":["28.10"],"like":["28.10"],"full":["28.10","28.14","28.15"],"instance":["28.12"],"splashscreen":["28.12"],"general":["28.13"],"player":["28.13"],"don":["28.13"],"forget":["28.13"],"remove":["28.13"],"snippet":["28.13"],"before":["28.13"],"going":["28.13"],"next":["28.13"],"fully":["28.14"],"functionnal":["28.14"],"their":["28.14"],"chain":["28.14"],"controlled":["28.14"],"remotely":["28.14"],"finish":["28.14"],"enabling":["28.14"],"control":["28.14"],"through":["28.15"],"noise":["28.15"],"high":["28.16"],"filters":["28.16"],"refactor":["28.16"],"classes":["28.16"]}]'},t={"0.0":{t:"# soundworks | website",p:"Sources fo ...",l:"README.html",a:"soundworks-website"},"0.1":{t:"Credits",p:"https://so ...",l:"README.html#credits",a:"credits"},"0.2":{t:"License",p:"BSD-3-Clau ...",l:"README.html#license",a:"license"},"1.0":{t:"Notes",p:` +screensho ...`,l:"TODOS.html",a:"notes"},"1.1":{t:"Structure",p:"",l:"TODOS.html#structure",a:"structure"},"1.2":{t:"homepage",p:` +[x] links ...`,l:"TODOS.html#homepage",a:"homepage"},"1.3":{t:"Introduction",p:` +[x] What ...`,l:"TODOS.html#introduction",a:"introduction"},"1.4":{t:"tutorials",p:` + +[x] Gett ...`,l:"TODOS.html#tutorials",a:"tutorials"},"1.5":{t:"receipes",p:` +[ ] state ...`,l:"TODOS.html#receipes",a:"receipes"},"1.6":{t:"ecosystem",p:` +[ ] Sound ...`,l:"TODOS.html#ecosystem",a:"ecosystem"},"1.7":{t:"misc",p:` +[x] webso ...`,l:"TODOS.html#misc",a:"misc"},"1.8":{t:"Credits",p:` +[ ] impro ...`,l:"TODOS.html#credits",a:"credits"},"3.0":{t:"# Credits",p:"",l:"credits.html",a:"credits"},"3.1":{t:"Design & Development",p:"soundworks ...",l:"credits.html#design-development",a:"design-development"},"3.2":{t:"Supporting Research Projects",p:"Initial an ...",l:"credits.html#supporting-research-projects",a:"supporting-research-projects"},"3.3":{t:"Artistic & Research Collaborations",p:"The design ...",l:"credits.html#artistic-research-collaborations",a:"artistic-research-collaborations"},"3.4":{t:"Citing this Work",p:` +Benjamin ...`,l:"credits.html#citing-this-work",a:"citing-this-work"},"3.5":{t:"Related Academic Papers",p:` +Frederic ...`,l:"credits.html#related-academic-papers",a:"related-academic-papers"},"3.6":{t:"License",p:"BSD-3-Clau ...",l:"credits.html#license",a:"license"},"4.0":{t:"# Ecosystem",p:`[[toc]] +`,l:"ecosystem/ecosystem.html",a:"ecosystem"},"4.1":{t:"`@soundworks/core`",p:"The core o ...",l:"ecosystem/ecosystem.html#soundworks-core",a:"soundworks-core"},"4.2":{t:"`@soundworks/plugin-audio-buffer-loader`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-audio-buffer-loader",a:"soundworks-plugin-audio-buffer-loader"},"4.3":{t:"`@soundworks/plugin-checkin`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-checkin",a:"soundworks-plugin-checkin"},"4.4":{t:"`@soundworks/plugin-filesystem`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-filesystem",a:"soundworks-plugin-filesystem"},"4.5":{t:"`@soundworks/plugin-logger`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-logger",a:"soundworks-plugin-logger"},"4.6":{t:"`@soundworks/plugin-platform`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-platform",a:"soundworks-plugin-platform"},"4.7":{t:"`@soundworks/plugin-position`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-position",a:"soundworks-plugin-position"},"4.8":{t:"`@soundworks/plugin-scripting`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-scripting",a:"soundworks-plugin-scripting"},"4.9":{t:"`@soundworks/plugin-sync`",p:"soundworks ...",l:"ecosystem/ecosystem.html#soundworks-plugin-sync",a:"soundworks-plugin-sync"},"4.10":{t:"`@soundworks-template`",p:"Project te ...",l:"ecosystem/ecosystem.html#soundworks-template",a:"soundworks-template"},"4.11":{t:"`@soundworks/template-build`",p:"Build scri ...",l:"ecosystem/ecosystem.html#soundworks-template-build",a:"soundworks-template-build"},"4.12":{t:"`@soundworks/template-helpers`",p:"Set of com ...",l:"ecosystem/ecosystem.html#soundworks-template-helpers",a:"soundworks-template-helpers"},"5.0":{t:'
',p:"<h1> ...",l:"index.html",a:"div-class-vphome-use-homepage-styles"},"6.0":{t:"# Introduction",p:"",l:"introduction.html",a:"introduction"},"6.1":{t:"Goal",p:"soundworks ...",l:"introduction.html#goal",a:"goal"},"6.2":{t:"Philosophy",p:"soundworks ...",l:"introduction.html#philosophy",a:"philosophy"},"6.3":{t:"Architecture",p:"The core o ...",l:"introduction.html#architecture",a:"architecture"},"6.4":{t:"Client and server initalization",p:"The soundw ...",l:"introduction.html#client-and-server-initalization",a:"client-and-server-initalization"},"6.5":{t:"Distributed shared states",p:"The StateM ...",l:"introduction.html#distributed-shared-states",a:"distributed-shared-states"},"6.6":{t:"Plugin host",p:"soundworks ...",l:"introduction.html#plugin-host",a:"plugin-host"},"6.7":{t:"About the tutorials",p:"These tuto ...",l:"introduction.html#about-the-tutorials",a:"about-the-tutorials"},"7.0":{t:"# Contributing to this Website",p:"You wrote ...",l:"misc/_contributing-to-this-site.html",a:"contributing-to-this-website"},"7.1":{t:"Install",p:` +Clone rep ...`,l:"misc/_contributing-to-this-site.html#install",a:"install"},"7.2":{t:"Run Development Mode",p:"Get remote ...",l:"misc/_contributing-to-this-site.html#run-development-mode",a:"run-development-mode"},"7.3":{t:"Publish",p:"::: tip No ...",l:"misc/_contributing-to-this-site.html#publish",a:"publish"},"7.4":{t:"Examples",p:"",l:"misc/_contributing-to-this-site.html#examples",a:"examples"},"7.5":{t:'Adding a "Misc" Page',p:` +Add your ...`,l:"misc/_contributing-to-this-site.html#adding-a-misc-page",a:"adding-a-misc-page"},"7.6":{t:"subsection 1",p:"Lorem ipsu ...",l:"misc/_contributing-to-this-site.html#subsection-1",a:"subsection-1"},"7.7":{t:"subsection 2",p:"Duis aute ...",l:"misc/_contributing-to-this-site.html#subsection-2",a:"subsection-2"},"7.8":{t:'Adding a "Tutorial" Page',p:"Creating a ...",l:"misc/_contributing-to-this-site.html#adding-a-tutorial-page",a:"adding-a-tutorial-page"},"8.0":{t:"# Deploying on the Internets",p:"If you wan ...",l:"misc/_deployment.html",a:"deploying-on-the-internets"},"8.1":{t:"Application Configure ",p:"The first ...",l:"misc/_deployment.html#application-configure",a:"application-configure"},"8.2":{t:"Nginx Config",p:"The nginx ...",l:"misc/_deployment.html#nginx-config",a:"nginx-config"},"8.3":{t:"Apache Config",p:":::warning ...",l:"misc/_deployment.html#apache-config",a:"apache-config"},"9.0":{t:"# Deployment on a Local Network",p:"This page ...",l:"misc/_local-deployment.html",a:"deployment-on-a-local-network"},"9.1":{t:"Network Configuration",p:"note: for ...",l:"misc/_local-deployment.html#network-configuration",a:"network-configuration"},"9.2":{t:"DHCP",p:"",l:"misc/_local-deployment.html#dhcp",a:"dhcp"},"9.3":{t:"DNS",p:"",l:"misc/_local-deployment.html#dns",a:"dns"},"9.4":{t:"WiFi Access Point",p:"",l:"misc/_local-deployment.html#wifi-access-point",a:"wifi-access-point"},"9.5":{t:"Sharing Internet Connection",p:"",l:"misc/_local-deployment.html#sharing-internet-connection",a:"sharing-internet-connection"},"9.6":{t:"TP-Links",p:"",l:"misc/_local-deployment.html#tp-links",a:"tp-links"},"9.7":{t:"Unify",p:"",l:"misc/_local-deployment.html#unify",a:"unify"},"9.8":{t:"Configuring Application",p:"",l:"misc/_local-deployment.html#configuring-application",a:"configuring-application"},"9.9":{t:"Creating an Environment Config File",p:"",l:"misc/_local-deployment.html#creating-an-environment-config-file",a:"creating-an-environment-config-file"},"9.10":{t:"Configuring Ports",p:"",l:"misc/_local-deployment.html#configuring-ports",a:"configuring-ports"},"9.11":{t:"The `https` Issue",p:` +when is i ...`,l:"misc/_local-deployment.html#the-https-issue",a:"the-https-issue"},"10.0":{t:"# Creating Electron Applications",p:"",l:"misc/_todo_electron-applications.html",a:"creating-electron-applications"},"10.1":{t:"How to",p:"",l:"misc/_todo_electron-applications.html#how-to",a:"how-to"},"10.2":{t:"Auto-Updates",p:"",l:"misc/_todo_electron-applications.html#auto-updates",a:"auto-updates"},"11.0":{t:"# WebSockets 101",p:"WebSocket ...",l:"misc/websockets-101.html",a:"websockets-101"},"11.1":{t:"Scaffolding the project",p:"Let's firs ...",l:"misc/websockets-101.html#scaffolding-the-project",a:"scaffolding-the-project"},"11.2":{t:"Implementing the server",p:"Now eveyth ...",l:"misc/websockets-101.html#implementing-the-server",a:"implementing-the-server"},"11.3":{t:"Opening a client WebSocket",p:"Now that e ...",l:"misc/websockets-101.html#opening-a-client-websocket",a:"opening-a-client-websocket"},"11.4":{t:"Propagating Events",p:"Now, that ...",l:"misc/websockets-101.html#propagating-events",a:"propagating-events"},"11.5":{t:"Conclusion",p:"This tutor ...",l:"misc/websockets-101.html#conclusion",a:"conclusion"},"12.0":{t:"Copyright (c) 2014-present IRCAM – Centre Pompidou (France, Paris)",p:"All rights ...",l:"plugins/LICENSE.html",a:"copyright-c-2014-present-ircam-–-centre-pompidou-france-paris"},"13.0":{t:"# soundworks | plugin checkin",p:` +soundwork ...`,l:"plugins/checkin.html",a:"soundworks-plugin-checkin"},"13.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/checkin.html#table-of-contents",a:"table-of-contents"},"13.2":{t:"Installation",p:"npm instal ...",l:"plugins/checkin.html#installation",a:"installation"},"13.3":{t:"Usage",p:"",l:"plugins/checkin.html#usage",a:"usage"},"13.4":{t:"Server",p:"// index.j ...",l:"plugins/checkin.html#server",a:"server"},"13.5":{t:"Client",p:"// index.j ...",l:"plugins/checkin.html#client",a:"client"},"13.6":{t:"API",p:"<!-- ap ...",l:"plugins/checkin.html#api",a:"api"},"13.7":{t:"Classes",p:"<dl> ...",l:"plugins/checkin.html#classes",a:"classes"},"13.8":{t:"PluginCheckinClient",p:"Client-sid ...",l:"plugins/checkin.html#plugincheckinclient",a:"plugincheckinclient"},"13.9":{t:"pluginCheckinClient.getIndex() ⇒ number",p:"Return the ...",l:"plugins/checkin.html#plugincheckinclient-getindex-⇒-code-number-code",a:"plugincheckinclient-getindex-⇒-code-number-code"},"13.10":{t:"pluginCheckinClient.getData() ⇒ mixed",p:"Return the ...",l:"plugins/checkin.html#plugincheckinclient-getdata-⇒-code-mixed-code",a:"plugincheckinclient-getdata-⇒-code-mixed-code"},"13.11":{t:"PluginCheckinServer",p:"Server-sid ...",l:"plugins/checkin.html#plugincheckinserver",a:"plugincheckinserver"},"13.12":{t:"new PluginCheckinServer()",p:"The constr ...",l:"plugins/checkin.html#new-plugincheckinserver",a:"new-plugincheckinserver"},"13.13":{t:"Credits",p:"https://so ...",l:"plugins/checkin.html#credits",a:"credits"},"13.14":{t:"License",p:"BSD-3-Clau ...",l:"plugins/checkin.html#license",a:"license"},"14.0":{t:"# soundworks | plugin filesystem",p:` +soundwork ...`,l:"plugins/filesystem.html",a:"soundworks-plugin-filesystem"},"14.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/filesystem.html#table-of-contents",a:"table-of-contents"},"14.2":{t:"Installation",p:"npm instal ...",l:"plugins/filesystem.html#installation",a:"installation"},"14.3":{t:"Usage",p:"",l:"plugins/filesystem.html#usage",a:"usage"},"14.4":{t:"Server",p:"// index.j ...",l:"plugins/filesystem.html#server",a:"server"},"14.5":{t:"Client",p:"",l:"plugins/filesystem.html#client",a:"client"},"14.6":{t:"Registering the plugin",p:"// index.j ...",l:"plugins/filesystem.html#registering-the-plugin",a:"registering-the-plugin"},"14.7":{t:"Notes",p:"",l:"plugins/filesystem.html#notes",a:"notes"},"14.8":{t:"Reading files",p:"For now, t ...",l:"plugins/filesystem.html#reading-files",a:"reading-files"},"14.9":{t:"Security",p:"Being able ...",l:"plugins/filesystem.html#security",a:"security"},"14.10":{t:"API",p:"<!-- ap ...",l:"plugins/filesystem.html#api",a:"api"},"14.11":{t:"Classes",p:"<dl> ...",l:"plugins/filesystem.html#classes",a:"classes"},"14.12":{t:"PluginFilesystemClient",p:"Client-sid ...",l:"plugins/filesystem.html#pluginfilesystemclient",a:"pluginfilesystemclient"},"14.13":{t:"pluginFilesystemClient.getTree() ⇒ Object",p:"Return the ...",l:"plugins/filesystem.html#pluginfilesystemclient-gettree-⇒-code-object-code",a:"pluginfilesystemclient-gettree-⇒-code-object-code"},"14.14":{t:"pluginFilesystemClient.onUpdate(callback, [executeListener]) ⇒ function",p:"Register a ...",l:"plugins/filesystem.html#pluginfilesystemclient-onupdate-callback-executelistener-⇒-code-function-code",a:"pluginfilesystemclient-onupdate-callback-executelistener-⇒-code-function-code"},"14.15":{t:"pluginFilesystemClient.getTreeAsUrlMap(filterExt, [keepExtension]) ⇒ Object",p:"Return the ...",l:"plugins/filesystem.html#pluginfilesystemclient-gettreeasurlmap-filterext-keepextension-⇒-code-object-code",a:"pluginfilesystemclient-gettreeasurlmap-filterext-keepextension-⇒-code-object-code"},"14.16":{t:"pluginFilesystemClient.findInTree(path) ⇒ Object",p:"Return a n ...",l:"plugins/filesystem.html#pluginfilesystemclient-findintree-path-⇒-code-object-code",a:"pluginfilesystemclient-findintree-path-⇒-code-object-code"},"14.17":{t:"pluginFilesystemClient.writeFile(pathname, data) ⇒ Promise",p:"Write a fi ...",l:"plugins/filesystem.html#pluginfilesystemclient-writefile-pathname-data-⇒-code-promise-code",a:"pluginfilesystemclient-writefile-pathname-data-⇒-code-promise-code"},"14.18":{t:"pluginFilesystemClient.mkdir(pathname) ⇒ Promise",p:"Create a d ...",l:"plugins/filesystem.html#pluginfilesystemclient-mkdir-pathname-⇒-code-promise-code",a:"pluginfilesystemclient-mkdir-pathname-⇒-code-promise-code"},"14.19":{t:"pluginFilesystemClient.rename(oldPath, newPath) ⇒ Promise",p:"Rename a f ...",l:"plugins/filesystem.html#pluginfilesystemclient-rename-oldpath-newpath-⇒-code-promise-code",a:"pluginfilesystemclient-rename-oldpath-newpath-⇒-code-promise-code"},"14.20":{t:"pluginFilesystemClient.rm(pathname) ⇒ Promise",p:"Delete a f ...",l:"plugins/filesystem.html#pluginfilesystemclient-rm-pathname-⇒-code-promise-code",a:"pluginfilesystemclient-rm-pathname-⇒-code-promise-code"},"14.21":{t:"PluginFilesystemServer",p:"Server-sid ...",l:"plugins/filesystem.html#pluginfilesystemserver",a:"pluginfilesystemserver"},"14.22":{t:"new PluginFilesystemServer()",p:"The constr ...",l:"plugins/filesystem.html#new-pluginfilesystemserver",a:"new-pluginfilesystemserver"},"14.23":{t:"pluginFilesystemServer.switch(options)",p:"Switch the ...",l:"plugins/filesystem.html#pluginfilesystemserver-switch-options",a:"pluginfilesystemserver-switch-options"},"14.24":{t:"pluginFilesystemServer.getTree() ⇒ Object",p:"Return the ...",l:"plugins/filesystem.html#pluginfilesystemserver-gettree-⇒-code-object-code",a:"pluginfilesystemserver-gettree-⇒-code-object-code"},"14.25":{t:"pluginFilesystemServer.onUpdate(callback, [executeListener]) ⇒ function",p:"Register a ...",l:"plugins/filesystem.html#pluginfilesystemserver-onupdate-callback-executelistener-⇒-code-function-code",a:"pluginfilesystemserver-onupdate-callback-executelistener-⇒-code-function-code"},"14.26":{t:"pluginFilesystemServer.findInTree(path) ⇒ Object",p:"Return a n ...",l:"plugins/filesystem.html#pluginfilesystemserver-findintree-path-⇒-code-object-code",a:"pluginfilesystemserver-findintree-path-⇒-code-object-code"},"14.27":{t:"pluginFilesystemServer.writeFile(pathname, data) ⇒ Promise",p:"Write a fi ...",l:"plugins/filesystem.html#pluginfilesystemserver-writefile-pathname-data-⇒-code-promise-code",a:"pluginfilesystemserver-writefile-pathname-data-⇒-code-promise-code"},"14.28":{t:"pluginFilesystemServer.mkdir(pathname) ⇒ Promise",p:"Create a d ...",l:"plugins/filesystem.html#pluginfilesystemserver-mkdir-pathname-⇒-code-promise-code",a:"pluginfilesystemserver-mkdir-pathname-⇒-code-promise-code"},"14.29":{t:"pluginFilesystemServer.rename(oldPath, newPath) ⇒ Promise",p:"Rename a f ...",l:"plugins/filesystem.html#pluginfilesystemserver-rename-oldpath-newpath-⇒-code-promise-code",a:"pluginfilesystemserver-rename-oldpath-newpath-⇒-code-promise-code"},"14.30":{t:"pluginFilesystemServer.rm(pathname) ⇒ Promise",p:"Delete a f ...",l:"plugins/filesystem.html#pluginfilesystemserver-rm-pathname-⇒-code-promise-code",a:"pluginfilesystemserver-rm-pathname-⇒-code-promise-code"},"14.31":{t:"Credits",p:"https://so ...",l:"plugins/filesystem.html#credits",a:"credits"},"14.32":{t:"License",p:"BSD-3-Clau ...",l:"plugins/filesystem.html#license",a:"license"},"15.0":{t:"# soundworks | plugin logger",p:` +soundwork ...`,l:"plugins/logger.html",a:"soundworks-plugin-logger"},"15.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/logger.html#table-of-contents",a:"table-of-contents"},"15.2":{t:"Installation",p:"npm instal ...",l:"plugins/logger.html#installation",a:"installation"},"15.3":{t:"Usage",p:"",l:"plugins/logger.html#usage",a:"usage"},"15.4":{t:"Server",p:"// index.j ...",l:"plugins/logger.html#server",a:"server"},"15.5":{t:"Client",p:"// index.j ...",l:"plugins/logger.html#client",a:"client"},"15.6":{t:"Notes & Receipes",p:"In the fol ...",l:"plugins/logger.html#notes-receipes",a:"notes-receipes"},"15.7":{t:"Default extension",p:"If a write ...",l:"plugins/logger.html#default-extension",a:"default-extension"},"15.8":{t:"Prefix in log files",p:"By default ...",l:"plugins/logger.html#prefix-in-log-files",a:"prefix-in-log-files"},"15.9":{t:"Creating log files in sub-directories",p:"If a path ...",l:"plugins/logger.html#creating-log-files-in-sub-directories",a:"creating-log-files-in-sub-directories"},"15.10":{t:"Share a writer between several clients",p:"In a simil ...",l:"plugins/logger.html#share-a-writer-between-several-clients",a:"share-a-writer-between-several-clients"},"15.11":{t:"Client-side buffering",p:"In many ca ...",l:"plugins/logger.html#client-side-buffering",a:"client-side-buffering"},"15.12":{t:"API",p:"<!-- ap ...",l:"plugins/logger.html#api",a:"api"},"15.13":{t:"Classes",p:"<dl> ...",l:"plugins/logger.html#classes",a:"classes"},"15.14":{t:"PluginLoggerClient",p:"Client-sid ...",l:"plugins/logger.html#pluginloggerclient",a:"pluginloggerclient"},"15.15":{t:"new PluginLoggerClient()",p:"The constr ...",l:"plugins/logger.html#new-pluginloggerclient",a:"new-pluginloggerclient"},"15.16":{t:"pluginLoggerClient.createWriter(name, options)",p:"Create a w ...",l:"plugins/logger.html#pluginloggerclient-createwriter-name-options",a:"pluginloggerclient-createwriter-name-options"},"15.17":{t:"pluginLoggerClient.attachWriter(name, options)",p:"Attach to ...",l:"plugins/logger.html#pluginloggerclient-attachwriter-name-options",a:"pluginloggerclient-attachwriter-name-options"},"15.18":{t:"PluginLoggerServer",p:"Server-sid ...",l:"plugins/logger.html#pluginloggerserver",a:"pluginloggerserver"},"15.19":{t:"new PluginLoggerServer()",p:"The constr ...",l:"plugins/logger.html#new-pluginloggerserver",a:"new-pluginloggerserver"},"15.20":{t:"pluginLoggerServer.switch(dirname)",p:"Change the ...",l:"plugins/logger.html#pluginloggerserver-switch-dirname",a:"pluginloggerserver-switch-dirname"},"15.21":{t:"pluginLoggerServer.createWriter(name, options)",p:"Create a w ...",l:"plugins/logger.html#pluginloggerserver-createwriter-name-options",a:"pluginloggerserver-createwriter-name-options"},"15.22":{t:"WriterClient",p:"Client-sid ...",l:"plugins/logger.html#writerclient",a:"writerclient"},"15.23":{t:"writerClient.name",p:"Name of th ...",l:"plugins/logger.html#writerclient-name",a:"writerclient-name"},"15.24":{t:"writerClient.pathname",p:"Pathname o ...",l:"plugins/logger.html#writerclient-pathname",a:"writerclient-pathname"},"15.25":{t:"writerClient.write(data)",p:"Format and ...",l:"plugins/logger.html#writerclient-write-data",a:"writerclient-write-data"},"15.26":{t:"writerClient.flush()",p:"Flush the ...",l:"plugins/logger.html#writerclient-flush",a:"writerclient-flush"},"15.27":{t:"writerClient.close() ⇒ Promise",p:"Close the ...",l:"plugins/logger.html#writerclient-close-⇒-code-promise-code",a:"writerclient-close-⇒-code-promise-code"},"15.28":{t:"writerClient.onPacketSend(callback) ⇒",p:"Register a ...",l:"plugins/logger.html#writerclient-onpacketsend-callback-⇒",a:"writerclient-onpacketsend-callback-⇒"},"15.29":{t:"writerClient.onClose(callback) ⇒",p:"Register a ...",l:"plugins/logger.html#writerclient-onclose-callback-⇒",a:"writerclient-onclose-callback-⇒"},"15.30":{t:"WriterServer",p:"Server-sid ...",l:"plugins/logger.html#writerserver",a:"writerserver"},"15.31":{t:"writerServer.name",p:"Name of th ...",l:"plugins/logger.html#writerserver-name",a:"writerserver-name"},"15.32":{t:"writerServer.pathname",p:"Pathname o ...",l:"plugins/logger.html#writerserver-pathname",a:"writerserver-pathname"},"15.33":{t:"writerServer.write(data)",p:"Format and ...",l:"plugins/logger.html#writerserver-write-data",a:"writerserver-write-data"},"15.34":{t:"writerServer.close() ⇒ Promise",p:"Close the ...",l:"plugins/logger.html#writerserver-close-⇒-code-promise-code",a:"writerserver-close-⇒-code-promise-code"},"15.35":{t:"writerServer.onClose(callback) ⇒",p:"Register a ...",l:"plugins/logger.html#writerserver-onclose-callback-⇒",a:"writerserver-onclose-callback-⇒"},"15.36":{t:"Credits",p:"The code h ...",l:"plugins/logger.html#credits",a:"credits"},"15.37":{t:"License",p:"BSD-3-Clau ...",l:"plugins/logger.html#license",a:"license"},"16.0":{t:"# soundworks | plugin platform init",p:` +soundwork ...`,l:"plugins/platform-init.html",a:"soundworks-plugin-platform-init"},"16.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/platform-init.html#table-of-contents",a:"table-of-contents"},"16.2":{t:"Installation",p:"npm instal ...",l:"plugins/platform-init.html#installation",a:"installation"},"16.3":{t:"Usage",p:"",l:"plugins/platform-init.html#usage",a:"usage"},"16.4":{t:"Server",p:"// src/ser ...",l:"plugins/platform-init.html#server",a:"server"},"16.5":{t:"Client",p:"// src/cli ...",l:"plugins/platform-init.html#client",a:"client"},"16.6":{t:"Available features",p:"By default ...",l:"plugins/platform-init.html#available-features",a:"available-features"},"16.7":{t:"API",p:"<!-- ap ...",l:"plugins/platform-init.html#api",a:"api"},"16.8":{t:"Classes",p:"<dl> ...",l:"plugins/platform-init.html#classes",a:"classes"},"16.9":{t:"PluginPlatformInitClient",p:"Client-sid ...",l:"plugins/platform-init.html#pluginplatforminitclient",a:"pluginplatforminitclient"},"16.10":{t:"new PluginPlatformInitClient()",p:"The constr ...",l:"plugins/platform-init.html#new-pluginplatforminitclient",a:"new-pluginplatforminitclient"},"16.11":{t:"pluginPlatformInitClient.onUserGesture()",p:"Method to ...",l:"plugins/platform-init.html#pluginplatforminitclient-onusergesture",a:"pluginplatforminitclient-onusergesture"},"16.12":{t:"pluginPlatformInitClient.get(featureId)",p:"Returns th ...",l:"plugins/platform-init.html#pluginplatforminitclient-get-featureid",a:"pluginplatforminitclient-get-featureid"},"16.13":{t:"PluginPlatformInitServer",p:"Client-sid ...",l:"plugins/platform-init.html#pluginplatforminitserver",a:"pluginplatforminitserver"},"16.14":{t:"Credits",p:"https://so ...",l:"plugins/platform-init.html#credits",a:"credits"},"16.15":{t:"License",p:"BSD-3-Clau ...",l:"plugins/platform-init.html#license",a:"license"},"17.0":{t:"# soundworks | plugin position",p:` +soundwork ...`,l:"plugins/position.html",a:"soundworks-plugin-position"},"17.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/position.html#table-of-contents",a:"table-of-contents"},"17.2":{t:"Installation",p:"npm instal ...",l:"plugins/position.html#installation",a:"installation"},"17.3":{t:"Usage",p:"",l:"plugins/position.html#usage",a:"usage"},"17.4":{t:"Server",p:"// index.j ...",l:"plugins/position.html#server",a:"server"},"17.5":{t:"Client",p:"// index.j ...",l:"plugins/position.html#client",a:"client"},"17.6":{t:"API",p:"<!-- ap ...",l:"plugins/position.html#api",a:"api"},"17.7":{t:"Classes",p:"<dl> ...",l:"plugins/position.html#classes",a:"classes"},"17.8":{t:"PluginPositionClient",p:"Client-sid ...",l:"plugins/position.html#pluginpositionclient",a:"pluginpositionclient"},"17.9":{t:"new PluginPositionClient()",p:"The constr ...",l:"plugins/position.html#new-pluginpositionclient",a:"new-pluginpositionclient"},"17.10":{t:"pluginPositionClient.setPosition(x, y)",p:"Set the x ...",l:"plugins/position.html#pluginpositionclient-setposition-x-y",a:"pluginpositionclient-setposition-x-y"},"17.11":{t:"pluginPositionClient.getPosition() ⇒ Object",p:"Retrieve t ...",l:"plugins/position.html#pluginpositionclient-getposition-⇒-code-object-code",a:"pluginpositionclient-getposition-⇒-code-object-code"},"17.12":{t:"pluginPositionClient.setNormalizedPosition(x, y)",p:"Set the x ...",l:"plugins/position.html#pluginpositionclient-setnormalizedposition-x-y",a:"pluginpositionclient-setnormalizedposition-x-y"},"17.13":{t:"pluginPositionClient.getNormalizedPosition() ⇒ Object",p:"Retrieve t ...",l:"plugins/position.html#pluginpositionclient-getnormalizedposition-⇒-code-object-code",a:"pluginpositionclient-getnormalizedposition-⇒-code-object-code"},"17.14":{t:"PluginPositionServer",p:"Server-sid ...",l:"plugins/position.html#pluginpositionserver",a:"pluginpositionserver"},"17.15":{t:"new PluginPositionServer()",p:"The constr ...",l:"plugins/position.html#new-pluginpositionserver",a:"new-pluginpositionserver"},"17.16":{t:"Credits",p:"https://so ...",l:"plugins/position.html#credits",a:"credits"},"17.17":{t:"License",p:"BSD-3-Clau ...",l:"plugins/position.html#license",a:"license"},"18.0":{t:"# soundworks | plugin scripting",p:` +soundwork ...`,l:"plugins/scripting.html",a:"soundworks-plugin-scripting"},"18.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/scripting.html#table-of-contents",a:"table-of-contents"},"18.2":{t:"Installation",p:"npm instal ...",l:"plugins/scripting.html#installation",a:"installation"},"18.3":{t:"Usage",p:"",l:"plugins/scripting.html#usage",a:"usage"},"18.4":{t:"Server",p:"// src/ser ...",l:"plugins/scripting.html#server",a:"server"},"18.5":{t:"Client",p:"// src/cli ...",l:"plugins/scripting.html#client",a:"client"},"18.6":{t:"Notes",p:"The shared ...",l:"plugins/scripting.html#notes",a:"notes"},"18.7":{t:"API",p:"<!-- ap ...",l:"plugins/scripting.html#api",a:"api"},"18.8":{t:"Classes",p:"<dl> ...",l:"plugins/scripting.html#classes",a:"classes"},"18.9":{t:"PluginScriptingClient",p:"Client-sid ...",l:"plugins/scripting.html#pluginscriptingclient",a:"pluginscriptingclient"},"18.10":{t:"pluginScriptingClient.setGlobalScriptingContext(ctx)",p:"Registers ...",l:"plugins/scripting.html#pluginscriptingclient-setglobalscriptingcontext-ctx",a:"pluginscriptingclient-setglobalscriptingcontext-ctx"},"18.11":{t:"pluginScriptingClient.getList() ⇒ Array",p:"Returns th ...",l:"plugins/scripting.html#pluginscriptingclient-getlist-⇒-code-array-code",a:"pluginscriptingclient-getlist-⇒-code-array-code"},"18.12":{t:"pluginScriptingClient.getTree() ⇒ Object",p:"Convenienc ...",l:"plugins/scripting.html#pluginscriptingclient-gettree-⇒-code-object-code",a:"pluginscriptingclient-gettree-⇒-code-object-code"},"18.13":{t:"pluginScriptingClient.createScript(name, [value]) ⇒ Promise",p:"Create a n ...",l:"plugins/scripting.html#pluginscriptingclient-createscript-name-value-⇒-code-promise-code",a:"pluginscriptingclient-createscript-name-value-⇒-code-promise-code"},"18.14":{t:"pluginScriptingClient.updateScript(name, value) ⇒ Promise",p:"Update an ...",l:"plugins/scripting.html#pluginscriptingclient-updatescript-name-value-⇒-code-promise-code",a:"pluginscriptingclient-updatescript-name-value-⇒-code-promise-code"},"18.15":{t:"pluginScriptingClient.deleteScript(name) ⇒ Promise",p:"Delete a s ...",l:"plugins/scripting.html#pluginscriptingclient-deletescript-name-⇒-code-promise-code",a:"pluginscriptingclient-deletescript-name-⇒-code-promise-code"},"18.16":{t:"pluginScriptingClient.attach(name) ⇒ Promise",p:"Attach to ...",l:"plugins/scripting.html#pluginscriptingclient-attach-name-⇒-code-promise-code",a:"pluginscriptingclient-attach-name-⇒-code-promise-code"},"18.17":{t:"PluginScriptingServer",p:"Server-sid ...",l:"plugins/scripting.html#pluginscriptingserver",a:"pluginscriptingserver"},"18.18":{t:"new PluginScriptingServer()",p:"The constr ...",l:"plugins/scripting.html#new-pluginscriptingserver",a:"new-pluginscriptingserver"},"18.19":{t:"pluginScriptingServer.setGlobalScriptingContext(ctx)",p:"Registers ...",l:"plugins/scripting.html#pluginscriptingserver-setglobalscriptingcontext-ctx",a:"pluginscriptingserver-setglobalscriptingcontext-ctx"},"18.20":{t:"pluginScriptingServer.getList() ⇒ Array",p:"Returns th ...",l:"plugins/scripting.html#pluginscriptingserver-getlist-⇒-code-array-code",a:"pluginscriptingserver-getlist-⇒-code-array-code"},"18.21":{t:"pluginScriptingServer.getTree() ⇒ Object",p:"Convenienc ...",l:"plugins/scripting.html#pluginscriptingserver-gettree-⇒-code-object-code",a:"pluginscriptingserver-gettree-⇒-code-object-code"},"18.22":{t:"pluginScriptingServer.onUpdate(callback, [executeListener]) ⇒ function",p:"Register c ...",l:"plugins/scripting.html#pluginscriptingserver-onupdate-callback-executelistener-⇒-code-function-code",a:"pluginscriptingserver-onupdate-callback-executelistener-⇒-code-function-code"},"18.23":{t:"pluginScriptingServer.switch(dirname)",p:"Switch the ...",l:"plugins/scripting.html#pluginscriptingserver-switch-dirname",a:"pluginscriptingserver-switch-dirname"},"18.24":{t:"pluginScriptingServer.createScript(name, [value]) ⇒ Promise",p:"Create a n ...",l:"plugins/scripting.html#pluginscriptingserver-createscript-name-value-⇒-code-promise-code",a:"pluginscriptingserver-createscript-name-value-⇒-code-promise-code"},"18.25":{t:"pluginScriptingServer.updateScript(name, value) ⇒ Promise",p:"Update an ...",l:"plugins/scripting.html#pluginscriptingserver-updatescript-name-value-⇒-code-promise-code",a:"pluginscriptingserver-updatescript-name-value-⇒-code-promise-code"},"18.26":{t:"pluginScriptingServer.deleteScript(name) ⇒ Promise",p:"Delete a s ...",l:"plugins/scripting.html#pluginscriptingserver-deletescript-name-⇒-code-promise-code",a:"pluginscriptingserver-deletescript-name-⇒-code-promise-code"},"18.27":{t:"pluginScriptingServer.attach(name) ⇒ Promise",p:"Attach to ...",l:"plugins/scripting.html#pluginscriptingserver-attach-name-⇒-code-promise-code",a:"pluginscriptingserver-attach-name-⇒-code-promise-code"},"18.28":{t:"SharedScript",p:"A SharedSc ...",l:"plugins/scripting.html#sharedscript",a:"sharedscript"},"18.29":{t:"sharedScript.source : string",p:"Kind: inst ...",l:"plugins/scripting.html#sharedscript-source-code-string-code",a:"sharedscript-source-code-string-code"},"18.30":{t:"sharedScript.error : string",p:"Kind: inst ...",l:"plugins/scripting.html#sharedscript-error-code-string-code",a:"sharedscript-error-code-string-code"},"18.31":{t:"sharedScript.transpiled : string",p:"Kind: inst ...",l:"plugins/scripting.html#sharedscript-transpiled-code-string-code",a:"sharedscript-transpiled-code-string-code"},"18.32":{t:"sharedScript.import() ⇒ Promise",p:"Dynamicall ...",l:"plugins/scripting.html#sharedscript-import-⇒-code-promise-code",a:"sharedscript-import-⇒-code-promise-code"},"18.33":{t:"sharedScript.detach()",p:"Stop liste ...",l:"plugins/scripting.html#sharedscript-detach",a:"sharedscript-detach"},"18.34":{t:"sharedScript.onUpdate(callback, [executeListener]) ⇒ function",p:"Register a ...",l:"plugins/scripting.html#sharedscript-onupdate-callback-executelistener-⇒-code-function-code",a:"sharedscript-onupdate-callback-executelistener-⇒-code-function-code"},"18.35":{t:"sharedScript.onDetach(callback)",p:"Register a ...",l:"plugins/scripting.html#sharedscript-ondetach-callback",a:"sharedscript-ondetach-callback"},"18.36":{t:"sharedScript.update(value)",p:"Alias for ...",l:"plugins/scripting.html#sharedscript-update-value",a:"sharedscript-update-value"},"18.37":{t:"sharedScript.delete()",p:"Alias for ...",l:"plugins/scripting.html#sharedscript-delete",a:"sharedscript-delete"},"18.38":{t:"Credits",p:"https://so ...",l:"plugins/scripting.html#credits",a:"credits"},"18.39":{t:"License",p:"BSD-3-Clau ...",l:"plugins/scripting.html#license",a:"license"},"19.0":{t:"# soundworks | plugin sync",p:` +soundwork ...`,l:"plugins/sync.html",a:"soundworks-plugin-sync"},"19.1":{t:"Table of Contents",p:"<!-- to ...",l:"plugins/sync.html#table-of-contents",a:"table-of-contents"},"19.2":{t:"Installation",p:"npm instal ...",l:"plugins/sync.html#installation",a:"installation"},"19.3":{t:"Usage",p:"",l:"plugins/sync.html#usage",a:"usage"},"19.4":{t:"Server",p:"// index.j ...",l:"plugins/sync.html#server",a:"server"},"19.5":{t:"Client",p:"// index.j ...",l:"plugins/sync.html#client",a:"client"},"19.6":{t:"Notes & Receipes",p:"",l:"plugins/sync.html#notes-receipes",a:"notes-receipes"},"19.7":{t:"Default clocks",p:"On the ser ...",l:"plugins/sync.html#default-clocks",a:"default-clocks"},"19.8":{t:"Using `audioContext.currentTime` as the local clock",p:"An importa ...",l:"plugins/sync.html#using-audiocontext-currenttime-as-the-local-clock",a:"using-audiocontext-currenttime-as-the-local-clock"},"19.9":{t:"Scheduling synchronized audio events",p:"When you p ...",l:"plugins/sync.html#scheduling-synchronized-audio-events",a:"scheduling-synchronized-audio-events"},"19.10":{t:"Correspondances between local time and sync time",p:"The follow ...",l:"plugins/sync.html#correspondances-between-local-time-and-sync-time",a:"correspondances-between-local-time-and-sync-time"},"19.11":{t:"API",p:"<!-- ap ...",l:"plugins/sync.html#api",a:"api"},"19.12":{t:"Classes",p:"<dl> ...",l:"plugins/sync.html#classes",a:"classes"},"19.13":{t:"PluginSyncClient",p:"Client-sid ...",l:"plugins/sync.html#pluginsyncclient",a:"pluginsyncclient"},"19.14":{t:"new PluginSyncClient()",p:"The constr ...",l:"plugins/sync.html#new-pluginsyncclient",a:"new-pluginsyncclient"},"19.15":{t:"pluginSyncClient.getLocalTime([syncTime]) ⇒ Number",p:"Time of th ...",l:"plugins/sync.html#pluginsyncclient-getlocaltime-synctime-⇒-code-number-code",a:"pluginsyncclient-getlocaltime-synctime-⇒-code-number-code"},"19.16":{t:"pluginSyncClient.getSyncTime([audioTime]) ⇒ Number",p:"Time of th ...",l:"plugins/sync.html#pluginsyncclient-getsynctime-audiotime-⇒-code-number-code",a:"pluginsyncclient-getsynctime-audiotime-⇒-code-number-code"},"19.17":{t:"pluginSyncClient.onReport(callback)",p:"Subscribe ...",l:"plugins/sync.html#pluginsyncclient-onreport-callback",a:"pluginsyncclient-onreport-callback"},"19.18":{t:"pluginSyncClient.getReport() ⇒ Object",p:"Get last s ...",l:"plugins/sync.html#pluginsyncclient-getreport-⇒-code-object-code",a:"pluginsyncclient-getreport-⇒-code-object-code"},"19.19":{t:"PluginSyncServer",p:"Server-sid ...",l:"plugins/sync.html#pluginsyncserver",a:"pluginsyncserver"},"19.20":{t:"new PluginSyncServer()",p:"The constr ...",l:"plugins/sync.html#new-pluginsyncserver",a:"new-pluginsyncserver"},"19.21":{t:"pluginSyncServer.getLocalTime([syncTime]) ⇒ Number",p:"Time of th ...",l:"plugins/sync.html#pluginsyncserver-getlocaltime-synctime-⇒-code-number-code",a:"pluginsyncserver-getlocaltime-synctime-⇒-code-number-code"},"19.22":{t:"pluginSyncServer.getSyncTime([localTime]) ⇒ Number",p:"Time of th ...",l:"plugins/sync.html#pluginsyncserver-getsynctime-localtime-⇒-code-number-code",a:"pluginsyncserver-getsynctime-localtime-⇒-code-number-code"},"19.23":{t:"Resources",p:` +Jean-Phil ...`,l:"plugins/sync.html#resources",a:"resources"},"19.24":{t:"Credits",p:"https://so ...",l:"plugins/sync.html#credits",a:"credits"},"19.25":{t:"License",p:"BSD-3-Clau ...",l:"plugins/sync.html#license",a:"license"},"20.0":{t:"# Creating a Connected Lamp",p:"In this tu ...",l:"tutorials/_connected-lamp.html",a:"creating-a-connected-lamp"},"21.0":{t:"# Using Contexts",p:"In this tu ...",l:"tutorials/_context.html",a:"using-contexts"},"21.1":{t:"Relevant API documentation",p:"",l:"tutorials/_context.html#relevant-api-documentation",a:"relevant-api-documentation"},"21.2":{t:"Introduction",p:"",l:"tutorials/_context.html#introduction",a:"introduction"},"21.3":{t:"How context works",p:"",l:"tutorials/_context.html#how-context-works",a:"how-context-works"},"21.4":{t:"Creating a simple router",p:"",l:"tutorials/_context.html#creating-a-simple-router",a:"creating-a-simple-router"},"21.5":{t:"Using contexts to model sections of an experience",p:"",l:"tutorials/_context.html#using-contexts-to-model-sections-of-an-experience",a:"using-contexts-to-model-sections-of-an-experience"},"21.6":{t:"conclusion",p:"",l:"tutorials/_context.html#conclusion",a:"conclusion"},"22.0":{t:"# Getting Started",p:"In this tu ...",l:"tutorials/getting-started.html",a:"getting-started"},"22.1":{t:"Prerequisites",p:` +Node.js 1 ...`,l:"tutorials/getting-started.html#prerequisites",a:"prerequisites"},"22.2":{t:"Step 1 - Setting things up",p:"The best a ...",l:"tutorials/getting-started.html#step-1-setting-things-up",a:"step-1-setting-things-up"},"22.3":{t:"Step 2 - Exploring the file structure of the application",p:"Press Ctrl ...",l:"tutorials/getting-started.html#step-2-exploring-the-file-structure-of-the-application",a:"step-2-exploring-the-file-structure-of-the-application"},"22.4":{t:"Step 3 - Create a global shared state",p:"First, go ...",l:"tutorials/getting-started.html#step-3-create-a-global-shared-state",a:"step-3-create-a-global-shared-state"},"22.5":{t:"Step 4 - Make clients interactive",p:"Now that t ...",l:"tutorials/getting-started.html#step-4-make-clients-interactive",a:"step-4-make-clients-interactive"},"22.6":{t:"Conclusion",p:"Congrats, ...",l:"tutorials/getting-started.html#conclusion",a:"conclusion"},"23.0":{t:"# Working with Node Clients",p:"In this tu ...",l:"tutorials/node-clients.html",a:"working-with-node-clients"},"23.1":{t:"Related Documentation",p:` +soundwork ...`,l:"tutorials/node-clients.html#related-documentation",a:"related-documentation"},"23.2":{t:"Scaffolding Application",p:"Let's star ...",l:"tutorials/node-clients.html#scaffolding-application",a:"scaffolding-application"},"23.3":{t:"Implementing the control logic",p:"Before imp ...",l:"tutorials/node-clients.html#implementing-the-control-logic",a:"implementing-the-control-logic"},"23.4":{t:"Implementing the _Node.js_ client",p:"Let's shut ...",l:"tutorials/node-clients.html#implementing-the-node-js-client",a:"implementing-the-node-js-client"},"23.5":{t:"Notes",p:"",l:"tutorials/node-clients.html#notes",a:"notes"},"23.6":{t:"Emulating multiple clients",p:"In previou ...",l:"tutorials/node-clients.html#emulating-multiple-clients",a:"emulating-multiple-clients"},"23.7":{t:"Running node client on a network",p:"Another im ...",l:"tutorials/node-clients.html#running-node-client-on-a-network",a:"running-node-client-on-a-network"},"23.8":{t:"Conclusion",p:"In this tu ...",l:"tutorials/node-clients.html#conclusion",a:"conclusion"},"24.0":{t:"# Using Plugins 1 - The _platform-init_ Plugin",p:"In this fi ...",l:"tutorials/plugin-platform-init.html",a:"using-plugins-1-the-platform-init-plugin"},"24.1":{t:"Relevant documentation",p:` +client.Pl ...`,l:"tutorials/plugin-platform-init.html#relevant-documentation",a:"relevant-documentation"},"24.2":{t:"Scaffolding the application and installing the plugin",p:"First thin ...",l:"tutorials/plugin-platform-init.html#scaffolding-the-application-and-installing-the-plugin",a:"scaffolding-the-application-and-installing-the-plugin"},"24.3":{t:"Registering the plugin into _soundworks_",p:"Now that t ...",l:"tutorials/plugin-platform-init.html#registering-the-plugin-into-soundworks",a:"registering-the-plugin-into-soundworks"},"24.4":{t:"Server-side registration",p:"Let's star ...",l:"tutorials/plugin-platform-init.html#server-side-registration",a:"server-side-registration"},"24.5":{t:"Client-side registration",p:"Let's open ...",l:"tutorials/plugin-platform-init.html#client-side-registration",a:"client-side-registration"},"24.6":{t:"Resuming an `AudioContext`",p:"So far, so ...",l:"tutorials/plugin-platform-init.html#resuming-an-audiocontext",a:"resuming-an-audiocontext"},"24.7":{t:"Notes on the `@soundworks/helpers` default views",p:"The spashs ...",l:"tutorials/plugin-platform-init.html#notes-on-the-soundworks-helpers-default-views",a:"notes-on-the-soundworks-helpers-default-views"},"24.8":{t:"Conclusion",p:"In this tu ...",l:"tutorials/plugin-platform-init.html#conclusion",a:"conclusion"},"25.0":{t:"# Using Plugins 2 - The _sync_ Plugin",p:"In this tu ...",l:"tutorials/plugin-sync.html",a:"using-plugins-2-the-sync-plugin"},"25.1":{t:"Related documentation",p:` +@soundwor ...`,l:"tutorials/plugin-sync.html#related-documentation",a:"related-documentation"},"25.2":{t:"Introduction",p:"First of a ...",l:"tutorials/plugin-sync.html#introduction",a:"introduction"},"25.3":{t:'The "Why"',p:"An importa ...",l:"tutorials/plugin-sync.html#the-why",a:"the-why"},"25.4":{t:'The "How"',p:"On a more ...",l:"tutorials/plugin-sync.html#the-how",a:"the-how"},"25.5":{t:"Scaffolding the application",p:"First thin ...",l:"tutorials/plugin-sync.html#scaffolding-the-application",a:"scaffolding-the-application"},"25.6":{t:"Using the _sync_ plugin",p:"",l:"tutorials/plugin-sync.html#using-the-sync-plugin",a:"using-the-sync-plugin"},"25.7":{t:"Register the plugin",p:"Now that e ...",l:"tutorials/plugin-sync.html#register-the-plugin",a:"register-the-plugin"},"25.8":{t:"Synchronizing the audio context",p:"So far so ...",l:"tutorials/plugin-sync.html#synchronizing-the-audio-context",a:"synchronizing-the-audio-context"},"25.9":{t:"Conclusion",p:"In this tu ...",l:"tutorials/plugin-sync.html#conclusion",a:"conclusion"},"26.0":{t:"# Using the State Manager",p:"In this tu ...",l:"tutorials/state-manager.html",a:"using-the-state-manager"},"26.1":{t:"Relevant documentation",p:` +client.St ...`,l:"tutorials/state-manager.html#relevant-documentation",a:"relevant-documentation"},"26.2":{t:"Introduction",p:"First of a ...",l:"tutorials/state-manager.html#introduction",a:"introduction"},"26.3":{t:'The "Why"',p:"Most of th ...",l:"tutorials/state-manager.html#the-why",a:"the-why"},"26.4":{t:'The "How"',p:"From a mor ...",l:"tutorials/state-manager.html#the-how",a:"the-how"},"26.5":{t:"Scaffolding the application",p:`::: info +T ...`,l:"tutorials/state-manager.html#scaffolding-the-application",a:"scaffolding-the-application"},"26.6":{t:"Declaring schemas",p:"The StateM ...",l:"tutorials/state-manager.html#declaring-schemas",a:"declaring-schemas"},"26.7":{t:"Registering schemas",p:"Let's firs ...",l:"tutorials/state-manager.html#registering-schemas",a:"registering-schemas"},"26.8":{t:"Creating shared states",p:"Let's firs ...",l:"tutorials/state-manager.html#creating-shared-states",a:"creating-shared-states"},"26.9":{t:"Display the states values",p:"Now that o ...",l:"tutorials/state-manager.html#display-the-states-values",a:"display-the-states-values"},"26.10":{t:"Remote control and monitoring",p:"In this se ...",l:"tutorials/state-manager.html#remote-control-and-monitoring",a:"remote-control-and-monitoring"},"26.11":{t:"Scaffolding the _controller_ client",p:"Let's use ...",l:"tutorials/state-manager.html#scaffolding-the-controller-client",a:"scaffolding-the-controller-client"},"26.12":{t:"Binding the `global` state",p:"Let's star ...",l:"tutorials/state-manager.html#binding-the-global-state",a:"binding-the-global-state"},"26.13":{t:"Observing and controlling collections of states",p:"The final ...",l:"tutorials/state-manager.html#observing-and-controlling-collections-of-states",a:"observing-and-controlling-collections-of-states"},"26.14":{t:"Using the client id to enhance the control interface",p:"To fix thi ...",l:"tutorials/state-manager.html#using-the-client-id-to-enhance-the-control-interface",a:"using-the-client-id-to-enhance-the-control-interface"},"26.15":{t:"Conclusion",p:"In this tu ...",l:"tutorials/state-manager.html#conclusion",a:"conclusion"},"27.0":{t:"# Building a Distributed Step Sequencer",p:"In this tu ...",l:"tutorials/step-sequencer.html",a:"building-a-distributed-step-sequencer"},"27.1":{t:"Related documentation",p:` +@soundwor ...`,l:"tutorials/step-sequencer.html#related-documentation",a:"related-documentation"},"27.2":{t:"Scaffolding application",p:"Let's star ...",l:"tutorials/step-sequencer.html#scaffolding-application",a:"scaffolding-application"},"27.3":{t:"Defining the global state",p:"Now that e ...",l:"tutorials/step-sequencer.html#defining-the-global-state",a:"defining-the-global-state"},"27.4":{t:"Registering the plugins",p:"Now that o ...",l:"tutorials/step-sequencer.html#registering-the-plugins",a:"registering-the-plugins"},"27.5":{t:"Implementing the controller",p:"Now that e ...",l:"tutorials/step-sequencer.html#implementing-the-controller",a:"implementing-the-controller"},"27.6":{t:"Implementing the audio engine",p:"Now that a ...",l:"tutorials/step-sequencer.html#implementing-the-audio-engine",a:"implementing-the-audio-engine"},"28.0":{t:"# The _Todo Noise_ Application",p:"In this tu ...",l:"tutorials/todo-noise.html",a:"the-todo-noise-application"},"28.1":{t:"Relevant documentation",p:` +client.Sh ...`,l:"tutorials/todo-noise.html#relevant-documentation",a:"relevant-documentation"},"28.2":{t:"User Story",p:"The applic ...",l:"tutorials/todo-noise.html#user-story",a:"user-story"},"28.3":{t:"Scaffolding the application",p:"First thin ...",l:"tutorials/todo-noise.html#scaffolding-the-application",a:"scaffolding-the-application"},"28.4":{t:"Creating and using the shared `global` state",p:"To impleme ...",l:"tutorials/todo-noise.html#creating-and-using-the-shared-global-state",a:"creating-and-using-the-shared-global-state"},"28.5":{t:"Create the shared instance",p:"First let' ...",l:"tutorials/todo-noise.html#create-the-shared-instance",a:"create-the-shared-instance"},"28.6":{t:"Attaching the `global` state to the _player_ clients",p:"Let's now ...",l:"tutorials/todo-noise.html#attaching-the-global-state-to-the-player-clients",a:"attaching-the-global-state-to-the-player-clients"},"28.7":{t:"Controlling the `global` shared states from the _controller_ clients",p:"Now that e ...",l:"tutorials/todo-noise.html#controlling-the-global-shared-states-from-the-controller-clients",a:"controlling-the-global-shared-states-from-the-controller-clients"},"28.8":{t:"Creating and using the `player` shared states",p:"As defined ...",l:"tutorials/todo-noise.html#creating-and-using-the-player-shared-states",a:"creating-and-using-the-player-shared-states"},"28.9":{t:"Registering the schema and creating the states",p:"To that en ...",l:"tutorials/todo-noise.html#registering-the-schema-and-creating-the-states",a:"registering-the-schema-and-creating-the-states"},"28.10":{t:"Creating the graphical user interface",p:"Then, let' ...",l:"tutorials/todo-noise.html#creating-the-graphical-user-interface",a:"creating-the-graphical-user-interface"},"28.11":{t:"Creating the synthesizers",p:"Eveything ...",l:"tutorials/todo-noise.html#creating-the-synthesizers",a:"creating-the-synthesizers"},"28.12":{t:"Resume the context with the `platform-init` plugin",p:"First thin ...",l:"tutorials/todo-noise.html#resume-the-context-with-the-platform-init-plugin",a:"resume-the-context-with-the-platform-init-plugin"},"28.13":{t:"Create the master chain",p:"Then let's ...",l:"tutorials/todo-noise.html#create-the-master-chain",a:"create-the-master-chain"},"28.14":{t:"Implement the two synths",p:"Now that a ...",l:"tutorials/todo-noise.html#implement-the-two-synths",a:"implement-the-two-synths"},"28.15":{t:"Remotely control players from the controller",p:"Let's go b ...",l:"tutorials/todo-noise.html#remotely-control-players-from-the-controller",a:"remotely-control-players-from-the-controller"},"28.16":{t:"Conclusion",p:"In this tu ...",l:"tutorials/todo-noise.html#conclusion",a:"conclusion"}},i={previewLength:10,buttonLabel:"Search",placeholder:"Search docs",allow:[],ignore:[]},n={INDEX_DATA:e,PREVIEW_LOOKUP:t,Options:i};export{n as default}; diff --git a/assets/controller-interface.dfe4e06a.png b/assets/controller-interface.dfe4e06a.png new file mode 100644 index 0000000..6aedd87 Binary files /dev/null and b/assets/controller-interface.dfe4e06a.png differ diff --git a/assets/controller-synced.db348175.png b/assets/controller-synced.db348175.png new file mode 100644 index 0000000..233545e Binary files /dev/null and b/assets/controller-synced.db348175.png differ diff --git a/assets/create-default-client.71f9a758.png b/assets/create-default-client.71f9a758.png new file mode 100644 index 0000000..8326117 Binary files /dev/null and b/assets/create-default-client.71f9a758.png differ diff --git a/assets/create-thing-client.529240fd.png b/assets/create-thing-client.529240fd.png new file mode 100644 index 0000000..4317bb3 Binary files /dev/null and b/assets/create-thing-client.529240fd.png differ diff --git a/assets/credits.md.bc93c26a.js b/assets/credits.md.d7ddd485.js similarity index 98% rename from assets/credits.md.bc93c26a.js rename to assets/credits.md.d7ddd485.js index 7b0ce59..5d9b3c5 100644 --- a/assets/credits.md.bc93c26a.js +++ b/assets/credits.md.d7ddd485.js @@ -1 +1 @@ -import{_ as e,o as r,c as a,Q as t}from"./chunks/framework.a5027060.js";const f=JSON.parse('{"title":"Credits","description":"","frontmatter":{},"headers":[],"relativePath":"credits.md","filePath":"credits.md"}'),i={name:"credits.md"},o=t('

Credits

Design & Development

soundworks has been initiated by Norbert Schnell, Sébastien Robaszkiewicz, and Benjamin Matuszewski at the ISMM team at Ircam - Centre Pompidou in the context of the CoSiMa research project founded by the French National Research Agency (ANR).

Development is now led by Benjamin Matuszewski, in the Sound Music Movement Interaction Team from the Ircam's STMS-LAB.

Supporting Research Projects

Initial and futher developments has been supported by the following research projects:

  • The DOTS project, funded by the French National Research Agency (ANR)
  • The Ircam projects BeCoMe and SO(a)P
  • The Constella(c)tions residency, funded by the STARTS program of the European Commission
  • The RAPID-MIX project, funded by the European Union’s Horizon 2020 research and innovation program
  • The CoSiMa project, funded by the French National Research Agency (ANR)

Artistic & Research Collaborations

The design & development of soundworks has also been conducted within many collaborations with composers, artists, designers and researchers.

A number of musical pieces and artworks created using soundworks can be found on the Ircam - Sound Music Movement Interaction team youtube channel https://www.youtube.com/ircam-ismm.

Some generic applications are also accessible online at https://apps.ismm.ircam.fr.

Citing this Work

  • Benjamin Matuszewski. A Web-Based Framework for Distributed Music System Research and Creation. AES - Journal of the Audio Engineering Society Audio-Accoustics-Application, Audio Engineering Society Inc, 2020. <hal-03033143>
  • Frederic Bevilacqua, Benjamin Matuszewski, Garth Paine, Norbert Schnell. On Designing, Composing and Performing Networked Collective Interactions. Organised Sound, Cambridge University Press (CUP), 2021, 26 (3), pp.333-339. <hal-03575509>
  • Benjamin Matuszewski. A Web-Based Framework for Distributed Music System Research and Creation. AES - Journal of the Audio Engineering Society Audio-Accoustics-Application, Audio Engineering Society Inc, 2020. <hal-03033143>
  • Benjamin Matuszewski. Soundworks - A Framework for Networked Music Systems on the Web - State of Affairs and New Developments. Proceedings of the Web Audio Conference (WAC) 2019, Dec 2019, Trondheim, Norway. <hal-02387783>
  • Benjamin Matuszewski, Norbert Schnell, Frédéric Bevilacqua. Interaction Topologies in Mobile-Based Situated Networked Music Systems. Wireless Communications and Mobile Computing, Hindawi Publishing Corporation, 2019. <hal-02086673>
  • Jean-Philippe Lambert, Sébastien Robaszkiewicz, Norbert Schnell. Synchronisation for Distributed Audio Rendering over Heterogeneous Devices, in HTML5. 2nd Web Audio Conference, Apr 2016, Atlanta, GA, United States. <hal-01304889>
  • Norbert Schnell, Sébastien Robaszkiewicz. Soundworks – A playground for artists and developers to create collaborative mobile web performances. Proceedings of the Web Audio Conference (WAC'15), 2015, Paris, France. <hal-01580797>

License

BSD-3-Clause

',17),n=[o];function s(l,c,h,d,m,p){return r(),a("div",null,n)}const b=e(i,[["render",s]]);export{f as __pageData,b as default}; +import{_ as e,o as r,c as a,Q as t}from"./chunks/framework.22f5e90d.js";const f=JSON.parse('{"title":"Credits","description":"","frontmatter":{},"headers":[],"relativePath":"credits.md","filePath":"credits.md"}'),i={name:"credits.md"},o=t('

Credits

Design & Development

soundworks has been initiated by Norbert Schnell, Sébastien Robaszkiewicz, and Benjamin Matuszewski at the ISMM team at Ircam - Centre Pompidou in the context of the CoSiMa research project founded by the French National Research Agency (ANR).

Development is now led by Benjamin Matuszewski, in the Sound Music Movement Interaction Team from the Ircam's STMS-LAB.

Supporting Research Projects

Initial and futher developments has been supported by the following research projects:

  • The DOTS project, funded by the French National Research Agency (ANR)
  • The Ircam projects BeCoMe and SO(a)P
  • The Constella(c)tions residency, funded by the STARTS program of the European Commission
  • The RAPID-MIX project, funded by the European Union’s Horizon 2020 research and innovation program
  • The CoSiMa project, funded by the French National Research Agency (ANR)

Artistic & Research Collaborations

The design & development of soundworks has also been conducted within many collaborations with composers, artists, designers and researchers.

A number of musical pieces and artworks created using soundworks can be found on the Ircam - Sound Music Movement Interaction team youtube channel https://www.youtube.com/ircam-ismm.

Some generic applications are also accessible online at https://apps.ismm.ircam.fr.

Citing this Work

  • Benjamin Matuszewski. A Web-Based Framework for Distributed Music System Research and Creation. AES - Journal of the Audio Engineering Society Audio-Accoustics-Application, Audio Engineering Society Inc, 2020. <hal-03033143>
  • Frederic Bevilacqua, Benjamin Matuszewski, Garth Paine, Norbert Schnell. On Designing, Composing and Performing Networked Collective Interactions. Organised Sound, Cambridge University Press (CUP), 2021, 26 (3), pp.333-339. <hal-03575509>
  • Benjamin Matuszewski. A Web-Based Framework for Distributed Music System Research and Creation. AES - Journal of the Audio Engineering Society Audio-Accoustics-Application, Audio Engineering Society Inc, 2020. <hal-03033143>
  • Benjamin Matuszewski. Soundworks - A Framework for Networked Music Systems on the Web - State of Affairs and New Developments. Proceedings of the Web Audio Conference (WAC) 2019, Dec 2019, Trondheim, Norway. <hal-02387783>
  • Benjamin Matuszewski, Norbert Schnell, Frédéric Bevilacqua. Interaction Topologies in Mobile-Based Situated Networked Music Systems. Wireless Communications and Mobile Computing, Hindawi Publishing Corporation, 2019. <hal-02086673>
  • Jean-Philippe Lambert, Sébastien Robaszkiewicz, Norbert Schnell. Synchronisation for Distributed Audio Rendering over Heterogeneous Devices, in HTML5. 2nd Web Audio Conference, Apr 2016, Atlanta, GA, United States. <hal-01304889>
  • Norbert Schnell, Sébastien Robaszkiewicz. Soundworks – A playground for artists and developers to create collaborative mobile web performances. Proceedings of the Web Audio Conference (WAC'15), 2015, Paris, France. <hal-01580797>

License

BSD-3-Clause

',17),n=[o];function s(l,c,h,d,m,p){return r(),a("div",null,n)}const b=e(i,[["render",s]]);export{f as __pageData,b as default}; diff --git a/assets/credits.md.bc93c26a.lean.js b/assets/credits.md.d7ddd485.lean.js similarity index 65% rename from assets/credits.md.bc93c26a.lean.js rename to assets/credits.md.d7ddd485.lean.js index d5dc4cd..8c97610 100644 --- a/assets/credits.md.bc93c26a.lean.js +++ b/assets/credits.md.d7ddd485.lean.js @@ -1 +1 @@ -import{_ as e,o as r,c as a,Q as t}from"./chunks/framework.a5027060.js";const f=JSON.parse('{"title":"Credits","description":"","frontmatter":{},"headers":[],"relativePath":"credits.md","filePath":"credits.md"}'),i={name:"credits.md"},o=t("",17),n=[o];function s(l,c,h,d,m,p){return r(),a("div",null,n)}const b=e(i,[["render",s]]);export{f as __pageData,b as default}; +import{_ as e,o as r,c as a,Q as t}from"./chunks/framework.22f5e90d.js";const f=JSON.parse('{"title":"Credits","description":"","frontmatter":{},"headers":[],"relativePath":"credits.md","filePath":"credits.md"}'),i={name:"credits.md"},o=t("",17),n=[o];function s(l,c,h,d,m,p){return r(),a("div",null,n)}const b=e(i,[["render",s]]);export{f as __pageData,b as default}; diff --git a/assets/ecosystem_ecosystem.md.454356e9.js b/assets/ecosystem_ecosystem.md.b1253aba.js similarity index 99% rename from assets/ecosystem_ecosystem.md.454356e9.js rename to assets/ecosystem_ecosystem.md.b1253aba.js index 167a479..75a5e99 100644 --- a/assets/ecosystem_ecosystem.md.454356e9.js +++ b/assets/ecosystem_ecosystem.md.b1253aba.js @@ -1 +1 @@ -import{_ as s,o,c as e,Q as n}from"./chunks/framework.a5027060.js";const k=JSON.parse('{"title":"Ecosystem","description":"","frontmatter":{},"headers":[],"relativePath":"ecosystem/ecosystem.md","filePath":"ecosystem/ecosystem.md"}'),a={name:"ecosystem/ecosystem.md"},r=n('

Ecosystem

@soundworks/core

The core of the framework is principally dedicated to:

  • WebSocket communications
  • Distributed state management
  • Plugin hosting

Note

Most of the time you won't need to install soundworks manually, as the application template already takes care of that.

sh
npm install --save @soundworks/core

→ documentation
→ github
→ npm

soundworks/core functionalities can be extended by installing plugins. Here is a list of available plugins so far:

@soundworks/plugin-audio-buffer-loader

soundworks plugin for loading and managing audio buffers and related JSON data. Currently limited to .mp3, .wav or .json formats to enforce browser compatibility and support (meaning support for Safari...)

sh
npm install @soundworks/plugin-audio-buffer-loader --save

→ github
→ npm
→ example
→ example (w/ filesystem)

@soundworks/plugin-checkin

soundworks plugin for assigning a ticket (unique index) to the client among the available ones. The number of available tickets can be limited and tickets can be associated with additional data.

sh
npm install @soundworks/plugin-checkin --save

→ github
→ npm
→ example

@soundworks/plugin-filesystem

soundworks plugin to parse and watch directories and distribute their content to all clients in real-time.

sh
npm install @soundworks/plugin-filesystem --save

→ github
→ npm
→ example

@soundworks/plugin-logger

soundworks plugin dedicated to recording arbitrarily from any node of the network into plain old files.

sh
npm install @soundworks/plugin-logger --save

→ github
→ npm
→ example

@soundworks/plugin-platform

soundworks plugin that checks the availability of features required by the application, and their initialisation. It also provides an entry point for features that may require a user gesture (e.g. clicking on the screen to resume an audio context). The plugin can also be used to simply add a splash screen to the application.

sh
npm install @soundworks/plugin-platform --save

→ github
→ npm
→ example
→ example (w/ devicemotion)

@soundworks/plugin-position

soundworks plugin for locating people in an area. In the soundworks-template default views, the plugin is associated with an initialization screen where people are asked to provide their position on a map.

sh
npm install @soundworks/plugin-position --save

→ github
→ npm
→ example

@soundworks/plugin-scripting

soundworks plugin for runtime scripting. The plugin allows to define an entry point of the application that enables the end user to modify the behavior of the distributed application at runtime, following an end-user programming strategy.

sh
npm install @soundworks/plugin-scripting --save

→ github
→ npm
→ example

@soundworks/plugin-sync

soundworks plugin for synchronizing arbitrary clocks across devices. The plugin is basically a wrapper around the @ircam/sync library.

sh
npm install @soundworks/plugin-sync --save

→ github
→ npm
→ example

@soundworks-template

Project template for developing soundworks applications. The template provides a clean code base to start developing an application.

sh
git clone https://github.com/collective-soundworks/soundworks-template.git my-application\ncd my-application\nrm -Rf .git\nnpm install\nnpm run dev

→ github

Additionally to the @soundworks/core package, the template installs and uses the @soundworks/template-build and @soundworks/template-helpers to simplify a set of common tasks.

@soundworks/template-build

Build scripts of the soundworks-template

sh
npm install --save @soundworks/template-build

→ github
→ npm

@soundworks/template-helpers

Set of common helpers (init views, etc.) for applications based on the soundworks-template

sh
npm install --save @soundworks/template-helpers

→ github
→ npm

',54),l=[r];function t(p,i,c,d,u,g){return o(),e("div",null,l)}const m=s(a,[["render",t]]);export{k as __pageData,m as default}; +import{_ as s,o,c as e,Q as n}from"./chunks/framework.22f5e90d.js";const k=JSON.parse('{"title":"Ecosystem","description":"","frontmatter":{},"headers":[],"relativePath":"ecosystem/ecosystem.md","filePath":"ecosystem/ecosystem.md"}'),a={name:"ecosystem/ecosystem.md"},r=n('

Ecosystem

@soundworks/core

The core of the framework is principally dedicated to:

  • WebSocket communications
  • Distributed state management
  • Plugin hosting

Note

Most of the time you won't need to install soundworks manually, as the application template already takes care of that.

sh
npm install --save @soundworks/core

→ documentation
→ github
→ npm

soundworks/core functionalities can be extended by installing plugins. Here is a list of available plugins so far:

@soundworks/plugin-audio-buffer-loader

soundworks plugin for loading and managing audio buffers and related JSON data. Currently limited to .mp3, .wav or .json formats to enforce browser compatibility and support (meaning support for Safari...)

sh
npm install @soundworks/plugin-audio-buffer-loader --save

→ github
→ npm
→ example
→ example (w/ filesystem)

@soundworks/plugin-checkin

soundworks plugin for assigning a ticket (unique index) to the client among the available ones. The number of available tickets can be limited and tickets can be associated with additional data.

sh
npm install @soundworks/plugin-checkin --save

→ github
→ npm
→ example

@soundworks/plugin-filesystem

soundworks plugin to parse and watch directories and distribute their content to all clients in real-time.

sh
npm install @soundworks/plugin-filesystem --save

→ github
→ npm
→ example

@soundworks/plugin-logger

soundworks plugin dedicated to recording arbitrarily from any node of the network into plain old files.

sh
npm install @soundworks/plugin-logger --save

→ github
→ npm
→ example

@soundworks/plugin-platform

soundworks plugin that checks the availability of features required by the application, and their initialisation. It also provides an entry point for features that may require a user gesture (e.g. clicking on the screen to resume an audio context). The plugin can also be used to simply add a splash screen to the application.

sh
npm install @soundworks/plugin-platform --save

→ github
→ npm
→ example
→ example (w/ devicemotion)

@soundworks/plugin-position

soundworks plugin for locating people in an area. In the soundworks-template default views, the plugin is associated with an initialization screen where people are asked to provide their position on a map.

sh
npm install @soundworks/plugin-position --save

→ github
→ npm
→ example

@soundworks/plugin-scripting

soundworks plugin for runtime scripting. The plugin allows to define an entry point of the application that enables the end user to modify the behavior of the distributed application at runtime, following an end-user programming strategy.

sh
npm install @soundworks/plugin-scripting --save

→ github
→ npm
→ example

@soundworks/plugin-sync

soundworks plugin for synchronizing arbitrary clocks across devices. The plugin is basically a wrapper around the @ircam/sync library.

sh
npm install @soundworks/plugin-sync --save

→ github
→ npm
→ example

@soundworks-template

Project template for developing soundworks applications. The template provides a clean code base to start developing an application.

sh
git clone https://github.com/collective-soundworks/soundworks-template.git my-application\ncd my-application\nrm -Rf .git\nnpm install\nnpm run dev

→ github

Additionally to the @soundworks/core package, the template installs and uses the @soundworks/template-build and @soundworks/template-helpers to simplify a set of common tasks.

@soundworks/template-build

Build scripts of the soundworks-template

sh
npm install --save @soundworks/template-build

→ github
→ npm

@soundworks/template-helpers

Set of common helpers (init views, etc.) for applications based on the soundworks-template

sh
npm install --save @soundworks/template-helpers

→ github
→ npm

',54),l=[r];function t(p,i,c,d,u,g){return o(),e("div",null,l)}const m=s(a,[["render",t]]);export{k as __pageData,m as default}; diff --git a/assets/ecosystem_ecosystem.md.454356e9.lean.js b/assets/ecosystem_ecosystem.md.b1253aba.lean.js similarity index 84% rename from assets/ecosystem_ecosystem.md.454356e9.lean.js rename to assets/ecosystem_ecosystem.md.b1253aba.lean.js index 0eb8800..50b52e5 100644 --- a/assets/ecosystem_ecosystem.md.454356e9.lean.js +++ b/assets/ecosystem_ecosystem.md.b1253aba.lean.js @@ -1 +1 @@ -import{_ as s,o,c as e,Q as n}from"./chunks/framework.a5027060.js";const k=JSON.parse('{"title":"Ecosystem","description":"","frontmatter":{},"headers":[],"relativePath":"ecosystem/ecosystem.md","filePath":"ecosystem/ecosystem.md"}'),a={name:"ecosystem/ecosystem.md"},r=n("",54),l=[r];function t(p,i,c,d,u,g){return o(),e("div",null,l)}const m=s(a,[["render",t]]);export{k as __pageData,m as default}; +import{_ as s,o,c as e,Q as n}from"./chunks/framework.22f5e90d.js";const k=JSON.parse('{"title":"Ecosystem","description":"","frontmatter":{},"headers":[],"relativePath":"ecosystem/ecosystem.md","filePath":"ecosystem/ecosystem.md"}'),a={name:"ecosystem/ecosystem.md"},r=n("",54),l=[r];function t(p,i,c,d,u,g){return o(),e("div",null,l)}const m=s(a,[["render",t]]);export{k as __pageData,m as default}; diff --git a/assets/filesystem-assets.31774b3f.png b/assets/filesystem-assets.31774b3f.png new file mode 100644 index 0000000..6444fd3 Binary files /dev/null and b/assets/filesystem-assets.31774b3f.png differ diff --git a/assets/index.md.039ad7d2.js b/assets/index.md.01c4e139.js similarity index 98% rename from assets/index.md.039ad7d2.js rename to assets/index.md.01c4e139.js index 9f1b44f..853eb0a 100644 --- a/assets/index.md.039ad7d2.js +++ b/assets/index.md.01c4e139.js @@ -1 +1 @@ -import{_ as o,o as a,c as i,k as t,a as e,Q as s}from"./chunks/framework.a5027060.js";const r="/assets/soundworks.d5727bc0.png",n="/assets/high-level-architecture.9239c13d.png",E=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),l={name:"index.md"},c={class:"VPHome"},d=t("h1",null,"soundworks",-1),u={class:"intro"},p=t("img",{src:r},null,-1),h=t("i",null,"Open-source creative coding framework for distributed applications based on Web technologies.",-1),m=t("br",null,null,-1),_={ref:"https://badge.fury.io/js/@soundworks%2Fcore"},f=t("img",{style:{width:"auto",height:"20px","margin-top":"20px"},src:"https://badge.fury.io/js/@soundworks%2Fcore.svg"},null,-1),b=[f],g=t("p",null,null,-1),w=t("p",null,[e(" Primarily focused on music, "),t("b",null,"soundworks"),e(" aims at supporting rapid development of real-time distributed applications using JavaScript. It provides abstractions to hide the complexity of the network and to foster very rapid-prototyping and trial-and-error workflows that are typical in artistic practices. ")],-1),v=t("p",null,[t("a",{href:"/introduction",class:"action-button infos"},"More Infos"),t("a",{href:"/tutorials/getting-started",class:"action-button infos"},"Get Started →")],-1),y=s('

Main Features

  • Support for both browser and Node.js clients
  • Real-time communications through WebSockets
  • Distributed state management
  • Plugin system to extend core functionalities
    (clock synchronization, runtime distributed scripting, etc.)

Projects & Demos

',3),k=t("div",{class:"projects"},[t("div",{class:"iframe"},[t("iframe",{src:"https://www.youtube-nocookie.com/embed/videoseries?list=PLt5gV5YpSJ0w-WgZUzLE1AN6YkwbiKnYn",title:"YouTube video player",frameborder:"0",allow:"encrypted-media; picture-in-picture",allowfullscreen:""})]),t("div",{class:"details"},[t("h3",null,"→   Installations"),t("h3",null,"→   Performances & Concerts"),t("h3",null,"→   Experimental Settings")])],-1),S=s('

What it is not

  • Not a framework to develop regular websites, although its probably feasible to do so if you are adventurous
  • Not a ready to use application, you will have to code.
    However, we maintain a set of quite generic applications that could fit your use-case: CoMo - Elements, Playground or Koryphaios
  • Probably a lot of other things (e.g. teapot, ...)

Related links and projects

BSD-3-Clause - {Sound Music Movement} Interaction Team - STMS-LAB
',5);function T(P,x,N,A,I,V){return a(),i("div",null,[t("div",c,[d,t("div",u,[p,t("div",null,[t("p",null,[h,m,t("a",_,b,512)]),g,w,v])]),y,k,S])])}const j=o(l,[["render",T]]);export{E as __pageData,j as default}; +import{_ as o,o as a,c as i,k as t,a as e,Q as s}from"./chunks/framework.22f5e90d.js";const r="/assets/soundworks.d5727bc0.png",n="/assets/high-level-architecture.9239c13d.png",E=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),l={name:"index.md"},c={class:"VPHome"},d=t("h1",null,"soundworks",-1),u={class:"intro"},p=t("img",{src:r},null,-1),h=t("i",null,"Open-source creative coding framework for distributed applications based on Web technologies.",-1),m=t("br",null,null,-1),_={ref:"https://badge.fury.io/js/@soundworks%2Fcore"},f=t("img",{style:{width:"auto",height:"20px","margin-top":"20px"},src:"https://badge.fury.io/js/@soundworks%2Fcore.svg"},null,-1),b=[f],g=t("p",null,null,-1),w=t("p",null,[e(" Primarily focused on music, "),t("b",null,"soundworks"),e(" aims at supporting rapid development of real-time distributed applications using JavaScript. It provides abstractions to hide the complexity of the network and to foster very rapid-prototyping and trial-and-error workflows that are typical in artistic practices. ")],-1),v=t("p",null,[t("a",{href:"/introduction",class:"action-button infos"},"More Infos"),t("a",{href:"/tutorials/getting-started",class:"action-button infos"},"Get Started →")],-1),y=s('

Main Features

  • Support for both browser and Node.js clients
  • Real-time communications through WebSockets
  • Distributed state management
  • Plugin system to extend core functionalities
    (clock synchronization, runtime distributed scripting, etc.)

Projects & Demos

',3),k=t("div",{class:"projects"},[t("div",{class:"iframe"},[t("iframe",{src:"https://www.youtube-nocookie.com/embed/videoseries?list=PLt5gV5YpSJ0w-WgZUzLE1AN6YkwbiKnYn",title:"YouTube video player",frameborder:"0",allow:"encrypted-media; picture-in-picture",allowfullscreen:""})]),t("div",{class:"details"},[t("h3",null,"→   Installations"),t("h3",null,"→   Performances & Concerts"),t("h3",null,"→   Experimental Settings")])],-1),S=s('

What it is not

  • Not a framework to develop regular websites, although its probably feasible to do so if you are adventurous
  • Not a ready to use application, you will have to code.
    However, we maintain a set of quite generic applications that could fit your use-case: CoMo - Elements, Playground or Koryphaios
  • Probably a lot of other things (e.g. teapot, ...)

Related links and projects

BSD-3-Clause - {Sound Music Movement} Interaction Team - STMS-LAB
',5);function T(P,x,N,A,I,V){return a(),i("div",null,[t("div",c,[d,t("div",u,[p,t("div",null,[t("p",null,[h,m,t("a",_,b,512)]),g,w,v])]),y,k,S])])}const j=o(l,[["render",T]]);export{E as __pageData,j as default}; diff --git a/assets/index.md.039ad7d2.lean.js b/assets/index.md.01c4e139.lean.js similarity index 96% rename from assets/index.md.039ad7d2.lean.js rename to assets/index.md.01c4e139.lean.js index 89af6e2..3b8802f 100644 --- a/assets/index.md.039ad7d2.lean.js +++ b/assets/index.md.01c4e139.lean.js @@ -1 +1 @@ -import{_ as o,o as a,c as i,k as t,a as e,Q as s}from"./chunks/framework.a5027060.js";const r="/assets/soundworks.d5727bc0.png",n="/assets/high-level-architecture.9239c13d.png",E=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),l={name:"index.md"},c={class:"VPHome"},d=t("h1",null,"soundworks",-1),u={class:"intro"},p=t("img",{src:r},null,-1),h=t("i",null,"Open-source creative coding framework for distributed applications based on Web technologies.",-1),m=t("br",null,null,-1),_={ref:"https://badge.fury.io/js/@soundworks%2Fcore"},f=t("img",{style:{width:"auto",height:"20px","margin-top":"20px"},src:"https://badge.fury.io/js/@soundworks%2Fcore.svg"},null,-1),b=[f],g=t("p",null,null,-1),w=t("p",null,[e(" Primarily focused on music, "),t("b",null,"soundworks"),e(" aims at supporting rapid development of real-time distributed applications using JavaScript. It provides abstractions to hide the complexity of the network and to foster very rapid-prototyping and trial-and-error workflows that are typical in artistic practices. ")],-1),v=t("p",null,[t("a",{href:"/introduction",class:"action-button infos"},"More Infos"),t("a",{href:"/tutorials/getting-started",class:"action-button infos"},"Get Started →")],-1),y=s("",3),k=t("div",{class:"projects"},[t("div",{class:"iframe"},[t("iframe",{src:"https://www.youtube-nocookie.com/embed/videoseries?list=PLt5gV5YpSJ0w-WgZUzLE1AN6YkwbiKnYn",title:"YouTube video player",frameborder:"0",allow:"encrypted-media; picture-in-picture",allowfullscreen:""})]),t("div",{class:"details"},[t("h3",null,"→   Installations"),t("h3",null,"→   Performances & Concerts"),t("h3",null,"→   Experimental Settings")])],-1),S=s("",5);function T(P,x,N,A,I,V){return a(),i("div",null,[t("div",c,[d,t("div",u,[p,t("div",null,[t("p",null,[h,m,t("a",_,b,512)]),g,w,v])]),y,k,S])])}const j=o(l,[["render",T]]);export{E as __pageData,j as default}; +import{_ as o,o as a,c as i,k as t,a as e,Q as s}from"./chunks/framework.22f5e90d.js";const r="/assets/soundworks.d5727bc0.png",n="/assets/high-level-architecture.9239c13d.png",E=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),l={name:"index.md"},c={class:"VPHome"},d=t("h1",null,"soundworks",-1),u={class:"intro"},p=t("img",{src:r},null,-1),h=t("i",null,"Open-source creative coding framework for distributed applications based on Web technologies.",-1),m=t("br",null,null,-1),_={ref:"https://badge.fury.io/js/@soundworks%2Fcore"},f=t("img",{style:{width:"auto",height:"20px","margin-top":"20px"},src:"https://badge.fury.io/js/@soundworks%2Fcore.svg"},null,-1),b=[f],g=t("p",null,null,-1),w=t("p",null,[e(" Primarily focused on music, "),t("b",null,"soundworks"),e(" aims at supporting rapid development of real-time distributed applications using JavaScript. It provides abstractions to hide the complexity of the network and to foster very rapid-prototyping and trial-and-error workflows that are typical in artistic practices. ")],-1),v=t("p",null,[t("a",{href:"/introduction",class:"action-button infos"},"More Infos"),t("a",{href:"/tutorials/getting-started",class:"action-button infos"},"Get Started →")],-1),y=s("",3),k=t("div",{class:"projects"},[t("div",{class:"iframe"},[t("iframe",{src:"https://www.youtube-nocookie.com/embed/videoseries?list=PLt5gV5YpSJ0w-WgZUzLE1AN6YkwbiKnYn",title:"YouTube video player",frameborder:"0",allow:"encrypted-media; picture-in-picture",allowfullscreen:""})]),t("div",{class:"details"},[t("h3",null,"→   Installations"),t("h3",null,"→   Performances & Concerts"),t("h3",null,"→   Experimental Settings")])],-1),S=s("",5);function T(P,x,N,A,I,V){return a(),i("div",null,[t("div",c,[d,t("div",u,[p,t("div",null,[t("p",null,[h,m,t("a",_,b,512)]),g,w,v])]),y,k,S])])}const j=o(l,[["render",T]]);export{E as __pageData,j as default}; diff --git a/assets/introduction.md.9e712117.js b/assets/introduction.md.8778fc30.js similarity index 85% rename from assets/introduction.md.9e712117.js rename to assets/introduction.md.8778fc30.js index 9ceba0e..f157653 100644 --- a/assets/introduction.md.9e712117.js +++ b/assets/introduction.md.8778fc30.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.a5027060.js";const i="/assets/high-level-architecture.9239c13d.png",r="/assets/distributed-state-management.d09470bb.png",b=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"introduction.md","filePath":"introduction.md"}'),n={name:"introduction.md"},s=a('

Introduction

Goal

soundworks is an open-source creative coding framework for distributed applications based on Web technologies. Primarily focused on music, soundworks aims at supporting rapid development of real-time distributed applications using JavaScript. It provides abstractions to hide the complexity of the network and to foster very rapid-prototyping and trial-and-error workflows that are typical in artistic practices.

At its core, soundworks is primarily focused on synchronization of data and states amonst clients, and on simplifying their control both localy and remotely.

Another important feature is that one soundworks is to make no distinction between browsers or Node.js runtimes. As such it can be used to prototype and develop distributed applications running exclusively or partly on embedded hardware such as Rapberry Pi while using the same architecture, codebase and principles.

high level architecture

Despite the "sound" in soundworks, the framework doesn't do any choice for you regarding the audio library you might use (be it low-level Web Audio API or higher level libraries) and more generally on the rendering aspects of your application. Therefore, it can also be suited to develop applications outside the audio realm, such as distributed applications focused on graphics or multi-user collaborative games.

Philosophy

soundworks has been and is still primarily developped as an experimental platform for artistic and scientific research in the domain of music and arts. As such the code base is considered as an experimental platform which embodies a dynamic relation and a dialog betwenn "epistemic things"_ and "technical objects", to quote Rheinberger.

Such an approach has strong implications on the design and maintenance of the code base, as it must evolve in such way to keep questionning the theory and practices it embodies (in order to not be "reduced to the simple demonstration of a phenomenon" - to quote Rheinberger again).

To mitigate this need of change and mutation with the contradictory need of stability required by software development, we opted for a modular architecture and to follow the semver approach. We hope this choice will minimize the maintenance burden of existing application while allowing the framework to evolve according to novel research questions.

Finally, both for maintenance and philosophical reasons, one of the goal of soundworks is to follow Web Standarts as close as possible. As such, the code base is developped in pure JavaScript and will only integrate language features that have reach Stage 3. For example, while we hope to propose some "type" files derived from the JSDoc for TypeScript users in a near future (and the fact that it works or not is not in our hands), this won't be implemented into the code base until the type annotation proposal has evolved.

Architecture

The core of soundworks framework mainly provides the following fonctionnalities:

Client and server initalization

The soundworks Client and Server abstrations, which are the main entry points of soundworks, are responsible to do all the nitty-gritty of creating a distributed application: running an http server, setting up WebSockets, properly sharing configuration objets, handling initialization process, etc.

See the Getting Started tutorial

Distributed shared states

The StateManager component provides tools to help you create synchronized states among your distributed devices. The component is specifically designed to help implement remote control and monitoring which is a key feature for rapid prototyping real-time distributed applications where you want to control many devices from a single point.

See the State Manager tutorial

distributed shared states

Plugin host

soundworks also implements a plugin system to add new and more specific functionnalities to the core framework. For example, we provide plugins for synchronizing clocks, working with the filesystem or to dynamically script parts of application at runtime. All plugins live in their own repository and are versionned at their own pace to simplify future evolutions.

See the Plugin Platform Init tutorial

',24),l=[s];function d(c,h,p,u,m,g){return t(),o("div",null,l)}const y=e(n,[["render",d]]);export{b as __pageData,y as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.22f5e90d.js";const i="/assets/high-level-architecture.9239c13d.png",r="/assets/distributed-state-management.d09470bb.png",b=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"introduction.md","filePath":"introduction.md"}'),n={name:"introduction.md"},s=a('

Introduction

Goal

soundworks is an open-source creative coding framework for distributed applications based on Web technologies. Primarily focused on music, soundworks aims at supporting rapid development of real-time distributed applications using JavaScript. It provides abstractions to hide the complexity of the network and to foster very rapid-prototyping and trial-and-error workflows that are typical in artistic practices.

At its core, soundworks is primarily focused on synchronization of data and states amonst clients, and on simplifying their control both localy and remotely.

Another important feature is that one soundworks is to make no distinction between browsers or Node.js runtimes. As such it can be used to prototype and develop distributed applications running exclusively or partly on embedded hardware such as Rapberry Pi while using the same architecture, codebase and principles.

high level architecture

Despite the "sound" in soundworks, the framework doesn't do any choice for you regarding the audio library you might use (be it low-level Web Audio API or higher level libraries) and more generally on the rendering aspects of your application. Therefore, it can also be suited to develop applications outside the audio realm, such as distributed applications focused on graphics or multi-user collaborative games.

Philosophy

soundworks has been and is still primarily developped as an experimental platform for artistic and scientific research in the domain of music and arts. As such the code base is considered as an experimental platform which embodies a dynamic relation and a dialog betwenn "epistemic things"_ and "technical objects", to quote Rheinberger.

Such an approach has strong implications on the design and maintenance of the code base, as it must evolve in such way to keep questionning the theory and practices it embodies (in order to not be "reduced to the simple demonstration of a phenomenon" - to quote Rheinberger again).

To mitigate this need of change and mutation with the contradictory need of stability required by software development, we opted for a modular architecture and to follow the semver approach. We hope this choice will minimize the maintenance burden of existing application while allowing the framework to evolve according to novel research questions.

Finally, both for maintenance and philosophical reasons, one of the goal of soundworks is to follow Web Standarts as close as possible. As such, the code base is developped in pure JavaScript and will only integrate language features that have reach Stage 3. For example, while we hope to propose some "type" files derived from the JSDoc for TypeScript users in a near future (and the fact that it works or not is not in our hands), this won't be implemented into the code base until the type annotation proposal has evolved.

Architecture

The core of soundworks framework mainly provides the following fonctionnalities:

Client and server initalization

The soundworks Client and Server abstrations, which are the main entry points of soundworks, are responsible to do all the nitty-gritty of creating a distributed application: running an http server, setting up WebSockets, properly sharing configuration objets, handling initialization process, etc.

See the Getting Started tutorial

Distributed shared states

The StateManager component provides tools to help you create synchronized states among your distributed devices. The component is specifically designed to help implement remote control and monitoring which is a key feature for rapid prototyping real-time distributed applications where you want to control many devices from a single point.

See the State Manager tutorial

distributed shared states

Plugin host

soundworks also implements a plugin system to add new and more specific functionnalities to the core framework. For example, we provide plugins for synchronizing clocks, working with the filesystem or to dynamically script parts of application at runtime. All plugins live in their own repository and are versionned at their own pace to simplify future evolutions.

See the Plugin Platform Init tutorial

About the tutorials

These tutorials are focused on soundworks functionnality which are quite abstract according to the low-level platform APIs such as WebSockets. If you need some refresher on this point you can have a look here.

Also, the tutorials assume that you have some level of familiarity with the usage of the Web Audio API, if you need a refresher on that point, you can have a look there.

Else, you can just jump to the Getting Started tutorial.

',28),l=[s];function h(c,d,p,u,m,g){return t(),o("div",null,l)}const y=e(n,[["render",h]]);export{b as __pageData,y as default}; diff --git a/assets/introduction.md.8778fc30.lean.js b/assets/introduction.md.8778fc30.lean.js new file mode 100644 index 0000000..77cbaf9 --- /dev/null +++ b/assets/introduction.md.8778fc30.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.22f5e90d.js";const i="/assets/high-level-architecture.9239c13d.png",r="/assets/distributed-state-management.d09470bb.png",b=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"introduction.md","filePath":"introduction.md"}'),n={name:"introduction.md"},s=a("",28),l=[s];function h(c,d,p,u,m,g){return t(),o("div",null,l)}const y=e(n,[["render",h]]);export{b as __pageData,y as default}; diff --git a/assets/introduction.md.9e712117.lean.js b/assets/introduction.md.9e712117.lean.js deleted file mode 100644 index 993bcb5..0000000 --- a/assets/introduction.md.9e712117.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.a5027060.js";const i="/assets/high-level-architecture.9239c13d.png",r="/assets/distributed-state-management.d09470bb.png",b=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"introduction.md","filePath":"introduction.md"}'),n={name:"introduction.md"},s=a("",24),l=[s];function d(c,h,p,u,m,g){return t(),o("div",null,l)}const y=e(n,[["render",d]]);export{b as __pageData,y as default}; diff --git a/assets/misc__contributing-to-this-site.md.1790efde.js b/assets/misc__contributing-to-this-site.md.468e1bc9.js similarity index 98% rename from assets/misc__contributing-to-this-site.md.1790efde.js rename to assets/misc__contributing-to-this-site.md.468e1bc9.js index 6c010ef..cd17ec7 100644 --- a/assets/misc__contributing-to-this-site.md.1790efde.js +++ b/assets/misc__contributing-to-this-site.md.468e1bc9.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.a5027060.js";const y=JSON.parse('{"title":"Contributing to this Website","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_contributing-to-this-site.md","filePath":"misc/_contributing-to-this-site.md"}'),e={name:"misc/_contributing-to-this-site.md"},l=o(`

Contributing to this Website

You wrote some documentation about some soundworks related stuff that could be useful to others, or you would like to fix or even improve existing content (which might be a great challenge)? Please contribute!

Note

This site is generated using vuepress, full documentation can be found at https://vuepress.vuejs.org/

Install

  1. Clone repo and go to sources branch where the source files are located
sh
git clone git@github.com:collective-soundworks/collective-soundworks.github.io.git
+import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.22f5e90d.js";const y=JSON.parse('{"title":"Contributing to this Website","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_contributing-to-this-site.md","filePath":"misc/_contributing-to-this-site.md"}'),e={name:"misc/_contributing-to-this-site.md"},l=o(`

Contributing to this Website

You wrote some documentation about some soundworks related stuff that could be useful to others, or you would like to fix or even improve existing content (which might be a great challenge)? Please contribute!

Note

This site is generated using vuepress, full documentation can be found at https://vuepress.vuejs.org/

Install

  1. Clone repo and go to sources branch where the source files are located
sh
git clone git@github.com:collective-soundworks/collective-soundworks.github.io.git
 cd collective-soundworks.github.io
 git checkout sources
 npm install

Run Development Mode

Get remote changes

sh
git pull origin sources

Start the development server

sh
npm run dev

Go to http://127.0.0.1:8080 in your favorite browser (which shall not be Safari) to see the development preview and edit some content (cf. examples).

Publish

Note

The following commands will only work if you are part of the soundworks team. Otherwise, proceed the usual steps and create a pull request for changes.

Push your changes on the source branch

sh
git add -A
diff --git a/assets/misc__contributing-to-this-site.md.1790efde.lean.js b/assets/misc__contributing-to-this-site.md.468e1bc9.lean.js
similarity index 72%
rename from assets/misc__contributing-to-this-site.md.1790efde.lean.js
rename to assets/misc__contributing-to-this-site.md.468e1bc9.lean.js
index fccdc51..207e764 100644
--- a/assets/misc__contributing-to-this-site.md.1790efde.lean.js
+++ b/assets/misc__contributing-to-this-site.md.468e1bc9.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.a5027060.js";const y=JSON.parse('{"title":"Contributing to this Website","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_contributing-to-this-site.md","filePath":"misc/_contributing-to-this-site.md"}'),e={name:"misc/_contributing-to-this-site.md"},l=o("",28),t=[l];function p(c,i,r,F,d,u){return a(),n("div",null,t)}const b=s(e,[["render",p]]);export{y as __pageData,b as default};
+import{_ as s,o as a,c as n,Q as o}from"./chunks/framework.22f5e90d.js";const y=JSON.parse('{"title":"Contributing to this Website","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_contributing-to-this-site.md","filePath":"misc/_contributing-to-this-site.md"}'),e={name:"misc/_contributing-to-this-site.md"},l=o("",28),t=[l];function p(c,i,r,F,d,u){return a(),n("div",null,t)}const b=s(e,[["render",p]]);export{y as __pageData,b as default};
diff --git a/assets/misc__deployment.md.1365ac44.js b/assets/misc__deployment.md.9968983d.js
similarity index 98%
rename from assets/misc__deployment.md.1365ac44.js
rename to assets/misc__deployment.md.9968983d.js
index 5928f5a..1ef9b8f 100644
--- a/assets/misc__deployment.md.1365ac44.js
+++ b/assets/misc__deployment.md.9968983d.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as a,Q as o}from"./chunks/framework.a5027060.js";const u=JSON.parse('{"title":"Deploying on the Internets","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_deployment.md","filePath":"misc/_deployment.md"}'),e={name:"misc/_deployment.md"},p=o(`

Deploying on the Internets

If you want want to deploy a single application on a single server, there is no particular complexity as the only thing you will have to do is to start the server on the port 80 for http or port 443 for https.

However, a more common situation is the need deploy several applications on the same server. Generally this is done by having a proxy server (Nginx or Apache) that handle the requests (and possibly the https certificates) and internally route the requests the proper Node.js / soundworks server.

In the remaining of this page we assume your domain is http(s)://my-domain.com and that you want to run an application behind the path my-app, so that the default soundworks client should be accessible at http(s)://my-domain.com/my-app

Application Configure

The first thing to do is to create a new env config file (e.g. config/env/prod.json) that will contain your production informations:

js
// cf. config/env/prod.json
+import{_ as s,o as n,c as a,Q as o}from"./chunks/framework.22f5e90d.js";const u=JSON.parse('{"title":"Deploying on the Internets","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_deployment.md","filePath":"misc/_deployment.md"}'),e={name:"misc/_deployment.md"},p=o(`

Deploying on the Internets

If you want want to deploy a single application on a single server, there is no particular complexity as the only thing you will have to do is to start the server on the port 80 for http or port 443 for https.

However, a more common situation is the need deploy several applications on the same server. Generally this is done by having a proxy server (Nginx or Apache) that handle the requests (and possibly the https certificates) and internally route the requests the proper Node.js / soundworks server.

In the remaining of this page we assume your domain is http(s)://my-domain.com and that you want to run an application behind the path my-app, so that the default soundworks client should be accessible at http(s)://my-domain.com/my-app

Application Configure

The first thing to do is to create a new env config file (e.g. config/env/prod.json) that will contain your production informations:

js
// cf. config/env/prod.json
 {
   // you are in a production environement
   type: 'production',
diff --git a/assets/misc__deployment.md.1365ac44.lean.js b/assets/misc__deployment.md.9968983d.lean.js
similarity index 69%
rename from assets/misc__deployment.md.1365ac44.lean.js
rename to assets/misc__deployment.md.9968983d.lean.js
index d1a8dac..af1e276 100644
--- a/assets/misc__deployment.md.1365ac44.lean.js
+++ b/assets/misc__deployment.md.9968983d.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,Q as o}from"./chunks/framework.a5027060.js";const u=JSON.parse('{"title":"Deploying on the Internets","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_deployment.md","filePath":"misc/_deployment.md"}'),e={name:"misc/_deployment.md"},p=o("",19),l=[p];function t(c,r,i,F,d,y){return n(),a("div",null,l)}const g=s(e,[["render",t]]);export{u as __pageData,g as default};
+import{_ as s,o as n,c as a,Q as o}from"./chunks/framework.22f5e90d.js";const u=JSON.parse('{"title":"Deploying on the Internets","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_deployment.md","filePath":"misc/_deployment.md"}'),e={name:"misc/_deployment.md"},p=o("",19),l=[p];function t(c,r,i,F,d,y){return n(),a("div",null,l)}const g=s(e,[["render",t]]);export{u as __pageData,g as default};
diff --git a/assets/misc__local-deployment.md.897b7ab9.js b/assets/misc__local-deployment.md.b71a8b0c.js
similarity index 92%
rename from assets/misc__local-deployment.md.897b7ab9.js
rename to assets/misc__local-deployment.md.b71a8b0c.js
index 9500300..673a921 100644
--- a/assets/misc__local-deployment.md.897b7ab9.js
+++ b/assets/misc__local-deployment.md.b71a8b0c.js
@@ -1 +1 @@
-import{_ as o,o as t,c as a,k as e,a as l}from"./chunks/framework.a5027060.js";const f=JSON.parse('{"title":"Deployment on a Local Network","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_local-deployment.md","filePath":"misc/_local-deployment.md"}'),n={name:"misc/_local-deployment.md"},c=e("h1",{id:"deployment-on-a-local-network",tabindex:"-1"},[l("Deployment on a Local Network "),e("a",{class:"header-anchor",href:"#deployment-on-a-local-network","aria-label":'Permalink to "Deployment on a Local Network"'},"​")],-1),s=e("p",null,"This page describes how to create a local WiFi network to deploy your application.",-1),r=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"Work in progress"),e("p",null,"...")],-1),i=[c,s,r];function p(d,m,_,h,k,y){return t(),a("div",null,i)}const w=o(n,[["render",p]]);export{f as __pageData,w as default};
+import{_ as o,o as t,c as a,k as e,a as l}from"./chunks/framework.22f5e90d.js";const f=JSON.parse('{"title":"Deployment on a Local Network","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_local-deployment.md","filePath":"misc/_local-deployment.md"}'),n={name:"misc/_local-deployment.md"},c=e("h1",{id:"deployment-on-a-local-network",tabindex:"-1"},[l("Deployment on a Local Network "),e("a",{class:"header-anchor",href:"#deployment-on-a-local-network","aria-label":'Permalink to "Deployment on a Local Network"'},"​")],-1),s=e("p",null,"This page describes how to create a local WiFi network to deploy your application.",-1),r=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"Work in progress"),e("p",null,"...")],-1),i=[c,s,r];function p(d,m,_,h,k,y){return t(),a("div",null,i)}const w=o(n,[["render",p]]);export{f as __pageData,w as default};
diff --git a/assets/misc__local-deployment.md.897b7ab9.lean.js b/assets/misc__local-deployment.md.b71a8b0c.lean.js
similarity index 92%
rename from assets/misc__local-deployment.md.897b7ab9.lean.js
rename to assets/misc__local-deployment.md.b71a8b0c.lean.js
index 9500300..673a921 100644
--- a/assets/misc__local-deployment.md.897b7ab9.lean.js
+++ b/assets/misc__local-deployment.md.b71a8b0c.lean.js
@@ -1 +1 @@
-import{_ as o,o as t,c as a,k as e,a as l}from"./chunks/framework.a5027060.js";const f=JSON.parse('{"title":"Deployment on a Local Network","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_local-deployment.md","filePath":"misc/_local-deployment.md"}'),n={name:"misc/_local-deployment.md"},c=e("h1",{id:"deployment-on-a-local-network",tabindex:"-1"},[l("Deployment on a Local Network "),e("a",{class:"header-anchor",href:"#deployment-on-a-local-network","aria-label":'Permalink to "Deployment on a Local Network"'},"​")],-1),s=e("p",null,"This page describes how to create a local WiFi network to deploy your application.",-1),r=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"Work in progress"),e("p",null,"...")],-1),i=[c,s,r];function p(d,m,_,h,k,y){return t(),a("div",null,i)}const w=o(n,[["render",p]]);export{f as __pageData,w as default};
+import{_ as o,o as t,c as a,k as e,a as l}from"./chunks/framework.22f5e90d.js";const f=JSON.parse('{"title":"Deployment on a Local Network","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_local-deployment.md","filePath":"misc/_local-deployment.md"}'),n={name:"misc/_local-deployment.md"},c=e("h1",{id:"deployment-on-a-local-network",tabindex:"-1"},[l("Deployment on a Local Network "),e("a",{class:"header-anchor",href:"#deployment-on-a-local-network","aria-label":'Permalink to "Deployment on a Local Network"'},"​")],-1),s=e("p",null,"This page describes how to create a local WiFi network to deploy your application.",-1),r=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"Work in progress"),e("p",null,"...")],-1),i=[c,s,r];function p(d,m,_,h,k,y){return t(),a("div",null,i)}const w=o(n,[["render",p]]);export{f as __pageData,w as default};
diff --git a/assets/misc__todo_electron-applications.md.9360eeec.js b/assets/misc__todo_electron-applications.md.bb55336f.js
similarity index 87%
rename from assets/misc__todo_electron-applications.md.9360eeec.js
rename to assets/misc__todo_electron-applications.md.bb55336f.js
index c5263ab..7467f78 100644
--- a/assets/misc__todo_electron-applications.md.9360eeec.js
+++ b/assets/misc__todo_electron-applications.md.bb55336f.js
@@ -1 +1 @@
-import{_ as t,o as a,c as e,Q as o}from"./chunks/framework.a5027060.js";const m=JSON.parse('{"title":"Creating Electron Applications","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_todo_electron-applications.md","filePath":"misc/_todo_electron-applications.md"}'),i={name:"misc/_todo_electron-applications.md"},n=o('

Creating Electron Applications

How to

Auto-Updates

',3),c=[n];function r(s,l,_,p,d,h){return a(),e("div",null,c)}const f=t(i,[["render",r]]);export{m as __pageData,f as default}; +import{_ as t,o as a,c as e,Q as o}from"./chunks/framework.22f5e90d.js";const m=JSON.parse('{"title":"Creating Electron Applications","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_todo_electron-applications.md","filePath":"misc/_todo_electron-applications.md"}'),i={name:"misc/_todo_electron-applications.md"},n=o('

Creating Electron Applications

How to

Auto-Updates

',3),c=[n];function r(s,l,_,p,d,h){return a(),e("div",null,c)}const f=t(i,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/misc__todo_electron-applications.md.9360eeec.lean.js b/assets/misc__todo_electron-applications.md.bb55336f.lean.js similarity index 72% rename from assets/misc__todo_electron-applications.md.9360eeec.lean.js rename to assets/misc__todo_electron-applications.md.bb55336f.lean.js index 0f6a1dd..42e605f 100644 --- a/assets/misc__todo_electron-applications.md.9360eeec.lean.js +++ b/assets/misc__todo_electron-applications.md.bb55336f.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as e,Q as o}from"./chunks/framework.a5027060.js";const m=JSON.parse('{"title":"Creating Electron Applications","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_todo_electron-applications.md","filePath":"misc/_todo_electron-applications.md"}'),i={name:"misc/_todo_electron-applications.md"},n=o("",3),c=[n];function r(s,l,_,p,d,h){return a(),e("div",null,c)}const f=t(i,[["render",r]]);export{m as __pageData,f as default}; +import{_ as t,o as a,c as e,Q as o}from"./chunks/framework.22f5e90d.js";const m=JSON.parse('{"title":"Creating Electron Applications","description":"","frontmatter":{},"headers":[],"relativePath":"misc/_todo_electron-applications.md","filePath":"misc/_todo_electron-applications.md"}'),i={name:"misc/_todo_electron-applications.md"},n=o("",3),c=[n];function r(s,l,_,p,d,h){return a(),e("div",null,c)}const f=t(i,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/misc_web-sockets-101.md.70030a45.lean.js b/assets/misc_web-sockets-101.md.70030a45.lean.js deleted file mode 100644 index fc25cd0..0000000 --- a/assets/misc_web-sockets-101.md.70030a45.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as n,c as a,Q as e}from"./chunks/framework.a5027060.js";const o="/assets/protocol.7a8362ee.png",l="/assets/homepage.ebb579e0.png",p="/assets/socket-connected.4ad96566.png",t="/assets/data-flow.0749b921.png",m=JSON.parse('{"title":"WebSockets 101","description":"","frontmatter":{},"headers":[],"relativePath":"misc/web-sockets-101.md","filePath":"misc/web-sockets-101.md"}'),c={name:"misc/web-sockets-101.md"},r=e("",51),F=[r];function i(y,d,u,h,f,E){return n(),a("div",null,F)}const v=s(c,[["render",i]]);export{m as __pageData,v as default}; diff --git a/assets/misc_web-sockets-101.md.70030a45.js b/assets/misc_websockets-101.md.28427512.js similarity index 95% rename from assets/misc_web-sockets-101.md.70030a45.js rename to assets/misc_websockets-101.md.28427512.js index a66ef7d..d6beac2 100644 --- a/assets/misc_web-sockets-101.md.70030a45.js +++ b/assets/misc_websockets-101.md.28427512.js @@ -1,4 +1,4 @@ -import{_ as s,o as n,c as a,Q as e}from"./chunks/framework.a5027060.js";const o="/assets/protocol.7a8362ee.png",l="/assets/homepage.ebb579e0.png",p="/assets/socket-connected.4ad96566.png",t="/assets/data-flow.0749b921.png",m=JSON.parse('{"title":"WebSockets 101","description":"","frontmatter":{},"headers":[],"relativePath":"misc/web-sockets-101.md","filePath":"misc/web-sockets-101.md"}'),c={name:"misc/web-sockets-101.md"},r=e('

WebSockets 101

WebSocket is a communication protocol that provides full-duplex communication channels over a single TCP connection. In other, WebSocket enable bi-directionnal communication between a client and a server, meaning that both the client and the server can send data to the other, which is not possible with traditionnal HTTP protocol.

They are particularly useful for creating applications requiring instant updates, such as chats, multiplayer games, or in our case distributed music systems.

protocol

Let's then create a very simple application from groundup to have a taste of what using raw WebSockets means.

Scaffolding the project

Let's first create a new simple project:

sh
cd /path/to/working/directory
+import{_ as s,o as n,c as a,Q as e}from"./chunks/framework.22f5e90d.js";const o="/assets/protocol.7a8362ee.png",l="/assets/homepage.ebb579e0.png",p="/assets/socket-connected.4ad96566.png",t="/assets/data-flow.0749b921.png",m=JSON.parse('{"title":"WebSockets 101","description":"","frontmatter":{},"headers":[],"relativePath":"misc/websockets-101.md","filePath":"misc/websockets-101.md"}'),c={name:"misc/websockets-101.md"},r=e('

WebSockets 101

WebSocket is a communication protocol that provides full-duplex communication channels over a single TCP connection. In other, WebSocket enable bi-directionnal communication between a client and a server, meaning that both the client and the server can send data to the other, which is not possible with traditionnal HTTP protocol.

They are particularly useful for creating applications requiring instant updates, such as chats, multiplayer games, or in our case distributed music systems.

protocol

Let's then create a very simple application from groundup to have a taste of what using raw WebSockets means.

Scaffolding the project

Let's first create a new simple project:

sh
cd /path/to/working/directory
 npx @ircam/create@latest websockets-101

In this project, we wont use the simple server which the command line tool propose (i.e. npx serve), but we will rather create our own server which will be able to handle handle websocket connections.

Let's then install some dependencies to simplifies the process:

sh
cd websockets-101
 npm install --save ws server-static finalhandler

After the last command, you should see a new file called package.json that have been created by npm in order to (amongst other things) track the dependencies of your application. Let's just add the following line in the file so that we can use a more modern and compliant javascript syntax within node:

js
// package.json
 {
diff --git a/assets/misc_websockets-101.md.28427512.lean.js b/assets/misc_websockets-101.md.28427512.lean.js
new file mode 100644
index 0000000..00168aa
--- /dev/null
+++ b/assets/misc_websockets-101.md.28427512.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as n,c as a,Q as e}from"./chunks/framework.22f5e90d.js";const o="/assets/protocol.7a8362ee.png",l="/assets/homepage.ebb579e0.png",p="/assets/socket-connected.4ad96566.png",t="/assets/data-flow.0749b921.png",m=JSON.parse('{"title":"WebSockets 101","description":"","frontmatter":{},"headers":[],"relativePath":"misc/websockets-101.md","filePath":"misc/websockets-101.md"}'),c={name:"misc/websockets-101.md"},r=e("",51),F=[r];function i(y,d,u,h,f,E){return n(),a("div",null,F)}const v=s(c,[["render",i]]);export{m as __pageData,v as default};
diff --git a/assets/plugins_LICENSE.md.8d79824c.js b/assets/plugins_LICENSE.md.1d1a3c69.js
similarity index 96%
rename from assets/plugins_LICENSE.md.8d79824c.js
rename to assets/plugins_LICENSE.md.1d1a3c69.js
index d3e6231..4ed730d 100644
--- a/assets/plugins_LICENSE.md.8d79824c.js
+++ b/assets/plugins_LICENSE.md.1d1a3c69.js
@@ -1 +1 @@
-import{_ as e,o,c as i,k as t}from"./chunks/framework.a5027060.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/LICENSE.md","filePath":"plugins/LICENSE.md"}'),n={name:"plugins/LICENSE.md"},s=t("p",null,"Copyright (c) 2014-present IRCAM – Centre Pompidou (France, Paris)",-1),I=t("p",null,"All rights reserved.",-1),E=t("p",null,"Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:",-1),r=t("ul",null,[t("li",null,[t("p",null,"Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.")]),t("li",null,[t("p",null,"Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.")]),t("li",null,[t("p",null,"Neither the name of the IRCAM nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.")])],-1),T=t("p",null,'THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.',-1),R=[s,I,E,r,T];function l(O,N,a,S,d,A){return o(),i("div",null,R)}const p=e(n,[["render",l]]);export{u as __pageData,p as default};
+import{_ as e,o,c as i,k as t}from"./chunks/framework.22f5e90d.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/LICENSE.md","filePath":"plugins/LICENSE.md"}'),n={name:"plugins/LICENSE.md"},s=t("p",null,"Copyright (c) 2014-present IRCAM – Centre Pompidou (France, Paris)",-1),I=t("p",null,"All rights reserved.",-1),E=t("p",null,"Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:",-1),r=t("ul",null,[t("li",null,[t("p",null,"Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.")]),t("li",null,[t("p",null,"Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.")]),t("li",null,[t("p",null,"Neither the name of the IRCAM nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.")])],-1),T=t("p",null,'THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.',-1),R=[s,I,E,r,T];function l(O,N,a,S,d,A){return o(),i("div",null,R)}const p=e(n,[["render",l]]);export{u as __pageData,p as default};
diff --git a/assets/plugins_LICENSE.md.8d79824c.lean.js b/assets/plugins_LICENSE.md.1d1a3c69.lean.js
similarity index 96%
rename from assets/plugins_LICENSE.md.8d79824c.lean.js
rename to assets/plugins_LICENSE.md.1d1a3c69.lean.js
index d3e6231..4ed730d 100644
--- a/assets/plugins_LICENSE.md.8d79824c.lean.js
+++ b/assets/plugins_LICENSE.md.1d1a3c69.lean.js
@@ -1 +1 @@
-import{_ as e,o,c as i,k as t}from"./chunks/framework.a5027060.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/LICENSE.md","filePath":"plugins/LICENSE.md"}'),n={name:"plugins/LICENSE.md"},s=t("p",null,"Copyright (c) 2014-present IRCAM – Centre Pompidou (France, Paris)",-1),I=t("p",null,"All rights reserved.",-1),E=t("p",null,"Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:",-1),r=t("ul",null,[t("li",null,[t("p",null,"Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.")]),t("li",null,[t("p",null,"Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.")]),t("li",null,[t("p",null,"Neither the name of the IRCAM nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.")])],-1),T=t("p",null,'THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.',-1),R=[s,I,E,r,T];function l(O,N,a,S,d,A){return o(),i("div",null,R)}const p=e(n,[["render",l]]);export{u as __pageData,p as default};
+import{_ as e,o,c as i,k as t}from"./chunks/framework.22f5e90d.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/LICENSE.md","filePath":"plugins/LICENSE.md"}'),n={name:"plugins/LICENSE.md"},s=t("p",null,"Copyright (c) 2014-present IRCAM – Centre Pompidou (France, Paris)",-1),I=t("p",null,"All rights reserved.",-1),E=t("p",null,"Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:",-1),r=t("ul",null,[t("li",null,[t("p",null,"Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.")]),t("li",null,[t("p",null,"Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.")]),t("li",null,[t("p",null,"Neither the name of the IRCAM nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.")])],-1),T=t("p",null,'THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.',-1),R=[s,I,E,r,T];function l(O,N,a,S,d,A){return o(),i("div",null,R)}const p=e(n,[["render",l]]);export{u as __pageData,p as default};
diff --git a/assets/plugins_checkin.md.03420b33.js b/assets/plugins_checkin.md.74cada88.js
similarity index 98%
rename from assets/plugins_checkin.md.03420b33.js
rename to assets/plugins_checkin.md.74cada88.js
index 147a744..321a0f1 100644
--- a/assets/plugins_checkin.md.03420b33.js
+++ b/assets/plugins_checkin.md.74cada88.js
@@ -1,4 +1,4 @@
-import{_ as n,o as e,c as a,Q as s}from"./chunks/framework.a5027060.js";const g=JSON.parse('{"title":"soundworks | plugin checkin","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/checkin.md","filePath":"plugins/checkin.md"}'),l={name:"plugins/checkin.md"},o=s(`

soundworks | plugin checkin

npm version

soundworks plugin to assign a unique index to the clients among the available ones.

When a client disconnects, it's index is recycled into the pool of available indexes and can be re-assigned to a newly connected client. The number of available indexes can be limited and can be associated to additional data.

Table of Contents

Installation

sh
npm install @soundworks/plugin-checkin --save

Usage

Server

js
// index.js
+import{_ as n,o as e,c as a,Q as s}from"./chunks/framework.22f5e90d.js";const g=JSON.parse('{"title":"soundworks | plugin checkin","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/checkin.md","filePath":"plugins/checkin.md"}'),l={name:"plugins/checkin.md"},o=s(`

soundworks | plugin checkin

npm version

soundworks plugin to assign a unique index to the clients among the available ones.

When a client disconnects, it's index is recycled into the pool of available indexes and can be re-assigned to a newly connected client. The number of available indexes can be limited and can be associated to additional data.

Table of Contents

Installation

sh
npm install @soundworks/plugin-checkin --save

Usage

Server

js
// index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginCheckin from '@soundworks/plugin-checkin/server.js';
 
diff --git a/assets/plugins_checkin.md.03420b33.lean.js b/assets/plugins_checkin.md.74cada88.lean.js
similarity index 69%
rename from assets/plugins_checkin.md.03420b33.lean.js
rename to assets/plugins_checkin.md.74cada88.lean.js
index 85dba37..5128127 100644
--- a/assets/plugins_checkin.md.03420b33.lean.js
+++ b/assets/plugins_checkin.md.74cada88.lean.js
@@ -1 +1 @@
-import{_ as n,o as e,c as a,Q as s}from"./chunks/framework.a5027060.js";const g=JSON.parse('{"title":"soundworks | plugin checkin","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/checkin.md","filePath":"plugins/checkin.md"}'),l={name:"plugins/checkin.md"},o=s("",41),i=[o];function t(c,r,p,d,h,F){return e(),a("div",null,i)}const k=n(l,[["render",t]]);export{g as __pageData,k as default};
+import{_ as n,o as e,c as a,Q as s}from"./chunks/framework.22f5e90d.js";const g=JSON.parse('{"title":"soundworks | plugin checkin","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/checkin.md","filePath":"plugins/checkin.md"}'),l={name:"plugins/checkin.md"},o=s("",41),i=[o];function t(c,r,p,d,h,F){return e(),a("div",null,i)}const k=n(l,[["render",t]]);export{g as __pageData,k as default};
diff --git a/assets/plugins_filesystem.md.2c015cb2.js b/assets/plugins_filesystem.md.1e0d26da.js
similarity index 99%
rename from assets/plugins_filesystem.md.2c015cb2.js
rename to assets/plugins_filesystem.md.1e0d26da.js
index 13c2cff..6c7e239 100644
--- a/assets/plugins_filesystem.md.2c015cb2.js
+++ b/assets/plugins_filesystem.md.1e0d26da.js
@@ -1,4 +1,4 @@
-import{_ as e,o as t,c as s,Q as a}from"./chunks/framework.a5027060.js";const y=JSON.parse('{"title":"soundworks | plugin filesystem","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/filesystem.md","filePath":"plugins/filesystem.md"}'),n={name:"plugins/filesystem.md"},l=a(`

soundworks | plugin filesystem

npm version

soundworks plugin to watch directories and update their contents from any node.

Table of Contents

Installation

sh
npm install @soundworks/plugin-filesystem --save

Usage

Server

js
// index.js
+import{_ as e,o as t,c as s,Q as a}from"./chunks/framework.22f5e90d.js";const y=JSON.parse('{"title":"soundworks | plugin filesystem","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/filesystem.md","filePath":"plugins/filesystem.md"}'),n={name:"plugins/filesystem.md"},l=a(`

soundworks | plugin filesystem

npm version

soundworks plugin to watch directories and update their contents from any node.

Table of Contents

Installation

sh
npm install @soundworks/plugin-filesystem --save

Usage

Server

js
// index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginFilesystem from '@soundworks/plugin-filesystem/server.js';
 
diff --git a/assets/plugins_filesystem.md.2c015cb2.lean.js b/assets/plugins_filesystem.md.1e0d26da.lean.js
similarity index 69%
rename from assets/plugins_filesystem.md.2c015cb2.lean.js
rename to assets/plugins_filesystem.md.1e0d26da.lean.js
index a615003..80b54da 100644
--- a/assets/plugins_filesystem.md.2c015cb2.lean.js
+++ b/assets/plugins_filesystem.md.1e0d26da.lean.js
@@ -1 +1 @@
-import{_ as e,o as t,c as s,Q as a}from"./chunks/framework.a5027060.js";const y=JSON.parse('{"title":"soundworks | plugin filesystem","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/filesystem.md","filePath":"plugins/filesystem.md"}'),n={name:"plugins/filesystem.md"},l=a("",122),i=[l];function o(r,d,p,c,h,m){return t(),s("div",null,i)}const g=e(n,[["render",o]]);export{y as __pageData,g as default};
+import{_ as e,o as t,c as s,Q as a}from"./chunks/framework.22f5e90d.js";const y=JSON.parse('{"title":"soundworks | plugin filesystem","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/filesystem.md","filePath":"plugins/filesystem.md"}'),n={name:"plugins/filesystem.md"},l=a("",122),i=[l];function o(r,d,p,c,h,m){return t(),s("div",null,i)}const g=e(n,[["render",o]]);export{y as __pageData,g as default};
diff --git a/assets/plugins_logger.md.06439713.js b/assets/plugins_logger.md.1095c07d.js
similarity index 99%
rename from assets/plugins_logger.md.06439713.js
rename to assets/plugins_logger.md.1095c07d.js
index 3587400..e973bb5 100644
--- a/assets/plugins_logger.md.06439713.js
+++ b/assets/plugins_logger.md.1095c07d.js
@@ -1,4 +1,4 @@
-import{_ as e,o as a,c as t,Q as s}from"./chunks/framework.a5027060.js";const u=JSON.parse('{"title":"soundworks | plugin logger","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/logger.md","filePath":"plugins/logger.md"}'),n={name:"plugins/logger.md"},r=s(`

soundworks | plugin logger

npm version

soundworks plugin for recording arbitrary data from any node of the network into plain old files.

Table of Contents

Installation

sh
npm install @soundworks/plugin-logger --save

Usage

Server

js
// index.js
+import{_ as e,o as a,c as t,Q as s}from"./chunks/framework.22f5e90d.js";const u=JSON.parse('{"title":"soundworks | plugin logger","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/logger.md","filePath":"plugins/logger.md"}'),n={name:"plugins/logger.md"},r=s(`

soundworks | plugin logger

npm version

soundworks plugin for recording arbitrary data from any node of the network into plain old files.

Table of Contents

Installation

sh
npm install @soundworks/plugin-logger --save

Usage

Server

js
// index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginLogger from '@soundworks/plugin-logger/server.js';
 
diff --git a/assets/plugins_logger.md.06439713.lean.js b/assets/plugins_logger.md.1095c07d.lean.js
similarity index 68%
rename from assets/plugins_logger.md.06439713.lean.js
rename to assets/plugins_logger.md.1095c07d.lean.js
index f585612..b21cecf 100644
--- a/assets/plugins_logger.md.06439713.lean.js
+++ b/assets/plugins_logger.md.1095c07d.lean.js
@@ -1 +1 @@
-import{_ as e,o as a,c as t,Q as s}from"./chunks/framework.a5027060.js";const u=JSON.parse('{"title":"soundworks | plugin logger","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/logger.md","filePath":"plugins/logger.md"}'),n={name:"plugins/logger.md"},r=s("",145),l=[r];function o(i,p,c,d,h,g){return a(),t("div",null,l)}const y=e(n,[["render",o]]);export{u as __pageData,y as default};
+import{_ as e,o as a,c as t,Q as s}from"./chunks/framework.22f5e90d.js";const u=JSON.parse('{"title":"soundworks | plugin logger","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/logger.md","filePath":"plugins/logger.md"}'),n={name:"plugins/logger.md"},r=s("",145),l=[r];function o(i,p,c,d,h,g){return a(),t("div",null,l)}const y=e(n,[["render",o]]);export{u as __pageData,y as default};
diff --git a/assets/plugins_platform-init.md.598c238b.js b/assets/plugins_platform-init.md.c0a9a7d6.js
similarity index 99%
rename from assets/plugins_platform-init.md.598c238b.js
rename to assets/plugins_platform-init.md.c0a9a7d6.js
index 3d5f333..ae0fc25 100644
--- a/assets/plugins_platform-init.md.598c238b.js
+++ b/assets/plugins_platform-init.md.c0a9a7d6.js
@@ -1,4 +1,4 @@
-import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.a5027060.js";const f=JSON.parse('{"title":"soundworks | plugin platform init","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/platform-init.md","filePath":"plugins/platform-init.md"}'),e={name:"plugins/platform-init.md"},o=l(`

soundworks | plugin platform init

npm version

soundworks plugin to handle initialization of browser client features that require a user interaction such as resuming audio context, etc.

Tutorial: https://soundworks.dev/tutorials/plugin-platform-init.html

Table of Contents

Installation

sh
npm install @soundworks/plugin-platform-init --save

Usage

Server

js
// src/server/index.js
+import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.22f5e90d.js";const f=JSON.parse('{"title":"soundworks | plugin platform init","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/platform-init.md","filePath":"plugins/platform-init.md"}'),e={name:"plugins/platform-init.md"},o=l(`

soundworks | plugin platform init

npm version

soundworks plugin to handle initialization of browser client features that require a user interaction such as resuming audio context, etc.

Tutorial: https://soundworks.dev/tutorials/plugin-platform-init.html

Table of Contents

Installation

sh
npm install @soundworks/plugin-platform-init --save

Usage

Server

js
// src/server/index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginPlatformInit from '@soundworks/plugin-platform-init/server.js';
 
diff --git a/assets/plugins_platform-init.md.598c238b.lean.js b/assets/plugins_platform-init.md.c0a9a7d6.lean.js
similarity index 70%
rename from assets/plugins_platform-init.md.598c238b.lean.js
rename to assets/plugins_platform-init.md.c0a9a7d6.lean.js
index 2b61186..c4ad8c4 100644
--- a/assets/plugins_platform-init.md.598c238b.lean.js
+++ b/assets/plugins_platform-init.md.c0a9a7d6.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.a5027060.js";const f=JSON.parse('{"title":"soundworks | plugin platform init","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/platform-init.md","filePath":"plugins/platform-init.md"}'),e={name:"plugins/platform-init.md"},o=l("",54),t=[o];function p(r,i,c,F,d,y){return a(),n("div",null,t)}const m=s(e,[["render",p]]);export{f as __pageData,m as default};
+import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.22f5e90d.js";const f=JSON.parse('{"title":"soundworks | plugin platform init","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/platform-init.md","filePath":"plugins/platform-init.md"}'),e={name:"plugins/platform-init.md"},o=l("",54),t=[o];function p(r,i,c,F,d,y){return a(),n("div",null,t)}const m=s(e,[["render",p]]);export{f as __pageData,m as default};
diff --git a/assets/plugins_position.md.13d16364.js b/assets/plugins_position.md.822c9f5b.js
similarity index 99%
rename from assets/plugins_position.md.13d16364.js
rename to assets/plugins_position.md.822c9f5b.js
index c65e37d..3723085 100644
--- a/assets/plugins_position.md.13d16364.js
+++ b/assets/plugins_position.md.822c9f5b.js
@@ -1,4 +1,4 @@
-import{_ as n,o as s,c as o,Q as a}from"./chunks/framework.a5027060.js";const h=JSON.parse('{"title":"soundworks | plugin position","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/position.md","filePath":"plugins/position.md"}'),e={name:"plugins/position.md"},l=a(`

soundworks | plugin position

npm version

soundworks plugin for locating people in an area.

When registered the soundworks launcher will automatically provide an interface so that people can give give their approximate position on a map or area.

Table of Contents

Installation

sh
npm install @soundworks/plugin-position --save

Usage

Server

js
// index.js
+import{_ as n,o as s,c as o,Q as a}from"./chunks/framework.22f5e90d.js";const h=JSON.parse('{"title":"soundworks | plugin position","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/position.md","filePath":"plugins/position.md"}'),e={name:"plugins/position.md"},l=a(`

soundworks | plugin position

npm version

soundworks plugin for locating people in an area.

When registered the soundworks launcher will automatically provide an interface so that people can give give their approximate position on a map or area.

Table of Contents

Installation

sh
npm install @soundworks/plugin-position --save

Usage

Server

js
// index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginPosition from '@soundworks/plugin-position/server.js';
 
diff --git a/assets/plugins_position.md.13d16364.lean.js b/assets/plugins_position.md.822c9f5b.lean.js
similarity index 69%
rename from assets/plugins_position.md.13d16364.lean.js
rename to assets/plugins_position.md.822c9f5b.lean.js
index 49c70bf..b258d89 100644
--- a/assets/plugins_position.md.13d16364.lean.js
+++ b/assets/plugins_position.md.822c9f5b.lean.js
@@ -1 +1 @@
-import{_ as n,o as s,c as o,Q as a}from"./chunks/framework.a5027060.js";const h=JSON.parse('{"title":"soundworks | plugin position","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/position.md","filePath":"plugins/position.md"}'),e={name:"plugins/position.md"},l=a("",60),t=[l];function i(p,r,c,d,F,u){return s(),o("div",null,t)}const y=n(e,[["render",i]]);export{h as __pageData,y as default};
+import{_ as n,o as s,c as o,Q as a}from"./chunks/framework.22f5e90d.js";const h=JSON.parse('{"title":"soundworks | plugin position","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/position.md","filePath":"plugins/position.md"}'),e={name:"plugins/position.md"},l=a("",60),t=[l];function i(p,r,c,d,F,u){return s(),o("div",null,t)}const y=n(e,[["render",i]]);export{h as __pageData,y as default};
diff --git a/assets/plugins_scripting.md.0e781cdc.js b/assets/plugins_scripting.md.38fc7c09.js
similarity index 99%
rename from assets/plugins_scripting.md.0e781cdc.js
rename to assets/plugins_scripting.md.38fc7c09.js
index fc1b06e..3753461 100644
--- a/assets/plugins_scripting.md.0e781cdc.js
+++ b/assets/plugins_scripting.md.38fc7c09.js
@@ -1,4 +1,4 @@
-import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.a5027060.js";const S=JSON.parse('{"title":"soundworks | plugin scripting","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/scripting.md","filePath":"plugins/scripting.md"}'),i={name:"plugins/scripting.md"},n=r(`

soundworks | plugin scripting

npm version

soundworks plugin for runtime distributed scripting.

Table of Contents

Installation

sh
npm install @soundworks/plugin-scripting --save

Usage

Server

js
// src/server/index.js
+import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.22f5e90d.js";const S=JSON.parse('{"title":"soundworks | plugin scripting","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/scripting.md","filePath":"plugins/scripting.md"}'),i={name:"plugins/scripting.md"},n=r(`

soundworks | plugin scripting

npm version

soundworks plugin for runtime distributed scripting.

Table of Contents

Installation

sh
npm install @soundworks/plugin-scripting --save

Usage

Server

js
// src/server/index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginScripting from '@soundworks/plugin-scripting/server.js';
 
diff --git a/assets/plugins_scripting.md.0e781cdc.lean.js b/assets/plugins_scripting.md.38fc7c09.lean.js
similarity index 69%
rename from assets/plugins_scripting.md.0e781cdc.lean.js
rename to assets/plugins_scripting.md.38fc7c09.lean.js
index cdf8eaa..4c05007 100644
--- a/assets/plugins_scripting.md.0e781cdc.lean.js
+++ b/assets/plugins_scripting.md.38fc7c09.lean.js
@@ -1 +1 @@
-import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.a5027060.js";const S=JSON.parse('{"title":"soundworks | plugin scripting","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/scripting.md","filePath":"plugins/scripting.md"}'),i={name:"plugins/scripting.md"},n=r("",150),s=[n];function l(o,c,p,d,h,g){return t(),a("div",null,s)}const m=e(i,[["render",l]]);export{S as __pageData,m as default};
+import{_ as e,o as t,c as a,Q as r}from"./chunks/framework.22f5e90d.js";const S=JSON.parse('{"title":"soundworks | plugin scripting","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/scripting.md","filePath":"plugins/scripting.md"}'),i={name:"plugins/scripting.md"},n=r("",150),s=[n];function l(o,c,p,d,h,g){return t(),a("div",null,s)}const m=e(i,[["render",l]]);export{S as __pageData,m as default};
diff --git a/assets/plugins_sync.md.a42cbef0.js b/assets/plugins_sync.md.3fdb3fe3.js
similarity index 99%
rename from assets/plugins_sync.md.a42cbef0.js
rename to assets/plugins_sync.md.3fdb3fe3.js
index 5e0314d..94b139d 100644
--- a/assets/plugins_sync.md.a42cbef0.js
+++ b/assets/plugins_sync.md.3fdb3fe3.js
@@ -1,4 +1,4 @@
-import{_ as e,o as n,c as s,Q as a}from"./chunks/framework.a5027060.js";const h=JSON.parse('{"title":"soundworks | plugin sync","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/sync.md","filePath":"plugins/sync.md"}'),o={name:"plugins/sync.md"},t=a(`

soundworks | plugin sync

npm version

soundworks plugin for synchronizing clients on a common master clock.

Because "as a consequence of dealing with independent nodes, each one will have its own notion of time [...] we cannot assume that there is something like a global clock" [M. van Steen & A. S. Tanenbaum], the sync plugin synchronizes a local clock from the client with a master clock from the server.

The plugin is a wrapper around the @ircam/sync library.

Table of Contents

Installation

sh
npm install --save @soundworks/plugin-sync

Usage

Server

js
// index.js
+import{_ as e,o as n,c as s,Q as a}from"./chunks/framework.22f5e90d.js";const h=JSON.parse('{"title":"soundworks | plugin sync","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/sync.md","filePath":"plugins/sync.md"}'),o={name:"plugins/sync.md"},t=a(`

soundworks | plugin sync

npm version

soundworks plugin for synchronizing clients on a common master clock.

Because "as a consequence of dealing with independent nodes, each one will have its own notion of time [...] we cannot assume that there is something like a global clock" [M. van Steen & A. S. Tanenbaum], the sync plugin synchronizes a local clock from the client with a master clock from the server.

The plugin is a wrapper around the @ircam/sync library.

Table of Contents

Installation

sh
npm install --save @soundworks/plugin-sync

Usage

Server

js
// index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginSync from '@soundworks/plugin-sync/server.js';
 
diff --git a/assets/plugins_sync.md.a42cbef0.lean.js b/assets/plugins_sync.md.3fdb3fe3.lean.js
similarity index 68%
rename from assets/plugins_sync.md.a42cbef0.lean.js
rename to assets/plugins_sync.md.3fdb3fe3.lean.js
index 3664409..c3f51d9 100644
--- a/assets/plugins_sync.md.a42cbef0.lean.js
+++ b/assets/plugins_sync.md.3fdb3fe3.lean.js
@@ -1 +1 @@
-import{_ as e,o as n,c as s,Q as a}from"./chunks/framework.a5027060.js";const h=JSON.parse('{"title":"soundworks | plugin sync","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/sync.md","filePath":"plugins/sync.md"}'),o={name:"plugins/sync.md"},t=a("",100),l=[t];function c(r,i,p,d,y,u){return n(),s("div",null,l)}const g=e(o,[["render",c]]);export{h as __pageData,g as default};
+import{_ as e,o as n,c as s,Q as a}from"./chunks/framework.22f5e90d.js";const h=JSON.parse('{"title":"soundworks | plugin sync","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/sync.md","filePath":"plugins/sync.md"}'),o={name:"plugins/sync.md"},t=a("",100),l=[t];function c(r,i,p,d,y,u){return n(),s("div",null,l)}const g=e(o,[["render",c]]);export{h as __pageData,g as default};
diff --git a/assets/select-plugins.e60d1bb6.png b/assets/select-plugins.e60d1bb6.png
new file mode 100644
index 0000000..4e419a3
Binary files /dev/null and b/assets/select-plugins.e60d1bb6.png differ
diff --git a/assets/tutorials__connected-lamp.md.5f34992a.js b/assets/tutorials__connected-lamp.md.1d1f0736.js
similarity index 92%
rename from assets/tutorials__connected-lamp.md.5f34992a.js
rename to assets/tutorials__connected-lamp.md.1d1f0736.js
index b7f7f54..a94d289 100644
--- a/assets/tutorials__connected-lamp.md.5f34992a.js
+++ b/assets/tutorials__connected-lamp.md.1d1f0736.js
@@ -1 +1 @@
-import{_ as t,o as a,c as n,k as e,a as o}from"./chunks/framework.a5027060.js";const g=JSON.parse('{"title":"Creating a Connected Lamp","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/_connected-lamp.md","filePath":"tutorials/_connected-lamp.md"}'),c={name:"tutorials/_connected-lamp.md"},s=e("h1",{id:"creating-a-connected-lamp",tabindex:"-1"},[o("Creating a Connected Lamp "),e("a",{class:"header-anchor",href:"#creating-a-connected-lamp","aria-label":'Permalink to "Creating a Connected Lamp"'},"​")],-1),r=e("p",null,"In this tutorial we will step aside music applications and system to see how soundworks can be used to prototype and build",-1),d=[s,r];function i(l,p,m,_,u,h){return a(),n("div",null,d)}const C=t(c,[["render",i]]);export{g as __pageData,C as default};
+import{_ as t,o as a,c as n,k as e,a as o}from"./chunks/framework.22f5e90d.js";const g=JSON.parse('{"title":"Creating a Connected Lamp","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/_connected-lamp.md","filePath":"tutorials/_connected-lamp.md"}'),c={name:"tutorials/_connected-lamp.md"},s=e("h1",{id:"creating-a-connected-lamp",tabindex:"-1"},[o("Creating a Connected Lamp "),e("a",{class:"header-anchor",href:"#creating-a-connected-lamp","aria-label":'Permalink to "Creating a Connected Lamp"'},"​")],-1),r=e("p",null,"In this tutorial we will step aside music applications and system to see how soundworks can be used to prototype and build",-1),d=[s,r];function i(l,p,m,_,u,h){return a(),n("div",null,d)}const C=t(c,[["render",i]]);export{g as __pageData,C as default};
diff --git a/assets/tutorials__connected-lamp.md.5f34992a.lean.js b/assets/tutorials__connected-lamp.md.1d1f0736.lean.js
similarity index 92%
rename from assets/tutorials__connected-lamp.md.5f34992a.lean.js
rename to assets/tutorials__connected-lamp.md.1d1f0736.lean.js
index b7f7f54..a94d289 100644
--- a/assets/tutorials__connected-lamp.md.5f34992a.lean.js
+++ b/assets/tutorials__connected-lamp.md.1d1f0736.lean.js
@@ -1 +1 @@
-import{_ as t,o as a,c as n,k as e,a as o}from"./chunks/framework.a5027060.js";const g=JSON.parse('{"title":"Creating a Connected Lamp","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/_connected-lamp.md","filePath":"tutorials/_connected-lamp.md"}'),c={name:"tutorials/_connected-lamp.md"},s=e("h1",{id:"creating-a-connected-lamp",tabindex:"-1"},[o("Creating a Connected Lamp "),e("a",{class:"header-anchor",href:"#creating-a-connected-lamp","aria-label":'Permalink to "Creating a Connected Lamp"'},"​")],-1),r=e("p",null,"In this tutorial we will step aside music applications and system to see how soundworks can be used to prototype and build",-1),d=[s,r];function i(l,p,m,_,u,h){return a(),n("div",null,d)}const C=t(c,[["render",i]]);export{g as __pageData,C as default};
+import{_ as t,o as a,c as n,k as e,a as o}from"./chunks/framework.22f5e90d.js";const g=JSON.parse('{"title":"Creating a Connected Lamp","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/_connected-lamp.md","filePath":"tutorials/_connected-lamp.md"}'),c={name:"tutorials/_connected-lamp.md"},s=e("h1",{id:"creating-a-connected-lamp",tabindex:"-1"},[o("Creating a Connected Lamp "),e("a",{class:"header-anchor",href:"#creating-a-connected-lamp","aria-label":'Permalink to "Creating a Connected Lamp"'},"​")],-1),r=e("p",null,"In this tutorial we will step aside music applications and system to see how soundworks can be used to prototype and build",-1),d=[s,r];function i(l,p,m,_,u,h){return a(),n("div",null,d)}const C=t(c,[["render",i]]);export{g as __pageData,C as default};
diff --git a/assets/tutorials__context.md.ec91752e.js b/assets/tutorials__context.md.f32aa2f6.js
similarity index 93%
rename from assets/tutorials__context.md.ec91752e.js
rename to assets/tutorials__context.md.f32aa2f6.js
index c69520b..010af67 100644
--- a/assets/tutorials__context.md.ec91752e.js
+++ b/assets/tutorials__context.md.f32aa2f6.js
@@ -1 +1 @@
-import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.a5027060.js";const m=JSON.parse('{"title":"Using Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/_context.md","filePath":"tutorials/_context.md"}'),n={name:"tutorials/_context.md"},i=a('

Using Contexts

In this tutorial, we will learn how to use the Context class proposed by soundworks.

Relevant API documentation

Introduction

How context works

Creating a simple router

Using contexts to model sections of an experience

conclusion

',8),r=[i];function s(c,l,d,h,u,x){return t(),o("div",null,r)}const p=e(n,[["render",s]]);export{m as __pageData,p as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.22f5e90d.js";const m=JSON.parse('{"title":"Using Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/_context.md","filePath":"tutorials/_context.md"}'),n={name:"tutorials/_context.md"},i=a('

Using Contexts

In this tutorial, we will learn how to use the Context class proposed by soundworks.

Relevant API documentation

Introduction

How context works

Creating a simple router

Using contexts to model sections of an experience

conclusion

',8),r=[i];function s(c,l,d,h,u,x){return t(),o("div",null,r)}const p=e(n,[["render",s]]);export{m as __pageData,p as default}; diff --git a/assets/tutorials__context.md.ec91752e.lean.js b/assets/tutorials__context.md.f32aa2f6.lean.js similarity index 68% rename from assets/tutorials__context.md.ec91752e.lean.js rename to assets/tutorials__context.md.f32aa2f6.lean.js index 0591a85..61809e5 100644 --- a/assets/tutorials__context.md.ec91752e.lean.js +++ b/assets/tutorials__context.md.f32aa2f6.lean.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.a5027060.js";const m=JSON.parse('{"title":"Using Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/_context.md","filePath":"tutorials/_context.md"}'),n={name:"tutorials/_context.md"},i=a("",8),r=[i];function s(c,l,d,h,u,x){return t(),o("div",null,r)}const p=e(n,[["render",s]]);export{m as __pageData,p as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.22f5e90d.js";const m=JSON.parse('{"title":"Using Contexts","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/_context.md","filePath":"tutorials/_context.md"}'),n={name:"tutorials/_context.md"},i=a("",8),r=[i];function s(c,l,d,h,u,x){return t(),o("div",null,r)}const p=e(n,[["render",s]]);export{m as __pageData,p as default}; diff --git a/assets/tutorials_getting-started.md.c674cd44.js b/assets/tutorials_getting-started.md.197f7fc1.js similarity index 99% rename from assets/tutorials_getting-started.md.c674cd44.js rename to assets/tutorials_getting-started.md.197f7fc1.js index 9914076..3118676 100644 --- a/assets/tutorials_getting-started.md.c674cd44.js +++ b/assets/tutorials_getting-started.md.197f7fc1.js @@ -1,4 +1,4 @@ -import{_ as s,o as e,c as a,Q as n}from"./chunks/framework.a5027060.js";const o="/assets/soundworks-create-min.2e2aae2b.gif",t="/assets/wizard-create-project.251a088b.png",l="/assets/wizard-init-install-deps.e140195f.png",p="/assets/wizard-create-player-1.e01591e6.png",r="/assets/wizard-create-player-2.4aa47840.png",c="/assets/wizard-create-player-3.0d49b1fe.png",i="/assets/wizard-create-player-confirm.30e4d539.png",d="/assets/wizard-init-end.bb661fd2.png",F="/assets/server-launched.b266e27d.png",y="/assets/fancy-black-screen.1259df19.png",h="/assets/browser-console.48f3525a.png",u="/assets/browser-console-2.a285274f.png",g="/assets/emulated-clients.2df378a3.png",j=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/getting-started.md","filePath":"tutorials/getting-started.md"}'),m={name:"tutorials/getting-started.md"},f=n('

Getting Started

In this tutorial, we will learn how to setup a project and develop a simple soundworks application where any connected user will be able to trigger a flash on the screen of all connected clients.

The tutorial requires basic knowledge of JavaScript, Node.js and of the command-line. If you are just starting with JavaScript development, please first set up a working environment following the instructions here and come back when done.

Prerequisites

Step 1 - Setting things up

The best and most simple way to create a new soundworks application is to use our dedicated command line tools:

soundworks/create

So first thing first, open a Terminal, go to some directory and execute the following command:

sh
cd path/to/working/dir
+import{_ as s,o as e,c as a,Q as n}from"./chunks/framework.22f5e90d.js";const o="/assets/soundworks-create-min.2e2aae2b.gif",t="/assets/wizard-create-project.251a088b.png",l="/assets/wizard-init-install-deps.e140195f.png",p="/assets/wizard-create-player-1.e01591e6.png",r="/assets/wizard-create-player-2.4aa47840.png",c="/assets/wizard-create-player-3.0d49b1fe.png",i="/assets/wizard-create-player-confirm.30e4d539.png",d="/assets/wizard-init-end.bb661fd2.png",F="/assets/server-launched.b266e27d.png",y="/assets/fancy-black-screen.1259df19.png",h="/assets/browser-console.48f3525a.png",u="/assets/browser-console-2.a285274f.png",g="/assets/emulated-clients.2df378a3.png",j=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/getting-started.md","filePath":"tutorials/getting-started.md"}'),m={name:"tutorials/getting-started.md"},f=n('

Getting Started

In this tutorial, we will learn how to setup a project and develop a simple soundworks application where any connected user will be able to trigger a flash on the screen of all connected clients.

The tutorial requires basic knowledge of JavaScript, Node.js and of the command-line. If you are just starting with JavaScript development, please first set up a working environment following the instructions here and come back when done.

Prerequisites

Step 1 - Setting things up

The best and most simple way to create a new soundworks application is to use our dedicated command line tools:

soundworks/create

So first thing first, open a Terminal, go to some directory and execute the following command:

sh
cd path/to/working/dir
 npx @soundworks/create@latest

TIP

If you run the command for the first time (which is quite likely), the npx command will tell you that it needs to install the @soundworks/create package, just press Enter to accept and continue.

The wizard will startup and ask you for the name of the directory in which you want create the application: just write getting-started and press Enter. The wizard will automatically create the directory, copy a bunch of files and install the required dependencies as illustrated in the screenshot below.

INFO

Note that the screenshots in this guide may differ slightly from what you actually see in your console, as the CLI tool might have evolved a bit since the screenshots have been made.

create-project

Once the installation is done, the @soundworks/create wizard will propose you to install some soundworks plugins and some curated libraries. For now, just press Enter to skip this steps.

init-install-deps

After that step, the wizard will propose you to create a client of your application. Let's call it player and press Enter as show below.

create-player-1

The wizard will then ask a few questions to configure your client, again just press Enter to select the default values (i.e. type: browser and template: default):

create-player-2

create-player-3

Finally, the wizard will ask you to confirm your choices, press Enter.

create-player-confirm

The wizard will copy some files and configure the application for you. Your application is ready to be launched.

To make sure the application is correctly set up and installed, just follow the steps 1 and 3 proposed as next steps by the wizard.

init-end

So:

  1. Go to the directory: cd getting-started
  2. Optionally create a git project: git init && git add -A && git commit -m "first commit"
  3. Launch the project in development mode: npm run dev

After a few seconds, the server should be running:

server-launched

Open you favorite browser (which shall probably not be Safari), go to http://127.0.0.1:8000, and tada! You should see a rather pretty almost black screen:

fancy-black-screen

Congrats! You just configured and ran your first soundworks application. Now, let's have a closer look to the codebase.

Step 2 - Exploring the file structure of the application

Press Ctrl + C to stop the server and open the getting-started directory in your favorite text editor. You should see the following file structure:

sh
getting-started
 ├── .build              # Directory where your application is built
 ├── config              # Configuration files
diff --git a/assets/tutorials_getting-started.md.c674cd44.lean.js b/assets/tutorials_getting-started.md.197f7fc1.lean.js
similarity index 87%
rename from assets/tutorials_getting-started.md.c674cd44.lean.js
rename to assets/tutorials_getting-started.md.197f7fc1.lean.js
index c6cec26..6cedc9f 100644
--- a/assets/tutorials_getting-started.md.c674cd44.lean.js
+++ b/assets/tutorials_getting-started.md.197f7fc1.lean.js
@@ -1 +1 @@
-import{_ as s,o as e,c as a,Q as n}from"./chunks/framework.a5027060.js";const o="/assets/soundworks-create-min.2e2aae2b.gif",t="/assets/wizard-create-project.251a088b.png",l="/assets/wizard-init-install-deps.e140195f.png",p="/assets/wizard-create-player-1.e01591e6.png",r="/assets/wizard-create-player-2.4aa47840.png",c="/assets/wizard-create-player-3.0d49b1fe.png",i="/assets/wizard-create-player-confirm.30e4d539.png",d="/assets/wizard-init-end.bb661fd2.png",F="/assets/server-launched.b266e27d.png",y="/assets/fancy-black-screen.1259df19.png",h="/assets/browser-console.48f3525a.png",u="/assets/browser-console-2.a285274f.png",g="/assets/emulated-clients.2df378a3.png",j=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/getting-started.md","filePath":"tutorials/getting-started.md"}'),m={name:"tutorials/getting-started.md"},f=n("",84),b=[f];function w(E,k,v,D,A,_){return e(),a("div",null,b)}const C=s(m,[["render",w]]);export{j as __pageData,C as default};
+import{_ as s,o as e,c as a,Q as n}from"./chunks/framework.22f5e90d.js";const o="/assets/soundworks-create-min.2e2aae2b.gif",t="/assets/wizard-create-project.251a088b.png",l="/assets/wizard-init-install-deps.e140195f.png",p="/assets/wizard-create-player-1.e01591e6.png",r="/assets/wizard-create-player-2.4aa47840.png",c="/assets/wizard-create-player-3.0d49b1fe.png",i="/assets/wizard-create-player-confirm.30e4d539.png",d="/assets/wizard-init-end.bb661fd2.png",F="/assets/server-launched.b266e27d.png",y="/assets/fancy-black-screen.1259df19.png",h="/assets/browser-console.48f3525a.png",u="/assets/browser-console-2.a285274f.png",g="/assets/emulated-clients.2df378a3.png",j=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/getting-started.md","filePath":"tutorials/getting-started.md"}'),m={name:"tutorials/getting-started.md"},f=n("",84),b=[f];function w(E,k,v,D,A,_){return e(),a("div",null,b)}const C=s(m,[["render",w]]);export{j as __pageData,C as default};
diff --git a/assets/tutorials_node-clients.md.41b5e9bb.js b/assets/tutorials_node-clients.md.b8cd6b06.js
similarity index 99%
rename from assets/tutorials_node-clients.md.41b5e9bb.js
rename to assets/tutorials_node-clients.md.b8cd6b06.js
index 84a11d0..0b23e92 100644
--- a/assets/tutorials_node-clients.md.41b5e9bb.js
+++ b/assets/tutorials_node-clients.md.b8cd6b06.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as a,Q as e}from"./chunks/framework.a5027060.js";const o="/assets/wizard-init.8b9d0e7e.png",l="/assets/wizard-create-client.55688247.png",t="/assets/node-client.c5d0cbb4.png",p="/assets/controller.aaddfc1c.png",c="/assets/trigger-sound.a33791fd.png",r="/assets/create-env.e1966aeb.png",b=JSON.parse('{"title":"Working with Node Clients","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/node-clients.md","filePath":"tutorials/node-clients.md"}'),i={name:"tutorials/node-clients.md"},F=e(`

Working with Node Clients

In this tutorial, we will explore how to use soundworks to create clients that run within a Node.js process, opening new possibilities of creating application ouside Web Browsers.

Indeed, this functionality allows to create applications that can work in screenless embedded hardware, such as the Raspberry Pi, allowing to access some fonctionnalities, such as controlling a motor or a LED, which are hard to achieve in sandboxed environment that are Web browsers.

To illustrate this possibility and discover some of the tools you have at hand to help you, we will build a very simple application where a browser controller client can trigger a sound synthesized by another client running in a Node.js process.

Scaffolding Application

Let's start with scaffolding our application:

sh
cd path/to/tutorials
+import{_ as s,o as n,c as a,Q as e}from"./chunks/framework.22f5e90d.js";const o="/assets/wizard-init.8b9d0e7e.png",l="/assets/wizard-create-client.55688247.png",t="/assets/node-client.c5d0cbb4.png",p="/assets/controller.aaddfc1c.png",c="/assets/trigger-sound.a33791fd.png",r="/assets/create-env.e1966aeb.png",b=JSON.parse('{"title":"Working with Node Clients","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/node-clients.md","filePath":"tutorials/node-clients.md"}'),i={name:"tutorials/node-clients.md"},F=e(`

Working with Node Clients

In this tutorial, we will explore how to use soundworks to create clients that run within a Node.js process, opening new possibilities of creating application ouside Web Browsers.

Indeed, this functionality allows to create applications that can work in screenless embedded hardware, such as the Raspberry Pi, allowing to access some fonctionnalities, such as controlling a motor or a LED, which are hard to achieve in sandboxed environment that are Web browsers.

To illustrate this possibility and discover some of the tools you have at hand to help you, we will build a very simple application where a browser controller client can trigger a sound synthesized by another client running in a Node.js process.

Scaffolding Application

Let's start with scaffolding our application:

sh
cd path/to/tutorials
 npx @soundworks/create@latest node-clients

When the wizard asks you to create the default client, let's just create a browser client with the "controller" template (we will create our Node.js client afterward):

wizard-init

Then let's start our application with:

cd node-clients
 npm run dev

Implementing the control logic

Before implementing our Node.js cient, let's use the features we have learned so far so that our controller can trigger a sound on any of our future Node.js clients.

Let's start with defining the state, we will call thing that will be created by our Node.js clients when they connect to the application. Create a file named thing.js in src/server/schemas and declare the following schema definition:

js
// src/server/schemas/thing.js
 export default {
diff --git a/assets/tutorials_node-clients.md.41b5e9bb.lean.js b/assets/tutorials_node-clients.md.b8cd6b06.lean.js
similarity index 80%
rename from assets/tutorials_node-clients.md.41b5e9bb.lean.js
rename to assets/tutorials_node-clients.md.b8cd6b06.lean.js
index 8d11d2e..3a3517e 100644
--- a/assets/tutorials_node-clients.md.41b5e9bb.lean.js
+++ b/assets/tutorials_node-clients.md.b8cd6b06.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as a,Q as e}from"./chunks/framework.a5027060.js";const o="/assets/wizard-init.8b9d0e7e.png",l="/assets/wizard-create-client.55688247.png",t="/assets/node-client.c5d0cbb4.png",p="/assets/controller.aaddfc1c.png",c="/assets/trigger-sound.a33791fd.png",r="/assets/create-env.e1966aeb.png",b=JSON.parse('{"title":"Working with Node Clients","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/node-clients.md","filePath":"tutorials/node-clients.md"}'),i={name:"tutorials/node-clients.md"},F=e("",65),d=[F];function y(u,h,f,g,m,E){return n(),a("div",null,d)}const v=s(i,[["render",y]]);export{b as __pageData,v as default};
+import{_ as s,o as n,c as a,Q as e}from"./chunks/framework.22f5e90d.js";const o="/assets/wizard-init.8b9d0e7e.png",l="/assets/wizard-create-client.55688247.png",t="/assets/node-client.c5d0cbb4.png",p="/assets/controller.aaddfc1c.png",c="/assets/trigger-sound.a33791fd.png",r="/assets/create-env.e1966aeb.png",b=JSON.parse('{"title":"Working with Node Clients","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/node-clients.md","filePath":"tutorials/node-clients.md"}'),i={name:"tutorials/node-clients.md"},F=e("",65),d=[F];function y(u,h,f,g,m,E){return n(),a("div",null,d)}const v=s(i,[["render",y]]);export{b as __pageData,v as default};
diff --git a/assets/tutorials_plugin-platform-init.md.295295ef.js b/assets/tutorials_plugin-platform-init.md.8e724f2b.js
similarity index 99%
rename from assets/tutorials_plugin-platform-init.md.295295ef.js
rename to assets/tutorials_plugin-platform-init.md.8e724f2b.js
index b53871f..826fa28 100644
--- a/assets/tutorials_plugin-platform-init.md.295295ef.js
+++ b/assets/tutorials_plugin-platform-init.md.8e724f2b.js
@@ -1,4 +1,4 @@
-import{_ as s,o as e,c as n,Q as a}from"./chunks/framework.a5027060.js";const o="/assets/wizard-create-player-confirm.30e4d539.png",t="/assets/wizard-1.31b229d4.png",l="/assets/wizard-2.bebc51d1.png",p="/assets/wizard-3.883b2723.png",i="/assets/homepage.59c52cb9.png",r="/assets/homepage-multiple.dfd6ed6a.png",c="/assets/homepage-custom.6f5d06bf.png",v=JSON.parse('{"title":"Using Plugins 1 - The platform-init Plugin","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/plugin-platform-init.md","filePath":"tutorials/plugin-platform-init.md"}'),d={name:"tutorials/plugin-platform-init.md"},F=a(`

Using Plugins 1 - The platform-init Plugin

In this first tutorial on soundworks plugins, we will learn why and how to use the platform-init plugin, which aims to simplify the use of certain features (such as the Web Audio API) that require a user gesture to be properly initialized.

The tutorial requires basic knowledge of the soundworks wizard, so please refer to the getting started tutorial if you didn't check it yet.

Relevant documentation

Scaffolding the application and installing the plugin

First thing first, let's generate a new empty application with the @soundworks/create wizard. When the wizard will ask you for the name of the default client, enter the following informations:

  • Name it player
  • Select the browser target
  • Select the default template
sh
cd /path/to/working/directory
+import{_ as s,o as e,c as n,Q as a}from"./chunks/framework.22f5e90d.js";const o="/assets/wizard-create-player-confirm.30e4d539.png",t="/assets/wizard-1.31b229d4.png",l="/assets/wizard-2.bebc51d1.png",p="/assets/wizard-3.883b2723.png",i="/assets/homepage.59c52cb9.png",r="/assets/homepage-multiple.dfd6ed6a.png",c="/assets/homepage-custom.6f5d06bf.png",v=JSON.parse('{"title":"Using Plugins 1 - The platform-init Plugin","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/plugin-platform-init.md","filePath":"tutorials/plugin-platform-init.md"}'),d={name:"tutorials/plugin-platform-init.md"},F=a(`

Using Plugins 1 - The platform-init Plugin

In this first tutorial on soundworks plugins, we will learn why and how to use the platform-init plugin, which aims to simplify the use of certain features (such as the Web Audio API) that require a user gesture to be properly initialized.

The tutorial requires basic knowledge of the soundworks wizard, so please refer to the getting started tutorial if you didn't check it yet.

Relevant documentation

Scaffolding the application and installing the plugin

First thing first, let's generate a new empty application with the @soundworks/create wizard. When the wizard will ask you for the name of the default client, enter the following informations:

  • Name it player
  • Select the browser target
  • Select the default template
sh
cd /path/to/working/directory
 npx @soundworks/create@latest plugin-platform-init

wizard-create-player-confirm

Once done, go to the directory and launch the soundworks wizard again to install the plugin:

sh
cd plugin-platform-init
 npx soundworks

Select the install / uninstall soundworks plugins entry:

wizard-1

Select the @soundworks/plugin-platform-init using the space bar:

wizard-2

And confirm:

wizard-3

After the installation has completed, you can exit the wizard by pressing Ctrl+C or by selecting the → exit entry.

TIP

Note that the wizard asks you if you want to install plugins when creating the application. We just followed the long path to show you how to use the wizard within the application.

INFO

Note that this specific functionnality of the wizard is just a mere alias of npm install, it is equivalent to doing:

sh
npm install --save @soundworks/plugin-platform-init

If you open the package.json file, you should see the @soundworks/plugin-platform-init appearing under the dependencies key:

json
// package.json
   "dependencies": {
diff --git a/assets/tutorials_plugin-platform-init.md.295295ef.lean.js b/assets/tutorials_plugin-platform-init.md.8e724f2b.lean.js
similarity index 82%
rename from assets/tutorials_plugin-platform-init.md.295295ef.lean.js
rename to assets/tutorials_plugin-platform-init.md.8e724f2b.lean.js
index e4ae00d..9668f62 100644
--- a/assets/tutorials_plugin-platform-init.md.295295ef.lean.js
+++ b/assets/tutorials_plugin-platform-init.md.8e724f2b.lean.js
@@ -1 +1 @@
-import{_ as s,o as e,c as n,Q as a}from"./chunks/framework.a5027060.js";const o="/assets/wizard-create-player-confirm.30e4d539.png",t="/assets/wizard-1.31b229d4.png",l="/assets/wizard-2.bebc51d1.png",p="/assets/wizard-3.883b2723.png",i="/assets/homepage.59c52cb9.png",r="/assets/homepage-multiple.dfd6ed6a.png",c="/assets/homepage-custom.6f5d06bf.png",v=JSON.parse('{"title":"Using Plugins 1 - The platform-init Plugin","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/plugin-platform-init.md","filePath":"tutorials/plugin-platform-init.md"}'),d={name:"tutorials/plugin-platform-init.md"},F=a("",73),h=[F];function u(y,g,m,f,w,k){return e(),n("div",null,h)}const E=s(d,[["render",u]]);export{v as __pageData,E as default};
+import{_ as s,o as e,c as n,Q as a}from"./chunks/framework.22f5e90d.js";const o="/assets/wizard-create-player-confirm.30e4d539.png",t="/assets/wizard-1.31b229d4.png",l="/assets/wizard-2.bebc51d1.png",p="/assets/wizard-3.883b2723.png",i="/assets/homepage.59c52cb9.png",r="/assets/homepage-multiple.dfd6ed6a.png",c="/assets/homepage-custom.6f5d06bf.png",v=JSON.parse('{"title":"Using Plugins 1 - The platform-init Plugin","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/plugin-platform-init.md","filePath":"tutorials/plugin-platform-init.md"}'),d={name:"tutorials/plugin-platform-init.md"},F=a("",73),h=[F];function u(y,g,m,f,w,k){return e(),n("div",null,h)}const E=s(d,[["render",u]]);export{v as __pageData,E as default};
diff --git a/assets/tutorials_plugin-sync.md.9d4475e8.js b/assets/tutorials_plugin-sync.md.083de7a3.js
similarity index 74%
rename from assets/tutorials_plugin-sync.md.9d4475e8.js
rename to assets/tutorials_plugin-sync.md.083de7a3.js
index 6115141..4f4c3cf 100644
--- a/assets/tutorials_plugin-sync.md.9d4475e8.js
+++ b/assets/tutorials_plugin-sync.md.083de7a3.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as e,Q as a}from"./chunks/framework.a5027060.js";const o="/assets/sync-process.2c9ca871.png",t="/assets/ping-pong.1262802c.png",l="/assets/wizard-plugins.5a889a01.png",p="/assets/wizard-create-player-confirm.30e4d539.png",i="/assets/sync-screen.b314e6a9.png",c="/assets/sync-clients.8ef693f6.png",k=JSON.parse('{"title":"Using Plugins 2 - The sync Plugin","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/plugin-sync.md","filePath":"tutorials/plugin-sync.md"}'),r={name:"tutorials/plugin-sync.md"},d=a('

Using Plugins 2 - The sync Plugin

In this tutorial, we will dig into a very important problem when dealing with distributed system for music creation, i.e. how to synchronize our musical / audio events across the different devices that compose our system.

After a short introduction on why this can be an issue and of the underlying concepts involved in synchronizing devices on a network, we will learn how to use the @soundworks/plugin-sync plugin which is proposed to solve this particular issue.

Relevant documentation

Introduction

First of all let's start with a bit of theory to understand the general concepts and theory behing the sync plugin.

The "Why"

An important thing to understand when working with system composed of multiple devices is that each of them will live into a different timeline. Or to say it in a more formal way:

« An important observation is that, as a consequence of dealing with independent nodes, each one will have its own notion of time. In other words, we cannot assume that there is something like a global clock. This lack of a common reference of time leads to fundamental questions regarding the synchronization and coordination within a distributed system. » Maarten van Steen, and Andrew S. Tanenbaum. “A Brief Introduction to Distributed Systems.” Computing 98, no. 10, October 2016.

Indeed, each device have different physical clocks, each of them having a different time origin and furthermore a different speed. Most of the time, i.e. when we use our computers in our daily life, this is something we don't perceive as users, but only because our computers are constently synchronizing themselves with distant reference clocks through the network, using the Network Time Protocol (NTP).

We could consider at this that the problem is solved, i.e. let's use NTP! But unfortunately the problem is a bit more complicated in our context.

First, we cannot always assume that our devices will be connected to the Internet and thus able to connect to a NTP server. Indeed, in many situations, you will have to and/or want to create you own local network, and this, for several reasons: e.g. the venue where your artwork is presented has a poor network installation, you want to have some control over what happen on the network to make sure the bandwidth is properly used, etc.

Second, when you want to produce sounds in a synchronized way, the clocks that are of interest for you are not the system clocks but the audio clocks. Furthermore, we cannot assume that these two clocks, the system and the audio clocks, 1. share the same origin, e.g. the origin of AudioContext.currentTime is defined as when the context is created, and 2. that they even advance at the same speed, i.e. this is likely that the system and the soundcard won't share the same physical clock.

For all these reason, it is important in our context to have some way of synchronizing arbitrary clocks without relying on external resources such as a NTP server.

The "How"

On a more practical manner, we can thus consider that when trying to synchornize 2 clocks, we face a problem that be can express in the following form:

  • Tclock1 = a * Tclock2 + b

Where:

  • a is the speed difference between the two clocks, i.e. their drift
  • b is the origin offset, i.e. the delta time between their respective origin

For the sake of keeping things simple, in this tutorial, we will consider the ideal case where 1. the respective speed of the clocks is excatly the same, i.e. a = 1 and 2. the time of the propagation of a message on the network is constant (disclaimer, none of these assumptions are true in real life...). Hence, the goal will be to estimate b so that we can calculate Tclock1 from Tclock2 and inversely.

To achieve that, we need a clock that we consider as a reference, in our case the more simple is to use a clock provided by the server as all clients are connected to it. Then, as shown in the figure below, the clients will periodically asks the server for its current time, to calculate the offset of their respective clocks:

sync-process

More precisely at each iteration:

  1. The client takes it current time (tping),
  2. The client sends a message to server which takes its time tag at message reception (Tping)
  3. Then, the server sends back a time tagged message to the client (Tpong)
  4. The client takes its local time (tpong) at reception of the message from the server.

ping-pong

Hence if we consider that the travel time of the ping / pong messages are the same, we can compute the offset between the 2 clocks as the following:

  • Treference = (Tpong - Tping) / 2
  • tlocal = (tpong - tping) / 2
  • offset = tlocal - Treference

From this point, it is then possible for all clients of our network, to calculate a local estimation of the server clock. With such information, it is therefore possible for our clients to schedule audio or musical events in the same infered time reference, while scheduling the actual audio synthesis in their own local audio time.

While this explanation is indeed simplified, we hope it gives you some intuition on the logic behind the synchronization process between different nodes on a network.

Let's now experiement with the @soundworks/plugin-sync to see how all these ideas translate into code.

Scaffolding the application

First thing first, let's create a new project using the soundworks wizard:

sh
cd /path/to/working/directory
+import{_ as s,o as n,c as e,Q as a}from"./chunks/framework.22f5e90d.js";const o="/assets/sync-process.2c9ca871.png",t="/assets/ping-pong.1262802c.png",l="/assets/wizard-plugins.5a889a01.png",p="/assets/wizard-create-player-confirm.30e4d539.png",i="/assets/sync-screen.b314e6a9.png",c="/assets/sync-clients.8ef693f6.png",k=JSON.parse('{"title":"Using Plugins 2 - The sync Plugin","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/plugin-sync.md","filePath":"tutorials/plugin-sync.md"}'),r={name:"tutorials/plugin-sync.md"},d=a('

Using Plugins 2 - The sync Plugin

In this tutorial, we will dig into a very important problem when dealing with distributed system for music creation, i.e. how to synchronize our musical / audio events across the different devices that compose our system.

After a short introduction on why this can be an issue and of the underlying concepts involved in synchronizing devices on a network, we will learn how to use the @soundworks/plugin-sync plugin which is proposed to solve this particular issue.

Introduction

First of all let's start with a bit of theory to understand the general concepts and theory behing the sync plugin.

The "Why"

An important thing to understand when working with system composed of multiple devices is that each of them will live into a different timeline. Or to say it in a more formal way:

« An important observation is that, as a consequence of dealing with independent nodes, each one will have its own notion of time. In other words, we cannot assume that there is something like a global clock. This lack of a common reference of time leads to fundamental questions regarding the synchronization and coordination within a distributed system. » Maarten van Steen, and Andrew S. Tanenbaum. “A Brief Introduction to Distributed Systems.” Computing 98, no. 10, October 2016.

Indeed, each device have different physical clocks, each of them having a different time origin and furthermore a different speed. Most of the time, i.e. when we use our computers in our daily life, this is something we don't perceive as users, but only because our computers are constently synchronizing themselves with distant reference clocks through the network, using the Network Time Protocol (NTP).

We could consider at this that the problem is solved, i.e. let's use NTP! But unfortunately the problem is a bit more complicated in our context.

First, we cannot always assume that our devices will be connected to the Internet and thus able to connect to a NTP server. Indeed, in many situations, you will have to and/or want to create you own local network, and this, for several reasons: e.g. the venue where your artwork is presented has a poor network installation, you want to have some control over what happen on the network to make sure the bandwidth is properly used, etc.

Second, when you want to produce sounds in a synchronized way, the clocks that are of interest for you are not the system clocks but the audio clocks. Furthermore, we cannot assume that these two clocks, the system and the audio clocks, 1. share the same origin, e.g. the origin of AudioContext.currentTime is defined as when the context is created, and 2. that they even advance at the same speed, i.e. this is likely that the system and the soundcard won't share the same physical clock.

For all these reason, it is important in our context to have some way of synchronizing arbitrary clocks without relying on external resources such as a NTP server.

The "How"

On a more practical manner, we can thus consider that when trying to synchornize 2 clocks, we face a problem that be can express in the following form:

  • Tclock1 = a * Tclock2 + b

Where:

  • a is the speed difference between the two clocks, i.e. their drift
  • b is the origin offset, i.e. the delta time between their respective origin

For the sake of keeping things simple, in this tutorial, we will consider the ideal case where 1. the respective speed of the clocks is excatly the same, i.e. a = 1 and 2. the time of the propagation of a message on the network is constant (disclaimer, none of these assumptions are true in real life...). Hence, the goal will be to estimate b so that we can calculate Tclock1 from Tclock2 and inversely.

To achieve that, we need a clock that we consider as a reference, in our case the more simple is to use a clock provided by the server as all clients are connected to it. Then, as shown in the figure below, the clients will periodically asks the server for its current time, to calculate the offset of their respective clocks:

sync-process

More precisely at each iteration:

  1. The client takes it current time (tping),
  2. The client sends a message to server which takes its time tag at message reception (Tping)
  3. Then, the server sends back a time tagged message to the client (Tpong)
  4. The client takes its local time (tpong) at reception of the message from the server.

ping-pong

Hence if we consider that the travel time of the ping / pong messages are the same, we can compute the offset between the 2 clocks as the following:

  • Treference = (Tpong - Tping) / 2
  • tlocal = (tpong - tping) / 2
  • offset = tlocal - Treference

From this point, it is then possible for all clients of our network, to calculate a local estimation of the server clock. With such information, it is therefore possible for our clients to schedule audio or musical events in the same infered time reference, while scheduling the actual audio synthesis in their own local audio time.

While this explanation is indeed simplified, we hope it gives you some intuition on the logic behind the synchronization process between different nodes on a network.

Let's now experiement with the @soundworks/plugin-sync to see how all these ideas translate into code.

Scaffolding the application

First thing first, let's create a new project using the soundworks wizard:

sh
cd /path/to/working/directory
 npx @soundworks/create@latest plugin-sync

When the wizard will ask you to select the plugins you would like to install, select the @soundworks/plugin-platform-init and the @soundworks/plugin-sync:

wizard-plugins

Then, when the wizard will ask you for the configuration of the default client:

  • Name it player
  • Select the browser target
  • Select the default template

wizard-create-player-confirm

Finally, open the new plugin-sync directory in your favorite editor and launch the application in development mode:

sh
cd plugin-sync
 npm run dev

Using the sync plugin

Register the plugin

Now that eveything is ready let's start with installing our plugin both on the server and on the client side.

Open the src/server/index.js file and add the following code:

js
// src/server/index.js
 import '@soundworks/helpers/polyfills.js';
diff --git a/assets/tutorials_plugin-sync.md.9d4475e8.lean.js b/assets/tutorials_plugin-sync.md.083de7a3.lean.js
similarity index 81%
rename from assets/tutorials_plugin-sync.md.9d4475e8.lean.js
rename to assets/tutorials_plugin-sync.md.083de7a3.lean.js
index f28322e..91b6523 100644
--- a/assets/tutorials_plugin-sync.md.9d4475e8.lean.js
+++ b/assets/tutorials_plugin-sync.md.083de7a3.lean.js
@@ -1 +1 @@
-import{_ as s,o as n,c as e,Q as a}from"./chunks/framework.a5027060.js";const o="/assets/sync-process.2c9ca871.png",t="/assets/ping-pong.1262802c.png",l="/assets/wizard-plugins.5a889a01.png",p="/assets/wizard-create-player-confirm.30e4d539.png",i="/assets/sync-screen.b314e6a9.png",c="/assets/sync-clients.8ef693f6.png",k=JSON.parse('{"title":"Using Plugins 2 - The sync Plugin","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/plugin-sync.md","filePath":"tutorials/plugin-sync.md"}'),r={name:"tutorials/plugin-sync.md"},d=a("",67),y=[d];function h(F,u,g,m,f,w){return n(),e("div",null,y)}const v=s(r,[["render",h]]);export{k as __pageData,v as default};
+import{_ as s,o as n,c as e,Q as a}from"./chunks/framework.22f5e90d.js";const o="/assets/sync-process.2c9ca871.png",t="/assets/ping-pong.1262802c.png",l="/assets/wizard-plugins.5a889a01.png",p="/assets/wizard-create-player-confirm.30e4d539.png",i="/assets/sync-screen.b314e6a9.png",c="/assets/sync-clients.8ef693f6.png",k=JSON.parse('{"title":"Using Plugins 2 - The sync Plugin","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/plugin-sync.md","filePath":"tutorials/plugin-sync.md"}'),r={name:"tutorials/plugin-sync.md"},d=a("",67),y=[d];function h(F,u,g,m,f,w){return n(),e("div",null,y)}const v=s(r,[["render",h]]);export{k as __pageData,v as default};
diff --git a/assets/tutorials_state-manager.md.adebe4e9.js b/assets/tutorials_state-manager.md.9563d0e9.js
similarity index 99%
rename from assets/tutorials_state-manager.md.adebe4e9.js
rename to assets/tutorials_state-manager.md.9563d0e9.js
index 466d895..6e9aaae 100644
--- a/assets/tutorials_state-manager.md.adebe4e9.js
+++ b/assets/tutorials_state-manager.md.9563d0e9.js
@@ -1,4 +1,4 @@
-import{_ as s,o as a,c as e,Q as n}from"./chunks/framework.a5027060.js";const l="/assets/distributed-application.ec63aa91.png",t="/assets/distributed-state-management.d09470bb.png",o="/assets/wizard-create-player-confirm.30e4d539.png",p="/assets/global-server-log.8eafd9f0.png",c="/assets/global-client-log.a184f944.png",r="/assets/states-in-html.cfd64b16.png",i="/assets/create-controller-wizard.afe39dba.png",d="/assets/controller-1.8ae726c4.png",F="/assets/controller-2.a1db85de.png",y="/assets/controller-and-clients-1.db58d76e.png",h="/assets/controller-and-clients-2.51311d63.png",u="/assets/badly-defined-players.f2ea5e37.png",g="/assets/controller-player-final.ffc32479.png",x=JSON.parse('{"title":"Using the State Manager","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/state-manager.md","filePath":"tutorials/state-manager.md"}'),m={name:"tutorials/state-manager.md"},f=n('

Using the State Manager

In this tutorial, we will dig into the distributed state management system proposed by soundworks. After a short introduction on the underlying concepts, we will see how to use shared states, and how this pattern can help you to implement remote control and monitoring in your applications. Along the way, we will see how the shared states simplify the development of distributed applications by abstracting the network communications and messages routing.

Along the way, we will discover a related library, @ircam/sc-components, to simply create usable (and hopefully elegant) graphical user interfaces.

Relevant documentation

Introduction

First of all, let's start with a bit of theory to understand the concepts and general logic behind the soundworks' shared states.

The "Why"

Most of the time, we think of an application as "something" that runs on a computer with which a user can interact in some way. The idea of distributed application extends this to applications that run on several computers and where several users can interact at the same time. Or to say it in a more formal way:

« A distributed system is a collection of autonomous computing elements that appears to its users as a single coherent system. » Maarten van Steen, and Andrew S. Tanenbaum. “A Brief Introduction to Distributed Systems.” Computing 98, no. 10, October 2016.

distributed-application

Additionally, in creative contexts, it's important to have very simple ways to monitor and/or control the state of distant clients. This is true both during the development of the artwork / application, e.g. to tweak some synthesizer on distant machines from a central point (even in the studio, modifying some parameters on several machines can get cumbersome quite quickly), as well as during a performance, e.g. to control the general volume, to switch between two sections of the artwork, etc.

The StateManager and the SharedState abstractions proposed by soundworks provide a simple way to define and synchronize some sets of parameters that are of interest by multiple clients, while abstracting all the network communications involved.

The "How"

From a more technical point of view, the distributed state management system proposed by soundworks is a circular dataflow pattern (loosely inspired by the flux pattern proposed by Facebook) adapted to the particular needs of real-time distributed applications.

To that end, the flow data is structured according to a circular path that is always synchronized with the server.

distributed-state-management

As illustrated in the figure above, when an input (e.g. some user gesture) triggers a change in the state of a client (arrow 1, red), the data is automatically synchronized with a server-side representation of the state through WebSockets (arrow 2), which when done triggers the change in the rendering, be it audio or visual (arrow 3).

This simple pattern enables an important feature: any other node of the network can make a change on the same server-side representation of the state (arrow 1', blue), which will trigger 2 (red) and 3 (red) in a completely transparent way.

INFO

In these tutorials, when we speak of a node of the network, we consider both the clients and the server.

Form the point of view of the distributed state management system, the server is indeed a node just as any client. However, its central role gives it particular abilities and features.

Scaffolding the application

INFO

This section requires basic knowledge of the soundworks wizard, so please refer to the getting started tutorial if you didn't check it yet.

First thing first, let's generate a new empty application with the @soundworks/create wizard.

sh
cd /path/to/working/directory
+import{_ as s,o as a,c as e,Q as n}from"./chunks/framework.22f5e90d.js";const l="/assets/distributed-application.ec63aa91.png",t="/assets/distributed-state-management.d09470bb.png",o="/assets/wizard-create-player-confirm.30e4d539.png",p="/assets/global-server-log.8eafd9f0.png",c="/assets/global-client-log.a184f944.png",r="/assets/states-in-html.cfd64b16.png",i="/assets/create-controller-wizard.afe39dba.png",d="/assets/controller-1.8ae726c4.png",F="/assets/controller-2.a1db85de.png",y="/assets/controller-and-clients-1.db58d76e.png",h="/assets/controller-and-clients-2.51311d63.png",u="/assets/badly-defined-players.f2ea5e37.png",g="/assets/controller-player-final.ffc32479.png",x=JSON.parse('{"title":"Using the State Manager","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/state-manager.md","filePath":"tutorials/state-manager.md"}'),m={name:"tutorials/state-manager.md"},f=n('

Using the State Manager

In this tutorial, we will dig into the distributed state management system proposed by soundworks. After a short introduction on the underlying concepts, we will see how to use shared states, and how this pattern can help you to implement remote control and monitoring in your applications. Along the way, we will see how the shared states simplify the development of distributed applications by abstracting the network communications and messages routing.

Along the way, we will discover a related library, @ircam/sc-components, to simply create usable (and hopefully elegant) graphical user interfaces.

Relevant documentation

Introduction

First of all, let's start with a bit of theory to understand the concepts and general logic behind the soundworks' shared states.

The "Why"

Most of the time, we think of an application as "something" that runs on a computer with which a user can interact in some way. The idea of distributed application extends this to applications that run on several computers and where several users can interact at the same time. Or to say it in a more formal way:

« A distributed system is a collection of autonomous computing elements that appears to its users as a single coherent system. » Maarten van Steen, and Andrew S. Tanenbaum. “A Brief Introduction to Distributed Systems.” Computing 98, no. 10, October 2016.

distributed-application

Additionally, in creative contexts, it's important to have very simple ways to monitor and/or control the state of distant clients. This is true both during the development of the artwork / application, e.g. to tweak some synthesizer on distant machines from a central point (even in the studio, modifying some parameters on several machines can get cumbersome quite quickly), as well as during a performance, e.g. to control the general volume, to switch between two sections of the artwork, etc.

The StateManager and the SharedState abstractions proposed by soundworks provide a simple way to define and synchronize some sets of parameters that are of interest by multiple clients, while abstracting all the network communications involved.

The "How"

From a more technical point of view, the distributed state management system proposed by soundworks is a circular dataflow pattern (loosely inspired by the flux pattern proposed by Facebook) adapted to the particular needs of real-time distributed applications.

To that end, the flow data is structured according to a circular path that is always synchronized with the server.

distributed-state-management

As illustrated in the figure above, when an input (e.g. some user gesture) triggers a change in the state of a client (arrow 1, red), the data is automatically synchronized with a server-side representation of the state through WebSockets (arrow 2), which when done triggers the change in the rendering, be it audio or visual (arrow 3).

This simple pattern enables an important feature: any other node of the network can make a change on the same server-side representation of the state (arrow 1', blue), which will trigger 2 (red) and 3 (red) in a completely transparent way.

INFO

In these tutorials, when we speak of a node of the network, we consider both the clients and the server.

Form the point of view of the distributed state management system, the server is indeed a node just as any client. However, its central role gives it particular abilities and features.

Scaffolding the application

INFO

This section requires basic knowledge of the soundworks wizard, so please refer to the getting started tutorial if you didn't check it yet.

First thing first, let's generate a new empty application with the @soundworks/create wizard.

sh
cd /path/to/working/directory
 npx @soundworks/create@latest state-manager

When the wizard will ask you for the configuration of the default client:

  • Name it player
  • Select the browser target
  • Select the default template

wizard-create-player-confirm

Then open the new state-manager directory in your favorite editor and launch the application in development mode:

sh
cd state-manager
 npm run dev

Declaring schemas

The StateManager component is configured with JavaScript objects that declare a set of attributes and their properties, which we call "schemas". You can think of a schema as a kind of blueprint from which multiple SharedState instances can be created.

TIP

If you are familiar with databases, you can think of it has the schema of a database table.

The syntax for declaring schemas is described here.

In this application we will declare two different schemas:

  • A schema called global which we will use to store informations accessible by all nodes of the network. This shared state will be unique across the whole application, i.e. it will be created by the server and all player clients will "attach" to it.
  • A schema called player, which we will use to describe the state of a single client of the application. All clients with the player role will create their own SharedState instance from this scheme.

Let's then create the file src/server/schemas/global.js, and push the following code into it:

js
// src/server/schemas/global.js
 export default {
diff --git a/assets/tutorials_state-manager.md.adebe4e9.lean.js b/assets/tutorials_state-manager.md.9563d0e9.lean.js
similarity index 87%
rename from assets/tutorials_state-manager.md.adebe4e9.lean.js
rename to assets/tutorials_state-manager.md.9563d0e9.lean.js
index 294f589..2e238ab 100644
--- a/assets/tutorials_state-manager.md.adebe4e9.lean.js
+++ b/assets/tutorials_state-manager.md.9563d0e9.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as e,Q as n}from"./chunks/framework.a5027060.js";const l="/assets/distributed-application.ec63aa91.png",t="/assets/distributed-state-management.d09470bb.png",o="/assets/wizard-create-player-confirm.30e4d539.png",p="/assets/global-server-log.8eafd9f0.png",c="/assets/global-client-log.a184f944.png",r="/assets/states-in-html.cfd64b16.png",i="/assets/create-controller-wizard.afe39dba.png",d="/assets/controller-1.8ae726c4.png",F="/assets/controller-2.a1db85de.png",y="/assets/controller-and-clients-1.db58d76e.png",h="/assets/controller-and-clients-2.51311d63.png",u="/assets/badly-defined-players.f2ea5e37.png",g="/assets/controller-player-final.ffc32479.png",x=JSON.parse('{"title":"Using the State Manager","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/state-manager.md","filePath":"tutorials/state-manager.md"}'),m={name:"tutorials/state-manager.md"},f=n("",145),E=[f];function b(w,v,D,B,k,A){return a(),e("div",null,E)}const j=s(m,[["render",b]]);export{x as __pageData,j as default};
+import{_ as s,o as a,c as e,Q as n}from"./chunks/framework.22f5e90d.js";const l="/assets/distributed-application.ec63aa91.png",t="/assets/distributed-state-management.d09470bb.png",o="/assets/wizard-create-player-confirm.30e4d539.png",p="/assets/global-server-log.8eafd9f0.png",c="/assets/global-client-log.a184f944.png",r="/assets/states-in-html.cfd64b16.png",i="/assets/create-controller-wizard.afe39dba.png",d="/assets/controller-1.8ae726c4.png",F="/assets/controller-2.a1db85de.png",y="/assets/controller-and-clients-1.db58d76e.png",h="/assets/controller-and-clients-2.51311d63.png",u="/assets/badly-defined-players.f2ea5e37.png",g="/assets/controller-player-final.ffc32479.png",x=JSON.parse('{"title":"Using the State Manager","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/state-manager.md","filePath":"tutorials/state-manager.md"}'),m={name:"tutorials/state-manager.md"},f=n("",145),E=[f];function b(w,v,D,B,k,A){return a(),e("div",null,E)}const j=s(m,[["render",b]]);export{x as __pageData,j as default};
diff --git a/assets/tutorials_step-sequencer.md.e1ed474c.js b/assets/tutorials_step-sequencer.md.e1ed474c.js
new file mode 100644
index 0000000..504bd99
--- /dev/null
+++ b/assets/tutorials_step-sequencer.md.e1ed474c.js
@@ -0,0 +1,245 @@
+import{o as a,c as l,k as s,a as p,l as o,Q as n,f as e}from"./chunks/framework.22f5e90d.js";const t="/assets/architecture.0ef77bdd.png",c="/assets/select-plugins.e60d1bb6.png",F="/assets/create-default-client.71f9a758.png",r="/assets/create-thing-client.529240fd.png",i="/assets/controller-interface.dfe4e06a.png",y="/assets/controller-synced.db348175.png",d="/assets/filesystem-assets.31774b3f.png",u=n('

Building a Distributed Step Sequencer

In this tutorial, we will use the soundworks' sync plugin we just learned to build a more advanced application: a distributed step sequencer.

The step sequencer will be based on Node.js clients, representing each a track of our step sequencer, i.e. one the kick, one for the snare, etc. and one browser controller client to rule them all:

architecture

Along the way we will use another plugin, the checkin plugin, which allows us to assign a unique index to each clients.

Scaffolding application

Let's start with scaffolding our application using the soundworks wizard:

sh
cd path/to/tutorials
+npx @soundworks/create@latest step-sequencer

When the wizard ask to select the plugin, let's then select @soundworks/plugin-sync and the @soundworks/plugin-checkin plugins:

select-plugins

And let's define our default client as a controller:

create-default-client

Once done, let's go into our step-sequencer directory and install a few more dependencies we will need using npm:

sh
cd step-sequencer
+npm install --save @ircam/sc-scheduling @ircam/sc-loader node-web-audio-api

Finally, let's just create our node client, we will name thing:

sh
npx soundworks --create-client

create-thing-client

We can now start our server:

js
npm run dev

And, in different "Terminal", emulate 5 thing clients:

sh
cd path/to/tutorials/step-sequencer
+EMULATE=5 npm run watch thing

TIP

To easily get the current directory in "Terminal" you can use the pwd command

Defining the global state

Now that eveything is set up, let's continue with defining the different parameters that describe our application and declare them in a global state.

Indeed, we will need several parameter to control our step sequencer:

  • A variable which will define if our step sequencer is running or not ("start / stop").
  • A timestamp (in synchronized time) associated to the start / stop event to make sure all our clients start at the same exact time.
  • A BPM value for our step sequencer.
  • A score.

To keep things simple, we won't allow to change the BPM while the step sequencer is running. Indeed, having such functionality would imply to also synchronize our BPM change amongst every clients, which would lead to over complicate this tutorial.

Let's thus create a file named global.js in the src/server/schemas directory and translate these informations into a schema definition:

js
// src/server/schemas/global.js
+export default {
+  running: {
+    type: 'boolean',
+    default: false,
+  },
+  startTime: {
+    type: 'float',
+    default: null,
+    nullable: true,
+  },
+  BPM: {
+    type: 'integer',
+    default: 120,
+  },
+  score: {
+    type: 'any',
+    default: [],
+  },
+};

Let's then register this schema in our server:

js
// src/server/index.js
+import { loadConfig } from '../utils/load-config.js';
+import '../utils/catch-unhandled-errors.js';
+
+import globalSchema from './schemas/global.js'; 
+
+// ...
+
+const server = new Server(config);
+server.useDefaultApplicationTemplate();
+
+server.stateManager.registerSchema('global', globalSchema); 

And define some default values for our tracks. Note that we will consider that our step sequencer has 5 different tracks with 8 steps each, and that we will create a branch initialize our score in debug mode (with some values filled) according to a debug flag to ease the development:

js
await server.start();
+// change this flag to false to empty score by default 
+const debug = true; 
+let score; 
+ 
+if (debug) { 
+  // if debug, fill score with default values 
+  score = [ 
+    [0, 1, 0, 1, 0, 1, 0, 1], 
+    [0, 0, 0, 0, 0, 0, 0, 0], 
+    [0, 0, 0, 0, 0, 0, 1, 0], 
+    [0, 0, 1, 0, 0, 0, 1, 0], 
+    [1, 0, 0, 0, 1, 0, 0, 1], 
+  ]; 
+} else { 
+  // if not debug, empty score 
+  score = [ 
+    [0, 0, 0, 0, 0, 0, 0, 0], 
+    [0, 0, 0, 0, 0, 0, 0, 0], 
+    [0, 0, 0, 0, 0, 0, 0, 0], 
+    [0, 0, 0, 0, 0, 0, 0, 0], 
+    [0, 0, 0, 0, 0, 0, 0, 0], 
+  ]; 
+} 
+ 
+const global = await server.stateManager.create('global', { 
+  score, 
+}); 

Registering the plugins

Now that our state is set up, let's install and configure our different plugins

First let's register the plugins in the server side:

js
import '@soundworks/helpers/polyfills.js';
+import { Server } from '@soundworks/core/server.js';
+import pluginSync from '@soundworks/plugin-sync/server.js'; 
+import pluginCheckin from '@soundworks/plugin-checkin/server.js'; 
+
+import { loadConfig } from '../utils/load-config.js';
+
+// ...
+
+const server = new Server(config);
+server.useDefaultApplicationTemplate();
+
+server.pluginManager.register('sync', pluginSync); 
+server.pluginManager.register('checkin', pluginCheckin); 
+
+server.stateManager.registerSchema('global', globalSchema);

And in our two "controller" and "thing" clients. Note that as we will use the checkin to get a unique index which will allow us to get a track from the score to be played, we will only register the checkin plugin on the "thing" client.

Let's start with the "controller":

js
// src/clients/controller/index.js
+import launcher from '@soundworks/helpers/launcher.js';
+import pluginSync from '@soundworks/plugin-sync/client.js'; 
+
+import { html, render } from 'lit';
+
+// ...
+
+client.pluginManager.register('sync', pluginSync); 
+
+await client.start();

Then let's install our two plugins in our "thing" clients, as you may recall in the last tutorial, in this case we will want to synchronize the audio clock, which will thus require a bit more configuration:

js
// src/clients/thing/index.js
+import { Client } from '@soundworks/core/client.js';
+import launcher from '@soundworks/helpers/launcher.js';
+import pluginSync from '@soundworks/plugin-sync/client.js'; 
+import pluginCheckin from '@soundworks/plugin-checkin/client.js'; 
+import { AudioContext } from 'node-web-audio-api'; 
+
+import { loadConfig } from '../../utils/load-config.js';
+
+// ...
+
+const client = new Client(config);
+const audioContext = new AudioContext(); 
+ 
+client.pluginManager.register('checkin', pluginCheckin); 
+client.pluginManager.register('sync', syncPlugin, { 
+  getTimeFunction: () => audioContext.currentTime, 
+}); 

Implementing the controller

Now that everything is set up, it is now time to implement of our controller logic.

Let's first import a few components, attach to our global state and sketch our graphical user interface:

js
// src/clients/controller/index.js
+import { html, render } from 'lit';
+import '../components/sw-audit.js';
+
+import '@ircam/sc-components/sc-matrix.js'; 
+import '@ircam/sc-components/sc-text.js'; 
+import '@ircam/sc-components/sc-transport.js'; 
+import '@ircam/sc-components/sc-number.js'; 
+
+// ... 
+
+await client.start();
+
+const global = await client.stateManager.attach('global'); 
+// update screen on update 
+global.onUpdate(() => renderApp()); 
+
+function renderApp() {
+  render(html\`
+    <div class="controller-layout">
+      <header>
+        <h1>\${client.config.app.name} | \${client.role}</h1>
+        <sw-audit .client="\${client}"></sw-audit>
+      </header>
+      <section>
+        <p>Hello \${client.config.app.name}!</p> 
+        <div> 
+          <div style="margin-bottom: 4px;"> 
+            <sc-transport  
+              .buttons=\${['play', 'stop']} 
+              value=\${global.get('running') ? 'play' : 'stop'} 
+            ></sc-transport> 
+          </div> 
+          <div style="margin-bottom: 4px;"> 
+            <sc-text>BPM</sc-text> 
+            <sc-number 
+              min="50" 
+              max="240" 
+              value=\${global.get('BPM')} 
+            ></sc-number> 
+          </div> 
+          <div style="margin-bottom: 4px;"> 
+            <sc-matrix 
+              .value=\${global.get('score')} 
+            ></sc-matrix> 
+          </div> 
+        </div>
+      </section>
+    </div>
+  \`, $container);
+}

If you open your controller in a Web browser, you should now see the following interface:

controller-interface

Now let's just change a bit our code to propagate the changes made in our interface in the global state:

js
await client.start();
+
+  const global = await client.stateManager.attach('global');
+  // update screen on update
+  global.onUpdate(() => renderApp());
+
+  const sync = await client.pluginManager.get('sync'); 
+
+  function renderApp() {
+    render(html\`
+      <div class="controller-layout">
+        <header>
+          <h1>\${client.config.app.name} | \${client.role}</h1>
+          <sw-audit .client="\${client}"></sw-audit>
+        </header>
+        <section>
+          <div>
+            <div style="margin-bottom: 4px;">
+              <sc-transport
+                .buttons=\${['play', 'stop']}
+                value=\${global.get('running') ? 'play' : 'stop'}
+                @change=\${e => { 
+                  if (e.detail.value === 'stop') { 
+                    global.set({ running: false }); 
+                  } else { 
+                    // grab current sync time 
+                    const syncTime = sync.getSyncTime(); 
+                    // add an offset to the syncTime to handle network latency 
+                    const startTime = syncTime + 0.5; 
+                    // propagate values on the network 
+                    global.set({ running: true, startTime }); 
+                  } 
+                }} 
+              ></sc-transport>
+            </div>
+            <div style="margin-bottom: 4px;">
+              <sc-text>BPM</sc-text>
+              <sc-number
+                min="50"
+                max="240"
+                value=\${global.get('BPM')}
+                ?disabled=\${global.get('running')} 
+                @change=\${e => global.set({ BPM: e.detail.value })} 
+              ></sc-number>
+            </div>
+            <div style="margin-bottom: 4px;">
+              <sc-matrix
+                .value=\${global.get('score')}
+                @change=\${e => global.set({ score: e.detail.value })} 
+              ></sc-matrix>
+            </div>
+          </div>
+        </section>
+      </div>
+    \`, $container);
+  }

INFO

Note how we disabled the BPM number box when the step sequencer is running:

js
?disabled=\${global.get('running')}

to make clear to the user that the BPM can be changed only when it is stopped.

If you now open two controllers side by side, e.g. http://127.0.0.1:8000?emulate=2, you should see that the two controllers stay perfectly in synchronized:

controller-synced

Implementing the audio engine

Now that all our controls are set up, let's go back to our thing clients to implement the audio engine and logic.

First let's add a few audio files into our project, that our step sequencer will be able to use for audio rendering. For simplicity, let's put them in the public directory.

',58),f={class:"info custom-block"},E=s("p",{class:"custom-block-title"},"INFO",-1),g=["href"],h=n('

Your file system should now look like the following:

filesystem-assets

Now let's load these file into our thing clients:

js
import { AudioContext } from 'node-web-audio-api';
+import { AudioBufferLoader } from '@ircam/sc-loader'; 
+import { loadConfig } from '../../utils/load-config.js';
+
+// ...
+
+await client.start();
+
+const audioFiles = [ 
+  'public/assets/hh.wav', 
+  'public/assets/clap.wav', 
+  'public/assets/rimshot.wav', 
+  'public/assets/snare.wav', 
+  'public/assets/kick.wav', 
+]; 
+ 
+const loader = new AudioBufferLoader(); 
+const audioBuffers = await loader.load(audioFiles); 
+ 
+console.log(audioBuffers); 

You should see logged into the console the loaded audio buffers.

Then, let's create a scheduler, running in the synchronized time, i.e. scheduling events in the synchronized timeline, but able to provide us the corresponding time in the audioContext time reference:

js
import { AudioBufferLoader } from '@ircam/sc-loader';
+import { Scheduler } from '@ircam/sc-scheduling'; 
+import { loadConfig } from '../../utils/load-config.js';
+
+// ...
+
+await client.start();
+
+// retrieve initialized sync plugin 
+const sync = await client.pluginManager.get('sync'); 
+const scheduler = new Scheduler(() => sync.getSyncTime(), { 
+  // provide the transfert function that will allow the scheduler to map from 
+  // its current time (the sync time) and the audio time (the sync plugin local time) 
+  currentTimeToAudioTimeFunction: syncTime => sync.getLocalTime(syncTime), 
+}); 
+
+const audioFiles = [
+  // ...
+];

Then implement a simple audio engine that will play a track from the score and an associated buffer according to a given index:

Finally, let's attach to the global state and create our step sequencer engine which will react to updates of the global state:

`,9),w=JSON.parse('{"title":"Building a Distributed Step Sequencer","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/step-sequencer.md","filePath":"tutorials/step-sequencer.md"}'),m={name:"tutorials/step-sequencer.md"},v=Object.assign(m,{setup(D){return(B,A)=>(a(),l("div",null,[u,s("div",f,[E,s("p",null,[p("The set of samples used in the tutorial can be downloaded "),s("a",{href:o(e)("/static-assets/step-sequencer-samples.zip")},"here",8,g)])]),h]))}});export{w as __pageData,v as default}; diff --git a/assets/tutorials_step-sequencer.md.e1ed474c.lean.js b/assets/tutorials_step-sequencer.md.e1ed474c.lean.js new file mode 100644 index 0000000..9d7470c --- /dev/null +++ b/assets/tutorials_step-sequencer.md.e1ed474c.lean.js @@ -0,0 +1 @@ +import{o as a,c as l,k as s,a as p,l as o,Q as n,f as e}from"./chunks/framework.22f5e90d.js";const t="/assets/architecture.0ef77bdd.png",c="/assets/select-plugins.e60d1bb6.png",F="/assets/create-default-client.71f9a758.png",r="/assets/create-thing-client.529240fd.png",i="/assets/controller-interface.dfe4e06a.png",y="/assets/controller-synced.db348175.png",d="/assets/filesystem-assets.31774b3f.png",u=n("",58),f={class:"info custom-block"},E=s("p",{class:"custom-block-title"},"INFO",-1),g=["href"],h=n("",9),w=JSON.parse('{"title":"Building a Distributed Step Sequencer","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/step-sequencer.md","filePath":"tutorials/step-sequencer.md"}'),m={name:"tutorials/step-sequencer.md"},v=Object.assign(m,{setup(D){return(B,A)=>(a(),l("div",null,[u,s("div",f,[E,s("p",null,[p("The set of samples used in the tutorial can be downloaded "),s("a",{href:o(e)("/static-assets/step-sequencer-samples.zip")},"here",8,g)])]),h]))}});export{w as __pageData,v as default}; diff --git a/assets/tutorials_synchronized-scheduling.md.f02cef38.js b/assets/tutorials_synchronized-scheduling.md.f02cef38.js deleted file mode 100644 index bf29f36..0000000 --- a/assets/tutorials_synchronized-scheduling.md.f02cef38.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,o as i,c as t,k as e,a as s}from"./chunks/framework.a5027060.js";const m=JSON.parse('{"title":"Synchronized Scheduling - Building a Distributed Step Sequencer","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/synchronized-scheduling.md","filePath":"tutorials/synchronized-scheduling.md"}'),d={name:"tutorials/synchronized-scheduling.md"},r=e("h1",{id:"synchronized-scheduling-building-a-distributed-step-sequencer",tabindex:"-1"},[s("Synchronized Scheduling - Building a Distributed Step Sequencer "),e("a",{class:"header-anchor",href:"#synchronized-scheduling-building-a-distributed-step-sequencer","aria-label":'Permalink to "Synchronized Scheduling - Building a Distributed Step Sequencer"'},"​")],-1),c=e("p",null,"@todo",-1),a=[r,c];function o(u,l,h,p,_,g){return i(),t("div",null,a)}const b=n(d,[["render",o]]);export{m as __pageData,b as default}; diff --git a/assets/tutorials_synchronized-scheduling.md.f02cef38.lean.js b/assets/tutorials_synchronized-scheduling.md.f02cef38.lean.js deleted file mode 100644 index bf29f36..0000000 --- a/assets/tutorials_synchronized-scheduling.md.f02cef38.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as n,o as i,c as t,k as e,a as s}from"./chunks/framework.a5027060.js";const m=JSON.parse('{"title":"Synchronized Scheduling - Building a Distributed Step Sequencer","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/synchronized-scheduling.md","filePath":"tutorials/synchronized-scheduling.md"}'),d={name:"tutorials/synchronized-scheduling.md"},r=e("h1",{id:"synchronized-scheduling-building-a-distributed-step-sequencer",tabindex:"-1"},[s("Synchronized Scheduling - Building a Distributed Step Sequencer "),e("a",{class:"header-anchor",href:"#synchronized-scheduling-building-a-distributed-step-sequencer","aria-label":'Permalink to "Synchronized Scheduling - Building a Distributed Step Sequencer"'},"​")],-1),c=e("p",null,"@todo",-1),a=[r,c];function o(u,l,h,p,_,g){return i(),t("div",null,a)}const b=n(d,[["render",o]]);export{m as __pageData,b as default}; diff --git a/assets/tutorials_todo-noise.md.d1061eac.js b/assets/tutorials_todo-noise.md.63c93564.js similarity index 99% rename from assets/tutorials_todo-noise.md.d1061eac.js rename to assets/tutorials_todo-noise.md.63c93564.js index ac56690..51d01f7 100644 --- a/assets/tutorials_todo-noise.md.d1061eac.js +++ b/assets/tutorials_todo-noise.md.63c93564.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.a5027060.js";const e="/assets/install-plugin-platform-init.169972d8.png",o="/assets/create-player.ef5368fc.png",p="/assets/soundworks-devtools.d9e925b7.png",t="/assets/create-controller.1271e198.png",c="/assets/global-server-log.822a6d53.png",r="/assets/player-log-global.b0f55f02.png",F="/assets/global-player-controller.af9833c0.png",i="/assets/player-full.c56b8647.png",y="/assets/todo-noise-full.c1e1dfdb.png",A=JSON.parse('{"title":"The Todo Noise Application","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/todo-noise.md","filePath":"tutorials/todo-noise.md"}'),d={name:"tutorials/todo-noise.md"},h=l(`

The Todo Noise Application

In this tutorial we will build a simple application, which illustrates the most common type of distributed interaction you will need to implement in your own applications: i.e. remote monitoring and control.

The tutorial requires basic knowledge of the soundworks state manager and of the platform-init plugin, so please refer to the relevant tutorials if you didn't check them yet.

Along the way, we will discover how to create our own reusable Web Components using the Lit library proposed by default in soundworks applications.

Relevant documentation

User Story

The application purposely privileges the point of view of a user in a working situation (e.g. developer, designer, composer or performer) rather than the point of view of the end user (e.g. participant, audience). Indeed, while the later is most of the time very specific to the application or artwork, the former generally requires some properties and features that are relatively common. To illustrate this two roles, the application is composed of two different types of clients: the player and the controller.

The player can be envisioned as the client dedicated to the end users. The application can accept any number of players and each player has access to the following fonctionalities:

  • It can trigger a sound.
  • It can start and stop a synthesizer.
  • It can update a parameter (i.e. the frequency of the synths).

The controller is dedicated to the user in working situation, be it during the creation or the performance of the artwork. The application can accept any number of controllers and each of them has access to the following fonctionalities:

  • It controls global parameters of the application (i.e. mute, master volume). These global parameters must be synchronized amongst all the clients of the application (i.e. player and controller).
  • It can take full control over any player, i.e. the change the volume, trigger a sound and change the state of the synthesizer as if he was the client itself.

This minimal set of functionalities should provide a good overview of several important and recurring patterns at stake in real-time distributed audio applications.

Scaffolding the application

First thing first, let's generate a new empty application with the @soundworks/create wizard:

sh
cd /path/to/working/directory
+import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.22f5e90d.js";const e="/assets/install-plugin-platform-init.169972d8.png",o="/assets/create-player.ef5368fc.png",p="/assets/soundworks-devtools.d9e925b7.png",t="/assets/create-controller.1271e198.png",c="/assets/global-server-log.822a6d53.png",r="/assets/player-log-global.b0f55f02.png",F="/assets/global-player-controller.af9833c0.png",i="/assets/player-full.c56b8647.png",y="/assets/todo-noise-full.c1e1dfdb.png",A=JSON.parse('{"title":"The Todo Noise Application","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/todo-noise.md","filePath":"tutorials/todo-noise.md"}'),d={name:"tutorials/todo-noise.md"},h=l(`

The Todo Noise Application

In this tutorial we will build a simple application, which illustrates the most common type of distributed interaction you will need to implement in your own applications: i.e. remote monitoring and control.

The tutorial requires basic knowledge of the soundworks state manager and of the platform-init plugin, so please refer to the relevant tutorials if you didn't check them yet.

Along the way, we will discover how to create our own reusable Web Components using the Lit library proposed by default in soundworks applications.

Relevant documentation

User Story

The application purposely privileges the point of view of a user in a working situation (e.g. developer, designer, composer or performer) rather than the point of view of the end user (e.g. participant, audience). Indeed, while the later is most of the time very specific to the application or artwork, the former generally requires some properties and features that are relatively common. To illustrate this two roles, the application is composed of two different types of clients: the player and the controller.

The player can be envisioned as the client dedicated to the end users. The application can accept any number of players and each player has access to the following fonctionalities:

  • It can trigger a sound.
  • It can start and stop a synthesizer.
  • It can update a parameter (i.e. the frequency of the synths).

The controller is dedicated to the user in working situation, be it during the creation or the performance of the artwork. The application can accept any number of controllers and each of them has access to the following fonctionalities:

  • It controls global parameters of the application (i.e. mute, master volume). These global parameters must be synchronized amongst all the clients of the application (i.e. player and controller).
  • It can take full control over any player, i.e. the change the volume, trigger a sound and change the state of the synthesizer as if he was the client itself.

This minimal set of functionalities should provide a good overview of several important and recurring patterns at stake in real-time distributed audio applications.

Scaffolding the application

First thing first, let's generate a new empty application with the @soundworks/create wizard:

sh
cd /path/to/working/directory
 npx @soundworks/create@latest todo-noise

You can already select the @soundworks/plugin-platform-init plugin to have it installed.

install-plugin-platform-init

Then, when the wizard asks you for the name of the default client, just call it player, and select the browser target as well as the default template:

create-player

Once the wizard ended, let's launch the soundworks development tools inside our application and select the "create a new soundworks client" option to create our second type of client, the controller:

sh
cd todo-noise
 npx soundworks

soundworks-devtools

The devtool wizard will ask you for the same questions as when you just created the player client. This time call the client controller, select the browser target and the controller template. Select no, the default value, when the tool asks if the client should be used as default:

create-controller

TIP

Selecting a client as default means the client will be accessible at the root of the domain, which is for example more simple if you need to share an url with the public. In the other case the name of the client will be used as the route to access it.

For example, in our application:

  • the player client would be accessible at http://my-domain.com
  • the controller client would be accessible at http://my-domain.com/controller

Once done, you can exit the command-line devtool by typing Ctrl+C or by selecting the → exit entry option.

Now that our project is scaffolded, let's create the schemas describing the states for each player as well as the global state.

Creating and using the shared global state

To implement the user story defined above, the application will rely on 2 types of schema:

  • A schema defining global variables of the application (e.g. mute, master volume) which will be unique and shared by every connected clients.
  • A schema that is tied to each connected player, i.e. each player client will create its own shared state instance from this schema.

Let's start by defining and creating the global schema. Create a new file named global.js in the src/server/schemas/ directory, and fill it with the following code:

js
// src/server/schemas/global.js
 export default { 
diff --git a/assets/tutorials_todo-noise.md.d1061eac.lean.js b/assets/tutorials_todo-noise.md.63c93564.lean.js
similarity index 84%
rename from assets/tutorials_todo-noise.md.d1061eac.lean.js
rename to assets/tutorials_todo-noise.md.63c93564.lean.js
index 78cde44..ec81af8 100644
--- a/assets/tutorials_todo-noise.md.d1061eac.lean.js
+++ b/assets/tutorials_todo-noise.md.63c93564.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.a5027060.js";const e="/assets/install-plugin-platform-init.169972d8.png",o="/assets/create-player.ef5368fc.png",p="/assets/soundworks-devtools.d9e925b7.png",t="/assets/create-controller.1271e198.png",c="/assets/global-server-log.822a6d53.png",r="/assets/player-log-global.b0f55f02.png",F="/assets/global-player-controller.af9833c0.png",i="/assets/player-full.c56b8647.png",y="/assets/todo-noise-full.c1e1dfdb.png",A=JSON.parse('{"title":"The Todo Noise Application","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/todo-noise.md","filePath":"tutorials/todo-noise.md"}'),d={name:"tutorials/todo-noise.md"},h=l("",129),f=[h];function g(m,u,E,b,w,D){return a(),n("div",null,f)}const k=s(d,[["render",g]]);export{A as __pageData,k as default};
+import{_ as s,o as a,c as n,Q as l}from"./chunks/framework.22f5e90d.js";const e="/assets/install-plugin-platform-init.169972d8.png",o="/assets/create-player.ef5368fc.png",p="/assets/soundworks-devtools.d9e925b7.png",t="/assets/create-controller.1271e198.png",c="/assets/global-server-log.822a6d53.png",r="/assets/player-log-global.b0f55f02.png",F="/assets/global-player-controller.af9833c0.png",i="/assets/player-full.c56b8647.png",y="/assets/todo-noise-full.c1e1dfdb.png",A=JSON.parse('{"title":"The Todo Noise Application","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/todo-noise.md","filePath":"tutorials/todo-noise.md"}'),d={name:"tutorials/todo-noise.md"},h=l("",129),f=[h];function g(m,u,E,b,w,D){return a(),n("div",null,f)}const k=s(d,[["render",g]]);export{A as __pageData,k as default};
diff --git a/credits.html b/credits.html
index 05bd062..522399e 100644
--- a/credits.html
+++ b/credits.html
@@ -7,17 +7,17 @@
     
     
     
-    
+    
     
-    
-    
-    
+    
+    
+    
     
     
   
   
-    
Skip to content

Credits

Design & Development

soundworks has been initiated by Norbert Schnell, Sébastien Robaszkiewicz, and Benjamin Matuszewski at the ISMM team at Ircam - Centre Pompidou in the context of the CoSiMa research project founded by the French National Research Agency (ANR).

Development is now led by Benjamin Matuszewski, in the Sound Music Movement Interaction Team from the Ircam's STMS-LAB.

Supporting Research Projects

Initial and futher developments has been supported by the following research projects:

  • The DOTS project, funded by the French National Research Agency (ANR)
  • The Ircam projects BeCoMe and SO(a)P
  • The Constella(c)tions residency, funded by the STARTS program of the European Commission
  • The RAPID-MIX project, funded by the European Union’s Horizon 2020 research and innovation program
  • The CoSiMa project, funded by the French National Research Agency (ANR)

Artistic & Research Collaborations

The design & development of soundworks has also been conducted within many collaborations with composers, artists, designers and researchers.

A number of musical pieces and artworks created using soundworks can be found on the Ircam - Sound Music Movement Interaction team youtube channel https://www.youtube.com/ircam-ismm.

Some generic applications are also accessible online at https://apps.ismm.ircam.fr.

Citing this Work

  • Benjamin Matuszewski. A Web-Based Framework for Distributed Music System Research and Creation. AES - Journal of the Audio Engineering Society Audio-Accoustics-Application, Audio Engineering Society Inc, 2020. <hal-03033143>
  • Frederic Bevilacqua, Benjamin Matuszewski, Garth Paine, Norbert Schnell. On Designing, Composing and Performing Networked Collective Interactions. Organised Sound, Cambridge University Press (CUP), 2021, 26 (3), pp.333-339. <hal-03575509>
  • Benjamin Matuszewski. A Web-Based Framework for Distributed Music System Research and Creation. AES - Journal of the Audio Engineering Society Audio-Accoustics-Application, Audio Engineering Society Inc, 2020. <hal-03033143>
  • Benjamin Matuszewski. Soundworks - A Framework for Networked Music Systems on the Web - State of Affairs and New Developments. Proceedings of the Web Audio Conference (WAC) 2019, Dec 2019, Trondheim, Norway. <hal-02387783>
  • Benjamin Matuszewski, Norbert Schnell, Frédéric Bevilacqua. Interaction Topologies in Mobile-Based Situated Networked Music Systems. Wireless Communications and Mobile Computing, Hindawi Publishing Corporation, 2019. <hal-02086673>
  • Jean-Philippe Lambert, Sébastien Robaszkiewicz, Norbert Schnell. Synchronisation for Distributed Audio Rendering over Heterogeneous Devices, in HTML5. 2nd Web Audio Conference, Apr 2016, Atlanta, GA, United States. <hal-01304889>
  • Norbert Schnell, Sébastien Robaszkiewicz. Soundworks – A playground for artists and developers to create collaborative mobile web performances. Proceedings of the Web Audio Conference (WAC'15), 2015, Paris, France. <hal-01580797>

License

BSD-3-Clause

- +
Skip to content

Credits

Design & Development

soundworks has been initiated by Norbert Schnell, Sébastien Robaszkiewicz, and Benjamin Matuszewski at the ISMM team at Ircam - Centre Pompidou in the context of the CoSiMa research project founded by the French National Research Agency (ANR).

Development is now led by Benjamin Matuszewski, in the Sound Music Movement Interaction Team from the Ircam's STMS-LAB.

Supporting Research Projects

Initial and futher developments has been supported by the following research projects:

  • The DOTS project, funded by the French National Research Agency (ANR)
  • The Ircam projects BeCoMe and SO(a)P
  • The Constella(c)tions residency, funded by the STARTS program of the European Commission
  • The RAPID-MIX project, funded by the European Union’s Horizon 2020 research and innovation program
  • The CoSiMa project, funded by the French National Research Agency (ANR)

Artistic & Research Collaborations

The design & development of soundworks has also been conducted within many collaborations with composers, artists, designers and researchers.

A number of musical pieces and artworks created using soundworks can be found on the Ircam - Sound Music Movement Interaction team youtube channel https://www.youtube.com/ircam-ismm.

Some generic applications are also accessible online at https://apps.ismm.ircam.fr.

Citing this Work

  • Benjamin Matuszewski. A Web-Based Framework for Distributed Music System Research and Creation. AES - Journal of the Audio Engineering Society Audio-Accoustics-Application, Audio Engineering Society Inc, 2020. <hal-03033143>
  • Frederic Bevilacqua, Benjamin Matuszewski, Garth Paine, Norbert Schnell. On Designing, Composing and Performing Networked Collective Interactions. Organised Sound, Cambridge University Press (CUP), 2021, 26 (3), pp.333-339. <hal-03575509>
  • Benjamin Matuszewski. A Web-Based Framework for Distributed Music System Research and Creation. AES - Journal of the Audio Engineering Society Audio-Accoustics-Application, Audio Engineering Society Inc, 2020. <hal-03033143>
  • Benjamin Matuszewski. Soundworks - A Framework for Networked Music Systems on the Web - State of Affairs and New Developments. Proceedings of the Web Audio Conference (WAC) 2019, Dec 2019, Trondheim, Norway. <hal-02387783>
  • Benjamin Matuszewski, Norbert Schnell, Frédéric Bevilacqua. Interaction Topologies in Mobile-Based Situated Networked Music Systems. Wireless Communications and Mobile Computing, Hindawi Publishing Corporation, 2019. <hal-02086673>
  • Jean-Philippe Lambert, Sébastien Robaszkiewicz, Norbert Schnell. Synchronisation for Distributed Audio Rendering over Heterogeneous Devices, in HTML5. 2nd Web Audio Conference, Apr 2016, Atlanta, GA, United States. <hal-01304889>
  • Norbert Schnell, Sébastien Robaszkiewicz. Soundworks – A playground for artists and developers to create collaborative mobile web performances. Proceedings of the Web Audio Conference (WAC'15), 2015, Paris, France. <hal-01580797>

License

BSD-3-Clause

+ \ No newline at end of file diff --git a/ecosystem/ecosystem.html b/ecosystem/ecosystem.html index c9ade9e..504d555 100644 --- a/ecosystem/ecosystem.html +++ b/ecosystem/ecosystem.html @@ -7,21 +7,21 @@ - + - - - + + + -
Skip to content

Ecosystem

@soundworks/core

The core of the framework is principally dedicated to:

  • WebSocket communications
  • Distributed state management
  • Plugin hosting

Note

Most of the time you won't need to install soundworks manually, as the application template already takes care of that.

sh
npm install --save @soundworks/core

→ documentation
→ github
→ npm

soundworks/core functionalities can be extended by installing plugins. Here is a list of available plugins so far:

@soundworks/plugin-audio-buffer-loader

soundworks plugin for loading and managing audio buffers and related JSON data. Currently limited to .mp3, .wav or .json formats to enforce browser compatibility and support (meaning support for Safari...)

sh
npm install @soundworks/plugin-audio-buffer-loader --save

→ github
→ npm
→ example
→ example (w/ filesystem)

@soundworks/plugin-checkin

soundworks plugin for assigning a ticket (unique index) to the client among the available ones. The number of available tickets can be limited and tickets can be associated with additional data.

sh
npm install @soundworks/plugin-checkin --save

→ github
→ npm
→ example

@soundworks/plugin-filesystem

soundworks plugin to parse and watch directories and distribute their content to all clients in real-time.

sh
npm install @soundworks/plugin-filesystem --save

→ github
→ npm
→ example

@soundworks/plugin-logger

soundworks plugin dedicated to recording arbitrarily from any node of the network into plain old files.

sh
npm install @soundworks/plugin-logger --save

→ github
→ npm
→ example

@soundworks/plugin-platform

soundworks plugin that checks the availability of features required by the application, and their initialisation. It also provides an entry point for features that may require a user gesture (e.g. clicking on the screen to resume an audio context). The plugin can also be used to simply add a splash screen to the application.

sh
npm install @soundworks/plugin-platform --save

→ github
→ npm
→ example
→ example (w/ devicemotion)

@soundworks/plugin-position

soundworks plugin for locating people in an area. In the soundworks-template default views, the plugin is associated with an initialization screen where people are asked to provide their position on a map.

sh
npm install @soundworks/plugin-position --save

→ github
→ npm
→ example

@soundworks/plugin-scripting

soundworks plugin for runtime scripting. The plugin allows to define an entry point of the application that enables the end user to modify the behavior of the distributed application at runtime, following an end-user programming strategy.

sh
npm install @soundworks/plugin-scripting --save

→ github
→ npm
→ example

@soundworks/plugin-sync

soundworks plugin for synchronizing arbitrary clocks across devices. The plugin is basically a wrapper around the @ircam/sync library.

sh
npm install @soundworks/plugin-sync --save

→ github
→ npm
→ example

@soundworks-template

Project template for developing soundworks applications. The template provides a clean code base to start developing an application.

sh
git clone https://github.com/collective-soundworks/soundworks-template.git my-application
+    
Skip to content

Ecosystem

@soundworks/core

The core of the framework is principally dedicated to:

  • WebSocket communications
  • Distributed state management
  • Plugin hosting

Note

Most of the time you won't need to install soundworks manually, as the application template already takes care of that.

sh
npm install --save @soundworks/core

→ documentation
→ github
→ npm

soundworks/core functionalities can be extended by installing plugins. Here is a list of available plugins so far:

@soundworks/plugin-audio-buffer-loader

soundworks plugin for loading and managing audio buffers and related JSON data. Currently limited to .mp3, .wav or .json formats to enforce browser compatibility and support (meaning support for Safari...)

sh
npm install @soundworks/plugin-audio-buffer-loader --save

→ github
→ npm
→ example
→ example (w/ filesystem)

@soundworks/plugin-checkin

soundworks plugin for assigning a ticket (unique index) to the client among the available ones. The number of available tickets can be limited and tickets can be associated with additional data.

sh
npm install @soundworks/plugin-checkin --save

→ github
→ npm
→ example

@soundworks/plugin-filesystem

soundworks plugin to parse and watch directories and distribute their content to all clients in real-time.

sh
npm install @soundworks/plugin-filesystem --save

→ github
→ npm
→ example

@soundworks/plugin-logger

soundworks plugin dedicated to recording arbitrarily from any node of the network into plain old files.

sh
npm install @soundworks/plugin-logger --save

→ github
→ npm
→ example

@soundworks/plugin-platform

soundworks plugin that checks the availability of features required by the application, and their initialisation. It also provides an entry point for features that may require a user gesture (e.g. clicking on the screen to resume an audio context). The plugin can also be used to simply add a splash screen to the application.

sh
npm install @soundworks/plugin-platform --save

→ github
→ npm
→ example
→ example (w/ devicemotion)

@soundworks/plugin-position

soundworks plugin for locating people in an area. In the soundworks-template default views, the plugin is associated with an initialization screen where people are asked to provide their position on a map.

sh
npm install @soundworks/plugin-position --save

→ github
→ npm
→ example

@soundworks/plugin-scripting

soundworks plugin for runtime scripting. The plugin allows to define an entry point of the application that enables the end user to modify the behavior of the distributed application at runtime, following an end-user programming strategy.

sh
npm install @soundworks/plugin-scripting --save

→ github
→ npm
→ example

@soundworks/plugin-sync

soundworks plugin for synchronizing arbitrary clocks across devices. The plugin is basically a wrapper around the @ircam/sync library.

sh
npm install @soundworks/plugin-sync --save

→ github
→ npm
→ example

@soundworks-template

Project template for developing soundworks applications. The template provides a clean code base to start developing an application.

sh
git clone https://github.com/collective-soundworks/soundworks-template.git my-application
 cd my-application
 rm -Rf .git
 npm install
 npm run dev

→ github

Additionally to the @soundworks/core package, the template installs and uses the @soundworks/template-build and @soundworks/template-helpers to simplify a set of common tasks.

@soundworks/template-build

Build scripts of the soundworks-template

sh
npm install --save @soundworks/template-build

→ github
→ npm

@soundworks/template-helpers

Set of common helpers (init views, etc.) for applications based on the soundworks-template

sh
npm install --save @soundworks/template-helpers

→ github
→ npm

- + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 1ec315a..6d963f1 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"introduction.md":"9e712117","api.md":"b2e5592a","misc__local-deployment.md":"897b7ab9","plugins_checkin.md":"03420b33","misc__deployment.md":"1365ac44","index.md":"039ad7d2","misc__todo_electron-applications.md":"9360eeec","plugins_filesystem.md":"2c015cb2","misc__contributing-to-this-site.md":"1790efde","plugins_position.md":"13d16364","plugins_license.md":"8d79824c","plugins_platform-init.md":"598c238b","ecosystem_ecosystem.md":"454356e9","tutorials__context.md":"ec91752e","credits.md":"bc93c26a","tutorials_node-clients.md":"41b5e9bb","plugins_logger.md":"06439713","tutorials__connected-lamp.md":"5f34992a","tutorials_getting-started.md":"c674cd44","misc_web-sockets-101.md":"70030a45","plugins_scripting.md":"0e781cdc","tutorials_plugin-platform-init.md":"295295ef","tutorials_plugin-sync.md":"9d4475e8","plugins_sync.md":"a42cbef0","tutorials_state-manager.md":"adebe4e9","tutorials_synchronized-scheduling.md":"f02cef38","tutorials_todo-noise.md":"d1061eac"} +{"tutorials_plugin-platform-init.md":"8e724f2b","plugins_position.md":"822c9f5b","index.md":"01c4e139","misc__todo_electron-applications.md":"bb55336f","misc__deployment.md":"9968983d","plugins_sync.md":"3fdb3fe3","tutorials__connected-lamp.md":"1d1f0736","plugins_license.md":"1d1a3c69","plugins_logger.md":"1095c07d","ecosystem_ecosystem.md":"b1253aba","misc__local-deployment.md":"b71a8b0c","plugins_filesystem.md":"1e0d26da","plugins_checkin.md":"74cada88","credits.md":"d7ddd485","tutorials_node-clients.md":"b8cd6b06","misc__contributing-to-this-site.md":"468e1bc9","introduction.md":"8778fc30","api.md":"7fbd8f8d","plugins_scripting.md":"38fc7c09","tutorials__context.md":"f32aa2f6","tutorials_step-sequencer.md":"e1ed474c","plugins_platform-init.md":"c0a9a7d6","misc_websockets-101.md":"28427512","tutorials_getting-started.md":"197f7fc1","tutorials_state-manager.md":"9563d0e9","tutorials_todo-noise.md":"63c93564","tutorials_plugin-sync.md":"083de7a3"} diff --git a/index.html b/index.html index 60b75cd..f4b7948 100644 --- a/index.html +++ b/index.html @@ -7,17 +7,17 @@ - + - - - + + + -
Skip to content

soundworks

Open-source creative coding framework for distributed applications based on Web technologies.

Primarily focused on music, soundworks aims at supporting rapid development of real-time distributed applications using JavaScript. It provides abstractions to hide the complexity of the network and to foster very rapid-prototyping and trial-and-error workflows that are typical in artistic practices.

More InfosGet Started →

Main Features

  • Support for both browser and Node.js clients
  • Real-time communications through WebSockets
  • Distributed state management
  • Plugin system to extend core functionalities
    (clock synchronization, runtime distributed scripting, etc.)

Projects & Demos

→   Installations

→   Performances & Concerts

→   Experimental Settings

What it is not

  • Not a framework to develop regular websites, although its probably feasible to do so if you are adventurous
  • Not a ready to use application, you will have to code.
    However, we maintain a set of quite generic applications that could fit your use-case: CoMo - Elements, Playground or Koryphaios
  • Probably a lot of other things (e.g. teapot, ...)

Related links and projects

BSD-3-Clause - {Sound Music Movement} Interaction Team - STMS-LAB
- +
Skip to content

soundworks

Open-source creative coding framework for distributed applications based on Web technologies.

Primarily focused on music, soundworks aims at supporting rapid development of real-time distributed applications using JavaScript. It provides abstractions to hide the complexity of the network and to foster very rapid-prototyping and trial-and-error workflows that are typical in artistic practices.

More InfosGet Started →

Main Features

  • Support for both browser and Node.js clients
  • Real-time communications through WebSockets
  • Distributed state management
  • Plugin system to extend core functionalities
    (clock synchronization, runtime distributed scripting, etc.)

Projects & Demos

→   Installations

→   Performances & Concerts

→   Experimental Settings

What it is not

  • Not a framework to develop regular websites, although its probably feasible to do so if you are adventurous
  • Not a ready to use application, you will have to code.
    However, we maintain a set of quite generic applications that could fit your use-case: CoMo - Elements, Playground or Koryphaios
  • Probably a lot of other things (e.g. teapot, ...)

Related links and projects

BSD-3-Clause - {Sound Music Movement} Interaction Team - STMS-LAB
+ \ No newline at end of file diff --git a/introduction.html b/introduction.html index f470187..e87bbab 100644 --- a/introduction.html +++ b/introduction.html @@ -7,17 +7,17 @@ - + - - - + + + -
Skip to content

Introduction

Goal

soundworks is an open-source creative coding framework for distributed applications based on Web technologies. Primarily focused on music, soundworks aims at supporting rapid development of real-time distributed applications using JavaScript. It provides abstractions to hide the complexity of the network and to foster very rapid-prototyping and trial-and-error workflows that are typical in artistic practices.

At its core, soundworks is primarily focused on synchronization of data and states amonst clients, and on simplifying their control both localy and remotely.

Another important feature is that one soundworks is to make no distinction between browsers or Node.js runtimes. As such it can be used to prototype and develop distributed applications running exclusively or partly on embedded hardware such as Rapberry Pi while using the same architecture, codebase and principles.

high level architecture

Despite the "sound" in soundworks, the framework doesn't do any choice for you regarding the audio library you might use (be it low-level Web Audio API or higher level libraries) and more generally on the rendering aspects of your application. Therefore, it can also be suited to develop applications outside the audio realm, such as distributed applications focused on graphics or multi-user collaborative games.

Philosophy

soundworks has been and is still primarily developped as an experimental platform for artistic and scientific research in the domain of music and arts. As such the code base is considered as an experimental platform which embodies a dynamic relation and a dialog betwenn "epistemic things"_ and "technical objects", to quote Rheinberger.

Such an approach has strong implications on the design and maintenance of the code base, as it must evolve in such way to keep questionning the theory and practices it embodies (in order to not be "reduced to the simple demonstration of a phenomenon" - to quote Rheinberger again).

To mitigate this need of change and mutation with the contradictory need of stability required by software development, we opted for a modular architecture and to follow the semver approach. We hope this choice will minimize the maintenance burden of existing application while allowing the framework to evolve according to novel research questions.

Finally, both for maintenance and philosophical reasons, one of the goal of soundworks is to follow Web Standarts as close as possible. As such, the code base is developped in pure JavaScript and will only integrate language features that have reach Stage 3. For example, while we hope to propose some "type" files derived from the JSDoc for TypeScript users in a near future (and the fact that it works or not is not in our hands), this won't be implemented into the code base until the type annotation proposal has evolved.

Architecture

The core of soundworks framework mainly provides the following fonctionnalities:

Client and server initalization

The soundworks Client and Server abstrations, which are the main entry points of soundworks, are responsible to do all the nitty-gritty of creating a distributed application: running an http server, setting up WebSockets, properly sharing configuration objets, handling initialization process, etc.

See the Getting Started tutorial

Distributed shared states

The StateManager component provides tools to help you create synchronized states among your distributed devices. The component is specifically designed to help implement remote control and monitoring which is a key feature for rapid prototyping real-time distributed applications where you want to control many devices from a single point.

See the State Manager tutorial

distributed shared states

Plugin host

soundworks also implements a plugin system to add new and more specific functionnalities to the core framework. For example, we provide plugins for synchronizing clocks, working with the filesystem or to dynamically script parts of application at runtime. All plugins live in their own repository and are versionned at their own pace to simplify future evolutions.

See the Plugin Platform Init tutorial

- +
Skip to content

Introduction

Goal

soundworks is an open-source creative coding framework for distributed applications based on Web technologies. Primarily focused on music, soundworks aims at supporting rapid development of real-time distributed applications using JavaScript. It provides abstractions to hide the complexity of the network and to foster very rapid-prototyping and trial-and-error workflows that are typical in artistic practices.

At its core, soundworks is primarily focused on synchronization of data and states amonst clients, and on simplifying their control both localy and remotely.

Another important feature is that one soundworks is to make no distinction between browsers or Node.js runtimes. As such it can be used to prototype and develop distributed applications running exclusively or partly on embedded hardware such as Rapberry Pi while using the same architecture, codebase and principles.

high level architecture

Despite the "sound" in soundworks, the framework doesn't do any choice for you regarding the audio library you might use (be it low-level Web Audio API or higher level libraries) and more generally on the rendering aspects of your application. Therefore, it can also be suited to develop applications outside the audio realm, such as distributed applications focused on graphics or multi-user collaborative games.

Philosophy

soundworks has been and is still primarily developped as an experimental platform for artistic and scientific research in the domain of music and arts. As such the code base is considered as an experimental platform which embodies a dynamic relation and a dialog betwenn "epistemic things"_ and "technical objects", to quote Rheinberger.

Such an approach has strong implications on the design and maintenance of the code base, as it must evolve in such way to keep questionning the theory and practices it embodies (in order to not be "reduced to the simple demonstration of a phenomenon" - to quote Rheinberger again).

To mitigate this need of change and mutation with the contradictory need of stability required by software development, we opted for a modular architecture and to follow the semver approach. We hope this choice will minimize the maintenance burden of existing application while allowing the framework to evolve according to novel research questions.

Finally, both for maintenance and philosophical reasons, one of the goal of soundworks is to follow Web Standarts as close as possible. As such, the code base is developped in pure JavaScript and will only integrate language features that have reach Stage 3. For example, while we hope to propose some "type" files derived from the JSDoc for TypeScript users in a near future (and the fact that it works or not is not in our hands), this won't be implemented into the code base until the type annotation proposal has evolved.

Architecture

The core of soundworks framework mainly provides the following fonctionnalities:

Client and server initalization

The soundworks Client and Server abstrations, which are the main entry points of soundworks, are responsible to do all the nitty-gritty of creating a distributed application: running an http server, setting up WebSockets, properly sharing configuration objets, handling initialization process, etc.

See the Getting Started tutorial

Distributed shared states

The StateManager component provides tools to help you create synchronized states among your distributed devices. The component is specifically designed to help implement remote control and monitoring which is a key feature for rapid prototyping real-time distributed applications where you want to control many devices from a single point.

See the State Manager tutorial

distributed shared states

Plugin host

soundworks also implements a plugin system to add new and more specific functionnalities to the core framework. For example, we provide plugins for synchronizing clocks, working with the filesystem or to dynamically script parts of application at runtime. All plugins live in their own repository and are versionned at their own pace to simplify future evolutions.

See the Plugin Platform Init tutorial

About the tutorials

These tutorials are focused on soundworks functionnality which are quite abstract according to the low-level platform APIs such as WebSockets. If you need some refresher on this point you can have a look here.

Also, the tutorials assume that you have some level of familiarity with the usage of the Web Audio API, if you need a refresher on that point, you can have a look there.

Else, you can just jump to the Getting Started tutorial.

+ \ No newline at end of file diff --git a/misc/_contributing-to-this-site.html b/misc/_contributing-to-this-site.html index 4fc1446..6c8faf0 100644 --- a/misc/_contributing-to-this-site.html +++ b/misc/_contributing-to-this-site.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

Contributing to this Website

You wrote some documentation about some soundworks related stuff that could be useful to others, or you would like to fix or even improve existing content (which might be a great challenge)? Please contribute!

Note

This site is generated using vuepress, full documentation can be found at https://vuepress.vuejs.org/

Install

  1. Clone repo and go to sources branch where the source files are located
sh
git clone git@github.com:collective-soundworks/collective-soundworks.github.io.git
+    
Skip to content

Contributing to this Website

You wrote some documentation about some soundworks related stuff that could be useful to others, or you would like to fix or even improve existing content (which might be a great challenge)? Please contribute!

Note

This site is generated using vuepress, full documentation can be found at https://vuepress.vuejs.org/

Install

  1. Clone repo and go to sources branch where the source files are located
sh
git clone git@github.com:collective-soundworks/collective-soundworks.github.io.git
 cd collective-soundworks.github.io
 git checkout sources
 npm install

Run Development Mode

Get remote changes

sh
git pull origin sources

Start the development server

sh
npm run dev

Go to http://127.0.0.1:8080 in your favorite browser (which shall not be Safari) to see the development preview and edit some content (cf. examples).

Publish

Note

The following commands will only work if you are part of the soundworks team. Otherwise, proceed the usual steps and create a pull request for changes.

Push your changes on the source branch

sh
git add -A
@@ -52,7 +52,7 @@
     // add your file here
   ]
 },
- + \ No newline at end of file diff --git a/misc/_deployment.html b/misc/_deployment.html index 981f036..ccbbfe5 100644 --- a/misc/_deployment.html +++ b/misc/_deployment.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

Deploying on the Internets

If you want want to deploy a single application on a single server, there is no particular complexity as the only thing you will have to do is to start the server on the port 80 for http or port 443 for https.

However, a more common situation is the need deploy several applications on the same server. Generally this is done by having a proxy server (Nginx or Apache) that handle the requests (and possibly the https certificates) and internally route the requests the proper Node.js / soundworks server.

In the remaining of this page we assume your domain is http(s)://my-domain.com and that you want to run an application behind the path my-app, so that the default soundworks client should be accessible at http(s)://my-domain.com/my-app

Application Configure

The first thing to do is to create a new env config file (e.g. config/env/prod.json) that will contain your production informations:

js
// cf. config/env/prod.json
+    
Skip to content

Deploying on the Internets

If you want want to deploy a single application on a single server, there is no particular complexity as the only thing you will have to do is to start the server on the port 80 for http or port 443 for https.

However, a more common situation is the need deploy several applications on the same server. Generally this is done by having a proxy server (Nginx or Apache) that handle the requests (and possibly the https certificates) and internally route the requests the proper Node.js / soundworks server.

In the remaining of this page we assume your domain is http(s)://my-domain.com and that you want to run an application behind the path my-app, so that the default soundworks client should be accessible at http(s)://my-domain.com/my-app

Application Configure

The first thing to do is to create a new env config file (e.g. config/env/prod.json) that will contain your production informations:

js
// cf. config/env/prod.json
 {
   // you are in a production environement
   type: 'production',
@@ -49,7 +49,7 @@
     }
   }
 }

Then reload the nginx config:

sh
nginx -s reload

And your application should be accessible on the internets at http(s)://my-domain.com/my-app!

Apache Config

@todo

...

- + \ No newline at end of file diff --git a/misc/_local-deployment.html b/misc/_local-deployment.html index 8840ef0..19e8c96 100644 --- a/misc/_local-deployment.html +++ b/misc/_local-deployment.html @@ -7,17 +7,17 @@ - + - - - + + + -
Skip to content

Deployment on a Local Network

This page describes how to create a local WiFi network to deploy your application.

Work in progress

...

- + + \ No newline at end of file diff --git a/misc/_todo_electron-applications.html b/misc/_todo_electron-applications.html index 9f03c00..bc0941c 100644 --- a/misc/_todo_electron-applications.html +++ b/misc/_todo_electron-applications.html @@ -7,17 +7,17 @@ - + - - - + + + - - + + \ No newline at end of file diff --git a/misc/web-sockets-101.html b/misc/websockets-101.html similarity index 80% rename from misc/web-sockets-101.html rename to misc/websockets-101.html index e3ad9c4..8d05590 100644 --- a/misc/web-sockets-101.html +++ b/misc/websockets-101.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

WebSockets 101

WebSocket is a communication protocol that provides full-duplex communication channels over a single TCP connection. In other, WebSocket enable bi-directionnal communication between a client and a server, meaning that both the client and the server can send data to the other, which is not possible with traditionnal HTTP protocol.

They are particularly useful for creating applications requiring instant updates, such as chats, multiplayer games, or in our case distributed music systems.

protocol

Let's then create a very simple application from groundup to have a taste of what using raw WebSockets means.

Scaffolding the project

Let's first create a new simple project:

sh
cd /path/to/working/directory
+    
Skip to content

WebSockets 101

WebSocket is a communication protocol that provides full-duplex communication channels over a single TCP connection. In other, WebSocket enable bi-directionnal communication between a client and a server, meaning that both the client and the server can send data to the other, which is not possible with traditionnal HTTP protocol.

They are particularly useful for creating applications requiring instant updates, such as chats, multiplayer games, or in our case distributed music systems.

protocol

Let's then create a very simple application from groundup to have a taste of what using raw WebSockets means.

Scaffolding the project

Let's first create a new simple project:

sh
cd /path/to/working/directory
 npx @ircam/create@latest websockets-101

In this project, we wont use the simple server which the command line tool propose (i.e. npx serve), but we will rather create our own server which will be able to handle handle websocket connections.

Let's then install some dependencies to simplifies the process:

sh
cd websockets-101
 npm install --save ws server-static finalhandler

After the last command, you should see a new file called package.json that have been created by npm in order to (amongst other things) track the dependencies of your application. Let's just add the following line in the file so that we can use a more modern and compliant javascript syntax within node:

js
// package.json
 {
@@ -116,7 +116,7 @@
   src.connect(audioContext.destination);
   src.start();
 });

And congrats! You now have a working simple distributed application.

Conclusion

This tutorial just showed you how simple it is to use WebSocket to create a distributed application, however it also gives you an idea of the problem you might encounter when using the raw WebSocket API.

Indeed, the API is rather low-level, e.g. implies to send messages as raw strings, to route them all manually. In this application, the messages where deliberately simple, but what if we want to send some variables (e.g. some frequency values) or more complex data structure?

Another issue is that the application is completely stateless, meaning there is no history of what happened in the past which can be an issue in more comple situations: for example, you want your clients to playback a sound file all together, but one of them just connected after the event was send, what should we do in such case?

soundworks is designed to hopefully help handle such more complex cases in simple manner.

- + \ No newline at end of file diff --git a/plugins/LICENSE.html b/plugins/LICENSE.html index 29701ea..8db532f 100644 --- a/plugins/LICENSE.html +++ b/plugins/LICENSE.html @@ -7,17 +7,17 @@ - + - - - + + + -
Skip to content

Copyright (c) 2014-present IRCAM – Centre Pompidou (France, Paris)

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

  • Neither the name of the IRCAM nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

- +
Skip to content

Copyright (c) 2014-present IRCAM – Centre Pompidou (France, Paris)

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

  • Neither the name of the IRCAM nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ \ No newline at end of file diff --git a/plugins/checkin.html b/plugins/checkin.html index c7a435d..805c39a 100644 --- a/plugins/checkin.html +++ b/plugins/checkin.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

soundworks | plugin checkin

npm version

soundworks plugin to assign a unique index to the clients among the available ones.

When a client disconnects, it's index is recycled into the pool of available indexes and can be re-assigned to a newly connected client. The number of available indexes can be limited and can be associated to additional data.

Table of Contents

Installation

sh
npm install @soundworks/plugin-checkin --save

Usage

Server

js
// index.js
+    
Skip to content

soundworks | plugin checkin

npm version

soundworks plugin to assign a unique index to the clients among the available ones.

When a client disconnects, it's index is recycled into the pool of available indexes and can be re-assigned to a newly connected client. The number of available indexes can be limited and can be associated to additional data.

Table of Contents

Installation

sh
npm install @soundworks/plugin-checkin --save

Usage

Server

js
// index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginCheckin from '@soundworks/plugin-checkin/server.js';
 
@@ -35,7 +35,7 @@
   capacity: 3,
   data: [{ color: 'green' }, { color: 'yellow' }, { color: 'pink' }],
 });

Credits

https://soundworks.dev/credits.html

License

BSD-3-Clause

- + \ No newline at end of file diff --git a/plugins/filesystem.html b/plugins/filesystem.html index b16af1c..d1c92ac 100644 --- a/plugins/filesystem.html +++ b/plugins/filesystem.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

soundworks | plugin filesystem

npm version

soundworks plugin to watch directories and update their contents from any node.

Table of Contents

Installation

sh
npm install @soundworks/plugin-filesystem --save

Usage

Server

js
// index.js
+    
Skip to content

soundworks | plugin filesystem

npm version

soundworks plugin to watch directories and update their contents from any node.

Table of Contents

Installation

sh
npm install @soundworks/plugin-filesystem --save

Usage

Server

js
// index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginFilesystem from '@soundworks/plugin-filesystem/server.js';
 
@@ -48,7 +48,7 @@
   dirname: 'my-dir',
   publicPath: 'assets'
 });

pluginFilesystemServer.switch(options)

Switch the filesystem to a new directory, e.g. to change project while keeping the same plugin and related logic at hand.

Kind: instance method of PluginFilesystemServer

ParamTypeDefaultDescription
optionsObject
[options.dirname]Stringdirectory to watch, plugin is idle if null
[options.publicPath]Stringoptionnal public path for the assets. If set, a route will be added to the router to serve the assets and an url entry will be added to each node of the tree.

pluginFilesystemServer.getTree() ⇒ Object

Return the current filesystem tree.

Kind: instance method of PluginFilesystemServer

pluginFilesystemServer.onUpdate(callback, [executeListener]) ⇒ function

Register a callback to execute when a file is created, modified or deleted on the underlying directory. The callback will receive the updated tree and the list of events describing the modifications made on the tree.

Kind: instance method of PluginFilesystemServer
Returns: function - Function that unregister the listener when executed.

ParamTypeDefaultDescription
callbackfunctionCallback function to execute
[executeListener]booleanfalseIf true, execute the given callback immediately.

pluginFilesystemServer.findInTree(path) ⇒ Object

Return a node from the tree matching the given path.

Kind: instance method of PluginFilesystemServer

ParamTypeDescription
pathStringpath of the node to be retrieved

pluginFilesystemServer.writeFile(pathname, data) ⇒ Promise

Write a file

Kind: instance method of PluginFilesystemServer

ParamTypeDescription
pathnameStringPathname.
dataString | BlobContent of the file.

pluginFilesystemServer.mkdir(pathname) ⇒ Promise

Create a directory

Kind: instance method of PluginFilesystemServer

ParamTypeDescription
pathnameStringPath of the directory.

pluginFilesystemServer.rename(oldPath, newPath) ⇒ Promise

Rename a file or directory

Kind: instance method of PluginFilesystemServer

ParamTypeDescription
oldPathStringCurrent pathname.
newPathStringNew pathname.

pluginFilesystemServer.rm(pathname) ⇒ Promise

Delete a file or directory

Kind: instance method of PluginFilesystemServer

ParamTypeDescription
pathnameStringPathname.

Credits

https://soundworks.dev/credits.html

License

BSD-3-Clause

- + \ No newline at end of file diff --git a/plugins/logger.html b/plugins/logger.html index 3ed6789..3f84220 100644 --- a/plugins/logger.html +++ b/plugins/logger.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

soundworks | plugin logger

npm version

soundworks plugin for recording arbitrary data from any node of the network into plain old files.

Table of Contents

Installation

sh
npm install @soundworks/plugin-logger --save

Usage

Server

js
// index.js
+    
Skip to content

soundworks | plugin logger

npm version

soundworks plugin for recording arbitrary data from any node of the network into plain old files.

Table of Contents

Installation

sh
npm install @soundworks/plugin-logger --save

Usage

Server

js
// index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginLogger from '@soundworks/plugin-logger/server.js';
 
@@ -66,7 +66,7 @@
 // data is sent to the server

API

Classes

PluginLoggerClient

Client-side representation of the soundworks sync plugin.

PluginLoggerServer

Server-side representation of the soundworks logger plugin.

WriterClient

Client-side stream writer.

Created and retrived by the client-side logger.createWriter(name, bufferSize) and logger.attachWriter(name, bufferSize) methods.

WriterServer

Server-side stream writer.

Created and retrived by the server-side logger.createWriter(name) method.

PluginLoggerClient

Client-side representation of the soundworks sync plugin.

Kind: global class

new PluginLoggerClient()

The constructor should never be called manually. The plugin will be instantiated by soundworks when registered in the pluginManager

Example

js
client.pluginManager.register('logger', pluginLogger);

pluginLoggerClient.createWriter(name, options)

Create a writer.

Kind: instance method of PluginLoggerClient

ParamTypeDefaultDescription
nameStringName of the writer. Used to generate the log file pathname.
optionsObjectOptions for the writer.
[options.bufferSize]Number1Number of writes buffered before sending the logs to the server.
[options.usePrefix]BooleantrueWhether the writer file should be prefixed with a YYYY.MM.DD_hh.mm.ss_uid_ string.
[options.allowReuse]BooleanfalseIf usePrefix is false, allow to reuse an existing underlying file for the writer. New data will be appended to the file. Can be usefull to log global informations in the same file amongst different sessions.

pluginLoggerClient.attachWriter(name, options)

Attach to a shared writer created by the server. Can be usefull to create files that gather informations from multiple nodes.

Kind: instance method of PluginLoggerClient

ParamTypeDefaultDescription
nameStringName of the writer. Used to generate the log file pathname.
optionsObjectOptions for the writer.
[options.bufferSize]Number1Number of writes buffered before sending the logs to the server.

PluginLoggerServer

Server-side representation of the soundworks logger plugin.

Kind: global class

new PluginLoggerServer()

The constructor should never be called manually. The plugin will be instantiated by soundworks when registered in the pluginManager

Available options:

  • [dirname=null] {String} - The directory in which the log files should be created. If null the plugin is in some "idle" state, and any call to createWriter (or client-side attachWriter) will throw an error. The directory can be changed at runtime usin the switch method.

Example

js
server.pluginManager.register('logger', pluginLogger, {
   dirname: 'my-logs',
 });

pluginLoggerServer.switch(dirname)

Change the directory in which the log files are created. Closes all existing writers.

Kind: instance method of PluginLoggerServer

ParamTypeDescription
dirnameString | ObjectPath to the new directory. As a convenience to match the plugin filesystem API, an object containing the 'dirname' key can also be passed.

pluginLoggerServer.createWriter(name, options)

Create a writer.

Kind: instance method of PluginLoggerServer

ParamTypeDefaultDescription
nameStringName of the writer. Used to generate the log file pathname.
optionsObjectOptions for the writer.
[options.usePrefix]BooleantrueWhether the writer file should be prefixed with a YYYY.MM.DD_hh.mm.ss_uid_ string.
[options.allowReuse]BooleanfalseIf usePrefix is false, allow to reuse an existing underlying file for the writer. New data will be appended to the file. Can be usefull to log global informations in the same file amongst different sessions.

WriterClient

Client-side stream writer.

Created and retrived by the client-side logger.createWriter(name, bufferSize) and logger.attachWriter(name, bufferSize) methods.

Kind: global class

writerClient.name

Name of the Writer.

Kind: instance property of WriterClient
Read only: true

writerClient.pathname

Pathname of the Writer.

Kind: instance property of WriterClient
Read only: true

writerClient.write(data)

Format and write data.

  • Successive write calls are added to a new line
  • Data can be of any type, it will be stringified before write.
  • TypedArrays are converted to Array before being stringified.

Kind: instance method of WriterClient

ParamTypeDescription
dataAnyData to be written

writerClient.flush()

Flush the buffer, only applies if bufferSize option is set.

Kind: instance method of WriterClient

writerClient.close() ⇒ Promise

Close the writer.

Kind: instance method of WriterClient
Returns: Promise - Promise that resolves when the stream is closed

writerClient.onPacketSend(callback) ⇒

Register a function to be executed when a packet is sent on the network., i.e. when the buffer is full or flushed on close.

Kind: instance method of WriterClient
Returns: Function that unregister the listener when executed.

ParamTypeDescription
callbackfunctionFunction to execute on close.

writerClient.onClose(callback) ⇒

Register a function to be executed when the Writer is closed. The function will be executed after the buffer has been flushed and underlying state has been deleted, and before the close Promise resolves.

Kind: instance method of WriterClient
Returns: Function that unregister the listener when executed.

ParamTypeDescription
callbackfunctionFunction to execute on close.

WriterServer

Server-side stream writer.

Created and retrived by the server-side logger.createWriter(name) method.

Kind: global class

writerServer.name

Name of the Writer.

Kind: instance property of WriterServer
Read only: true

writerServer.pathname

Pathname of the Writer.

Kind: instance property of WriterServer
Read only: true

writerServer.write(data)

Format and write data.

  • Successive write calls are added to a new line
  • Data can be of any type, it will be stringified before write.
  • TypedArrays are converted to Array before being stringified.

Kind: instance method of WriterServer

ParamTypeDescription
dataAnyData to be written

writerServer.close() ⇒ Promise

Close the writer and the underlying stream.

Kind: instance method of WriterServer
Returns: Promise - Promise that resolves when the stream is closed

writerServer.onClose(callback) ⇒

Register a function to be executed when the Writer is closed. The function will be executed when the underlying stream is closed and before the close() Promise is resolved.

Kind: instance method of WriterServer
Returns: Function that unregister the listener when executed.

ParamTypeDescription
callbackfunctionFunction to execute on close.

Credits

The code has been initiated in the framework of the WAVE and CoSiMa research projects, funded by the French National Research Agency (ANR).

License

BSD-3-Clause

- + \ No newline at end of file diff --git a/plugins/platform-init.html b/plugins/platform-init.html index 17a3bde..e086ea7 100644 --- a/plugins/platform-init.html +++ b/plugins/platform-init.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

soundworks | plugin platform init

npm version

soundworks plugin to handle initialization of browser client features that require a user interaction such as resuming audio context, etc.

Tutorial: https://soundworks.dev/tutorials/plugin-platform-init.html

Table of Contents

Installation

sh
npm install @soundworks/plugin-platform-init --save

Usage

Server

js
// src/server/index.js
+    
Skip to content

soundworks | plugin platform init

npm version

soundworks plugin to handle initialization of browser client features that require a user interaction such as resuming audio context, etc.

Tutorial: https://soundworks.dev/tutorials/plugin-platform-init.html

Table of Contents

Installation

sh
npm install @soundworks/plugin-platform-init --save

Usage

Server

js
// src/server/index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginPlatformInit from '@soundworks/plugin-platform-init/server.js';
 
@@ -67,7 +67,7 @@
 });

API

Classes

PluginPlatformInitClient

Client-side representation of the soundworks' platform init plugin.

PluginPlatformInitServer

Client-side representation of the soundworks' platform init plugin.

PluginPlatformInitClient

Client-side representation of the soundworks' platform init plugin.

Kind: global class

new PluginPlatformInitClient()

The constructor should never be called manually. The plugin will be instantiated by soundworks when registered in the pluginManager

Available options:

  • audioContext {AudioContext} - instance audio context to be resumed aliases: ['webaudio', 'audio-context', 'audioContext']
  • devicemotion {DeviceMotion} - @ircam/devicemotion module. aliases: ['devicemotion', 'device-motion']
  • micro {Boolean} - create a microphone stream with all feature (i.e. echoCancellation, noiseReduction, autoGainControl) set to false.
    • aliases: ['mic', 'micro']
    • todo: implement deviceId
  • video {Boolean} - create a camera stream
    • todo: implement deviceId
  • onCheck {Function} - function executed when the plugin is started to check for example if the feature is available. The provided function should return a Promise.
  • onActive {Function} - function executed on the user gesture to init a feature. The provided function should return a Promise.

Example

js
client.pluginManager.register('platform-init', pluginPlatformInit, { audioContext });

pluginPlatformInitClient.onUserGesture()

Method to be executed by the application on the first user gesture. Calling this method several times will result in a no-op after the first call.

By default, this method is automatically called by the soundworks launcher, you should not have to call it manually in most cases.

Kind: instance method of PluginPlatformInitClient
Example

js
myView.addEventListener((e) => {
   platformPlugin.onUserGesture(e);
 });

pluginPlatformInitClient.get(featureId)

Returns the poayload associated to a given feature.

Kind: instance method of PluginPlatformInitClient

ParamTypeDescription
featureIdStringId of the feature as given when the plugin was registered

PluginPlatformInitServer

Client-side representation of the soundworks' platform init plugin.

Kind: global class

Credits

https://soundworks.dev/credits.html

License

BSD-3-Clause

- + \ No newline at end of file diff --git a/plugins/position.html b/plugins/position.html index 84a79cf..9c0fafe 100644 --- a/plugins/position.html +++ b/plugins/position.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

soundworks | plugin position

npm version

soundworks plugin for locating people in an area.

When registered the soundworks launcher will automatically provide an interface so that people can give give their approximate position on a map or area.

Table of Contents

Installation

sh
npm install @soundworks/plugin-position --save

Usage

Server

js
// index.js
+    
Skip to content

soundworks | plugin position

npm version

soundworks plugin for locating people in an area.

When registered the soundworks launcher will automatically provide an interface so that people can give give their approximate position on a map or area.

Table of Contents

Installation

sh
npm install @soundworks/plugin-position --save

Usage

Server

js
// index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginPosition from '@soundworks/plugin-position/server.js';
 
@@ -46,7 +46,7 @@
   yRange: [-1, 1],
   backgroundImage: 'public/path/to/map.png',
 });

Credits

https://soundworks.dev/credits.html

License

BSD-3-Clause

- + \ No newline at end of file diff --git a/plugins/scripting.html b/plugins/scripting.html index 7af9dd4..b7301a6 100644 --- a/plugins/scripting.html +++ b/plugins/scripting.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

soundworks | plugin scripting

npm version

soundworks plugin for runtime distributed scripting.

Table of Contents

Installation

sh
npm install @soundworks/plugin-scripting --save

Usage

Server

js
// src/server/index.js
+    
Skip to content

soundworks | plugin scripting

npm version

soundworks plugin for runtime distributed scripting.

Table of Contents

Installation

sh
npm install @soundworks/plugin-scripting --save

Usage

Server

js
// src/server/index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginScripting from '@soundworks/plugin-scripting/server.js';
 
@@ -41,7 +41,7 @@
 const script = await scripting.attach('my-constants');
 const mod = await script.import();
 console.log(mod.answer);

Notes

The shared scripts are stored in the file system as raw Javascript files located in the directory defined on the server side (cf. dirname option).

The scripts are simple JavaScript modules that are re-bundled using esbuild each time their content is modified. As such, they can import installed dependencies (i.e. node_modules) or import other scripts.

For now, only named exports are supported. This is the responsibility of the code consuming the shared scripts to define the API that the scripts should expose.

Internally the scripting plugin relies on the @soundworks/plugin-filesystem plugin. As such, it provide the same security restrictions, i.e. in production mode only authentified and trusted clients are allowed to modify the scripts.

API

Classes

PluginScriptingClient

Client-side representation of the soundworks' scripting plugin.

PluginScriptingServer

Server-side representation of the soundworks' scripting plugin.

SharedScript

A SharedScript can be distributed amongst different clients and modified at runtime. The script source is stored directly in the filestem, see dirname option of the server-side plugin. A Shared script cannot be instatiated manually, it is retrieved by calling the client's or server PluScritping.attach method.

PluginScriptingClient

Client-side representation of the soundworks' scripting plugin.

Kind: global class

pluginScriptingClient.setGlobalScriptingContext(ctx)

Registers a global context object to be used in scripts. Note that the context is store globally, so several scripting plugins running in parallel will share the same underlying object. The global getGlobalScriptingContext function will allow to retrieve the given object from within scripts.

Kind: instance method of PluginScriptingClient

ParamTypeDescription
ctxObjectObject to store in global context

pluginScriptingClient.getList() ⇒ Array

Returns the list of all available scripts.

Kind: instance method of PluginScriptingClient

pluginScriptingClient.getTree() ⇒ Object

Convenience method that return the underlying filesystem tree. Can be usefull to reuse components created for the filesystem (e.g. sc-filesystem)

Kind: instance method of PluginScriptingClient

pluginScriptingClient.createScript(name, [value]) ⇒ Promise

Create a new script. The returned promise resolves when all underlyings states, files and script instances are up-to-date.

Kind: instance method of PluginScriptingClient

ParamTypeDefaultDescription
namestringName of the script, will be used as the actual filename
[value]string"''"Initial value of the script

pluginScriptingClient.updateScript(name, value) ⇒ Promise

Update an existing script. The returned promise resolves when all underlyings states, files and script instances are up-to-date.

Kind: instance method of PluginScriptingClient

ParamTypeDescription
namestringName of the script
valuestringNew value of the script

pluginScriptingClient.deleteScript(name) ⇒ Promise

Delete a script. The returned promise resolves when all underlyings states, files and script instances are up-to-date.

Kind: instance method of PluginScriptingClient

ParamTypeDescription
namestringName of the script

pluginScriptingClient.attach(name) ⇒ Promise

Attach to a script.

Kind: instance method of PluginScriptingClient
Returns: Promise - Promise that resolves on a new Script instance.

ParamTypeDescription
namestringName of the script

PluginScriptingServer

Server-side representation of the soundworks' scripting plugin.

Kind: global class

new PluginScriptingServer()

The constructor should never be called manually. The plugin will be instantiated by soundworks when registered in the pluginManager

Available options:

  • dirname {String} - directory in which the script files are located

If no option is given, for example before a user selects a project, the plugin will stay idle until switch is called.

Example

js
server.pluginManager.register('scripting', scriptingPlugin, { dirname })

pluginScriptingServer.setGlobalScriptingContext(ctx)

Registers a global context object to be used in scripts. Note that the context is store globally, so several scripting plugins running in parallel will share the same underlying object. The global getGlobalScriptingContext function will allow to retrieve the given object from within scripts.

Kind: instance method of PluginScriptingServer

ParamTypeDescription
ctxObjectObject to store in global context

pluginScriptingServer.getList() ⇒ Array

Returns the list of all available scripts.

Kind: instance method of PluginScriptingServer

pluginScriptingServer.getTree() ⇒ Object

Convenience method that return the underlying filesystem tree. Can be usefull to reuse components created for the filesystem (e.g. sc-filesystem)

Kind: instance method of PluginScriptingServer

pluginScriptingServer.onUpdate(callback, [executeListener]) ⇒ function

Register callback to execute when a script is created or deleted. The callback will receive the updated list of script names and the updated file tree.

Kind: instance method of PluginScriptingServer
Returns: function - Function that unregister the listener when executed.

ParamTypeDefaultDescription
callbackfunctionCallback function to execute
[executeListener]booleanfalseIf true, execute the given callback immediately.

pluginScriptingServer.switch(dirname)

Switch the plugin to watch and use another directory

Kind: instance method of PluginScriptingServer

ParamTypeDescription
dirnameString | ObjectPath to the new directory. As a convenience to match the plugin filesystem API, an object containing the 'dirname' key can also be passed

pluginScriptingServer.createScript(name, [value]) ⇒ Promise

Create a new script. The returned promise resolves when all underlyings states, files and script instances are up-to-date.

Kind: instance method of PluginScriptingServer

ParamTypeDefaultDescription
namestringName of the script, will be used as the actual filename
[value]string"''"Initial value of the script

pluginScriptingServer.updateScript(name, value) ⇒ Promise

Update an existing script. The returned promise resolves when all underlyings states, files and script instances are up-to-date.

Kind: instance method of PluginScriptingServer

ParamTypeDescription
namestringName of the script
valuestringNew value of the script

pluginScriptingServer.deleteScript(name) ⇒ Promise

Delete a script. The returned promise resolves when all underlyings states, files and script instances are up-to-date.

Kind: instance method of PluginScriptingServer

ParamTypeDescription
namestringName of the script

pluginScriptingServer.attach(name) ⇒ Promise

Attach to a script.

Kind: instance method of PluginScriptingServer
Returns: Promise - Promise that resolves on a new Script instance.

ParamTypeDescription
namestringName of the script

SharedScript

A SharedScript can be distributed amongst different clients and modified at runtime. The script source is stored directly in the filestem, see dirname option of the server-side plugin. A Shared script cannot be instatiated manually, it is retrieved by calling the client's or server PluScritping.attach method.

Kind: global class

sharedScript.source : string

Kind: instance property of SharedScript
Read only: true

sharedScript.error : string

Kind: instance property of SharedScript
Read only: true

sharedScript.transpiled : string

Kind: instance property of SharedScript
Read only: true

sharedScript.import() ⇒ Promise

Dynamically import the transpiled module. https://caniuse.com/?search=import()

Kind: instance method of SharedScript
Returns: Promise - Promise which fulfills to an object containing all exports the script.

sharedScript.detach()

Stop listening for updates

Kind: instance method of SharedScript

sharedScript.onUpdate(callback, [executeListener]) ⇒ function

Register a callback to be executed when the script is updated.

Kind: instance method of SharedScript
Returns: function - Function that unregister the callback when executed.

ParamTypeDefaultDescription
callbackfunctionCallback function
[executeListener]booleanfalseIf true, execute the given callback immediately.

sharedScript.onDetach(callback)

Register a callback to be executed when the script is detached, i.e. when detach as been called, or when the script has been deleted

Kind: instance method of SharedScript

ParamTypeDescription
callbackfunctionCallback function

sharedScript.update(value)

Alias for plugin.updateScript(name, value), calling this method will update the source of the script. The update will be propagated to all attached scripts

Kind: instance method of SharedScript

ParamTypeDescription
valuestringNew source code for the script.

sharedScript.delete()

Alias for plugin.deleteScript(name), calling this method will entirely delete the script: the file and all associated scripts. If you just want to stop using the current script without deleting it, call detach instead

Kind: instance method of SharedScript

Credits

https://soundworks.dev/credits.html

License

BSD-3-Clause

- + \ No newline at end of file diff --git a/plugins/sync.html b/plugins/sync.html index d4fbac1..fcfe448 100644 --- a/plugins/sync.html +++ b/plugins/sync.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

soundworks | plugin sync

npm version

soundworks plugin for synchronizing clients on a common master clock.

Because "as a consequence of dealing with independent nodes, each one will have its own notion of time [...] we cannot assume that there is something like a global clock" [M. van Steen & A. S. Tanenbaum], the sync plugin synchronizes a local clock from the client with a master clock from the server.

The plugin is a wrapper around the @ircam/sync library.

Table of Contents

Installation

sh
npm install --save @soundworks/plugin-sync

Usage

Server

js
// index.js
+    
Skip to content

soundworks | plugin sync

npm version

soundworks plugin for synchronizing clients on a common master clock.

Because "as a consequence of dealing with independent nodes, each one will have its own notion of time [...] we cannot assume that there is something like a global clock" [M. van Steen & A. S. Tanenbaum], the sync plugin synchronizes a local clock from the client with a master clock from the server.

The plugin is a wrapper around the @ircam/sync library.

Table of Contents

Installation

sh
npm install --save @soundworks/plugin-sync

Usage

Server

js
// index.js
 import { Server } from '@soundworks/core/server.js';
 import pluginSync from '@soundworks/plugin-sync/server.js';
 
@@ -71,7 +71,7 @@
 const sync = sync.getSyncTime(localTime);

Note that on the server-side, as it is the master clock, there is no difference between localTime and syncTime.

API

Classes

PluginSyncClient

Client-side representation of the soundworks sync plugin.

PluginSyncServer

Server-side representation of the soundworks sync plugin.

PluginSyncClient

Client-side representation of the soundworks sync plugin.

Kind: global class

new PluginSyncClient()

The constructor should never be called manually. The plugin will be instantiated by soundworks when registered in the pluginManager

Available options:

  • getTimeFunction {Function} - Function that returns a time in second. Defaults to performance.now is available or Date.now on browser clients, and process.hrtime on node clients, all of them with an origin set when the plugin starts.
  • [onReport=null] {Function} - Function to execute when the synchronization reports some statistics.

Example

js
client.pluginManager.register('sync', pluginSync, {
   getTimeFunction: () => audioContext.currentTime,
 });

pluginSyncClient.getLocalTime([syncTime]) ⇒ Number

Time of the local clock. If no arguments provided, returns the current local time, else performs the convertion between the given sync time and the associated local time.

Kind: instance method of PluginSyncClient
Returns: Number - Local time corresponding to the given sync time (sec).

ParamTypeDescription
[syncTime]Numberoptionnal, time from the sync clock (sec).

pluginSyncClient.getSyncTime([audioTime]) ⇒ Number

Time of the synced clock. If no arguments provided, returns the current sync time, else performs the convertion between the given local time and the associated sync time.

Kind: instance method of PluginSyncClient
Returns: Number - Sync time corresponding to the given local time (sec).

ParamTypeDescription
[audioTime]Numberoptionnal, time from the local clock (sec).

pluginSyncClient.onReport(callback)

Subscribe to reports from the sync process. See https://github.com/ircam-ismm/sync#SyncClient..reportFunction

Kind: instance method of PluginSyncClient

ParamType
callbackfunction

pluginSyncClient.getReport() ⇒ Object

Get last statistics from the synchronaization process. See https://github.com/ircam-ismm/sync#SyncClient..reportFunction

Kind: instance method of PluginSyncClient
Returns: Object - The last report

PluginSyncServer

Server-side representation of the soundworks sync plugin.

Kind: global class

new PluginSyncServer()

The constructor should never be called manually. The plugin will be instantiated by soundworks when registered in the pluginManager

Available options:

  • getTimeFunction {Function} - Function that returns a time in second. Defaults to process.hrtime with an origin set when the plugin starts. In most cases, you shouldn't have to modify this default behavior.

Example

js
server.pluginManager.register('sync', pluginSync);

pluginSyncServer.getLocalTime([syncTime]) ⇒ Number

Time of the local clock. If no arguments provided, returns the current local time, else performs the convertion between the given sync time and the associated local time.

Kind: instance method of PluginSyncServer
Returns: Number - Local time corresponding to the given sync time (sec).
Note:: server-side, getLocalTime and getSyncTime are identical

ParamTypeDescription
[syncTime]Numberoptionnal, time from the sync clock (sec).

pluginSyncServer.getSyncTime([localTime]) ⇒ Number

Time of the synced clock. If no arguments provided, returns the current sync time, else performs the convertion between the given local time and the associated sync time.

Kind: instance method of PluginSyncServer
Returns: Number - Sync time corresponding to the given local time (sec).
Note:: server-side, getLocalTime and getSyncTime are identical

ParamTypeDescription
[localTime]Numberoptionnal, time from the local clock (sec).

Resources

  • Jean-Philippe Lambert, Sébastien Robaszkiewicz, Norbert Schnell. Synchronisation for Distributed Audio Rendering over Heterogeneous Devices, in HTML5. 2nd Web Audio Conference, Apr 2016, Atlanta, GA, United States. <hal-01304889v1>

Credits

https://soundworks.dev/credits.html

License

BSD-3-Clause

- + \ No newline at end of file diff --git a/static-assets/step-sequencer-samples.zip b/static-assets/step-sequencer-samples.zip new file mode 100644 index 0000000..d1fc4b1 Binary files /dev/null and b/static-assets/step-sequencer-samples.zip differ diff --git a/tutorials/_connected-lamp.html b/tutorials/_connected-lamp.html index 45905d9..0b0fb1a 100644 --- a/tutorials/_connected-lamp.html +++ b/tutorials/_connected-lamp.html @@ -7,17 +7,17 @@ - + - - - + + + -
Skip to content

Creating a Connected Lamp

In this tutorial we will step aside music applications and system to see how soundworks can be used to prototype and build

- +
Skip to content

Creating a Connected Lamp

In this tutorial we will step aside music applications and system to see how soundworks can be used to prototype and build

+ \ No newline at end of file diff --git a/tutorials/_context.html b/tutorials/_context.html index e01d281..c91486a 100644 --- a/tutorials/_context.html +++ b/tutorials/_context.html @@ -7,17 +7,17 @@ - + - - - + + + -
Skip to content

Using Contexts

In this tutorial, we will learn how to use the Context class proposed by soundworks.

Relevant API documentation

Introduction

How context works

Creating a simple router

Using contexts to model sections of an experience

conclusion

- +
Skip to content

Using Contexts

In this tutorial, we will learn how to use the Context class proposed by soundworks.

Relevant API documentation

Introduction

How context works

Creating a simple router

Using contexts to model sections of an experience

conclusion

+ \ No newline at end of file diff --git a/tutorials/getting-started.html b/tutorials/getting-started.html index 73a455a..913a243 100644 --- a/tutorials/getting-started.html +++ b/tutorials/getting-started.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

Getting Started

In this tutorial, we will learn how to setup a project and develop a simple soundworks application where any connected user will be able to trigger a flash on the screen of all connected clients.

The tutorial requires basic knowledge of JavaScript, Node.js and of the command-line. If you are just starting with JavaScript development, please first set up a working environment following the instructions here and come back when done.

Prerequisites

Step 1 - Setting things up

The best and most simple way to create a new soundworks application is to use our dedicated command line tools:

soundworks/create

So first thing first, open a Terminal, go to some directory and execute the following command:

sh
cd path/to/working/dir
+    
Skip to content

Getting Started

In this tutorial, we will learn how to setup a project and develop a simple soundworks application where any connected user will be able to trigger a flash on the screen of all connected clients.

The tutorial requires basic knowledge of JavaScript, Node.js and of the command-line. If you are just starting with JavaScript development, please first set up a working environment following the instructions here and come back when done.

Prerequisites

Step 1 - Setting things up

The best and most simple way to create a new soundworks application is to use our dedicated command line tools:

soundworks/create

So first thing first, open a Terminal, go to some directory and execute the following command:

sh
cd path/to/working/dir
 npx @soundworks/create@latest

TIP

If you run the command for the first time (which is quite likely), the npx command will tell you that it needs to install the @soundworks/create package, just press Enter to accept and continue.

The wizard will startup and ask you for the name of the directory in which you want create the application: just write getting-started and press Enter. The wizard will automatically create the directory, copy a bunch of files and install the required dependencies as illustrated in the screenshot below.

INFO

Note that the screenshots in this guide may differ slightly from what you actually see in your console, as the CLI tool might have evolved a bit since the screenshots have been made.

create-project

Once the installation is done, the @soundworks/create wizard will propose you to install some soundworks plugins and some curated libraries. For now, just press Enter to skip this steps.

init-install-deps

After that step, the wizard will propose you to create a client of your application. Let's call it player and press Enter as show below.

create-player-1

The wizard will then ask a few questions to configure your client, again just press Enter to select the default values (i.e. type: browser and template: default):

create-player-2

create-player-3

Finally, the wizard will ask you to confirm your choices, press Enter.

create-player-confirm

The wizard will copy some files and configure the application for you. Your application is ready to be launched.

To make sure the application is correctly set up and installed, just follow the steps 1 and 3 proposed as next steps by the wizard.

init-end

So:

  1. Go to the directory: cd getting-started
  2. Optionally create a git project: git init && git add -A && git commit -m "first commit"
  3. Launch the project in development mode: npm run dev

After a few seconds, the server should be running:

server-launched

Open you favorite browser (which shall probably not be Safari), go to http://127.0.0.1:8000, and tada! You should see a rather pretty almost black screen:

fancy-black-screen

Congrats! You just configured and ran your first soundworks application. Now, let's have a closer look to the codebase.

Step 2 - Exploring the file structure of the application

Press Ctrl + C to stop the server and open the getting-started directory in your favorite text editor. You should see the following file structure:

sh
getting-started
 ├── .build              # Directory where your application is built
 ├── config              # Configuration files
@@ -99,7 +99,7 @@
     }, 50);
   }
 });

Now, whenever the trigger parameter of the global shared state is set to true, we change the background color of the screen to 'white' and put it back to 'black' after 50ms.

To see the shared state in action, and understand more precisely why we keep calling it a "shared state", let's emulate several parallel browser clients in our browser window. To that end, open http://127.0.0.1:8000?emulate=8 (note the ?emulate=8 at the end of the URL).

emulated-clients

If you click on any of these 8 emulated clients, all of them will blink. Indeed all of them are attached to the same global shared state, and react exactly in the same way to the updates of the state.

Conclusion

Congrats, you just wrote your first soundworks application. Along the way you learned quite a few things:

    1. How to setup a soundworks application using the @soundworks/create wizard,
    1. How to use some of the tools that are at your end to simplify development
    1. Discovered the shared states provided by soundworks, and how they allow you to simplify development and to hide network complexity.

On the next tutorial, we will explore more possibilities proposed by the soundworks' distributed state management system.

- + \ No newline at end of file diff --git a/tutorials/node-clients.html b/tutorials/node-clients.html index 683a2b9..b49645b 100644 --- a/tutorials/node-clients.html +++ b/tutorials/node-clients.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

Working with Node Clients

In this tutorial, we will explore how to use soundworks to create clients that run within a Node.js process, opening new possibilities of creating application ouside Web Browsers.

Indeed, this functionality allows to create applications that can work in screenless embedded hardware, such as the Raspberry Pi, allowing to access some fonctionnalities, such as controlling a motor or a LED, which are hard to achieve in sandboxed environment that are Web browsers.

To illustrate this possibility and discover some of the tools you have at hand to help you, we will build a very simple application where a browser controller client can trigger a sound synthesized by another client running in a Node.js process.

Scaffolding Application

Let's start with scaffolding our application:

sh
cd path/to/tutorials
+    
Skip to content

Working with Node Clients

In this tutorial, we will explore how to use soundworks to create clients that run within a Node.js process, opening new possibilities of creating application ouside Web Browsers.

Indeed, this functionality allows to create applications that can work in screenless embedded hardware, such as the Raspberry Pi, allowing to access some fonctionnalities, such as controlling a motor or a LED, which are hard to achieve in sandboxed environment that are Web browsers.

To illustrate this possibility and discover some of the tools you have at hand to help you, we will build a very simple application where a browser controller client can trigger a sound synthesized by another client running in a Node.js process.

Scaffolding Application

Let's start with scaffolding our application:

sh
cd path/to/tutorials
 npx @soundworks/create@latest node-clients

When the wizard asks you to create the default client, let's just create a browser client with the "controller" template (we will create our Node.js client afterward):

wizard-init

Then let's start our application with:

cd node-clients
 npm run dev

Implementing the control logic

Before implementing our Node.js cient, let's use the features we have learned so far so that our controller can trigger a sound on any of our future Node.js clients.

Let's start with defining the state, we will call thing that will be created by our Node.js clients when they connect to the application. Create a file named thing.js in src/server/schemas and declare the following schema definition:

js
// src/server/schemas/thing.js
 export default {
@@ -122,7 +122,7 @@
     osc.stop(now + 1); 
   }
 });

And that's all! You have now a simple soundworks client that runs into Node.js process and can trigger sound.

As you can see, the code you wrote to create this client is exactly the same as the one you would have written in a browser client. Indeed, abstracting the platform in such manner is an important goal of soundworks and of the related libraries, such as the node-web-audio-api package.

Notes

Emulating multiple clients

In previous tutorial, we often used the ?emulate=6 query parameter in our url to emulate several clients in only one browser window, which is very practical when developing a distributed application.

In a similar manner, this is also possible to run several node clients in the same terminal, for example run:

sh
EMULATE=4 npm run watch thing

to launch four clients in parallel.

Running node client on a network

Another important point to consider is that the node clients needs some configuration to be able to connect to the server. Indeed, when we launch a client in a browser we, as human, tell the browser where to reach the server when we write the URL in the address bar of the Web browser.

However, node clients don't have any address bar, hence if you node client doesn't run into your computer but in a remote device, it will need a bit of configuration to know the IP address of the server. To that end, you can launch the following command to create a environment config file that node clients will be able to consume:

sh
npx soundworks --create-env

create-env

A future tutorial will explain more detail about how to configure a soundworks application in a production setting.

Conclusion

In this tutorial, we have explored an important feature of soundworks, i.e. the possibility to create clients that are not running in a Web browser, but rather in a Node.js process.

In the next tutorials, we will continue our journey into soundworks, by tackling the important question of synchronization between different processes and machines.

- + \ No newline at end of file diff --git a/tutorials/plugin-platform-init.html b/tutorials/plugin-platform-init.html index 4f608f3..0bd4aa4 100644 --- a/tutorials/plugin-platform-init.html +++ b/tutorials/plugin-platform-init.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

Using Plugins 1 - The platform-init Plugin

In this first tutorial on soundworks plugins, we will learn why and how to use the platform-init plugin, which aims to simplify the use of certain features (such as the Web Audio API) that require a user gesture to be properly initialized.

The tutorial requires basic knowledge of the soundworks wizard, so please refer to the getting started tutorial if you didn't check it yet.

Relevant documentation

Scaffolding the application and installing the plugin

First thing first, let's generate a new empty application with the @soundworks/create wizard. When the wizard will ask you for the name of the default client, enter the following informations:

  • Name it player
  • Select the browser target
  • Select the default template
sh
cd /path/to/working/directory
+    
Skip to content

Using Plugins 1 - The platform-init Plugin

In this first tutorial on soundworks plugins, we will learn why and how to use the platform-init plugin, which aims to simplify the use of certain features (such as the Web Audio API) that require a user gesture to be properly initialized.

The tutorial requires basic knowledge of the soundworks wizard, so please refer to the getting started tutorial if you didn't check it yet.

Relevant documentation

Scaffolding the application and installing the plugin

First thing first, let's generate a new empty application with the @soundworks/create wizard. When the wizard will ask you for the name of the default client, enter the following informations:

  • Name it player
  • Select the browser target
  • Select the default template
sh
cd /path/to/working/directory
 npx @soundworks/create@latest plugin-platform-init

wizard-create-player-confirm

Once done, go to the directory and launch the soundworks wizard again to install the plugin:

sh
cd plugin-platform-init
 npx soundworks

Select the install / uninstall soundworks plugins entry:

wizard-1

Select the @soundworks/plugin-platform-init using the space bar:

wizard-2

And confirm:

wizard-3

After the installation has completed, you can exit the wizard by pressing Ctrl+C or by selecting the → exit entry.

TIP

Note that the wizard asks you if you want to install plugins when creating the application. We just followed the long path to show you how to use the wizard within the application.

INFO

Note that this specific functionnality of the wizard is just a mere alias of npm install, it is equivalent to doing:

sh
npm install --save @soundworks/plugin-platform-init

If you open the package.json file, you should see the @soundworks/plugin-platform-init appearing under the dependencies key:

json
// package.json
   "dependencies": {
@@ -84,7 +84,7 @@
 name: 'Hello Plugins', 
 author: '', 
 author: 'me & myself', 

And tada! If you now go to http://127.0.0.1:8000 you should now see something like:

homepage-custom

INFO

By default, the init views try to adapt to the locale of the browser and falls back to english if the localized texts do not exist. However, as we only provide english and french versions of the texts at time of writing the tutorial, it's likely that you have seen the english version.

If you are confortable with another language and are willing to contribute a localized version of this file, please open an issue or a pull request in the @soundworks/helpers repository!

Conclusion

In this tutorial, you have learned the basics of soundworks plugins usage, and more precisely how to use the platform-init plugin. While this plugin is not per se very complex, it can save you a lot of (quite boring) development time by simplifying the initialization of certains browser features. Along the way, you also discovered some of the functionalities provided by the launcher component that is automatically included in all soundworks applications created using the wizard.

In the next tutorial, we will wrap up what we have learned so far by creating a small working application where several clients can be used as distributed speakers by a central controller.

- + \ No newline at end of file diff --git a/tutorials/plugin-sync.html b/tutorials/plugin-sync.html index 9a56943..d7a252b 100644 --- a/tutorials/plugin-sync.html +++ b/tutorials/plugin-sync.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

Using Plugins 2 - The sync Plugin

In this tutorial, we will dig into a very important problem when dealing with distributed system for music creation, i.e. how to synchronize our musical / audio events across the different devices that compose our system.

After a short introduction on why this can be an issue and of the underlying concepts involved in synchronizing devices on a network, we will learn how to use the @soundworks/plugin-sync plugin which is proposed to solve this particular issue.

Relevant documentation

Introduction

First of all let's start with a bit of theory to understand the general concepts and theory behing the sync plugin.

The "Why"

An important thing to understand when working with system composed of multiple devices is that each of them will live into a different timeline. Or to say it in a more formal way:

« An important observation is that, as a consequence of dealing with independent nodes, each one will have its own notion of time. In other words, we cannot assume that there is something like a global clock. This lack of a common reference of time leads to fundamental questions regarding the synchronization and coordination within a distributed system. » Maarten van Steen, and Andrew S. Tanenbaum. “A Brief Introduction to Distributed Systems.” Computing 98, no. 10, October 2016.

Indeed, each device have different physical clocks, each of them having a different time origin and furthermore a different speed. Most of the time, i.e. when we use our computers in our daily life, this is something we don't perceive as users, but only because our computers are constently synchronizing themselves with distant reference clocks through the network, using the Network Time Protocol (NTP).

We could consider at this that the problem is solved, i.e. let's use NTP! But unfortunately the problem is a bit more complicated in our context.

First, we cannot always assume that our devices will be connected to the Internet and thus able to connect to a NTP server. Indeed, in many situations, you will have to and/or want to create you own local network, and this, for several reasons: e.g. the venue where your artwork is presented has a poor network installation, you want to have some control over what happen on the network to make sure the bandwidth is properly used, etc.

Second, when you want to produce sounds in a synchronized way, the clocks that are of interest for you are not the system clocks but the audio clocks. Furthermore, we cannot assume that these two clocks, the system and the audio clocks, 1. share the same origin, e.g. the origin of AudioContext.currentTime is defined as when the context is created, and 2. that they even advance at the same speed, i.e. this is likely that the system and the soundcard won't share the same physical clock.

For all these reason, it is important in our context to have some way of synchronizing arbitrary clocks without relying on external resources such as a NTP server.

The "How"

On a more practical manner, we can thus consider that when trying to synchornize 2 clocks, we face a problem that be can express in the following form:

  • Tclock1 = a * Tclock2 + b

Where:

  • a is the speed difference between the two clocks, i.e. their drift
  • b is the origin offset, i.e. the delta time between their respective origin

For the sake of keeping things simple, in this tutorial, we will consider the ideal case where 1. the respective speed of the clocks is excatly the same, i.e. a = 1 and 2. the time of the propagation of a message on the network is constant (disclaimer, none of these assumptions are true in real life...). Hence, the goal will be to estimate b so that we can calculate Tclock1 from Tclock2 and inversely.

To achieve that, we need a clock that we consider as a reference, in our case the more simple is to use a clock provided by the server as all clients are connected to it. Then, as shown in the figure below, the clients will periodically asks the server for its current time, to calculate the offset of their respective clocks:

sync-process

More precisely at each iteration:

  1. The client takes it current time (tping),
  2. The client sends a message to server which takes its time tag at message reception (Tping)
  3. Then, the server sends back a time tagged message to the client (Tpong)
  4. The client takes its local time (tpong) at reception of the message from the server.

ping-pong

Hence if we consider that the travel time of the ping / pong messages are the same, we can compute the offset between the 2 clocks as the following:

  • Treference = (Tpong - Tping) / 2
  • tlocal = (tpong - tping) / 2
  • offset = tlocal - Treference

From this point, it is then possible for all clients of our network, to calculate a local estimation of the server clock. With such information, it is therefore possible for our clients to schedule audio or musical events in the same infered time reference, while scheduling the actual audio synthesis in their own local audio time.

While this explanation is indeed simplified, we hope it gives you some intuition on the logic behind the synchronization process between different nodes on a network.

Let's now experiement with the @soundworks/plugin-sync to see how all these ideas translate into code.

Scaffolding the application

First thing first, let's create a new project using the soundworks wizard:

sh
cd /path/to/working/directory
+    
Skip to content

Using Plugins 2 - The sync Plugin

In this tutorial, we will dig into a very important problem when dealing with distributed system for music creation, i.e. how to synchronize our musical / audio events across the different devices that compose our system.

After a short introduction on why this can be an issue and of the underlying concepts involved in synchronizing devices on a network, we will learn how to use the @soundworks/plugin-sync plugin which is proposed to solve this particular issue.

Introduction

First of all let's start with a bit of theory to understand the general concepts and theory behing the sync plugin.

The "Why"

An important thing to understand when working with system composed of multiple devices is that each of them will live into a different timeline. Or to say it in a more formal way:

« An important observation is that, as a consequence of dealing with independent nodes, each one will have its own notion of time. In other words, we cannot assume that there is something like a global clock. This lack of a common reference of time leads to fundamental questions regarding the synchronization and coordination within a distributed system. » Maarten van Steen, and Andrew S. Tanenbaum. “A Brief Introduction to Distributed Systems.” Computing 98, no. 10, October 2016.

Indeed, each device have different physical clocks, each of them having a different time origin and furthermore a different speed. Most of the time, i.e. when we use our computers in our daily life, this is something we don't perceive as users, but only because our computers are constently synchronizing themselves with distant reference clocks through the network, using the Network Time Protocol (NTP).

We could consider at this that the problem is solved, i.e. let's use NTP! But unfortunately the problem is a bit more complicated in our context.

First, we cannot always assume that our devices will be connected to the Internet and thus able to connect to a NTP server. Indeed, in many situations, you will have to and/or want to create you own local network, and this, for several reasons: e.g. the venue where your artwork is presented has a poor network installation, you want to have some control over what happen on the network to make sure the bandwidth is properly used, etc.

Second, when you want to produce sounds in a synchronized way, the clocks that are of interest for you are not the system clocks but the audio clocks. Furthermore, we cannot assume that these two clocks, the system and the audio clocks, 1. share the same origin, e.g. the origin of AudioContext.currentTime is defined as when the context is created, and 2. that they even advance at the same speed, i.e. this is likely that the system and the soundcard won't share the same physical clock.

For all these reason, it is important in our context to have some way of synchronizing arbitrary clocks without relying on external resources such as a NTP server.

The "How"

On a more practical manner, we can thus consider that when trying to synchornize 2 clocks, we face a problem that be can express in the following form:

  • Tclock1 = a * Tclock2 + b

Where:

  • a is the speed difference between the two clocks, i.e. their drift
  • b is the origin offset, i.e. the delta time between their respective origin

For the sake of keeping things simple, in this tutorial, we will consider the ideal case where 1. the respective speed of the clocks is excatly the same, i.e. a = 1 and 2. the time of the propagation of a message on the network is constant (disclaimer, none of these assumptions are true in real life...). Hence, the goal will be to estimate b so that we can calculate Tclock1 from Tclock2 and inversely.

To achieve that, we need a clock that we consider as a reference, in our case the more simple is to use a clock provided by the server as all clients are connected to it. Then, as shown in the figure below, the clients will periodically asks the server for its current time, to calculate the offset of their respective clocks:

sync-process

More precisely at each iteration:

  1. The client takes it current time (tping),
  2. The client sends a message to server which takes its time tag at message reception (Tping)
  3. Then, the server sends back a time tagged message to the client (Tpong)
  4. The client takes its local time (tpong) at reception of the message from the server.

ping-pong

Hence if we consider that the travel time of the ping / pong messages are the same, we can compute the offset between the 2 clocks as the following:

  • Treference = (Tpong - Tping) / 2
  • tlocal = (tpong - tping) / 2
  • offset = tlocal - Treference

From this point, it is then possible for all clients of our network, to calculate a local estimation of the server clock. With such information, it is therefore possible for our clients to schedule audio or musical events in the same infered time reference, while scheduling the actual audio synthesis in their own local audio time.

While this explanation is indeed simplified, we hope it gives you some intuition on the logic behind the synchronization process between different nodes on a network.

Let's now experiement with the @soundworks/plugin-sync to see how all these ideas translate into code.

Scaffolding the application

First thing first, let's create a new project using the soundworks wizard:

sh
cd /path/to/working/directory
 npx @soundworks/create@latest plugin-sync

When the wizard will ask you to select the plugins you would like to install, select the @soundworks/plugin-platform-init and the @soundworks/plugin-sync:

wizard-plugins

Then, when the wizard will ask you for the configuration of the default client:

  • Name it player
  • Select the browser target
  • Select the default template

wizard-create-player-confirm

Finally, open the new plugin-sync directory in your favorite editor and launch the application in development mode:

sh
cd plugin-sync
 npm run dev

Using the sync plugin

Register the plugin

Now that eveything is ready let's start with installing our plugin both on the server and on the client side.

Open the src/server/index.js file and add the following code:

js
// src/server/index.js
 import '@soundworks/helpers/polyfills.js';
@@ -90,8 +90,8 @@
   getTimeFunction: () => audioContext.currentTime, 
   // declare the 'platform-init' plugin as a dependency, so that the 
   // sync process starts only when the audio context is resumed 
-}, ['platform-init']); 

And that's all, we now have a synchronization process estimating the server reference time using the clock provided by our audio context.

Conclusion

In this tutorial, you have learned the reasons and general concepts behind clock synchronization in a distributed system, and learned how to use the sync plugin provided by soundworks to achieve such synchronization.

In the next tutorial, we will go further and use this new tool in a more musical way by implemeting a distributed step sequencer.

- +}, ['platform-init']);

And that's all, we now have a synchronization process estimating the server reference time using the clock provided by our audio context.

Conclusion

In this tutorial, you have learned the reasons and general concepts behind clock synchronization in a distributed system, and learned how to use the sync plugin provided by soundworks to achieve such synchronization.

In the next tutorial, we will go further and use this new tool in a more musical way by implemeting a distributed step sequencer.

+ \ No newline at end of file diff --git a/tutorials/state-manager.html b/tutorials/state-manager.html index 868232a..b0fca3d 100644 --- a/tutorials/state-manager.html +++ b/tutorials/state-manager.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

Using the State Manager

In this tutorial, we will dig into the distributed state management system proposed by soundworks. After a short introduction on the underlying concepts, we will see how to use shared states, and how this pattern can help you to implement remote control and monitoring in your applications. Along the way, we will see how the shared states simplify the development of distributed applications by abstracting the network communications and messages routing.

Along the way, we will discover a related library, @ircam/sc-components, to simply create usable (and hopefully elegant) graphical user interfaces.

Relevant documentation

Introduction

First of all, let's start with a bit of theory to understand the concepts and general logic behind the soundworks' shared states.

The "Why"

Most of the time, we think of an application as "something" that runs on a computer with which a user can interact in some way. The idea of distributed application extends this to applications that run on several computers and where several users can interact at the same time. Or to say it in a more formal way:

« A distributed system is a collection of autonomous computing elements that appears to its users as a single coherent system. » Maarten van Steen, and Andrew S. Tanenbaum. “A Brief Introduction to Distributed Systems.” Computing 98, no. 10, October 2016.

distributed-application

Additionally, in creative contexts, it's important to have very simple ways to monitor and/or control the state of distant clients. This is true both during the development of the artwork / application, e.g. to tweak some synthesizer on distant machines from a central point (even in the studio, modifying some parameters on several machines can get cumbersome quite quickly), as well as during a performance, e.g. to control the general volume, to switch between two sections of the artwork, etc.

The StateManager and the SharedState abstractions proposed by soundworks provide a simple way to define and synchronize some sets of parameters that are of interest by multiple clients, while abstracting all the network communications involved.

The "How"

From a more technical point of view, the distributed state management system proposed by soundworks is a circular dataflow pattern (loosely inspired by the flux pattern proposed by Facebook) adapted to the particular needs of real-time distributed applications.

To that end, the flow data is structured according to a circular path that is always synchronized with the server.

distributed-state-management

As illustrated in the figure above, when an input (e.g. some user gesture) triggers a change in the state of a client (arrow 1, red), the data is automatically synchronized with a server-side representation of the state through WebSockets (arrow 2), which when done triggers the change in the rendering, be it audio or visual (arrow 3).

This simple pattern enables an important feature: any other node of the network can make a change on the same server-side representation of the state (arrow 1', blue), which will trigger 2 (red) and 3 (red) in a completely transparent way.

INFO

In these tutorials, when we speak of a node of the network, we consider both the clients and the server.

Form the point of view of the distributed state management system, the server is indeed a node just as any client. However, its central role gives it particular abilities and features.

Scaffolding the application

INFO

This section requires basic knowledge of the soundworks wizard, so please refer to the getting started tutorial if you didn't check it yet.

First thing first, let's generate a new empty application with the @soundworks/create wizard.

sh
cd /path/to/working/directory
+    
Skip to content

Using the State Manager

In this tutorial, we will dig into the distributed state management system proposed by soundworks. After a short introduction on the underlying concepts, we will see how to use shared states, and how this pattern can help you to implement remote control and monitoring in your applications. Along the way, we will see how the shared states simplify the development of distributed applications by abstracting the network communications and messages routing.

Along the way, we will discover a related library, @ircam/sc-components, to simply create usable (and hopefully elegant) graphical user interfaces.

Relevant documentation

Introduction

First of all, let's start with a bit of theory to understand the concepts and general logic behind the soundworks' shared states.

The "Why"

Most of the time, we think of an application as "something" that runs on a computer with which a user can interact in some way. The idea of distributed application extends this to applications that run on several computers and where several users can interact at the same time. Or to say it in a more formal way:

« A distributed system is a collection of autonomous computing elements that appears to its users as a single coherent system. » Maarten van Steen, and Andrew S. Tanenbaum. “A Brief Introduction to Distributed Systems.” Computing 98, no. 10, October 2016.

distributed-application

Additionally, in creative contexts, it's important to have very simple ways to monitor and/or control the state of distant clients. This is true both during the development of the artwork / application, e.g. to tweak some synthesizer on distant machines from a central point (even in the studio, modifying some parameters on several machines can get cumbersome quite quickly), as well as during a performance, e.g. to control the general volume, to switch between two sections of the artwork, etc.

The StateManager and the SharedState abstractions proposed by soundworks provide a simple way to define and synchronize some sets of parameters that are of interest by multiple clients, while abstracting all the network communications involved.

The "How"

From a more technical point of view, the distributed state management system proposed by soundworks is a circular dataflow pattern (loosely inspired by the flux pattern proposed by Facebook) adapted to the particular needs of real-time distributed applications.

To that end, the flow data is structured according to a circular path that is always synchronized with the server.

distributed-state-management

As illustrated in the figure above, when an input (e.g. some user gesture) triggers a change in the state of a client (arrow 1, red), the data is automatically synchronized with a server-side representation of the state through WebSockets (arrow 2), which when done triggers the change in the rendering, be it audio or visual (arrow 3).

This simple pattern enables an important feature: any other node of the network can make a change on the same server-side representation of the state (arrow 1', blue), which will trigger 2 (red) and 3 (red) in a completely transparent way.

INFO

In these tutorials, when we speak of a node of the network, we consider both the clients and the server.

Form the point of view of the distributed state management system, the server is indeed a node just as any client. However, its central role gives it particular abilities and features.

Scaffolding the application

INFO

This section requires basic knowledge of the soundworks wizard, so please refer to the getting started tutorial if you didn't check it yet.

First thing first, let's generate a new empty application with the @soundworks/create wizard.

sh
cd /path/to/working/directory
 npx @soundworks/create@latest state-manager

When the wizard will ask you for the configuration of the default client:

  • Name it player
  • Select the browser target
  • Select the default template

wizard-create-player-confirm

Then open the new state-manager directory in your favorite editor and launch the application in development mode:

sh
cd state-manager
 npm run dev

Declaring schemas

The StateManager component is configured with JavaScript objects that declare a set of attributes and their properties, which we call "schemas". You can think of a schema as a kind of blueprint from which multiple SharedState instances can be created.

TIP

If you are familiar with databases, you can think of it has the schema of a database table.

The syntax for declaring schemas is described here.

In this application we will declare two different schemas:

  • A schema called global which we will use to store informations accessible by all nodes of the network. This shared state will be unique across the whole application, i.e. it will be created by the server and all player clients will "attach" to it.
  • A schema called player, which we will use to describe the state of a single client of the application. All clients with the player role will create their own SharedState instance from this scheme.

Let's then create the file src/server/schemas/global.js, and push the following code into it:

js
// src/server/schemas/global.js
 export default {
@@ -270,7 +270,7 @@
     </div>
   `
 })}

Now, if you open a controller (http://127.0.0.1:8000/controller) and several players (http://127.0.0.1:8000/?emulate=3) side by side, you should have a more usefull interface:

controller-player-final

Conclusion

In this tutorial, you learned how to use the soundworks distributed state management system which we think is one of its most powerfull and versatile feature.

You have seen how to create global states that are common to all clients of the application, how to use them to describe the state of each client and how use them to implement remote control and monitoring interfaces using state collections. Along the way, you have seen how to use the soundworks wizard within your application (i.e. npx soundworks).

In the next tutorial, we will see how to extend the possibilities of soundworks with plugins. For this first dive into plugins we will use the @soundworks/plugin-platform-init plugin that is meant to simplify some redondant and cumbersome tasks such as resuming the audio context, etc.

- + \ No newline at end of file diff --git a/tutorials/step-sequencer.html b/tutorials/step-sequencer.html new file mode 100644 index 0000000..f91563d --- /dev/null +++ b/tutorials/step-sequencer.html @@ -0,0 +1,267 @@ + + + + + + Building a Distributed Step Sequencer | soundworks + + + + + + + + + + + + +
Skip to content

Building a Distributed Step Sequencer

In this tutorial, we will use the soundworks' sync plugin we just learned to build a more advanced application: a distributed step sequencer.

The step sequencer will be based on Node.js clients, representing each a track of our step sequencer, i.e. one the kick, one for the snare, etc. and one browser controller client to rule them all:

architecture

Along the way we will use another plugin, the checkin plugin, which allows us to assign a unique index to each clients.

Scaffolding application

Let's start with scaffolding our application using the soundworks wizard:

sh
cd path/to/tutorials
+npx @soundworks/create@latest step-sequencer

When the wizard ask to select the plugin, let's then select @soundworks/plugin-sync and the @soundworks/plugin-checkin plugins:

select-plugins

And let's define our default client as a controller:

create-default-client

Once done, let's go into our step-sequencer directory and install a few more dependencies we will need using npm:

sh
cd step-sequencer
+npm install --save @ircam/sc-scheduling @ircam/sc-loader node-web-audio-api

Finally, let's just create our node client, we will name thing:

sh
npx soundworks --create-client

create-thing-client

We can now start our server:

js
npm run dev

And, in different "Terminal", emulate 5 thing clients:

sh
cd path/to/tutorials/step-sequencer
+EMULATE=5 npm run watch thing

TIP

To easily get the current directory in "Terminal" you can use the pwd command

Defining the global state

Now that eveything is set up, let's continue with defining the different parameters that describe our application and declare them in a global state.

Indeed, we will need several parameter to control our step sequencer:

  • A variable which will define if our step sequencer is running or not ("start / stop").
  • A timestamp (in synchronized time) associated to the start / stop event to make sure all our clients start at the same exact time.
  • A BPM value for our step sequencer.
  • A score.

To keep things simple, we won't allow to change the BPM while the step sequencer is running. Indeed, having such functionality would imply to also synchronize our BPM change amongst every clients, which would lead to over complicate this tutorial.

Let's thus create a file named global.js in the src/server/schemas directory and translate these informations into a schema definition:

js
// src/server/schemas/global.js
+export default {
+  running: {
+    type: 'boolean',
+    default: false,
+  },
+  startTime: {
+    type: 'float',
+    default: null,
+    nullable: true,
+  },
+  BPM: {
+    type: 'integer',
+    default: 120,
+  },
+  score: {
+    type: 'any',
+    default: [],
+  },
+};

Let's then register this schema in our server:

js
// src/server/index.js
+import { loadConfig } from '../utils/load-config.js';
+import '../utils/catch-unhandled-errors.js';
+
+import globalSchema from './schemas/global.js'; 
+
+// ...
+
+const server = new Server(config);
+server.useDefaultApplicationTemplate();
+
+server.stateManager.registerSchema('global', globalSchema); 

And define some default values for our tracks. Note that we will consider that our step sequencer has 5 different tracks with 8 steps each, and that we will create a branch initialize our score in debug mode (with some values filled) according to a debug flag to ease the development:

js
await server.start();
+// change this flag to false to empty score by default 
+const debug = true; 
+let score; 
+ 
+if (debug) { 
+  // if debug, fill score with default values 
+  score = [ 
+    [0, 1, 0, 1, 0, 1, 0, 1], 
+    [0, 0, 0, 0, 0, 0, 0, 0], 
+    [0, 0, 0, 0, 0, 0, 1, 0], 
+    [0, 0, 1, 0, 0, 0, 1, 0], 
+    [1, 0, 0, 0, 1, 0, 0, 1], 
+  ]; 
+} else { 
+  // if not debug, empty score 
+  score = [ 
+    [0, 0, 0, 0, 0, 0, 0, 0], 
+    [0, 0, 0, 0, 0, 0, 0, 0], 
+    [0, 0, 0, 0, 0, 0, 0, 0], 
+    [0, 0, 0, 0, 0, 0, 0, 0], 
+    [0, 0, 0, 0, 0, 0, 0, 0], 
+  ]; 
+} 
+ 
+const global = await server.stateManager.create('global', { 
+  score, 
+}); 

Registering the plugins

Now that our state is set up, let's install and configure our different plugins

First let's register the plugins in the server side:

js
import '@soundworks/helpers/polyfills.js';
+import { Server } from '@soundworks/core/server.js';
+import pluginSync from '@soundworks/plugin-sync/server.js'; 
+import pluginCheckin from '@soundworks/plugin-checkin/server.js'; 
+
+import { loadConfig } from '../utils/load-config.js';
+
+// ...
+
+const server = new Server(config);
+server.useDefaultApplicationTemplate();
+
+server.pluginManager.register('sync', pluginSync); 
+server.pluginManager.register('checkin', pluginCheckin); 
+
+server.stateManager.registerSchema('global', globalSchema);

And in our two "controller" and "thing" clients. Note that as we will use the checkin to get a unique index which will allow us to get a track from the score to be played, we will only register the checkin plugin on the "thing" client.

Let's start with the "controller":

js
// src/clients/controller/index.js
+import launcher from '@soundworks/helpers/launcher.js';
+import pluginSync from '@soundworks/plugin-sync/client.js'; 
+
+import { html, render } from 'lit';
+
+// ...
+
+client.pluginManager.register('sync', pluginSync); 
+
+await client.start();

Then let's install our two plugins in our "thing" clients, as you may recall in the last tutorial, in this case we will want to synchronize the audio clock, which will thus require a bit more configuration:

js
// src/clients/thing/index.js
+import { Client } from '@soundworks/core/client.js';
+import launcher from '@soundworks/helpers/launcher.js';
+import pluginSync from '@soundworks/plugin-sync/client.js'; 
+import pluginCheckin from '@soundworks/plugin-checkin/client.js'; 
+import { AudioContext } from 'node-web-audio-api'; 
+
+import { loadConfig } from '../../utils/load-config.js';
+
+// ...
+
+const client = new Client(config);
+const audioContext = new AudioContext(); 
+ 
+client.pluginManager.register('checkin', pluginCheckin); 
+client.pluginManager.register('sync', syncPlugin, { 
+  getTimeFunction: () => audioContext.currentTime, 
+}); 

Implementing the controller

Now that everything is set up, it is now time to implement of our controller logic.

Let's first import a few components, attach to our global state and sketch our graphical user interface:

js
// src/clients/controller/index.js
+import { html, render } from 'lit';
+import '../components/sw-audit.js';
+
+import '@ircam/sc-components/sc-matrix.js'; 
+import '@ircam/sc-components/sc-text.js'; 
+import '@ircam/sc-components/sc-transport.js'; 
+import '@ircam/sc-components/sc-number.js'; 
+
+// ... 
+
+await client.start();
+
+const global = await client.stateManager.attach('global'); 
+// update screen on update 
+global.onUpdate(() => renderApp()); 
+
+function renderApp() {
+  render(html`
+    <div class="controller-layout">
+      <header>
+        <h1>${client.config.app.name} | ${client.role}</h1>
+        <sw-audit .client="${client}"></sw-audit>
+      </header>
+      <section>
+        <p>Hello ${client.config.app.name}!</p> 
+        <div> 
+          <div style="margin-bottom: 4px;"> 
+            <sc-transport  
+              .buttons=${['play', 'stop']} 
+              value=${global.get('running') ? 'play' : 'stop'} 
+            ></sc-transport> 
+          </div> 
+          <div style="margin-bottom: 4px;"> 
+            <sc-text>BPM</sc-text> 
+            <sc-number 
+              min="50" 
+              max="240" 
+              value=${global.get('BPM')} 
+            ></sc-number> 
+          </div> 
+          <div style="margin-bottom: 4px;"> 
+            <sc-matrix 
+              .value=${global.get('score')} 
+            ></sc-matrix> 
+          </div> 
+        </div>
+      </section>
+    </div>
+  `, $container);
+}

If you open your controller in a Web browser, you should now see the following interface:

controller-interface

Now let's just change a bit our code to propagate the changes made in our interface in the global state:

js
await client.start();
+
+  const global = await client.stateManager.attach('global');
+  // update screen on update
+  global.onUpdate(() => renderApp());
+
+  const sync = await client.pluginManager.get('sync'); 
+
+  function renderApp() {
+    render(html`
+      <div class="controller-layout">
+        <header>
+          <h1>${client.config.app.name} | ${client.role}</h1>
+          <sw-audit .client="${client}"></sw-audit>
+        </header>
+        <section>
+          <div>
+            <div style="margin-bottom: 4px;">
+              <sc-transport
+                .buttons=${['play', 'stop']}
+                value=${global.get('running') ? 'play' : 'stop'}
+                @change=${e => { 
+                  if (e.detail.value === 'stop') { 
+                    global.set({ running: false }); 
+                  } else { 
+                    // grab current sync time 
+                    const syncTime = sync.getSyncTime(); 
+                    // add an offset to the syncTime to handle network latency 
+                    const startTime = syncTime + 0.5; 
+                    // propagate values on the network 
+                    global.set({ running: true, startTime }); 
+                  } 
+                }} 
+              ></sc-transport>
+            </div>
+            <div style="margin-bottom: 4px;">
+              <sc-text>BPM</sc-text>
+              <sc-number
+                min="50"
+                max="240"
+                value=${global.get('BPM')}
+                ?disabled=${global.get('running')} 
+                @change=${e => global.set({ BPM: e.detail.value })} 
+              ></sc-number>
+            </div>
+            <div style="margin-bottom: 4px;">
+              <sc-matrix
+                .value=${global.get('score')}
+                @change=${e => global.set({ score: e.detail.value })} 
+              ></sc-matrix>
+            </div>
+          </div>
+        </section>
+      </div>
+    `, $container);
+  }

INFO

Note how we disabled the BPM number box when the step sequencer is running:

js
?disabled=${global.get('running')}

to make clear to the user that the BPM can be changed only when it is stopped.

If you now open two controllers side by side, e.g. http://127.0.0.1:8000?emulate=2, you should see that the two controllers stay perfectly in synchronized:

controller-synced

Implementing the audio engine

Now that all our controls are set up, let's go back to our thing clients to implement the audio engine and logic.

First let's add a few audio files into our project, that our step sequencer will be able to use for audio rendering. For simplicity, let's put them in the public directory.

INFO

The set of samples used in the tutorial can be downloaded here

Your file system should now look like the following:

filesystem-assets

Now let's load these file into our thing clients:

js
import { AudioContext } from 'node-web-audio-api';
+import { AudioBufferLoader } from '@ircam/sc-loader'; 
+import { loadConfig } from '../../utils/load-config.js';
+
+// ...
+
+await client.start();
+
+const audioFiles = [ 
+  'public/assets/hh.wav', 
+  'public/assets/clap.wav', 
+  'public/assets/rimshot.wav', 
+  'public/assets/snare.wav', 
+  'public/assets/kick.wav', 
+]; 
+ 
+const loader = new AudioBufferLoader(); 
+const audioBuffers = await loader.load(audioFiles); 
+ 
+console.log(audioBuffers); 

You should see logged into the console the loaded audio buffers.

Then, let's create a scheduler, running in the synchronized time, i.e. scheduling events in the synchronized timeline, but able to provide us the corresponding time in the audioContext time reference:

js
import { AudioBufferLoader } from '@ircam/sc-loader';
+import { Scheduler } from '@ircam/sc-scheduling'; 
+import { loadConfig } from '../../utils/load-config.js';
+
+// ...
+
+await client.start();
+
+// retrieve initialized sync plugin 
+const sync = await client.pluginManager.get('sync'); 
+const scheduler = new Scheduler(() => sync.getSyncTime(), { 
+  // provide the transfert function that will allow the scheduler to map from 
+  // its current time (the sync time) and the audio time (the sync plugin local time) 
+  currentTimeToAudioTimeFunction: syncTime => sync.getLocalTime(syncTime), 
+}); 
+
+const audioFiles = [
+  // ...
+];

Then implement a simple audio engine that will play a track from the score and an associated buffer according to a given index:

Finally, let's attach to the global state and create our step sequencer engine which will react to updates of the global state:

+ + + + \ No newline at end of file diff --git a/tutorials/synchronized-scheduling.html b/tutorials/synchronized-scheduling.html deleted file mode 100644 index 5568cb4..0000000 --- a/tutorials/synchronized-scheduling.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - Synchronized Scheduling - Building a Distributed Step Sequencer | soundworks - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tutorials/todo-noise.html b/tutorials/todo-noise.html index 03eb41d..ca8a6e8 100644 --- a/tutorials/todo-noise.html +++ b/tutorials/todo-noise.html @@ -7,16 +7,16 @@ - + - - - + + + -
Skip to content

The Todo Noise Application

In this tutorial we will build a simple application, which illustrates the most common type of distributed interaction you will need to implement in your own applications: i.e. remote monitoring and control.

The tutorial requires basic knowledge of the soundworks state manager and of the platform-init plugin, so please refer to the relevant tutorials if you didn't check them yet.

Along the way, we will discover how to create our own reusable Web Components using the Lit library proposed by default in soundworks applications.

Relevant documentation

User Story

The application purposely privileges the point of view of a user in a working situation (e.g. developer, designer, composer or performer) rather than the point of view of the end user (e.g. participant, audience). Indeed, while the later is most of the time very specific to the application or artwork, the former generally requires some properties and features that are relatively common. To illustrate this two roles, the application is composed of two different types of clients: the player and the controller.

The player can be envisioned as the client dedicated to the end users. The application can accept any number of players and each player has access to the following fonctionalities:

  • It can trigger a sound.
  • It can start and stop a synthesizer.
  • It can update a parameter (i.e. the frequency of the synths).

The controller is dedicated to the user in working situation, be it during the creation or the performance of the artwork. The application can accept any number of controllers and each of them has access to the following fonctionalities:

  • It controls global parameters of the application (i.e. mute, master volume). These global parameters must be synchronized amongst all the clients of the application (i.e. player and controller).
  • It can take full control over any player, i.e. the change the volume, trigger a sound and change the state of the synthesizer as if he was the client itself.

This minimal set of functionalities should provide a good overview of several important and recurring patterns at stake in real-time distributed audio applications.

Scaffolding the application

First thing first, let's generate a new empty application with the @soundworks/create wizard:

sh
cd /path/to/working/directory
+    
Skip to content

The Todo Noise Application

In this tutorial we will build a simple application, which illustrates the most common type of distributed interaction you will need to implement in your own applications: i.e. remote monitoring and control.

The tutorial requires basic knowledge of the soundworks state manager and of the platform-init plugin, so please refer to the relevant tutorials if you didn't check them yet.

Along the way, we will discover how to create our own reusable Web Components using the Lit library proposed by default in soundworks applications.

Relevant documentation

User Story

The application purposely privileges the point of view of a user in a working situation (e.g. developer, designer, composer or performer) rather than the point of view of the end user (e.g. participant, audience). Indeed, while the later is most of the time very specific to the application or artwork, the former generally requires some properties and features that are relatively common. To illustrate this two roles, the application is composed of two different types of clients: the player and the controller.

The player can be envisioned as the client dedicated to the end users. The application can accept any number of players and each player has access to the following fonctionalities:

  • It can trigger a sound.
  • It can start and stop a synthesizer.
  • It can update a parameter (i.e. the frequency of the synths).

The controller is dedicated to the user in working situation, be it during the creation or the performance of the artwork. The application can accept any number of controllers and each of them has access to the following fonctionalities:

  • It controls global parameters of the application (i.e. mute, master volume). These global parameters must be synchronized amongst all the clients of the application (i.e. player and controller).
  • It can take full control over any player, i.e. the change the volume, trigger a sound and change the state of the synthesizer as if he was the client itself.

This minimal set of functionalities should provide a good overview of several important and recurring patterns at stake in real-time distributed audio applications.

Scaffolding the application

First thing first, let's generate a new empty application with the @soundworks/create wizard:

sh
cd /path/to/working/directory
 npx @soundworks/create@latest todo-noise

You can already select the @soundworks/plugin-platform-init plugin to have it installed.

install-plugin-platform-init

Then, when the wizard asks you for the name of the default client, just call it player, and select the browser target as well as the default template:

create-player

Once the wizard ended, let's launch the soundworks development tools inside our application and select the "create a new soundworks client" option to create our second type of client, the controller:

sh
cd todo-noise
 npx soundworks

soundworks-devtools

The devtool wizard will ask you for the same questions as when you just created the player client. This time call the client controller, select the browser target and the controller template. Select no, the default value, when the tool asks if the client should be used as default:

create-controller

TIP

Selecting a client as default means the client will be accessible at the root of the domain, which is for example more simple if you need to share an url with the public. In the other case the name of the client will be used as the route to access it.

For example, in our application:

  • the player client would be accessible at http://my-domain.com
  • the controller client would be accessible at http://my-domain.com/controller

Once done, you can exit the command-line devtool by typing Ctrl+C or by selecting the → exit entry option.

Now that our project is scaffolded, let's create the schemas describing the states for each player as well as the global state.

Creating and using the shared global state

To implement the user story defined above, the application will rely on 2 types of schema:

  • A schema defining global variables of the application (e.g. mute, master volume) which will be unique and shared by every connected clients.
  • A schema that is tied to each connected player, i.e. each player client will create its own shared state instance from this schema.

Let's start by defining and creating the global schema. Create a new file named global.js in the src/server/schemas/ directory, and fill it with the following code:

js
// src/server/schemas/global.js
 export default { 
@@ -401,7 +401,7 @@
 players.onAttach(() => renderApp()); 
 players.onDetach(() => renderApp()); 
 players.onUpdate(() => renderApp()); 

If you now open a controller (http://127.0.0.1:8000/controller) and emulate several clients in a different window ((http://127.0.0.1:8000?emulate=3), you should now see the full application and how the players and controller are kept synchronized through the shared states:

todo-noise-full

Conclusion

In this tutorial, you have learned an important pattern that soundworks aims to simplify: the ability of simply create remote control and monitoring of clients through shared states. Along the way, you have learned how to create a reusable Web Component using the Lit library.

While the application purposely simplified important aspects of the application to focus on these key points, a number of features could improved with simple modification to the structure. For example:

  • Improve the start / stop synth so that no click occurs when it is stopped.
  • Create more complex synthesizers with more more and more complex audio chains.
  • Improve the master chain, e.g. use decibels for the master volume to make the slider behavior more natural, add low pass and high pass filters.
  • Refactor the synthesizers with classes to create reusable audio components.
  • etc.
- + \ No newline at end of file