diff --git a/anchors.min.js b/anchors.min.js index 4a4bb24a..a6cf78ca 100644 --- a/anchors.min.js +++ b/anchors.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Anchors=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const r=Object.prototype.hasOwnProperty;return t&&r.call(t,e)},r=t=>Object.prototype.toString.apply(t),s=t=>"function"==typeof t||"[object Function]"===r(t),n=t=>("[object Object]"===r(t)||"object"==typeof t||s(t))&&null!==t;class i{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(r,s){const i=this.attrs;return t(r)?s&&e(i,r)?(i[r]=s,this):i[r]:n(r)?(o=i,l=r,Object.keys(l).forEach((t=>{e(l,t)&&(o[t]=l[t])})),this):0===arguments.length?i:this;var o,l}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const o=t=>!!(n(t)&&t.nodeName&&t.tagName&&1===t.nodeType),l=t=>t*t,c=(e=null)=>{let r,s;return e?t(e)?s=document.querySelector(e):o(e)&&(s=e):(r=document.querySelectorAll("html,body"),s=r[0].scrollTop-r[1].scrollTop>=0?r[0]:r[1]),s},a=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=a(t.offsetParent)),e},h=(t,e="")=>{const r=e.replace(/^>/i,"");return!!(e&&r&&t)&&(t.matches?t.matches(r):!!t.msMatchesSelector&&t.msMatchesSelector(r))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,u=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],p=(t,e,r)=>{const s=u.indexOf(e)>-1;r._delegateListener&&delete(r=r._delegateListener)._delegateListener,function(t,e,r){const s=t._listeners;let n=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const i=t.fn;e===t.type&&(n=s,i===r&&(n=s))})),n>-1&&s.splice(n,1)}(t,e,r),t.removeEventListener(e,r,s)},m=function(e,r,s=!1){const n=t(e)?document.querySelector(e):e,i=n.childNodes,l=((e,r)=>{let s=e._listeners||[];return t(r)&&r&&(s=s.filter((t=>t.type===r))),s})(n,r);l.forEach((t=>{p(n,t.type,t.fn)})),(s||!0===r||1===arguments.length)&&n&&i&&i.forEach((t=>{o(t)&&m(t,r,s)}))},f=(t,e,r)=>{if(!s(r))return m(t,e);p(t,e,r)},y=(t,e,r,s,n,i,o=!1)=>{const l=u.indexOf(r)>-1,c=function(l){const a=function(t){const e=t.target;return(r=e)&&3===r.nodeType?r.parentNode:r;var r}(l),u=((t,e,r,s)=>{const n=r||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&h(t,e):h(t,e))||s&&t===n)return t;if(t===n)break}while(t=d(t))})(a,e,t);let p=i||t;l.delegateTarget=u,!0===i&&(p=n),u&&(!0===o&&f(t,r,c),s.call(p,l,n))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:r,fn:c,data:n,context:i,capture:l}),s._delegateListener=c,t.addEventListener(r,c,l)},g={},b=t=>e(g,t)&&g[t].length>0,v=(t,e=!0)=>e?b(t):(t=>{let e=b(t),r=t.lastIndexOf(".");for(;!e&&-1!==r;)r=(t=t.substring(0,r)).lastIndexOf("."),e=b(t);return e})(t),A=(t,e,s=!0)=>{const n=t=>{if(!b(t))return!1;g[t].forEach((t=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(r(e))>-1?e.toString():e;t.callback.call(t.context||t,s)}))},i=()=>{let e=t,r=t.lastIndexOf(".");for(;-1!==r;)e=e.substring(0,r),r=e.lastIndexOf("."),n(e);n(t),n("*")};if(!v(t))return!1;s?setTimeout(i,10):i()},E=t=>Array.isArray?Array.isArray(t):"[object Array]"===r(t),L=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),$=t=>{return!(!n(t)||!(o(t)||(t=>!(!n(t)||"[object NodeList]"!==r(t)))(t)||(e=t,n(e)&&"[object DocumentFragment]"===r(e))||(t=>!(!n(t)||!("[object Text]"===r(t)||t.tagName&&3===t.nodeType)))(t)));var e},T=(t,e,r)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=r;break;case"value":"input"===s||"textarea"===s?t.value=r:t.setAttribute(e,r);break;case"className":t.className=r;break;default:t.setAttribute(e,r)}},x=(r,s,i)=>{const o="outline-heading",l=i.hasAnchor||!0,c=i.isAtStart||!0,a=i.showCode||!1,h=i.chapterCode||"",d=i.anchorURL||"",u=`heading-${s}`,p={id:u,className:c?`${o} ${o}_start`:o,"data-id":s},m=Object.keys(p),f=L(r.innerHTML);let y,g;if(m.forEach((t=>{T(r,t,p[t])})),a&&(r.innerHTML=h+" "+f),!l)return!1;g=((t,e=0,r="",s="outline")=>{const n=s?`xlink:href="#${s}-icon-${t}"`:`xlink:href="#icon-${t}"`,i=E(e)?e[0]:e,o=E(e)?e[1]:e,l=e?`width:${i}px;height:${o}px;`:"",c=``,a=document.createElement("i");return a.className="outline-icon",a.innerHTML=c,a})("hash"),y=((r,s,i)=>{const o=document.createDocumentFragment(),l=document.createElement(r),c=e=>$(e)||t(e),a=e=>{let r;if(!c(e))return!1;$(e)?r=e:t(e)&&(r=document.createTextNode(e)),o.appendChild(r)};return n(s)?Object.keys(s).forEach((t=>{e(s,t)&&T(l,t,s[t])})):E(s)&&s.every((t=>c(t)))&&s.forEach((t=>{a(t)})),E(i)?i.forEach((t=>{a(t)})):a(i),l.appendChild(o),l})("a",{id:`anchor-${s}`,className:`${o}__anchor anchor-${s}`,href:d||`#${u}`,target:d?"_blank":"self","data-id":s},[g]),r.appendChild(y)},M=(t,e)=>{let r,s=t.className;if(!s||!((t,e)=>{const r=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!o(t)&&(s=t.className,!!s&&(n=t.classList,n?.contains?t.classList.contains(e):!!r.exec(s)))})(t,e))return!1;r=t.classList,r?.remove?r.remove(e):(s=L(s.replace(e,"")),t.className=s)},z=(e,r=!0,s=!0)=>{const n="outline-heading",i=e.innerHTML;let o;if(e.innerHTML=i.replace(/^\d+(?:(\.?\d*)*\s?)?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),M(e,n),!r)return!1;var l;o=e.querySelector(`.${n}__anchor`),s&&M(e,`${n}_start`),l=L(e.className),t(l)&&""===l&&e.removeAttribute("class"),e.removeChild(o)},j=(e,r=!0)=>{let s=1,n=0;const i=[];return e.forEach(((e,r)=>{const o=e.tagName.replace(/h/i,"");let l=parseInt(o,10),c=-1;var a;l>s?(n+=1,c=1===n?-1:r-1):l===s||ln?1===l?(n=1,c=-1):c=i[r-1].pid:l<=n&&(1===l?n=1:(n-=s-l,n<=1&&(n=1)),c=1===n?-1:((t,e,r)=>{let s,n,i=t[r-1];for(n=0;n]+(>|$)/g,""):"")})})),r?(t=>{const e={};return t.forEach((t=>{const r=JSON.stringify((t=>[t.pid])(t));e[r]=e[r]||[],e[r].push(t),t.index=e[r].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((r=>{e[r].forEach((e=>{t.filter((t=>t.pid===e.id)).forEach((t=>{t.code=e.code+"."+t.index}))}))})),t})(i):i};class S extends i{constructor(t){super(),this.attrs=S.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){let r,n,i,l,a;return this.attr(e),a=this.attr("articleElement"),n=this.attr("scrollElement"),i=this.attr("selector"),r=this.attr("created"),t(a)?l=document.querySelector(a):o(a)&&(l=a),l?(this.$articleElement=l,this.$scrollElement=c(n),this.$headings=[...l.querySelectorAll(i)],this.$headings.length<1||(this.chapters=j(this.$headings),s(r)&&r.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,r)=>{const s={},n=[];return t.forEach(((t,r)=>{s[t[e]]=r,t.children=[]})),t.forEach((e=>{const i=t[s[e[r]]];-1!==e[r]?i.children.push(e):n.push(e)})),n})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),r=this.attr("isAtStart"),n=this.attr("showCode"),i=this.attr("anchorURL"),o=this.$headings,l=this.getChapters();return((t=[])=>{const e=['','','','','','','','',''],r=E(t)&&t.length>0?e.concat(t):e,s=document.body;let n=document.querySelector("#svg-sprites");n?n.innerHTML=r.join(""):(n=document.createElement("div"),n.innerHTML=``,s.insertBefore(n.firstChild,s.firstChild))})(),o.forEach(((t,s)=>{const o=l[s].code;x(t,s,{hasAnchor:e,isAtStart:r,showCode:n,chapterCode:o,anchorURL:i})})),s(t)&&t.call(this),this}scrollTo(t,e){return((t,e,r)=>{const n=c(t);let i=n.scrollTop,o=0;const a=e-i,h=n.scrollHeight,d=e-h<=0?e:h,u=t=>(s(r)&&r(t),!1),p=()=>{if(o+=1,a<0){if(i-=l(o),n.scrollTop=i,i<=e)return n.scrollTop=e,u(e)}else if(i+=l(o),n.scrollTop=i,i>=d)return n.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)})(this.$scrollElement,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),r=this.attr("beforeDestroy"),n=this.attr("afterDestroy"),i=this.$headings;return s(r)&&r.call(this),this.removeListeners(),i.forEach((r=>{z(r,t,e)})),this.attr(S.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],s(n)&&n.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),i=t.delegateTarget.parentNode,o=a(i)-(n+10),l=this.$scrollElement,c=l.scrollHeight-l.clientHeight;return this.scrollTo(o,(()=>{s(r)&&r.call(this,"anchor"),((t,e=300)=>{!!s(t)&&setTimeout((()=>{t()}),e)})((()=>{A("toolbar:update",{top:o,min:0,max:c})}))})),e||function(t){t.stopPropagation(),t.preventDefault()}(t),this}addListeners(){const t=this.$articleElement;return y(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return f(t,"click",this.onAnchorTrigger),this}}return S.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null},S})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Anchors=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const r=Object.prototype.hasOwnProperty;return t&&r.call(t,e)},r=t=>Object.prototype.toString.apply(t),s=t=>"function"==typeof t||"[object Function]"===r(t),n=t=>("[object Object]"===r(t)||"object"==typeof t||s(t))&&null!==t;class i{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(r,s){const i=this.attrs;return t(r)?s&&e(i,r)?(i[r]=s,this):i[r]:n(r)?(o=i,c=r,Object.keys(c).forEach((t=>{e(c,t)&&(o[t]=c[t])})),this):0===arguments.length?i:this;var o,c}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const o=t=>!!(n(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>t*t,l=(e=null)=>{let r,s;return e?t(e)?s=document.querySelector(e):o(e)&&(s=e):(r=document.querySelectorAll("html,body"),s=r[0].scrollTop-r[1].scrollTop>=0?r[0]:r[1]),s},a=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=a(t.offsetParent)),e},h=(t,e="")=>{const r=e.replace(/^>/i,"");return!!(e&&r&&t)&&(t.matches?t.matches(r):!!t.msMatchesSelector&&t.msMatchesSelector(r))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,u=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],p=(t,e,r)=>{const s=u.indexOf(e)>-1;r._delegateListener&&delete(r=r._delegateListener)._delegateListener,function(t,e,r){const s=t._listeners;let n=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const i=t.fn;e===t.type&&(n=s,i===r&&(n=s))})),n>-1&&s.splice(n,1)}(t,e,r),t.removeEventListener(e,r,s)},m=function(e,r,s=!1){const n=t(e)?document.querySelector(e):e,i=n.childNodes,c=((e,r)=>{let s=e._listeners||[];return t(r)&&r&&(s=s.filter((t=>t.type===r))),s})(n,r);c.forEach((t=>{p(n,t.type,t.fn)})),(s||!0===r||1===arguments.length)&&n&&i&&i.forEach((t=>{o(t)&&m(t,r,s)}))},f=(t,e,r)=>{if(!s(r))return m(t,e);p(t,e,r)},y=(t,e,r,s,n,i,o=!1)=>{const c=u.indexOf(r)>-1,l=function(c){const a=function(t){const e=t.target;return(r=e)&&3===r.nodeType?r.parentNode:r;var r}(c),u=((t,e,r,s)=>{const n=r||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&h(t,e):h(t,e))||s&&t===n)return t;if(t===n)break}while(t=d(t))})(a,e,t);let p=i||t;c.delegateTarget=u,!0===i&&(p=n),u&&(!0===o&&f(t,r,l),s.call(p,c,n))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:r,fn:l,data:n,context:i,capture:c}),s._delegateListener=l,t.addEventListener(r,l,c)},g={},b=t=>e(g,t)&&g[t].length>0,v=(t,e=!0)=>e?b(t):(t=>{let e=b(t),r=t.lastIndexOf(".");for(;!e&&-1!==r;)r=(t=t.substring(0,r)).lastIndexOf("."),e=b(t);return e})(t),A=(t,e,s=!0)=>{const n=t=>{if(!b(t))return!1;g[t].forEach((t=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(r(e))>-1?e.toString():e;t.callback.call(t.context||t,s)}))},i=()=>{let e=t,r=t.lastIndexOf(".");for(;-1!==r;)e=e.substring(0,r),r=e.lastIndexOf("."),n(e);n(t),n("*")};if(!v(t))return!1;s?setTimeout(i,10):i()},$=t=>Array.isArray?Array.isArray(t):"[object Array]"===r(t),E=['','','','','','','','',''],x=(e,r="icon")=>t(e)?((t,e="icon")=>{const r=/id="(.*?)"/,s=/^(\w+)-/;return E.find((n=>{const i=r.exec(n)[1];return s.exec(i)[1]===e&&i===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,r):[...E],L=(e="")=>{const r=document.body;let s=document.querySelector("#outline-icons"),n=[];(e=>{if(!e)return!1;$(e)&&e.length>0?e.forEach((e=>{-1===E.indexOf(e)&&t(e)&&E.push(e)})):t(e)&&E.push(e)})(e),n=x(),s?s.innerHTML=n.join(""):(s=document.createElement("div"),s.innerHTML=``,r.insertBefore(s.firstChild,r.firstChild))},T=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),M=t=>{return!(!n(t)||!(o(t)||(t=>!(!n(t)||"[object NodeList]"!==r(t)))(t)||(e=t,n(e)&&"[object DocumentFragment]"===r(e))||(t=>!(!n(t)||!("[object Text]"===r(t)||t.tagName&&3===t.nodeType)))(t)));var e},z=(t,e,r)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=r;break;case"value":"input"===s||"textarea"===s?t.value=r:t.setAttribute(e,r);break;case"className":t.className=r;break;default:t.setAttribute(e,r)}},w=e=>{const r=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&r.test(e)},j=(e,r={})=>((e,r={})=>{const s=r.size||0,n=r.color||"",i=r.iconSet||"",o=$(s)?s[0]:s,c=$(s)?s[1]:s,l=s?`width:${o}px;height:${c}px;`:"",a=n?l+`color:${n}`:l,h=document.createElement("i");let d,u="",p="";return t(e)?(w(e)?p=e:(u=i&&"icon"!==i?`xlink:href="#${i}-icon-${e}"`:`xlink:href="#icon-${e}"`,p=``),h.className="outline-icon",h.innerHTML=p,w(e)&&(d=h.querySelector("svg"),d.setAttribute("aria-hidden","true"),d.setAttribute("xmlns","http://www.w3.org/2000/svg"),d.setAttribute("class","outline-icon__svg"),d.setAttribute("width","200"),d.setAttribute("height","200"),d.style=a),h):null})(e,r),S=(r,s,i)=>{const o="outline-heading",c=i.hasAnchor||!0,l=i.isAtStart||!0,a=i.showCode||!1,h=i.chapterCode||"",d=i.anchorURL||"",u=`heading-${s}`,p={id:u,className:l?`${o} ${o}_start`:o,"data-id":s},m=Object.keys(p),f=T(r.innerHTML);let y,g;if(m.forEach((t=>{z(r,t,p[t])})),a&&(r.innerHTML=h+" "+f),!c)return!1;g=j("hash"),y=((r,s,i)=>{const o=document.createDocumentFragment(),c=document.createElement(r),l=e=>M(e)||t(e),a=e=>{let r;if(!l(e))return!1;M(e)?r=e:t(e)&&(r=document.createTextNode(e)),o.appendChild(r)};return n(s)?Object.keys(s).forEach((t=>{e(s,t)&&z(c,t,s[t])})):$(s)&&s.every((t=>l(t)))&&s.forEach((t=>{a(t)})),$(i)?i.forEach((t=>{a(t)})):a(i),c.appendChild(o),c})("a",{id:`anchor-${s}`,className:`${o}__anchor anchor-${s}`,href:d||`#${u}`,target:d?"_blank":"self","data-id":s},[g]),r.appendChild(y)},N=(t,e)=>{let r,s=t.className;if(!s||!((t,e)=>{const r=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!o(t)&&(s=t.className,!!s&&(n=t.classList,n?.contains?t.classList.contains(e):!!r.exec(s)))})(t,e))return!1;r=t.classList,r?.remove?r.remove(e):(s=T(s.replace(e,"")),t.className=s)},_=(e,r=!0,s=!0)=>{const n="outline-heading",i=e.innerHTML;let o;if(e.innerHTML=i.replace(/^\d+(?:(\.?\d*)*\s?)?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),N(e,n),!r)return!1;var c;o=e.querySelector(`.${n}__anchor`),s&&N(e,`${n}_start`),c=T(e.className),t(c)&&""===c&&e.removeAttribute("class"),e.removeChild(o)},H=(e,r=!0)=>{let s=1,n=0;const i=[];return e.forEach(((e,r)=>{const o=e.tagName.replace(/h/i,"");let c=parseInt(o,10),l=-1;var a;c>s?(n+=1,l=1===n?-1:r-1):c===s||cn?1===c?(n=1,l=-1):l=i[r-1].pid:c<=n&&(1===c?n=1:(n-=s-c,n<=1&&(n=1)),l=1===n?-1:((t,e,r)=>{let s,n,i=t[r-1];for(n=0;n]+(>|$)/g,""):"")})})),r?(t=>{const e={};return t.forEach((t=>{const r=JSON.stringify((t=>[t.pid])(t));e[r]=e[r]||[],e[r].push(t),t.index=e[r].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((r=>{e[r].forEach((e=>{t.filter((t=>t.pid===e.id)).forEach((t=>{t.code=e.code+"."+t.index}))}))})),t})(i):i};class O extends i{constructor(t){super(),this.attrs=O.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){let r,n,i,c,a;return this.attr(e),a=this.attr("articleElement"),n=this.attr("scrollElement"),i=this.attr("selector"),r=this.attr("created"),t(a)?c=document.querySelector(a):o(a)&&(c=a),c?(this.$articleElement=c,this.$scrollElement=l(n),this.$headings=[...c.querySelectorAll(i)],this.$headings.length<1||(this.chapters=H(this.$headings),s(r)&&r.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,r)=>{const s={},n=[];return t.forEach(((t,r)=>{s[t[e]]=r,t.children=[]})),t.forEach((e=>{const i=t[s[e[r]]];-1!==e[r]?i.children.push(e):n.push(e)})),n})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),r=this.attr("isAtStart"),n=this.attr("showCode"),i=this.attr("anchorURL"),o=this.$headings,c=this.getChapters();return L(),o.forEach(((t,s)=>{const o=c[s].code;S(t,s,{hasAnchor:e,isAtStart:r,showCode:n,chapterCode:o,anchorURL:i})})),s(t)&&t.call(this),this}scrollTo(t,e){return((t,e,r)=>{const n=l(t);let i=n.scrollTop,o=0;const a=e-i,h=n.scrollHeight,d=e-h<=0?e:h,u=t=>(s(r)&&r(t),!1),p=()=>{if(o+=1,a<0){if(i-=c(o),n.scrollTop=i,i<=e)return n.scrollTop=e,u(e)}else if(i+=c(o),n.scrollTop=i,i>=d)return n.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)})(this.$scrollElement,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),r=this.attr("beforeDestroy"),n=this.attr("afterDestroy"),i=this.$headings;return s(r)&&r.call(this),this.removeListeners(),i.forEach((r=>{_(r,t,e)})),this.attr(O.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],s(n)&&n.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),i=t.delegateTarget.parentNode,o=a(i)-(n+10),c=this.$scrollElement,l=c.scrollHeight-c.clientHeight;return this.scrollTo(o,(()=>{s(r)&&r.call(this,"anchor"),((t,e=300)=>{!!s(t)&&setTimeout((()=>{t()}),e)})((()=>{A("toolbar:update",{top:o,min:0,max:l})}))})),e||function(t){t.stopPropagation(),t.preventDefault()}(t),this}addListeners(){const t=this.$articleElement;return y(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return f(t,"click",this.onAnchorTrigger),this}}return O.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null},O})); //# sourceMappingURL=anchors.min.js.map diff --git a/anchors.min.js.map b/anchors.min.js.map index 2b09b3c3..6b3d7e61 100644 --- a/anchors.min.js.map +++ b/anchors.min.js.map @@ -1 +1 @@ -{"version":3,"file":"anchors.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isElement.js","src/utils/lang/easeInQuad.js","src/utils/dom/_getScrollElement.js","src/utils/dom/offsetTop.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/utils/types/isArray.js","src/utils/lang/trim.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/setAttribute.js","src/_updateHeading.js","src/utils/icons.js","src/utils/dom/createElement.js","src/utils/dom/removeClass.js","src/utils/dom/hasClass.js","src/_resetHeading.js","src/utils/types/isEmpty.js","src/getChapters.js","src/utils/lang/stripTags.js","src/_getChapterParentIdByDiffer.js","src/_getChaptersWithCode.js","src/anchors.js","src/utils/lang/toTree.js","src/utils/dom/scrollTo.js","src/utils/lang/later.js","src/utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from '../types/isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n return purgeElement(el, type)\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} data - (必须)数据对象\r\n * @param {Boolean} async - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttribute from './utils/dom/setAttribute'\r\n\r\nimport { createSvgIcon } from './utils/icons'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const keys = Object.keys(attrs)\r\n const text = trim($heading.innerHTML)\r\n let $anchor\r\n let $icon\r\n\r\n keys.forEach((prop) => {\r\n setAttribute($heading, prop, attrs[prop])\r\n })\r\n\r\n if (showCode) {\r\n $heading.innerHTML = chapterCode + ' ' + text\r\n }\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $icon = createSvgIcon('hash')\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: anchorURL ? anchorURL : `#${headingId}`,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n [$icon]\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","import isArray from './types/isArray'\r\n\r\n/**\r\n * 绘制 SVG Sprites 图标集\r\n * ========================================================================\r\n * @method paintSvgSprites\r\n * @param {Array} [symbols] - (可选)symbols 图标数组\r\n * 传递 symbols - 绘制 symbols + SYMBOLS 的图标集\r\n * 不传递 symbols - 仅绘制默认 SYMBOLS 图标集\r\n */\r\nexport const paintSvgSprites = (symbols = []) => {\r\n const SYMBOLS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n ]\r\n const sprites =\r\n isArray(symbols) && symbols.length > 0 ? SYMBOLS.concat(symbols) : SYMBOLS\r\n const $body = document.body\r\n let $icons = document.querySelector('#svg-sprites')\r\n\r\n if ($icons) {\r\n $icons.innerHTML = sprites.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createSvgIcon\r\n * @param {String} name\r\n * @param {Number|String|Array} [size]\r\n * @param {String} [color]\r\n * @param {String} [iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nexport const createSvgIcon = (\r\n name,\r\n size = 0,\r\n color = '',\r\n iconSet = 'outline'\r\n) => {\r\n const binds = iconSet\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const svg =\r\n `` +\r\n `` +\r\n ``\r\n const $icon = document.createElement('i')\r\n\r\n $icon.className = 'outline-icon'\r\n $icon.innerHTML = svg\r\n\r\n return $icon\r\n}\r\n","import hasOwn from '../lang/hasOwn'\r\nimport isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttribute from './setAttribute'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array} attrs - 属性对象或者子节点\r\n * @param {Array} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n Object.keys(attrs).forEach((attr) => {\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute($el, attr, attrs[attr])\r\n }\r\n })\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(/^\\d+(?:(\\.?\\d*)*\\s?)?/gi, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n $heading.removeChild($anchor)\r\n}\r\n\r\nexport default _resetHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\nconst getChapters = (headings, showCode = true) => {\r\n let previous = 1\r\n let level = 0\r\n const chapters = []\r\n\r\n headings.forEach((heading, i) => {\r\n const headingLevel = heading.tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text: stripTags(trim(heading.innerHTML))\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChapters\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","const _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = chapters.filter((b) => b.pid === c.id)\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import Base from './base'\r\n\r\n// 在文章的标题生成 anchor 链接\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport publish from './utils/observer/emit'\r\nimport { paintSvgSprites } from './utils/icons'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _resetHeading from './_resetHeading'\r\nimport getChapters from './getChapters'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Anchors.DEFAULTS\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n this.chapters = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let selector\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n selector = this.attr('selector')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = [...$articleElement.querySelectorAll(selector)]\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n this.chapters = getChapters(this.$headings)\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const chapters = this.chapters\r\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const $headings = this.$headings\r\n const chapters = this.getChapters()\r\n\r\n paintSvgSprites()\r\n\r\n $headings.forEach(($heading, i) => {\r\n const chapterCode = chapters[i].code\r\n _updateHeading($heading, i, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL\r\n })\r\n })\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n const $headings = this.$headings\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n $headings.forEach(($heading) => {\r\n _resetHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n this.attr(Anchors.DEFAULTS)\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n this.chapters = []\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n}\r\n\r\nexport default Anchors\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n requestAnimationFrame(play)\r\n }\r\n\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","offsetTop","el","top","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","fn","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","setTimeout","isArray","Array","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","className","_updateHeading","$heading","CLS_HEADING","hasAnchor","isAtStart","showCode","chapterCode","anchorURL","headingId","id","text","innerHTML","$anchor","$icon","name","size","color","iconSet","binds","width","height","defaultRules","svg","createElement","createSvgIcon","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","href","removeClass","classList","allClass","pattern","RegExp","contains","exec","hasClass","remove","_resetHeading","removeAttribute","removeChild","getChapters","headings","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","rel","groups","group","JSON","stringify","cb","code","String","c","b","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","symbols","SYMBOLS","sprites","concat","$body","body","$icons","join","insertBefore","firstChild","paintSvgSprites","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","delay","later","publish","min","stopPropagation","preventDefault"],"mappings":"wOAOA,MAAMA,EAAYC,GACM,iBAARA,ECAVC,EAAS,CAACC,EAAKC,KACnB,MAAMC,EAAiBC,OAAOC,UAAUF,eACxC,OAAOF,GAAOE,EAAeG,KAAKL,EAAKC,EAAI,ECHvCK,EAAYC,GACTJ,OAAOC,UAAUE,SAASE,MAAMD,GCCnCE,EAAcF,GACI,mBAARA,GAAwC,sBAAlBD,EAASC,GCAzCG,EAAYC,IAEG,oBAAhBL,EAASK,IACK,iBAANA,GACPF,EAAWE,KACP,OAANA,ECVJ,MAAMC,EACJC,YAAYC,GACVC,KAAKC,MAAQ,CAAE,EAEXF,GACFC,KAAKE,WAAWH,EAEnB,CAEDG,WAAWH,GAET,OADAC,KAAKG,KAAKJ,GAASK,SAASC,eACrBL,IACR,CAEDG,KAAKjB,EAAMoB,GACT,MAAML,EAAQD,KAAKC,MAEnB,OAAInB,EAASI,GAEPoB,GAAStB,EAAOiB,EAAOf,IAEzBe,EAAMf,GAAQoB,EACPN,MAIFC,EAAMf,GACJS,EAAST,ICvBRqB,EDyBHN,ECzBWO,EDyBJtB,ECxBLE,OAAOqB,KAAKD,GAEpBE,SAASxB,IACRF,EAAOwB,EAAQtB,KACjBqB,EAAOrB,GAAQsB,EAAOtB,GACvB,IDqBQc,MACuB,IAArBW,UAAUC,OAEZX,EAGFD,KCjCI,IAACO,EAAQC,CDkCrB,CAEDJ,SACE,OAAOJ,IACR,CAEDa,UAEE,OADAb,KAAKc,kBACEd,IACR,CAEDe,OAAOhB,GAEL,OADAC,KAAKa,UAAUX,WAAWF,KAAKG,KAAKJ,IAC7BC,IACR,CAEDK,eACE,OAAOL,IACR,CAEDc,kBACE,OAAOd,IACR,EExDH,MAAMgB,EAAapB,MACPD,EAASC,IAAMA,EAAEqB,UAAYrB,EAAEsB,SAA0B,IAAftB,EAAEuB,UCHlDC,EAAcC,GACXA,EAAIA,ECGPC,EAAoB,CAACC,EAAgB,QACzC,IAAIC,EACAC,EAgBJ,OAdKF,EAOCzC,EAASyC,GACXE,EAAiBC,SAASC,cAAcJ,GAC/BP,EAAUO,KACnBE,EAAiBF,IATnBC,EAAgBE,SAASE,iBAAiB,aAC1CH,EACED,EAAc,GAAGK,UAAYL,EAAc,GAAGK,WAAa,EACvDL,EAAc,GACdA,EAAc,IASfC,GCtBHK,EAAaC,IACjB,IAAIC,EAAMD,EAAGD,UAMb,OAJwB,OAApBC,EAAGE,eACLD,GAAOF,EAAUC,EAAGE,eAGfD,GCDHE,EAAU,CAACH,EAAII,EAAW,MAC9B,MAAMC,EAAMD,EAASE,QAAQ,MAAO,IAEpC,SAAKF,GAAaC,GAAQL,KAKtBA,EAAGG,QACEH,EAAGG,QAAQE,KACTL,EAAGO,mBACLP,EAAGO,kBAAkBF,GAG7B,ECpBGG,EAAmBR,GAChBA,EAAGS,MAAQT,IAAOL,UAAYK,EAAGS,KAAKrB,SACzCY,EAAGS,KACHT,EAAGU,WCVIC,EAAiB,CAC5B,WACA,OACA,UACA,QACA,OACA,SACA,aACA,cCMIC,EAAO,CAACZ,EAAIa,EAAMC,KACtB,MAAMC,EAAUJ,EAAeK,QAAQH,IAAS,EAG5CC,EAAGG,0BACLH,EAAKA,EAAGG,mBACEA,kBCZE,SAAUjB,EAAIa,EAAMC,GAClC,MAAMI,EAAYlB,EAAGmB,WACrB,IAAIC,GAAS,EAEb,GAAIF,EAAUrC,OAAS,EACrB,OAAO,EAITqC,EAAUvC,SAAQ,CAAC0C,EAAUC,KAC3B,MAAMC,EAAUF,EAASP,GAErBD,IAASQ,EAASR,OACpBO,EAAQE,EAEJC,IAAYT,IACdM,EAAQE,GAEX,IAICF,GAAS,GACXF,EAAUM,OAAOJ,EAAO,EAE5B,CDTEK,CAAQzB,EAAIa,EAAMC,GAElBd,EAAG0B,oBAAoBb,EAAMC,EAAIC,EAAQ,EEVrCY,EAAe,SAAU3B,EAAIa,EAAMe,GAAU,GACjD,MAAMC,EAAW9E,EAASiD,GAAML,SAASC,cAAcI,GAAMA,EACvD8B,EAAYD,EAASE,WACrBb,ECPa,EAAClB,EAAIa,KACxB,IAAIK,EAAYlB,EAAGmB,YAAc,GAQjC,OANIpE,EAAS8D,IAASA,IACpBK,EAAYA,EAAUc,QAAQX,GACrBA,EAASR,OAASA,KAItBK,GDFWe,CAAaJ,EAAUhB,GAEzCK,EAAUvC,SAAS0C,IACjBT,EAAKiB,EAAUR,EAASR,KAAMQ,EAASP,GAAG,KAIzCc,IAAoB,IAATf,GAAsC,IAArBjC,UAAUC,SACvCgD,GACAC,GAEAA,EAAUnD,SAASuD,IACbjD,EAAUiD,IACZP,EAAaO,EAAQrB,EAAMe,EAC5B,GAGP,EEtBMO,EAAM,CAACnC,EAAIa,EAAMC,KAErB,IAAKnD,EAAWmD,GACd,OAAOa,EAAa3B,EAAIa,GAG1BD,EAAKZ,EAAIa,EAAMC,EAAG,ECDdsB,EAAK,CAACpC,EAAII,EAAUS,EAAMC,EAAIuB,EAAMC,EAASC,GAAO,KAExD,MAAMxB,EAAUJ,EAAeK,QAAQH,IAAS,EAE1CQ,EAAW,SAAUmB,GACzB,MAAMC,ECfQ,SAAUD,GAC1B,MAAMC,EAASD,EAAIC,OAEnB,OCJgCzC,EDITyC,ICHG,IAAhBzC,EAAGZ,SACJY,EAAGU,WAGLV,EALe,IAAUA,CDKlC,CDWmB0C,CAAUF,GAEnBG,EGbM,EAAC3C,EAAII,EAAUwC,EAAKC,KAClC,MAAMP,EAAUM,GAAOjD,SAEvB,IAAKK,EACH,OAAO,KAGT,EAAG,CAED,GACe,MAAZI,IACEA,EAAS0C,WAAW,KACjB9C,EAAGU,aAAe4B,GAAWnC,EAAQH,EAAII,GACzCD,EAAQH,EAAII,KACjByC,GAAc7C,IAAOsC,EAEtB,OAAOtC,EAIT,GAAIA,IAAOsC,EACT,KAIN,OAAYtC,EAAKQ,EAAgBR,GAAK,EHZX+C,CAAQN,EAAQrC,EAAUJ,GACjD,IAAIgD,EAAkBV,GAAWtC,EAEjCwC,EAAIG,eAAiBA,GAIL,IAAZL,IACFU,EAAkBX,GAIhBM,KAGW,IAATJ,GACFJ,EAAInC,EAAIa,EAAMQ,GAGhBP,EAAGvD,KAAKyF,EAAiBR,EAAKH,GAEjC,EAEIrC,EAAGmB,aACNnB,EAAGmB,WAAa,IAIlBnB,EAAGmB,WAAW8B,KAAK,CACjBjD,KACAI,WACAS,OACAC,GAAIO,EACJgB,OACAC,UACAvB,YAIFD,EAAGG,kBAAoBI,EAEvBrB,EAAGkD,iBAAiBrC,EAAMQ,EAAUN,EAAQ,EI7DxCoC,EAAe,CAAA,ECIfC,EAA4BC,GACzBpG,EAAOkG,EAAcE,IAAUF,EAAaE,GAAOxE,OAAS,ECA/DyE,EAAM,CAACD,EAAOE,GAAW,IACtBA,EAAWH,EAAyBC,GCHrB,CAACA,IACvB,IAAIG,EAAQJ,EAAyBC,GACjCI,EAAWJ,EAAMK,YAAY,KAEjC,MAAQF,IAAuB,IAAdC,GAEfA,GADAJ,EAAQA,EAAMM,UAAU,EAAGF,IACVC,YAAY,KAC7BF,EAAQJ,EAAyBC,GAGnC,OAAOG,GDP6CI,CAAgBP,GEGhEQ,EAAO,CAACR,EAAOhB,EAAMyB,GAAQ,KACjC,MAAMC,EAAWV,IACf,IAAKD,EAAyBC,GAC5B,OAAO,EAGTF,EAAaE,GAAO1E,SAASqF,IAG3B,MAAMC,EChBI,CACZ,qBACA,sBACA,6BACA,sBACA,uBACA,sBACA,uBACA,wBACA,wBACA,yBACA,2BAGWjD,QAAQxD,EDEY6E,KCFM,EDEEA,EAAK7E,WAAa6E,EAEvD2B,EAAWE,SAAS3G,KAAKyG,EAAW1B,SAAW0B,EAAYC,EAAQ,GACnE,EAEEE,EAAU,KACd,IAAIH,EAAaX,EACbI,EAAWJ,EAAMK,YAAY,KAEjC,MAAqB,IAAdD,GACLO,EAAaA,EAAWL,UAAU,EAAGF,GACrCA,EAAWO,EAAWN,YAAY,KAElCK,EAAQC,GAIVD,EAAQV,GAERU,EAAQ,IAAI,EAGd,IAAKT,EAAID,GACP,OAAO,EAGLS,EACFM,WAAWD,EAAS,IAEpBA,GACD,EE7CGE,EAAWxG,GACXyG,MAAMD,QACDC,MAAMD,QAAQxG,GAEE,mBAAhBL,EAASK,GCJd0G,EAAQvH,KACPD,EAASC,IAGPA,EAAIsD,QAAQ,iBAAkB,ICPjCkE,EAASxE,IACb,SACEpC,EAASoC,MACRf,EAAUe,ICNU,CAACA,MACdpC,EAASoC,IAAwB,sBAAjBxC,EAASwC,IDKfyE,CAAiBzE,KENnB0E,EFMqC1E,EEJrDpC,EAAS8G,IAAoC,8BAAvBlH,EAASkH,KCFhB,CAAC1E,MAEhBpC,EAASoC,MACS,kBAAjBxC,EAASwC,IAA4BA,EAAGb,SAA2B,IAAhBa,EAAGZ,WHGKuF,CAAW3E,KENxD,IAAC0E,CFOjB,EIFGE,EAAe,CAAC5E,EAAI5B,EAAMG,KAC9B,IAAIY,EAAUa,EAAGb,QAAQ0F,cAEzB,OAAQzG,GACN,IAAK,QACH4B,EAAG8E,MAAMC,QAAUxG,EACnB,MACF,IAAK,QACa,UAAZY,GAAmC,aAAZA,EACzBa,EAAGzB,MAAQA,EAEXyB,EAAG4E,aAAaxG,EAAMG,GAExB,MACF,IAAK,YACHyB,EAAGgF,UAAYzG,EACf,MACF,QACEyB,EAAG4E,aAAaxG,EAAMG,GAEzB,ECtBG0G,EAAiB,CAACC,EAAU5D,EAAGtD,KACnC,MAAMmH,EAAc,kBACdC,EAAYpH,EAAQoH,YAAa,EACjCC,EAAYrH,EAAQqH,YAAa,EACjCC,EAAWtH,EAAQsH,WAAY,EAC/BC,EAAcvH,EAAQuH,aAAe,GACrCC,EAAYxH,EAAQwH,WAAa,GACjCC,EAAY,WAAWnE,IACvBpD,EAAQ,CACZwH,GAAID,EACJT,UAAWK,EAAY,GAAGF,KAAeA,UAAsBA,EAC/D,UAAW7D,GAEP5C,EAAOrB,OAAOqB,KAAKR,GACnByH,EAAOpB,EAAKW,EAASU,WAC3B,IAAIC,EACAC,EAUJ,GARApH,EAAKC,SAASxB,IACZyH,EAAaM,EAAU/H,EAAMe,EAAMf,GAAM,IAGvCmI,IACFJ,EAASU,UAAYL,EAAc,IAAMI,IAGtCP,EACH,OAAO,EAGTU,ECa2B,EAC3BC,EACAC,EAAO,EACPC,EAAQ,GACRC,EAAU,aAEV,MAAMC,EAAQD,EACV,gBAAgBA,UAAgBH,KAChC,qBAAqBA,KACnBK,EAAQ/B,EAAQ2B,GAAQA,EAAK,GAAKA,EAClCK,EAAShC,EAAQ2B,GAAQA,EAAK,GAAKA,EACnCM,EAAeN,EAAO,SAASI,cAAkBC,OAAc,GAE/DE,EACJ,4DAFeN,EAAQK,EAAe,SAASL,IAAUK,WAGjDH,iBAEJL,EAAQnG,SAAS6G,cAAc,KAKrC,OAHAV,EAAMd,UAAY,eAClBc,EAAMF,UAAYW,EAEXT,GDnCCW,CAAc,QACtBZ,EErBoB,EAAC1G,EAASjB,EAAOwI,KACrC,MAAMC,EAAYhH,SAASiH,yBACrBC,EAAMlH,SAAS6G,cAAcrH,GAC7B2H,EAAgBC,GACbvC,EAAMuC,IAAUhK,EAASgK,GAE5BC,EAAUD,IACd,IAAI7E,EAEJ,IAAK4E,EAAaC,GAChB,OAAO,EAGLvC,EAAMuC,GACR7E,EAAS6E,EACAhK,EAASgK,KAClB7E,EAASvC,SAASsH,eAAeF,IAGnCJ,EAAUO,YAAYhF,EAAO,EAyB/B,OAtBItE,EAASM,GACXb,OAAOqB,KAAKR,GAAOS,SAASP,IACtBnB,EAAOiB,EAAOE,IAChBwG,EAAaiC,EAAKzI,EAAMF,EAAME,GAC/B,IAEMiG,EAAQnG,IAAUA,EAAMiJ,OAAO/I,GAAS0I,EAAa1I,MAC9DF,EAAMS,SAASoI,IACbC,EAAOD,EAAM,IAIb1C,EAAQqC,GACVA,EAAS/H,SAASoI,IAChBC,EAAOD,EAAM,IAGfC,EAAON,GAGTG,EAAIK,YAAYP,GAETE,GFvBGL,CACR,IACA,CACEd,GAAI,UAAUpE,IACd0D,UAAW,GAAGG,oBAA8B7D,IAC5C8F,KAAM5B,GAAwB,IAAIC,IAClChD,OAAQ+C,EAAY,SAAW,OAC/B,UAAWlE,GAEb,CAACwE,IAEHZ,EAASgC,YAAYrB,EAAQ,EGrCzBwB,EAAc,CAACrH,EAAIgF,KACvB,IACIsC,EADAC,EAAWvH,EAAGgF,UAGlB,IAAKuC,ICNU,EAACvH,EAAIgF,KACpB,MAAMwC,EAAU,IAAIC,OAAO,UAAYzC,EAAY,WACnD,IAAIuC,EACAD,EAEJ,QAAKrI,EAAUe,KAIfuH,EAAWvH,EAAGgF,YAETuC,IAILD,EAAYtH,EAAGsH,UAEXA,GAAWI,SACN1H,EAAGsH,UAAUI,SAAS1C,KAGtBwC,EAAQG,KAAKJ,IAAQ,EDfZK,CAAS5H,EAAIgF,GAC7B,OAAO,EAGTsC,EAAYtH,EAAGsH,UAEXA,GAAWO,OACbP,EAAUO,OAAO7C,IAEjBuC,EAAWhD,EAAKgD,EAASjH,QAAQ0E,EAAW,KAC5ChF,EAAGgF,UAAYuC,EAChB,EEtBGO,EAAgB,CAAC5C,EAAUE,GAAY,EAAMC,GAAY,KAC7D,MAAMF,EAAc,kBACdQ,EAAOT,EAASU,UACtB,IAAIC,EAQJ,GANAX,EAASU,UAAYD,EAAKrF,QAAQ,0BAA2B,IAC7D4E,EAAS6C,gBAAgB,MACzB7C,EAAS6C,gBAAgB,WAEzBV,EAAYnC,EAAUC,IAEjBC,EACH,OAAO,ECRK,IAACpI,EDWf6I,EAAUX,EAAStF,cAAc,IAAIuF,aAEjCE,GACFgC,EAAYnC,EAAU,GAAGC,WCdZnI,EDiBHuH,EAAKW,EAASF,WChBnBjI,EAASC,IAAgB,KAARA,GDiBtBkI,EAAS6C,gBAAgB,SAG3B7C,EAAS8C,YAAYnC,EAAQ,EEvBzBoC,EAAc,CAACC,EAAU5C,GAAW,KACxC,IAAI6C,EAAW,EACXC,EAAQ,EACZ,MAAMC,EAAW,GAuEjB,OArEAH,EAASvJ,SAAQ,CAAC2J,EAAShH,KACzB,MAAMiH,EAAeD,EAAQnJ,QAAQmB,QAAQ,KAAM,IACnD,IAAIkI,EAAUC,SAASF,EAAc,IACjCG,GAAO,ECLG,IAAC1L,EDWXwL,EAAUL,GACZC,GAAS,EAIPM,EADY,IAAVN,GACK,EAED9G,EAAI,GAWLkH,IAAYL,GAAaK,EAAUL,GAAYK,EAAUJ,EAEhD,IAAZI,GACFJ,EAAQ,EACRM,GAAO,GAEPA,EAAML,EAAS/G,EAAI,GAAGoH,IAIjBF,GAAWJ,IAEF,IAAZI,EACFJ,EAAQ,GAERA,GAAiBD,EAAWK,EAExBJ,GAAS,IACXA,EAAQ,IAMVM,EADY,IAAVN,GACK,EE9DqB,EAACC,EAAUM,EAAQvH,KACrD,IACIsH,EACApH,EAFA6G,EAAWE,EAASjH,EAAQ,GAIhC,IAAKE,EAAI,EAAGA,EAAIqH,EAAQrH,GAAK,EAC3BoH,EAAMP,EAASO,IACfP,EAAWE,EAASK,GAKtB,OAFAA,EAAMP,EAASO,IAERA,GFqDKE,CAA4BP,EAAUF,EAAWK,EAASlH,IAIpE6G,EAAWK,EAEXH,EAASpF,KAAK,CACZyC,GAAIpE,EACJoH,IAAKA,EACLN,MAAOA,EACPS,IAAK,WAAWvH,IAChBqE,MCnEa3I,EDmEGuH,EAAK+D,EAAQ1C,WClE5B7I,EAASC,GAGPA,EAAIsD,QAAQ,kBAAmB,IAF7B,KDkEL,IAGGgF,EGhFoB,CAAC+C,IAC5B,MAAMS,EAAS,CAAE,EA0BjB,OArBAT,EAAS1J,SAASd,IAChB,MAAMkL,EAAQC,KAAKC,UALV,CAACpL,GACH,CAACA,EAAE6K,KAImBQ,CAAGrL,IAEhCiL,EAAOC,GAASD,EAAOC,IAAU,GACjCD,EAAOC,GAAO9F,KAAKpF,GAEnBA,EAAEuD,MAAQ0H,EAAOC,GAAOlK,QACT,IAAXhB,EAAE6K,MACJ7K,EAAEsL,KAAOC,OAAOvL,EAAEuD,OACnB,IAGH/D,OAAOqB,KAAKoK,GAAQnK,SAASoK,IAC3BD,EAAOC,GAAOpK,SAAS0K,IACJhB,EAASrG,QAAQsH,GAAMA,EAAEZ,MAAQW,EAAE3D,KAC3C/G,SAASd,IAChBA,EAAEsL,KAAOE,EAAEF,KAAO,IAAMtL,EAAEuD,KAAK,GAC/B,GACF,IAGGiH,GHqDWkB,CAAqBlB,GAAYA,GI3DrD,MAAMmB,UAAgB1L,EACpBC,YAAYC,GACVyL,QAEAxL,KAAKC,MAAQsL,EAAQE,SACrBzL,KAAK0L,gBAAkB,KACvB1L,KAAKyB,eAAiB,KACtBzB,KAAK2L,UAAY,GAEjB3L,KAAKoK,SAAW,GAEZrK,GACFC,KAAKE,WAAWH,EAEnB,CAEDG,WAAWH,GACT,IAAI6L,EACArK,EACAY,EACAuJ,EACAG,EAcJ,OAZA7L,KAAKG,KAAKJ,GACV8L,EAAiB7L,KAAKG,KAAK,kBAC3BoB,EAAgBvB,KAAKG,KAAK,iBAC1BgC,EAAWnC,KAAKG,KAAK,YACrByL,EAAU5L,KAAKG,KAAK,WAEhBrB,EAAS+M,GACXH,EAAkBhK,SAASC,cAAckK,GAChC7K,EAAU6K,KACnBH,EAAkBG,GAGfH,GAIL1L,KAAK0L,gBAAkBA,EACvB1L,KAAKyB,eAAiBH,EAAkBC,GACxCvB,KAAK2L,UAAY,IAAID,EAAgB9J,iBAAiBO,IAElDnC,KAAK2L,UAAU/K,OAAS,IAI5BZ,KAAKoK,SAAWJ,EAAYhK,KAAK2L,WAE7BjM,EAAWkM,IACbA,EAAQtM,KAAKU,MAGfA,KAAKI,SAASC,gBATLL,MARAA,IAoBV,CAEDgK,YAAY8B,GAAmB,GAC7B,MAAM1B,EAAWpK,KAAKoK,SACtB,OAAO0B,ECjFI,EAACC,EAAMC,EAASC,KAC7B,MAAMC,EAAM,CAAE,EACRC,EAAQ,GAoBd,OAlBAJ,EAAKrL,SAAQ,CAAC0L,EAAM/I,KAElB6I,EAAIE,EAAKJ,IAAY3I,EAErB+I,EAAK3D,SAAW,EAAE,IAGpBsD,EAAKrL,SAAS0L,IACZ,MAAMC,EAAON,EAAKG,EAAIE,EAAKH,MAEF,IAArBG,EAAKH,GAEPI,EAAK5D,SAASzD,KAAKoH,GAEnBD,EAAMnH,KAAKoH,EACZ,IAGID,GD2DqBG,CAAOlC,EAAU,KAAM,OAASA,CAC3D,CAEDmC,QACE,OAAOvM,KAAKoK,SAASxJ,MACtB,CAEDR,SACE,MAAMoM,EAAUxM,KAAKG,KAAK,WACpBgH,EAAYnH,KAAKG,KAAK,aACtBiH,EAAYpH,KAAKG,KAAK,aACtBkH,EAAWrH,KAAKG,KAAK,YACrBoH,EAAYvH,KAAKG,KAAK,aACtBwL,EAAY3L,KAAK2L,UACjBvB,EAAWpK,KAAKgK,cAmBtB,MVxG2B,EAACyC,EAAU,MACxC,MAAMC,EAAU,CACd,gbACA,2bACA,+MACA,yqBACA,4UACA,kqBACA,q4DACA,0wBACA,wvBAEIC,EACJvG,EAAQqG,IAAYA,EAAQ7L,OAAS,EAAI8L,EAAQE,OAAOH,GAAWC,EAC/DG,EAAQnL,SAASoL,KACvB,IAAIC,EAASrL,SAASC,cAAc,gBAEhCoL,EACFA,EAAOpF,UAAYgF,EAAQK,KAAK,KAEhCD,EAASrL,SAAS6G,cAAc,OAChCwE,EAAOpF,UAEL,qHAAGgF,EAAQK,KAAK,YAElBH,EAAMI,aAAaF,EAAOG,WAAYL,EAAMK,YAC7C,EU6DCC,GAEAxB,EAAUjL,SAAQ,CAACuG,EAAU5D,KAC3B,MAAMiE,EAAc8C,EAAS/G,GAAG6H,KAChClE,EAAeC,EAAU5D,EAAG,CAC1B8D,YACAC,YACAC,WACAC,cACAC,aACA,IAGA7H,EAAW8M,IACbA,EAAQlN,KAAKU,MAGRA,IACR,CAEDoN,SAASpL,EAAKqL,GAKZ,ME9Ga,EAAC9L,EAAeS,EAAKsL,KACpC,MAAM7L,EAAiBH,EAAkBC,GACzC,IAAIM,EAAYJ,EAAeI,UAC3B0L,EAAO,EACX,MAAMC,EAAWxL,EAAMH,EACjB4L,EAAahM,EAAeiM,aAC5BC,EAAU3L,EAAMyL,GAAc,EAAIzL,EAAMyL,EACxCG,EAAQ5L,IACRtC,EAAW4N,IACbA,EAAUtL,IAGL,GAEH6L,EAAO,KAIX,GAHAN,GAAQ,EAGJC,EAAW,GAIb,GAHA3L,GAAaT,EAAWmM,GACxB9L,EAAeI,UAAYA,EAEvBA,GAAaG,EAEf,OADAP,EAAeI,UAAYG,EACpB4L,EAAK5L,QAMd,GAHAH,GAAaT,EAAWmM,GACxB9L,EAAeI,UAAYA,EAEvBA,GAAa8L,EAEf,OADAlM,EAAeI,UAAY8L,EACpBC,EAAKD,GAIhBG,sBAAsBD,EAAK,EAG7BC,sBAAsBD,EAAK,EFqEzBT,CAFWpN,KAAKyB,eAEHO,EAAKqL,GAEXrN,IACR,CAEDa,UACE,MAAMsG,EAAYnH,KAAKG,KAAK,aACtBiH,EAAYpH,KAAKG,KAAK,aACtB4N,EAAgB/N,KAAKG,KAAK,iBAC1B6N,EAAehO,KAAKG,KAAK,gBACzBwL,EAAY3L,KAAK2L,UAqBvB,OAnBIjM,EAAWqO,IACbA,EAAczO,KAAKU,MAGrBA,KAAKc,kBACL6K,EAAUjL,SAASuG,IACjB4C,EAAc5C,EAAUE,EAAWC,EAAU,IAG/CpH,KAAKG,KAAKoL,EAAQE,UAClBzL,KAAK0L,gBAAkB,KACvB1L,KAAKyB,eAAiB,KACtBzB,KAAK2L,UAAY,GACjB3L,KAAKoK,SAAW,GAEZ1K,EAAWsO,IACbA,EAAa1O,KAAKU,MAGbA,IACR,CAEDiO,gBAAgB1J,GACd,MAAMgD,EAAYvH,KAAKG,KAAK,aACtB+N,EAAclO,KAAKG,KAAK,eACxBgO,EAAenO,KAAKG,KAAK,gBAEzB8G,EADU1C,EAAIG,eACKjC,WACnBT,EAAMF,EAAUmF,IAAakH,EAAe,IAC5C1M,EAAiBzB,KAAKyB,eAEtB2M,EAAM3M,EAAeiM,aAAejM,EAAe4M,aAqBzD,OANArO,KAAKoN,SAASpL,GAdA,KACRtC,EAAWwO,IACbA,EAAY5O,KAAKU,KAAM,UG5JjB,EAAC6C,EAAIyL,EAAQ,SACpB5O,EAAWmD,IAITsD,YAAW,KAChBtD,GAAI,GACHyL,EAAK,EHwJJC,EAAM,KACJC,EAAQ,iBAAkB,CACxBxM,MACAyM,IAVM,EAWNL,OACA,GACF,IAKC7G,GIxJI,SAAUhD,GACrBA,EAAImK,kBACJnK,EAAIoK,gBACN,CJsJMf,CAAKrJ,GAGAvE,IACR,CAEDK,eACE,MAAMqL,EAAkB1L,KAAK0L,gBAW7B,OATAvH,EACEuH,EACA,2BACA,QACA1L,KAAKiO,gBACLjO,MACA,GAGKA,IACR,CAEDc,kBACE,MAAM4K,EAAkB1L,KAAK0L,gBAI7B,OAFAxH,EAAIwH,EAAiB,QAAS1L,KAAKiO,iBAE5BjO,IACR,SAGHuL,EAAQE,SAAW,CACjBlK,cAAe,YACfsK,eAAgB,WAChB1J,SAAU,oBACVgM,aAAc,EACd5G,UAAW,GACXJ,WAAW,EACXC,WAAW,EACXC,UAAU,EACVuE,QAAS,KACTY,QAAS,KACT0B,YAAa,KACbH,cAAe,KACfC,aAAc"} \ No newline at end of file +{"version":3,"file":"anchors.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isElement.js","src/utils/lang/easeInQuad.js","src/utils/dom/_getScrollElement.js","src/utils/dom/offsetTop.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/utils/types/isArray.js","src/utils/icons/symbols.js","src/utils/icons/defaults.js","src/utils/icons/getSymbols.js","src/utils/icons/getSymbol.js","src/utils/icons/paint.js","src/utils/icons/add.js","src/utils/lang/trim.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/setAttribute.js","src/utils/types/isSVG.js","src/utils/icons/icon.js","src/utils/icons/createElement.js","src/_updateHeading.js","src/utils/dom/createElement.js","src/utils/dom/removeClass.js","src/utils/dom/hasClass.js","src/_resetHeading.js","src/utils/types/isEmpty.js","src/getChapters.js","src/utils/lang/stripTags.js","src/_getChapterParentIdByDiffer.js","src/_getChaptersWithCode.js","src/anchors.js","src/utils/lang/toTree.js","src/utils/dom/scrollTo.js","src/utils/lang/later.js","src/utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from '../types/isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n return purgeElement(el, type)\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} data - (必须)数据对象\r\n * @param {Boolean} async - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg =\r\n `` +\r\n `` +\r\n ``\r\n }\r\n\r\n $icon.className = 'outline-icon'\r\n $icon.innerHTML = svg\r\n\r\n if (isSVG(name)) {\r\n $svg = $icon.querySelector('svg')\r\n $svg.setAttribute('aria-hidden', 'true')\r\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\r\n $svg.setAttribute('class', 'outline-icon__svg')\r\n $svg.setAttribute('width', '200')\r\n $svg.setAttribute('height', '200')\r\n $svg.style = cssRules\r\n }\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttribute from './utils/dom/setAttribute'\r\n\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const keys = Object.keys(attrs)\r\n const text = trim($heading.innerHTML)\r\n let $anchor\r\n let $icon\r\n\r\n keys.forEach((prop) => {\r\n setAttribute($heading, prop, attrs[prop])\r\n })\r\n\r\n if (showCode) {\r\n $heading.innerHTML = chapterCode + ' ' + text\r\n }\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $icon = icon('hash')\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: anchorURL ? anchorURL : `#${headingId}`,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n [$icon]\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","import hasOwn from '../lang/hasOwn'\r\nimport isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttribute from './setAttribute'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array} attrs - 属性对象或者子节点\r\n * @param {Array} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n Object.keys(attrs).forEach((attr) => {\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute($el, attr, attrs[attr])\r\n }\r\n })\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(/^\\d+(?:(\\.?\\d*)*\\s?)?/gi, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n $heading.removeChild($anchor)\r\n}\r\n\r\nexport default _resetHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\nconst getChapters = (headings, showCode = true) => {\r\n let previous = 1\r\n let level = 0\r\n const chapters = []\r\n\r\n headings.forEach((heading, i) => {\r\n const headingLevel = heading.tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text: stripTags(trim(heading.innerHTML))\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChapters\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","const _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = chapters.filter((b) => b.pid === c.id)\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import Base from './base'\r\n\r\n// 在文章的标题生成 anchor 链接\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport publish from './utils/observer/emit'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _resetHeading from './_resetHeading'\r\nimport getChapters from './getChapters'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Anchors.DEFAULTS\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n this.chapters = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let selector\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n selector = this.attr('selector')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = [...$articleElement.querySelectorAll(selector)]\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n this.chapters = getChapters(this.$headings)\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const chapters = this.chapters\r\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const $headings = this.$headings\r\n const chapters = this.getChapters()\r\n\r\n paint()\r\n\r\n $headings.forEach(($heading, i) => {\r\n const chapterCode = chapters[i].code\r\n _updateHeading($heading, i, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL\r\n })\r\n })\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n const $headings = this.$headings\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n $headings.forEach(($heading) => {\r\n _resetHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n this.attr(Anchors.DEFAULTS)\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n this.chapters = []\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n}\r\n\r\nexport default Anchors\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n requestAnimationFrame(play)\r\n }\r\n\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","offsetTop","el","top","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","fn","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","setTimeout","isArray","Array","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","exec","iconName","getSymbol","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","className","isSVG","pattern","RegExp","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","_updateHeading","$heading","CLS_HEADING","hasAnchor","isAtStart","showCode","chapterCode","anchorURL","headingId","id","text","$anchor","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","href","removeClass","classList","allClass","contains","hasClass","remove","_resetHeading","removeAttribute","removeChild","getChapters","headings","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","rel","groups","group","JSON","stringify","cb","code","String","c","b","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","delay","later","publish","min","stopPropagation","preventDefault"],"mappings":"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"} \ No newline at end of file diff --git a/api/less/section.less b/api/less/section.less index 383bcc00..7709cca5 100644 --- a/api/less/section.less +++ b/api/less/section.less @@ -30,28 +30,26 @@ color: @fourth_text_color; } + &__dl, + &__dt, + &__dd { + margin: 0; + padding: 0; + overflow: hidden; + } + &__dl { position: relative; z-index: 1; - overflow: hidden; } &__dt { - position: absolute; - z-index: 2; - top: 0; - left: 0; - width: 60px; - margin: 0; - overflow: hidden; + display:inline-block; } &__dd { - position: relative; - z-index: 1; - margin: 0 0 0 60px; + display:inline-block; color: @success_color; - overflow: hidden; } &__pre { diff --git a/api/pug/fixed.pug b/api/pug/fixed.pug index db52b34a..3ba7c5db 100644 --- a/api/pug/fixed.pug +++ b/api/pug/fixed.pug @@ -22,7 +22,7 @@ html(lang='en') include ./footer script(src="js/outline.min.js") script. - const $header = document.querySelector('#header') + const $header = document.querySelector('#header') const HEADER_STICKY = 'header_sticky' const defaults = Outline.DEFAULTS let outline diff --git a/api/pug/methods.pug b/api/pug/methods.pug index 8e955d19..2103663a 100644 --- a/api/pug/methods.pug +++ b/api/pug/methods.pug @@ -28,6 +28,8 @@ ul.aside__list a.aside__anchor(href="#option-tags") tags li.aside__item a.aside__anchor(href="#option-issues") issues + li.aside__item + a.aside__anchor(href="#option-tools") tools li.aside__item a.aside__anchor(href="#option-customClass") customClass li.aside__item @@ -42,6 +44,8 @@ ul.aside__list a.aside__anchor(href="#property-defaults") DEFAULTS li.aside__item a.aside__anchor(href="#property-attrs") attrs + li.aside__item + a.aside__anchor(href="#property-buttons") buttons li.aside__item a.aside__anchor(href="#property-anchors") anchors li.aside__item @@ -58,6 +62,10 @@ ul.aside__list a.aside__anchor(href="#method-getChapters") getChapters() li.aside__item a.aside__anchor(href="#method-count") count() + li.aside__item + a.aside__anchor(href="#method-addButton") addButton() + li.aside__item + a.aside__anchor(href="#method-removeButton") removeButton() li.aside__item a.aside__anchor(href="#method-toTop") toTop() li.aside__item diff --git a/api/pug/methods/addButton.pug b/api/pug/methods/addButton.pug new file mode 100644 index 00000000..8e902c39 --- /dev/null +++ b/api/pug/methods/addButton.pug @@ -0,0 +1,45 @@ +section.section + header.section__header + h3#method-addButton.section__h3 addButton(button) + div.section__content + h4.section__h4 Description + p addButton() 方法添加自定义的工具栏按钮。 + h4.section__h4 Parameters + h5.section__h4 button + dl.section__dl + dt.section__dt Type: + dd.section__dd Object|Array + p (必须)单个按钮的配置信息或者多个按钮的配置信息。 + h4.section__h4 Returns + dl.section__dl + dt.section__dt Type: + dd.section__dd Outline + p Outline 对象,便于链式方法调用。 + pre.section__pre + code.section__code. + const outline = new Outline(Outline.DEFAULTS) + // 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源 + const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' + + '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' + + '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' + + '</svg>' + + outline.addButton({ + name: 'clean', + // 图标 + icon: clean, + size: 20, + color: '#f00' + // link 指定按钮点击后页面的跳转地址 + link: 'https://github.com/yaohaixiao', + // link 和 action 只能二选一 + // action 指定按钮的处理方式 + action: { + type: 'click', + // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件 + context: outline, + handler: function() { + // 回调函数的处理逻辑 + } + } + }) diff --git a/api/pug/methods/removeButton.pug b/api/pug/methods/removeButton.pug new file mode 100644 index 00000000..b9375d96 --- /dev/null +++ b/api/pug/methods/removeButton.pug @@ -0,0 +1,49 @@ +section.section + header.section__header + h3#method-removeButton.section__h3 removeButton(name) + div.section__content + h4.section__h4 Description + p removeButton() 方法移除工具栏按钮。 + h4.section__h4 Parameters + h5.section__h4 name + dl.section__dl + dt.section__dt Type: + dd.section__dd String + p (必须)按钮名称。 + h4.section__h4 Returns + dl.section__dl + dt.section__dt Type: + dd.section__dd Outline + p Outline 对象,便于链式方法调用。 + pre.section__pre + code.section__code. + const outline = new Outline(Outline.DEFAULTS) + // 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源 + const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' + + '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' + + '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' + + '</svg>' + + outline.addButton({ + name: 'clean', + // 图标 + icon: clean, + size: 20, + color: '#f00' + // link 指定按钮点击后页面的跳转地址 + link: 'https://github.com/yaohaixiao', + // link 和 action 只能二选一 + // action 指定按钮的处理方式 + action: { + type: 'click', + // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件 + context: outline, + handler: function() { + // 回调函数的处理逻辑 + } + } + }) + + setTimeout(() => { + outline.addButton('clean') + }, 5000) diff --git a/api/pug/methods/section.pug b/api/pug/methods/section.pug index 62d48193..dd4fd995 100644 --- a/api/pug/methods/section.pug +++ b/api/pug/methods/section.pug @@ -6,6 +6,8 @@ section.section include attr include getChapters include count + include addButton + include removeButton include toTop include toBottom include scrollTo diff --git a/api/pug/options/section.pug b/api/pug/options/section.pug index 6c8510f6..2f4476fe 100644 --- a/api/pug/options/section.pug +++ b/api/pug/options/section.pug @@ -16,6 +16,7 @@ section.section include git include tags include issues + include tools include customClass include afterScroll include afterSticky diff --git a/api/pug/options/tools.pug b/api/pug/options/tools.pug new file mode 100644 index 00000000..45647cc4 --- /dev/null +++ b/api/pug/options/tools.pug @@ -0,0 +1,46 @@ +section.section + header.section__header + h3#option-tools.section__h3 tools + div.section__content + h4.section__h4 Description + dl.section__dl + dt.section__dt Type: + dd.section__dd Array + dl.section__dl + dt.section__dt Default: + dd.section__dd [] + p 可选,自定义的按钮配置项。tools 中的按钮会排列显示在 homepage, git, tags, issues 等按钮之后。 + pre.section__pre + code.section__code. + const outline = new Outline(Outline.DEFAULTS) + // 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源 + const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' + + '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' + + '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' + + '</svg>' + + // 侧边栏的 Toolbar 会多出一个 git 图标的按钮 + outline.reload({ + git: 'https://github.com/yaohaixiao/outline.js', + tools: [ + { + name: 'clean', + // 图标 + icon: clean, + size: 20, + color: '#f00' + // link 指定按钮点击后页面的跳转地址 + link: 'https://github.com/yaohaixiao', + // link 和 action 只能二选一 + // action 指定按钮的处理方式 + action: { + type: 'click', + // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件 + context: outline, + handler: function() { + // 回调函数的处理逻辑 + } + } + } + ] + }) diff --git a/api/pug/properties/buttons.pug b/api/pug/properties/buttons.pug new file mode 100644 index 00000000..61c1c49a --- /dev/null +++ b/api/pug/properties/buttons.pug @@ -0,0 +1,17 @@ +section.section + header.section__header + h3#property-buttons.section__h3 buttons + div.section__content + h4.section__h4 Description + dl.section__dl + dt.section__dt Type: + dd.section__dd Array + p 存储的是 Outline 对象当前工具栏的完整的按钮配置信息: + pre.section__pre + code.section__code. + // 设置默认配置项 + const outline = new Outline(Outline.DEFAULTS) + + // 查看全部按钮配置信息 + outline.buttons + diff --git a/api/pug/properties/section.pug b/api/pug/properties/section.pug index 22fa3447..fb4d154e 100644 --- a/api/pug/properties/section.pug +++ b/api/pug/properties/section.pug @@ -5,6 +5,7 @@ section.section p outline.js 重构后,对外放 4 个重要的属性:anchors、drawer、chapters 和 toolbar。它们都是独立的对象实例,提供了 outline.js 所有的能力(属性和方法)。 include DEFAULTS include attrs + include buttons include anchors include chapters include drawer diff --git a/docs/css/docs.css b/docs/css/docs.css index 58708662..005bb98e 100644 --- a/docs/css/docs.css +++ b/docs/css/docs.css @@ -557,26 +557,23 @@ code { font-size: 1em; color: #999; } +.section__dl, +.section__dt, +.section__dd { + margin: 0; + padding: 0; + overflow: hidden; +} .section__dl { position: relative; z-index: 1; - overflow: hidden; } .section__dt { - position: absolute; - z-index: 2; - top: 0; - left: 0; - width: 60px; - margin: 0; - overflow: hidden; + display: inline-block; } .section__dd { - position: relative; - z-index: 1; - margin: 0 0 0 60px; + display: inline-block; color: #058942; - overflow: hidden; } .section__pre { margin: 2em 0; @@ -767,4 +764,4 @@ code { overflow: hidden; } -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLzxpbnB1dCBjc3MgMT4iLCJub3JtYWxpemUubGVzcyIsImJhc2UubGVzcyIsInNjcm9sbGJhci5sZXNzIiwibGF5b3V0Lmxlc3MiLCJhc2lkZS5sZXNzIiwibWFpbi5sZXNzIiwic2VjdGlvbi5sZXNzIiwiY2FzZS5sZXNzIiwiYnV0dG9ucy5sZXNzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRFQUE0RTtBQUM1RTtnRkFDZ0Y7QUFDaEY7OztHQUdHO0FDSUg7RUFDRSxrQkFBQTtFREZBLE9BQU87RUNHUCwrQkFBQTtFRERBLE9BQU87Q0FDUjtBQUNEO2dGQUNnRjtBQUNoRjs7R0FFRztBQ0tIO0VBQ0UsVUFBQTtDREhEO0FBQ0Q7O0dBRUc7QUNPSDtFQUNFLGVBQUE7Q0RMRDtBQUNEOzs7R0FHRztBQ1NIO0VBQ0UsZUFBQTtFQUNBLGlCQUFBO0NEUEQ7QUFDRDtnRkFDZ0Y7QUFDaEY7OztHQUdHO0FDWUg7RUFDRSxnQ0FBQTtVQUFBLHdCQUFBO0VEVkEsT0FBTztFQ1dQLFVBQUE7RURUQSxPQUFPO0VDVVAsa0JBQUE7RURSQSxPQUFPO0NBQ1I7QUFDRDs7O0dBR0c7QUNXSDtFQUNFLGtDQUFBO0VEVEEsT0FBTztFQ1VQLGVBQUE7RURSQSxPQUFPO0NBQ1I7QUFDRDtnRkFDZ0Y7QUFDaEY7O0dBRUc7QUNZSDtFQUNFLDhCQUFBO0NEVkQ7QUFDRDs7O0dBR0c7QUNjSDtFQUNFLG9CQUFBO0VEWkEsT0FBTztFQ2FQLDJCQUFBO0VEWEEsT0FBTztFQ1lQLDBDQUFBO1VBQUEsa0NBQUE7RURWQSxPQUFPO0NBQ1I7QUFDRDs7R0FFRztBQ2FIOztFQUVFLG9CQUFBO0NEWEQ7QUFDRDs7O0dBR0c7QUNlSDs7O0VBR0Usa0NBQUE7RURiQSxPQUFPO0VDY1AsZUFBQTtFRFpBLE9BQU87Q0FDUjtBQUNEOztHQUVHO0FDZUg7RUFDRSxlQUFBO0NEYkQ7QUFDRDs7O0dBR0c7QUNpQkg7O0VBRUUsZUFBQTtFQUNBLGVBQUE7RUFDQSxtQkFBQTtFQUNB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QUE7RUFDQSxhQUFBO0VBQ0EsY0FBQTtFQUNBLGFBQUE7RUFDQSwrQkFBQTtVQUFBLHVCQUFBO0VBQ0EsZUFBQTtDUnlqQkg7QVF0akJDOztFQUVFLFVBQUE7RUFDQSxXQUFBO0VBQ0Esc0JBQUE7RUFDQSxpQkFBQTtDUndqQkg7QVFyakJDO0VBQ0UsY0FBQTtFQUNBLDJCQUFBO0VBQ0EsOEJBQUE7RUFDQSxnQkFBQTtFQUNBLGVBQUE7Q1J1akJIO0FRcGpCQztFQUNFLGFBQUE7RUFDQSxrQkFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7Q1JzakJIO0FRcGpCRztFQUNFLDBCQUFBO0NSc2pCTDtBUzFxQkQ7RUFDRSxnQkFBQTtFQUNBLFdBQUE7RUFDQSxTQUFBO0VBQ0EsWUFBQTtFQUNBLFVBQUE7RUFDQSxZQUFBO0VBQ0Esb0NBQUE7VUFBQSw0QkFBQTtFQUNBLGlCQUFBO0NUNHFCRDtBUzFxQkM7RUFDRSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxhQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSx1QkFBQTtFQUNBLG1CQUFBO0VBQ0EsaUNBQUE7VUFBQSx5QkFBQTtFQUNBLCtCQUFBO1VBQUEsdUJBQUE7RUFDQSx1QkFBQTtFQUNBLGdCQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsaUJBQUE7Q1Q0cUJIO0FTMXFCRztFQUNFLGVBQUE7Q1Q0cUJMO0FTenFCRztFQUNFLGNBQUE7Q1QycUJMO0FTdHFCRzs7O0VBR0UsWUFBQTtDVHdxQkw7QVNycUJHO0VBQ0UsZUFBQTtDVHVxQkw7QVNucUJDO0VBQ0UsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsU0FBQTtFQUNBLFVBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLHlDQUFBO1VBQUEsaUNBQUE7RUFDQSxtQkFBQTtFQUNBLGlCQUFBO0NUcXFCSCIsImZpbGUiOiJkb2NzLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi8qISBub3JtYWxpemUuY3NzIHY4LjAuMSB8IE1JVCBMaWNlbnNlIHwgZ2l0aHViLmNvbS9uZWNvbGFzL25vcm1hbGl6ZS5jc3MgKi9cbi8qIERvY3VtZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBsaW5lIGhlaWdodCBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBQcmV2ZW50IGFkanVzdG1lbnRzIG9mIGZvbnQgc2l6ZSBhZnRlciBvcmllbnRhdGlvbiBjaGFuZ2VzIGluIGlPUy5cbiAqL1xuaHRtbCB7XG4gIGxpbmUtaGVpZ2h0OiAxLjE1O1xuICAvKiAxICovXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTtcbiAgLyogMiAqL1xufVxuLyogU2VjdGlvbnNcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIFJlbW92ZSB0aGUgbWFyZ2luIGluIGFsbCBicm93c2Vycy5cbiAqL1xuYm9keSB7XG4gIG1hcmdpbjogMDtcbn1cbi8qKlxuICogUmVuZGVyIHRoZSBgbWFpbmAgZWxlbWVudCBjb25zaXN0ZW50bHkgaW4gSUUuXG4gKi9cbm1haW4ge1xuICBkaXNwbGF5OiBibG9jaztcbn1cbi8qKlxuICogQ29ycmVjdCB0aGUgZm9udCBzaXplIGFuZCBtYXJnaW4gb24gYGgxYCBlbGVtZW50cyB3aXRoaW4gYHNlY3Rpb25gIGFuZFxuICogYGFydGljbGVgIGNvbnRleHRzIGluIENocm9tZSwgRmlyZWZveCwgYW5kIFNhZmFyaS5cbiAqL1xuaDEge1xuICBmb250LXNpemU6IDJlbTtcbiAgbWFyZ2luOiAwLjY3ZW0gMDtcbn1cbi8qIEdyb3VwaW5nIGNvbnRlbnRcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIDEuIEFkZCB0aGUgY29ycmVjdCBib3ggc2l6aW5nIGluIEZpcmVmb3guXG4gKiAyLiBTaG93IHRoZSBvdmVyZmxvdyBpbiBFZGdlIGFuZCBJRS5cbiAqL1xuaHIge1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgLyogMSAqL1xuICBoZWlnaHQ6IDA7XG4gIC8qIDEgKi9cbiAgb3ZlcmZsb3c6IHZpc2libGU7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xucHJlIHtcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgbW9ub3NwYWNlO1xuICAvKiAxICovXG4gIGZvbnQtc2l6ZTogMWVtO1xuICAvKiAyICovXG59XG4vKiBUZXh0LWxldmVsIHNlbWFudGljc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogUmVtb3ZlIHRoZSBncmF5IGJhY2tncm91bmQgb24gYWN0aXZlIGxpbmtzIGluIElFIDEwLlxuICovXG5hIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG4vKipcbiAqIDEuIFJlbW92ZSB0aGUgYm90dG9tIGJvcmRlciBpbiBDaHJvbWUgNTctXG4gKiAyLiBBZGQgdGhlIGNvcnJlY3QgdGV4dCBkZWNvcmF0aW9uIGluIENocm9tZSwgRWRnZSwgSUUsIE9wZXJhLCBhbmQgU2FmYXJpLlxuICovXG5hYmJyW3RpdGxlXSB7XG4gIGJvcmRlci1ib3R0b206IG5vbmU7XG4gIC8qIDEgKi9cbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIC8qIDIgKi9cbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xuICAvKiAyICovXG59XG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCBmb250IHdlaWdodCBpbiBDaHJvbWUsIEVkZ2UsIGFuZCBTYWZhcmkuXG4gKi9cbmIsXG5zdHJvbmcge1xuICBmb250LXdlaWdodDogYm9sZGVyO1xufVxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBpbmhlcml0YW5jZSBhbmQgc2NhbGluZyBvZiBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLlxuICogMi4gQ29ycmVjdCB0aGUgb2RkIGBlbWAgZm9udCBzaXppbmcgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5jb2RlLFxua2JkLFxuc2FtcCB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTtcbiAgLyogMSAqL1xuICBmb250LXNpemU6IDFlbTtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqL1xuc21hbGwge1xuICBmb250LXNpemU6IDgwJTtcbn1cbi8qKlxuICogUHJldmVudCBgc3ViYCBhbmQgYHN1cGAgZWxlbWVudHMgZnJvbSBhZmZlY3RpbmcgdGhlIGxpbmUgaGVpZ2h0IGluXG4gKiBhbGwgYnJvd3NlcnMuXG4gKi9cbnN1YixcbnN1cCB7XG4gIGZvbnQtc2l6ZTogNzUlO1xuICBsaW5lLWhlaWdodDogMDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5zdWIge1xuICBib3R0b206IC0wLjI1ZW07XG59XG5zdXAge1xuICB0b3A6IC0wLjVlbTtcbn1cbi8qIEVtYmVkZGVkIGNvbnRlbnRcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIFJlbW92ZSB0aGUgYm9yZGVyIG9uIGltYWdlcyBpbnNpZGUgbGlua3MgaW4gSUUgMTAuXG4gKi9cbmltZyB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbn1cbi8qIEZvcm1zXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiAxLiBDaGFuZ2UgdGhlIGZvbnQgc3R5bGVzIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIFJlbW92ZSB0aGUgbWFyZ2luIGluIEZpcmVmb3ggYW5kIFNhZmFyaS5cbiAqL1xuYnV0dG9uLFxuaW5wdXQsXG5vcHRncm91cCxcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIC8qIDEgKi9cbiAgZm9udC1zaXplOiAxMDAlO1xuICAvKiAxICovXG4gIGxpbmUtaGVpZ2h0OiAxLjE1O1xuICAvKiAxICovXG4gIG1hcmdpbjogMDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBTaG93IHRoZSBvdmVyZmxvdyBpbiBJRS5cbiAqIDEuIFNob3cgdGhlIG92ZXJmbG93IGluIEVkZ2UuXG4gKi9cbmJ1dHRvbixcbmlucHV0IHtcbiAgLyogMSAqL1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBFZGdlLCBGaXJlZm94LCBhbmQgSUUuXG4gKiAxLiBSZW1vdmUgdGhlIGluaGVyaXRhbmNlIG9mIHRleHQgdHJhbnNmb3JtIGluIEZpcmVmb3guXG4gKi9cbmJ1dHRvbixcbnNlbGVjdCB7XG4gIC8qIDEgKi9cbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG59XG4vKipcbiAqIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXG4gKi9cbmJ1dHRvbixcblt0eXBlPVwiYnV0dG9uXCJdLFxuW3R5cGU9XCJyZXNldFwiXSxcblt0eXBlPVwic3VibWl0XCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgaW5uZXIgYm9yZGVyIGFuZCBwYWRkaW5nIGluIEZpcmVmb3guXG4gKi9cbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPVwiYnV0dG9uXCJdOjotbW96LWZvY3VzLWlubmVyLFxuW3R5cGU9XCJyZXNldFwiXTo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPVwic3VibWl0XCJdOjotbW96LWZvY3VzLWlubmVyIHtcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xuICBwYWRkaW5nOiAwO1xufVxuLyoqXG4gKiBSZXN0b3JlIHRoZSBmb2N1cyBzdHlsZXMgdW5zZXQgYnkgdGhlIHByZXZpb3VzIHJ1bGUuXG4gKi9cbmJ1dHRvbjotbW96LWZvY3VzcmluZyxcblt0eXBlPVwiYnV0dG9uXCJdOi1tb3otZm9jdXNyaW5nLFxuW3R5cGU9XCJyZXNldFwiXTotbW96LWZvY3VzcmluZyxcblt0eXBlPVwic3VibWl0XCJdOi1tb3otZm9jdXNyaW5nIHtcbiAgb3V0bGluZTogMXB4IGRvdHRlZCBCdXR0b25UZXh0O1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBwYWRkaW5nIGluIEZpcmVmb3guXG4gKi9cbmZpZWxkc2V0IHtcbiAgcGFkZGluZzogMC4zNWVtIDAuNzVlbSAwLjYyNWVtO1xufVxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSB0ZXh0IHdyYXBwaW5nIGluIEVkZ2UgYW5kIElFLlxuICogMi4gQ29ycmVjdCB0aGUgY29sb3IgaW5oZXJpdGFuY2UgZnJvbSBgZmllbGRzZXRgIGVsZW1lbnRzIGluIElFLlxuICogMy4gUmVtb3ZlIHRoZSBwYWRkaW5nIHNvIGRldmVsb3BlcnMgYXJlIG5vdCBjYXVnaHQgb3V0IHdoZW4gdGhleSB6ZXJvIG91dFxuICogICAgYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbmxlZ2VuZCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC8qIDEgKi9cbiAgY29sb3I6IGluaGVyaXQ7XG4gIC8qIDIgKi9cbiAgZGlzcGxheTogdGFibGU7XG4gIC8qIDEgKi9cbiAgbWF4LXdpZHRoOiAxMDAlO1xuICAvKiAxICovXG4gIHBhZGRpbmc6IDA7XG4gIC8qIDMgKi9cbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgLyogMSAqL1xufVxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgdmVydGljYWwgYWxpZ25tZW50IGluIENocm9tZSwgRmlyZWZveCwgYW5kIE9wZXJhLlxuICovXG5wcm9ncmVzcyB7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBkZWZhdWx0IHZlcnRpY2FsIHNjcm9sbGJhciBpbiBJRSAxMCsuXG4gKi9cbnRleHRhcmVhIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4vKipcbiAqIDEuIEFkZCB0aGUgY29ycmVjdCBib3ggc2l6aW5nIGluIElFIDEwLlxuICogMi4gUmVtb3ZlIHRoZSBwYWRkaW5nIGluIElFIDEwLlxuICovXG5bdHlwZT1cImNoZWNrYm94XCJdLFxuW3R5cGU9XCJyYWRpb1wiXSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC8qIDEgKi9cbiAgcGFkZGluZzogMDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBjdXJzb3Igc3R5bGUgb2YgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgYnV0dG9ucyBpbiBDaHJvbWUuXG4gKi9cblt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBoZWlnaHQ6IGF1dG87XG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIG9kZCBhcHBlYXJhbmNlIGluIENocm9tZSBhbmQgU2FmYXJpLlxuICogMi4gQ29ycmVjdCB0aGUgb3V0bGluZSBzdHlsZSBpbiBTYWZhcmkuXG4gKi9cblt0eXBlPVwic2VhcmNoXCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG4gIC8qIDEgKi9cbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBpbm5lciBwYWRkaW5nIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIG1hY09TLlxuICovXG5bdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cbiAqIDIuIENoYW5nZSBmb250IHByb3BlcnRpZXMgdG8gYGluaGVyaXRgIGluIFNhZmFyaS5cbiAqL1xuOjotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xuICAvKiAxICovXG4gIGZvbnQ6IGluaGVyaXQ7XG4gIC8qIDIgKi9cbn1cbi8qIEludGVyYWN0aXZlXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLypcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIEVkZ2UsIElFIDEwKywgYW5kIEZpcmVmb3guXG4gKi9cbmRldGFpbHMge1xuICBkaXNwbGF5OiBibG9jaztcbn1cbi8qXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnN1bW1hcnkge1xuICBkaXNwbGF5OiBsaXN0LWl0ZW07XG59XG4vKiBNaXNjXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSAxMCsuXG4gKi9cbnRlbXBsYXRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgMTAuXG4gKi9cbltoaWRkZW5dIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qID09PT09IEJhc2UgPT09PT0gKi9cbmh0bWwsXG5ib2R5IHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kOiAjZmFmYWZhO1xuICBjb2xvcjogIzMzMztcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgZm9udC1mYW1pbHk6IFwiTWljcm9zb2Z0IFlhSGVpIFVJXCIsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuYTpsaW5rLFxuYTp2aXNpdGVkLFxuYTpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5hOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG5jb2RlIHtcbiAgZm9udC1mYW1pbHk6IFwiU291cmNlIENvZGUgUHJvXCIsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4vKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG59XG4vKiBMYXlvdXQgKi9cbi5kb2NzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLyogQXNpZGUgKi9cbi5hc2lkZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgd2lkdGg6IDI2MHB4O1xuICBtYXJnaW46IDA7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcbiAgY29sb3I6ICNkZGQ7XG4gIGJveC1zaGFkb3c6IDAgMCA1cHggMnB4ICNkZGQ7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLyogTWFpbiAqL1xuLm1haW4ge1xuICBmbGV4OiAxO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uYXNpZGUge1xuICBmb250LWZhbWlseTogXCJTb3VyY2UgQ29kZSBQcm9cIiwgQ29uc29sYXMsIEdlb3JnaWEsIE1vbmFjbywgbW9ub3NwYWNlLCBBcmlhbCwgc2Fucy1zZXJpZjtcbn1cbi5hc2lkZV9faGVhZGVyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmFzaWRlX19uYXYge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5hc2lkZV9faDIge1xuICBtYXJnaW46IDAgYXV0bztcbiAgaGVpZ2h0OiA1NHB4O1xuICBsaW5lLWhlaWdodDogNTRweDtcbiAgZm9udC1zaXplOiAyMHB4O1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBmb250LWZhbWlseTogR2VvcmdpYSwgQ29uc29sYXMsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYXNpZGVfX2gzIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHBhZGRpbmc6IDAgMjBweDtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmFzaWRlX19saXN0IHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAxMHB4IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYXNpZGVfX2l0ZW0ge1xuICBoZWlnaHQ6IDMycHg7XG4gIGxpbmUtaGVpZ2h0OiAzMnB4O1xuICBwYWRkaW5nOiAwIDMwcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmFzaWRlX19pdGVtLmFjdGl2ZSxcbi5hc2lkZV9faXRlbTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1NTU7XG59XG4uYXNpZGVfX2l0ZW0uYWN0aXZlIHtcbiAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZmZmO1xufVxuLmFzaWRlX19hbmNob3I6bGluayB7XG4gIGNvbG9yOiAjZGRkO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4uYXNpZGVfX2FuY2hvcjp2aXNpdGVkIHtcbiAgY29sb3I6ICNkZGQ7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5hc2lkZV9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICNkZGQ7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuLm1haW5fX2hlYWRlcixcbi5tYWluX19mb290ZXIge1xuICBtYXJnaW46IDAgYXV0bztcbiAgcGFkZGluZzogMWVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9faDEge1xuICBtYXJnaW46IDAgYXV0bztcbiAgcGFkZGluZy10b3A6IDFlbTtcbiAgZm9udC1zaXplOiA1ZW07XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAyZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fbmFtZSB7XG4gIGNvbG9yOiAjMWY4ZGQ2O1xuICBmb250LXdlaWdodDogbm9ybWFsO1xufVxuLm1haW5fX3RhZ2xpbmUge1xuICBtYXJnaW46IDFlbSBhdXRvO1xuICBtYXgtd2lkdGg6IDY2MHB4O1xuICBsaW5lLWhlaWdodDogMS4zZW07XG4gIGZvbnQtc2l6ZTogMmVtO1xuICBjb2xvcjogIzk5OTtcbiAgZm9udC13ZWlnaHQ6IDEwMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19jZG4ge1xuICBtYXJnaW46IDJlbSAwO1xuICBwYWRkaW5nOiAyZW07XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBjb2xvcjogIzY2NjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19kb3dubG9hZCB7XG4gIG1hcmdpbjogMWVtIGF1dG87XG4gIHdpZHRoOiAyMDBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2J1dHRvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBwYWRkaW5nOiAxNHB4IDI5cHg7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgZm9udC1mYW1pbHk6IFwiU291cmNlIENvZGUgUHJvXCIsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwNTg5NDI7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fYnV0dG9uOmxpbmssXG4ubWFpbl9fYnV0dG9uOnZpc2l0ZWQsXG4ubWFpbl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5tYWluX19mb290ZXIge1xuICBtYXJnaW46IDAgM2VtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbn1cbi5zZWN0aW9uIHtcbiAgbWFyZ2luOiAxZW0gMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX19oZWFkZXIsXG4uc2VjdGlvbl9fY29udGVudCxcbi5zZWN0aW9uX19mb290ZXIge1xuICBtYXJnaW46IDAgM2VtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX3RpdGxlIHtcbiAgY29sb3I6ICM2NjY7XG59XG4uc2VjdGlvbl9faDMge1xuICBjb2xvcjogIzFmOGRkNjtcbiAgZm9udC1zaXplOiAxLjM1ZW07XG59XG4uc2VjdGlvbl9faDQge1xuICBmb250LXNpemU6IDEuMWVtO1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oNSB7XG4gIGZvbnQtc2l6ZTogMWVtO1xuICBjb2xvcjogIzk5OTtcbn1cbi5zZWN0aW9uX19kbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX19kdCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogNjBweDtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2RkIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDAgMCAwIDYwcHg7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX3ByZSB7XG4gIG1hcmdpbjogMmVtIDA7XG4gIHBhZGRpbmc6IDFlbTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBjb2xvcjogIzY2NjtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uc2VjdGlvbl9fY29kZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDAgYXV0bztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX19mb290ZXIge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgbWFyZ2luLXRvcDogM2VtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBjb2xvcjogIzk5OTtcbn1cbi5jYXNlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xuICBnYXA6IDQwcHg7XG4gIHBhZGRpbmc6IDFlbTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2U6YWZ0ZXIge1xuICBjb250ZW50OiAnJztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDUwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMDtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX3ByZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX2NvZGUsXG4uY2FzZV9fdGV4dGFyZWEge1xuICBmb250LWZhbWlseTogXCJDb3VyaWVyIE5ld1wiLCBDb25zb2xhcywgR2VvcmdpYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uY2FzZV9fcHJlIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX190b29sYmFyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19hY3Rpb24sXG4uY2FzZV9fcmVtb3ZlIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzA1ODk0MjtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4uY2FzZV9fYWN0aW9uIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG4uY2FzZV9fYWN0aW9uOmZpcnN0LWNoaWxkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xufVxuLmNhc2VfX3JlbW92ZSB7XG4gIGZsb2F0OiByaWdodDtcbn1cbi5jYXNlX19jb25zb2xlIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMTgwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fdGV4dGFyZWEge1xuICBtYXJnaW46IDAgYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nOiAxZW07XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2xpc3QsXG4uY2FzZV9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX2xpc3Qge1xuICBoZWlnaHQ6IDM2MHB4O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9faXRlbSB7XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLmNhc2VfX2l0ZW06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xufVxuLmJ1dHRvbnMge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTJweDtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogNTZweDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmJ1dHRvbnNfX2l0ZW0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMTBweDtcbiAgd2lkdGg6IDM2cHg7XG4gIGhlaWdodDogMzZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBib3gtc2hhZG93OiAwIDAgNnB4ICNkZGQ7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogIzk5OTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5idXR0b25zX19pdGVtOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4uYnV0dG9uc19faXRlbS5oaWRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5idXR0b25zX19hbmNob3I6bGluayxcbi5idXR0b25zX19hbmNob3I6dmlzaXRlZCxcbi5idXR0b25zX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbn1cbi5idXR0b25zX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5idXR0b25zX19pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuIiwiLyohIG5vcm1hbGl6ZS5jc3MgdjguMC4xIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xyXG5cclxuLyogRG9jdW1lbnRcclxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbi8qKlxyXG4gKiAxLiBDb3JyZWN0IHRoZSBsaW5lIGhlaWdodCBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqIDIuIFByZXZlbnQgYWRqdXN0bWVudHMgb2YgZm9udCBzaXplIGFmdGVyIG9yaWVudGF0aW9uIGNoYW5nZXMgaW4gaU9TLlxyXG4gKi9cclxuXHJcbmh0bWwge1xyXG4gIGxpbmUtaGVpZ2h0OiAxLjE1OyAvKiAxICovXHJcbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovXHJcbn1cclxuXHJcbi8qIFNlY3Rpb25zXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBtYXJnaW4gaW4gYWxsIGJyb3dzZXJzLlxyXG4gKi9cclxuXHJcbmJvZHkge1xyXG4gIG1hcmdpbjogMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbmRlciB0aGUgYG1haW5gIGVsZW1lbnQgY29uc2lzdGVudGx5IGluIElFLlxyXG4gKi9cclxuXHJcbm1haW4ge1xyXG4gIGRpc3BsYXk6IGJsb2NrO1xyXG59XHJcblxyXG4vKipcclxuICogQ29ycmVjdCB0aGUgZm9udCBzaXplIGFuZCBtYXJnaW4gb24gYGgxYCBlbGVtZW50cyB3aXRoaW4gYHNlY3Rpb25gIGFuZFxyXG4gKiBgYXJ0aWNsZWAgY29udGV4dHMgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgU2FmYXJpLlxyXG4gKi9cclxuXHJcbmgxIHtcclxuICBmb250LXNpemU6IDJlbTtcclxuICBtYXJnaW46IDAuNjdlbSAwO1xyXG59XHJcblxyXG4vKiBHcm91cGluZyBjb250ZW50XHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gRmlyZWZveC5cclxuICogMi4gU2hvdyB0aGUgb3ZlcmZsb3cgaW4gRWRnZSBhbmQgSUUuXHJcbiAqL1xyXG5cclxuaHIge1xyXG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAvKiAxICovXHJcbiAgaGVpZ2h0OiAwOyAvKiAxICovXHJcbiAgb3ZlcmZsb3c6IHZpc2libGU7IC8qIDIgKi9cclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5wcmUge1xyXG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTsgLyogMSAqL1xyXG4gIGZvbnQtc2l6ZTogMWVtOyAvKiAyICovXHJcbn1cclxuXHJcbi8qIFRleHQtbGV2ZWwgc2VtYW50aWNzXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBncmF5IGJhY2tncm91bmQgb24gYWN0aXZlIGxpbmtzIGluIElFIDEwLlxyXG4gKi9cclxuXHJcbmEge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG59XHJcblxyXG4vKipcclxuICogMS4gUmVtb3ZlIHRoZSBib3R0b20gYm9yZGVyIGluIENocm9tZSA1Ny1cclxuICogMi4gQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS5cclxuICovXHJcblxyXG5hYmJyW3RpdGxlXSB7XHJcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTsgLyogMSAqL1xyXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyAvKiAyICovXHJcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkOyAvKiAyICovXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxyXG4gKi9cclxuXHJcbmIsXHJcbnN0cm9uZyB7XHJcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5jb2RlLFxyXG5rYmQsXHJcbnNhbXAge1xyXG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTsgLyogMSAqL1xyXG4gIGZvbnQtc2l6ZTogMWVtOyAvKiAyICovXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5zbWFsbCB7XHJcbiAgZm9udC1zaXplOiA4MCU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcmV2ZW50IGBzdWJgIGFuZCBgc3VwYCBlbGVtZW50cyBmcm9tIGFmZmVjdGluZyB0aGUgbGluZSBoZWlnaHQgaW5cclxuICogYWxsIGJyb3dzZXJzLlxyXG4gKi9cclxuXHJcbnN1Yixcclxuc3VwIHtcclxuICBmb250LXNpemU6IDc1JTtcclxuICBsaW5lLWhlaWdodDogMDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xyXG59XHJcblxyXG5zdWIge1xyXG4gIGJvdHRvbTogLTAuMjVlbTtcclxufVxyXG5cclxuc3VwIHtcclxuICB0b3A6IC0wLjVlbTtcclxufVxyXG5cclxuLyogRW1iZWRkZWQgY29udGVudFxyXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgYm9yZGVyIG9uIGltYWdlcyBpbnNpZGUgbGlua3MgaW4gSUUgMTAuXHJcbiAqL1xyXG5cclxuaW1nIHtcclxuICBib3JkZXItc3R5bGU6IG5vbmU7XHJcbn1cclxuXHJcbi8qIEZvcm1zXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqIDIuIFJlbW92ZSB0aGUgbWFyZ2luIGluIEZpcmVmb3ggYW5kIFNhZmFyaS5cclxuICovXHJcblxyXG5idXR0b24sXHJcbmlucHV0LFxyXG5vcHRncm91cCxcclxuc2VsZWN0LFxyXG50ZXh0YXJlYSB7XHJcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7IC8qIDEgKi9cclxuICBmb250LXNpemU6IDEwMCU7IC8qIDEgKi9cclxuICBsaW5lLWhlaWdodDogMS4xNTsgLyogMSAqL1xyXG4gIG1hcmdpbjogMDsgLyogMiAqL1xyXG59XHJcblxyXG4vKipcclxuICogU2hvdyB0aGUgb3ZlcmZsb3cgaW4gSUUuXHJcbiAqIDEuIFNob3cgdGhlIG92ZXJmbG93IGluIEVkZ2UuXHJcbiAqL1xyXG5cclxuYnV0dG9uLFxyXG5pbnB1dCB7IC8qIDEgKi9cclxuICBvdmVyZmxvdzogdmlzaWJsZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSwgRmlyZWZveCwgYW5kIElFLlxyXG4gKiAxLiBSZW1vdmUgdGhlIGluaGVyaXRhbmNlIG9mIHRleHQgdHJhbnNmb3JtIGluIEZpcmVmb3guXHJcbiAqL1xyXG5cclxuYnV0dG9uLFxyXG5zZWxlY3QgeyAvKiAxICovXHJcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxyXG4gKi9cclxuXHJcbmJ1dHRvbixcclxuW3R5cGU9XCJidXR0b25cIl0sXHJcblt0eXBlPVwicmVzZXRcIl0sXHJcblt0eXBlPVwic3VibWl0XCJdIHtcclxuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgaW5uZXIgYm9yZGVyIGFuZCBwYWRkaW5nIGluIEZpcmVmb3guXHJcbiAqL1xyXG5cclxuYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLFxyXG5bdHlwZT1cImJ1dHRvblwiXTo6LW1vei1mb2N1cy1pbm5lcixcclxuW3R5cGU9XCJyZXNldFwiXTo6LW1vei1mb2N1cy1pbm5lcixcclxuW3R5cGU9XCJzdWJtaXRcIl06Oi1tb3otZm9jdXMtaW5uZXIge1xyXG4gIGJvcmRlci1zdHlsZTogbm9uZTtcclxuICBwYWRkaW5nOiAwO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzdG9yZSB0aGUgZm9jdXMgc3R5bGVzIHVuc2V0IGJ5IHRoZSBwcmV2aW91cyBydWxlLlxyXG4gKi9cclxuXHJcbmJ1dHRvbjotbW96LWZvY3VzcmluZyxcclxuW3R5cGU9XCJidXR0b25cIl06LW1vei1mb2N1c3JpbmcsXHJcblt0eXBlPVwicmVzZXRcIl06LW1vei1mb2N1c3JpbmcsXHJcblt0eXBlPVwic3VibWl0XCJdOi1tb3otZm9jdXNyaW5nIHtcclxuICBvdXRsaW5lOiAxcHggZG90dGVkIEJ1dHRvblRleHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb3JyZWN0IHRoZSBwYWRkaW5nIGluIEZpcmVmb3guXHJcbiAqL1xyXG5cclxuZmllbGRzZXQge1xyXG4gIHBhZGRpbmc6IDAuMzVlbSAwLjc1ZW0gMC42MjVlbTtcclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIENvcnJlY3QgdGhlIHRleHQgd3JhcHBpbmcgaW4gRWRnZSBhbmQgSUUuXHJcbiAqIDIuIENvcnJlY3QgdGhlIGNvbG9yIGluaGVyaXRhbmNlIGZyb20gYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBJRS5cclxuICogMy4gUmVtb3ZlIHRoZSBwYWRkaW5nIHNvIGRldmVsb3BlcnMgYXJlIG5vdCBjYXVnaHQgb3V0IHdoZW4gdGhleSB6ZXJvIG91dFxyXG4gKiAgICBgZmllbGRzZXRgIGVsZW1lbnRzIGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5sZWdlbmQge1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8qIDEgKi9cclxuICBjb2xvcjogaW5oZXJpdDsgLyogMiAqL1xyXG4gIGRpc3BsYXk6IHRhYmxlOyAvKiAxICovXHJcbiAgbWF4LXdpZHRoOiAxMDAlOyAvKiAxICovXHJcbiAgcGFkZGluZzogMDsgLyogMyAqL1xyXG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7IC8qIDEgKi9cclxufVxyXG5cclxuLyoqXHJcbiAqIEFkZCB0aGUgY29ycmVjdCB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgT3BlcmEuXHJcbiAqL1xyXG5cclxucHJvZ3Jlc3Mge1xyXG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgZGVmYXVsdCB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW4gSUUgMTArLlxyXG4gKi9cclxuXHJcbnRleHRhcmVhIHtcclxuICBvdmVyZmxvdzogYXV0bztcclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIEFkZCB0aGUgY29ycmVjdCBib3ggc2l6aW5nIGluIElFIDEwLlxyXG4gKiAyLiBSZW1vdmUgdGhlIHBhZGRpbmcgaW4gSUUgMTAuXHJcbiAqL1xyXG5cclxuW3R5cGU9XCJjaGVja2JveFwiXSxcclxuW3R5cGU9XCJyYWRpb1wiXSB7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLyogMSAqL1xyXG4gIHBhZGRpbmc6IDA7IC8qIDIgKi9cclxufVxyXG5cclxuLyoqXHJcbiAqIENvcnJlY3QgdGhlIGN1cnNvciBzdHlsZSBvZiBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBidXR0b25zIGluIENocm9tZS5cclxuICovXHJcblxyXG5bdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcclxuW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xyXG4gIGhlaWdodDogYXV0bztcclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIENvcnJlY3QgdGhlIG9kZCBhcHBlYXJhbmNlIGluIENocm9tZSBhbmQgU2FmYXJpLlxyXG4gKiAyLiBDb3JyZWN0IHRoZSBvdXRsaW5lIHN0eWxlIGluIFNhZmFyaS5cclxuICovXHJcblxyXG5bdHlwZT1cInNlYXJjaFwiXSB7XHJcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7IC8qIDEgKi9cclxuICBvdXRsaW5lLW9mZnNldDogLTJweDsgLyogMiAqL1xyXG59XHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBpbm5lciBwYWRkaW5nIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIG1hY09TLlxyXG4gKi9cclxuXHJcblt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uIHtcclxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAxLiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxyXG4gKiAyLiBDaGFuZ2UgZm9udCBwcm9wZXJ0aWVzIHRvIGBpbmhlcml0YCBpbiBTYWZhcmkuXHJcbiAqL1xyXG5cclxuOjotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbiB7XHJcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247IC8qIDEgKi9cclxuICBmb250OiBpbmhlcml0OyAvKiAyICovXHJcbn1cclxuXHJcbi8qIEludGVyYWN0aXZlXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBFZGdlLCBJRSAxMCssIGFuZCBGaXJlZm94LlxyXG4gKi9cclxuXHJcbmRldGFpbHMge1xyXG4gIGRpc3BsYXk6IGJsb2NrO1xyXG59XHJcblxyXG4vKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqL1xyXG5cclxuc3VtbWFyeSB7XHJcbiAgZGlzcGxheTogbGlzdC1pdGVtO1xyXG59XHJcblxyXG4vKiBNaXNjXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgMTArLlxyXG4gKi9cclxuXHJcbnRlbXBsYXRlIHtcclxuICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4vKipcclxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgMTAuXHJcbiAqL1xyXG5cclxuW2hpZGRlbl0ge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuIiwiQGltcG9ydCAnY29sb3JzJztcclxuXHJcbi8qID09PT09IEJhc2UgPT09PT0gKi9cclxuaHRtbCxcclxuYm9keSB7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIGJhY2tncm91bmQ6IEBiZ19jb2xvcjtcclxuICBjb2xvcjogQHByaW1hcnlfdGV4dF9jb2xvcjtcclxuICBmb250LXNpemU6IDE0cHg7XHJcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XHJcbiAgZm9udC1mYW1pbHk6IFwiTWljcm9zb2Z0IFlhSGVpIFVJXCIsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuXHJcbmEge1xyXG4gICY6bGluayxcclxuICAmOnZpc2l0ZWQsXHJcbiAgJjpob3ZlciB7XHJcbiAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgfVxyXG5cclxuICAmOmhvdmVyIHtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xyXG4gIH1cclxufVxyXG5cclxuY29kZSB7XHJcbiAgZm9udC1mYW1pbHk6IFwiU291cmNlIENvZGUgUHJvXCIsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbn1cclxuIiwiLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIHdpZHRoOiA3cHg7XHJcbiAgaGVpZ2h0OiA3cHg7XHJcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2stcGllY2Uge1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XHJcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XHJcbn1cclxuIiwiQGltcG9ydCAnY29sb3JzJztcclxuXHJcbi8qIExheW91dCAqL1xyXG4uZG9jcyB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICB3aWR0aDogMTAwJTtcclxuICBtYXJnaW46IDA7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLyogQXNpZGUgKi9cclxuLmFzaWRlIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtc2hyaW5rOiAwO1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgd2lkdGg6IDI2MHB4O1xyXG4gIG1hcmdpbjogMDtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogQHByaW1hcnlfdGV4dF9jb2xvcjtcclxuICBjb2xvcjogQGJvcmRlcl9jb2xvcjtcclxuICBib3gtc2hhZG93OiAwIDAgNXB4IDJweCBAYm9yZGVyX2NvbG9yO1xyXG4gIG92ZXJmbG93OiBhdXRvO1xyXG59XHJcblxyXG4vKiBNYWluICovXHJcbi5tYWluIHtcclxuICBmbGV4OiAxO1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgb3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuIiwiQGltcG9ydCAnY29sb3JzJztcclxuXHJcbi5hc2lkZSB7XHJcbiAgZm9udC1mYW1pbHk6IFwiU291cmNlIENvZGUgUHJvXCIsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XHJcblxyXG4gICZfX2hlYWRlciB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX25hdiB7XHJcbiAgICBmbGV4OiAxO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX19oMiB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGhlaWdodDogNTRweDtcclxuICAgIGxpbmUtaGVpZ2h0OiA1NHB4O1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxuICAgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCBDb25zb2xhcywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9faDMge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBwYWRkaW5nOiAwIDIwcHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9faXRlbSB7XHJcbiAgICBoZWlnaHQ6IDMycHg7XHJcbiAgICBsaW5lLWhlaWdodDogMzJweDtcclxuICAgIHBhZGRpbmc6IDAgMzBweDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgJi5hY3RpdmUsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHNlY29uZGFyeV90ZXh0X2NvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgICYuYWN0aXZlIHtcclxuICAgICAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCBAd2hpdGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19hbmNob3I6bGluayB7XHJcbiAgICBjb2xvcjogQGJvcmRlcl9jb2xvcjtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICB9XHJcblxyXG4gICZfX2FuY2hvcjp2aXNpdGVkIHtcclxuICAgIGNvbG9yOiBAYm9yZGVyX2NvbG9yO1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gIH1cclxuXHJcbiAgJl9fYW5jaG9yOmhvdmVyIHtcclxuICAgIGNvbG9yOiBAYm9yZGVyX2NvbG9yO1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJ2NvbG9ycyc7XHJcblxyXG4ubWFpbiB7XHJcbiAgJl9faGVhZGVyLFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIHBhZGRpbmc6IDFlbTtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19oMSB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIHBhZGRpbmctdG9wOiAxZW07XHJcbiAgICBmb250LXNpemU6IDVlbTtcclxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcbiAgICBsaW5lLWhlaWdodDogMi4wZW07XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbmFtZSB7XHJcbiAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xyXG4gIH1cclxuXHJcbiAgJl9fdGFnbGluZSB7XHJcbiAgICBtYXJnaW46IDFlbSBhdXRvO1xyXG4gICAgbWF4LXdpZHRoOiA2NjBweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxLjNlbTtcclxuICAgIGZvbnQtc2l6ZTogMmVtO1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgIGZvbnQtd2VpZ2h0OiAxMDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fY2RuIHtcclxuICAgIG1hcmdpbjogMmVtIDA7XHJcbiAgICBwYWRkaW5nOiAyZW07XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMTUwJTtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fZG93bmxvYWR7XHJcbiAgICBtYXJnaW46IDFlbSBhdXRvO1xyXG4gICAgd2lkdGg6IDIwMHB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2J1dHRvbiB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBwYWRkaW5nOiAxNHB4IDI5cHg7XHJcbiAgICBmb250LXNpemU6IDE4cHg7XHJcbiAgICBmb250LWZhbWlseTogXCJTb3VyY2UgQ29kZSBQcm9cIiwgQ29uc29sYXMsIEdlb3JnaWEsIE1vbmFjbywgbW9ub3NwYWNlLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAmOmxpbmssXHJcbiAgICAmOnZpc2l0ZWQsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIG1hcmdpbjogMCAzZW07XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnY29sb3JzJztcclxuXHJcbi5zZWN0aW9uIHtcclxuICBtYXJnaW46IDFlbSAwO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX2hlYWRlcixcclxuICAmX19jb250ZW50LFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBtYXJnaW46IDAgM2VtO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3RpdGxlIHtcclxuICAgIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2gzIHtcclxuICAgIGNvbG9yOiBAcHJpbWFyeV9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMS4zNWVtO1xyXG4gIH1cclxuXHJcbiAgJl9faDQge1xyXG4gICAgZm9udC1zaXplOiAxLjFlbTtcclxuICAgIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2g1IHtcclxuICAgIGZvbnQtc2l6ZTogMWVtO1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2RsIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fZHQge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogNjBweDtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19kZCB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgbWFyZ2luOiAwIDAgMCA2MHB4O1xyXG4gICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3ByZSB7XHJcbiAgICBtYXJnaW46IDJlbSAwO1xyXG4gICAgcGFkZGluZzogMWVtO1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDE1MCU7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJnX2NvbG9yO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9fY29kZSB7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIG1hcmdpbi10b3A6IDNlbTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJy4vY29sb3JzJztcclxuXHJcbi5jYXNlIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgei1pbmRleDogMTtcclxuICBkaXNwbGF5OiBncmlkO1xyXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7XHJcbiAgZ2FwOiA0MHB4O1xyXG4gIHBhZGRpbmc6IDFlbTtcclxuICBib3JkZXItdG9wOjFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gIGJvcmRlci1ib3R0b206MXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJjphZnRlciB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICB3aWR0aDogMDtcclxuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19wcmUsXHJcbiAgJl9fdGV4dGFyZWEge1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDE1MCU7XHJcbiAgfVxyXG5cclxuICAmX19wcmUsXHJcbiAgJl9fY29kZSxcclxuICAmX190ZXh0YXJlYSB7XHJcbiAgICBmb250LWZhbWlseTogXCJDb3VyaWVyIE5ld1wiLCBDb25zb2xhcywgR2VvcmdpYSwgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgfVxyXG5cclxuICAmX19wcmUge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMWVtO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJnX2NvbG9yO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9fdG9vbGJhciB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGhlaWdodDogMzZweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAzNnB4O1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgcGFkZGluZzogMCAxNnB4O1xyXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fYWN0aW9uLFxyXG4gICZfX3JlbW92ZSB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcclxuICB9XHJcblxyXG4gICZfX2FjdGlvbiB7XHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcblxyXG4gICAgJjpmaXJzdC1jaGlsZCB7XHJcbiAgICAgIHBhZGRpbmctbGVmdDogMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX3JlbW92ZSB7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgfVxyXG5cclxuICAmX19jb25zb2xlIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgaGVpZ2h0OiAxODBweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fdGV4dGFyZWEge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGJvcmRlcjogbm9uZTtcclxuICAgIG91dGxpbmU6IG5vbmU7XHJcbiAgICBwYWRkaW5nOiAxZW07XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX19saXN0LFxyXG4gICZfX2l0ZW0ge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19saXN0IHtcclxuICAgIGhlaWdodDogMzYwcHg7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX19pdGVtIHtcclxuICAgIGhlaWdodDogMzZweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAzNnB4O1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgcGFkZGluZzogMCAxNnB4O1xyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAaG92ZXJfYmdfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJy4vY29sb3JzJztcclxuXHJcbi5idXR0b25zIHtcclxuICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgei1pbmRleDogMjtcclxuICB0b3A6IDUwJTtcclxuICByaWdodDogMTJweDtcclxuICBtYXJnaW46IDA7XHJcbiAgd2lkdGg6IDU2cHg7XHJcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX2l0ZW0ge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIG1hcmdpbjogMTBweDtcclxuICAgIHdpZHRoOiAzNnB4O1xyXG4gICAgaGVpZ2h0OiAzNnB4O1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgIGJveC1zaGFkb3c6IDAgMCA2cHggQGJvcmRlcl9jb2xvcjtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgICYuaGlkZSB7XHJcbiAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19hbmNob3Ige1xyXG4gICAgJjpsaW5rLFxyXG4gICAgJjp2aXNpdGVkLFxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX2ljb24ge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcclxuICAgIGZpbGw6IGN1cnJlbnRjb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG59XHJcbiJdfQ== */ +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLzxpbnB1dCBjc3MgMT4iLCJub3JtYWxpemUubGVzcyIsImJhc2UubGVzcyIsInNjcm9sbGJhci5sZXNzIiwibGF5b3V0Lmxlc3MiLCJhc2lkZS5sZXNzIiwibWFpbi5sZXNzIiwic2VjdGlvbi5sZXNzIiwiY2FzZS5sZXNzIiwiYnV0dG9ucy5sZXNzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRFQUE0RTtBQUM1RTtnRkFDZ0Y7QUFDaEY7OztHQUdHO0FDSUg7RUFDRSxrQkFBQTtFREZBLE9BQU87RUNHUCwrQkFBQTtFRERBLE9BQU87Q0FDUjtBQUNEO2dGQUNnRjtBQUNoRjs7R0FFRztBQ0tIO0VBQ0UsVUFBQTtDREhEO0FBQ0Q7O0dBRUc7QUNPSDtFQUNFLGVBQUE7Q0RMRDtBQUNEOzs7R0FHRztBQ1NIO0VBQ0UsZUFBQTtFQUNBLGlCQUFBO0NEUEQ7QUFDRDtnRkFDZ0Y7QUFDaEY7OztHQUdHO0FDWUg7RUFDRSxnQ0FBQTtVQUFBLHdCQUFBO0VEVkEsT0FBTztFQ1dQLFVBQUE7RURUQSxPQUFPO0VDVVAsa0JBQUE7RURSQSxPQUFPO0NBQ1I7QUFDRDs7O0dBR0c7QUNXSDtFQUNFLGtDQUFBO0VEVEEsT0FBTztFQ1VQLGVBQUE7RURSQSxPQUFPO0NBQ1I7QUFDRDtnRkFDZ0Y7QUFDaEY7O0dBRUc7QUNZSDtFQUNFLDhCQUFBO0NEVkQ7QUFDRDs7O0dBR0c7QUNjSDtFQUNFLG9CQUFBO0VEWkEsT0FBTztFQ2FQLDJCQUFBO0VEWEEsT0FBTztFQ1lQLDBDQUFBO1VBQUEsa0NBQUE7RURWQSxPQUFPO0NBQ1I7QUFDRDs7R0FFRztBQ2FIOztFQUVFLG9CQUFBO0NEWEQ7QUFDRDs7O0dBR0c7QUNlSDs7O0VBR0Usa0NBQUE7RURiQSxPQUFPO0VDY1AsZUFBQTtFRFpBLE9BQU87Q0FDUjtBQUNEOztHQUVHO0FDZUg7RUFDRSxlQUFBO0NEYkQ7QUFDRDs7O0dBR0c7QUNpQkg7O0VBRUUsZUFBQTtFQUNBLGVBQUE7RUFDQSxtQkFBQTtFQUNB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LGVBQUE7Q1JzakJIO0FRbmpCQzs7RUFFRSxVQUFBO0VBQ0EsV0FBQTtFQUNBLHNCQUFBO0VBQ0EsaUJBQUE7Q1JxakJIO0FRbGpCQztFQUNFLGNBQUE7RUFDQSwyQkFBQTtFQUNBLDhCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxlQUFBO0NSb2pCSDtBUWpqQkM7RUFDRSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBO0NSbWpCSDtBUWpqQkc7RUFDRSwwQkFBQTtDUm1qQkw7QVN2cUJEO0VBQ0UsZ0JBQUE7RUFDQSxXQUFBO0VBQ0EsU0FBQTtFQUNBLFlBQUE7RUFDQSxVQUFBO0VBQ0EsWUFBQTtFQUNBLG9DQUFBO1VBQUEsNEJBQUE7RUFDQSxpQkFBQTtDVHlxQkQ7QVN2cUJDO0VBQ0UsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsYUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtFQUNBLGlDQUFBO1VBQUEseUJBQUE7RUFDQSwrQkFBQTtVQUFBLHVCQUFBO0VBQ0EsdUJBQUE7RUFDQSxnQkFBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLGlCQUFBO0NUeXFCSDtBU3ZxQkc7RUFDRSxlQUFBO0NUeXFCTDtBU3RxQkc7RUFDRSxjQUFBO0NUd3FCTDtBU25xQkc7OztFQUdFLFlBQUE7Q1RxcUJMO0FTbHFCRztFQUNFLGVBQUE7Q1RvcUJMO0FTaHFCQztFQUNFLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7RUFDQSxVQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSx5Q0FBQTtVQUFBLGlDQUFBO0VBQ0EsbUJBQUE7RUFDQSxpQkFBQTtDVGtxQkgiLCJmaWxlIjoiZG9jcy5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgbm9ybWFsaXplLmNzcyB2OC4wLjEgfCBNSVQgTGljZW5zZSB8IGdpdGh1Yi5jb20vbmVjb2xhcy9ub3JtYWxpemUuY3NzICovXG4vKiBEb2N1bWVudFxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgbGluZSBoZWlnaHQgaW4gYWxsIGJyb3dzZXJzLlxuICogMi4gUHJldmVudCBhZGp1c3RtZW50cyBvZiBmb250IHNpemUgYWZ0ZXIgb3JpZW50YXRpb24gY2hhbmdlcyBpbiBpT1MuXG4gKi9cbmh0bWwge1xuICBsaW5lLWhlaWdodDogMS4xNTtcbiAgLyogMSAqL1xuICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7XG4gIC8qIDIgKi9cbn1cbi8qIFNlY3Rpb25zXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbmJvZHkge1xuICBtYXJnaW46IDA7XG59XG4vKipcbiAqIFJlbmRlciB0aGUgYG1haW5gIGVsZW1lbnQgY29uc2lzdGVudGx5IGluIElFLlxuICovXG5tYWluIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4vKipcbiAqIENvcnJlY3QgdGhlIGZvbnQgc2l6ZSBhbmQgbWFyZ2luIG9uIGBoMWAgZWxlbWVudHMgd2l0aGluIGBzZWN0aW9uYCBhbmRcbiAqIGBhcnRpY2xlYCBjb250ZXh0cyBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBTYWZhcmkuXG4gKi9cbmgxIHtcbiAgZm9udC1zaXplOiAyZW07XG4gIG1hcmdpbjogMC42N2VtIDA7XG59XG4vKiBHcm91cGluZyBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgYm94IHNpemluZyBpbiBGaXJlZm94LlxuICogMi4gU2hvdyB0aGUgb3ZlcmZsb3cgaW4gRWRnZSBhbmQgSUUuXG4gKi9cbmhyIHtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIC8qIDEgKi9cbiAgaGVpZ2h0OiAwO1xuICAvKiAxICovXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICAvKiAyICovXG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBDb3JyZWN0IHRoZSBvZGQgYGVtYCBmb250IHNpemluZyBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnByZSB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTtcbiAgLyogMSAqL1xuICBmb250LXNpemU6IDFlbTtcbiAgLyogMiAqL1xufVxuLyogVGV4dC1sZXZlbCBzZW1hbnRpY3NcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIG9uIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbiAqL1xuYSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuLyoqXG4gKiAxLiBSZW1vdmUgdGhlIGJvdHRvbSBib3JkZXIgaW4gQ2hyb21lIDU3LVxuICogMi4gQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS5cbiAqL1xuYWJiclt0aXRsZV0ge1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICAvKiAxICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAvKiAyICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xuY29kZSxcbmtiZCxcbnNhbXAge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7XG4gIC8qIDEgKi9cbiAgZm9udC1zaXplOiAxZW07XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG4vKipcbiAqIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGVsZW1lbnRzIGZyb20gYWZmZWN0aW5nIHRoZSBsaW5lIGhlaWdodCBpblxuICogYWxsIGJyb3dzZXJzLlxuICovXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuc3ViIHtcbiAgYm90dG9tOiAtMC4yNWVtO1xufVxuc3VwIHtcbiAgdG9wOiAtMC41ZW07XG59XG4vKiBFbWJlZGRlZCBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBSZW1vdmUgdGhlIGJvcmRlciBvbiBpbWFnZXMgaW5zaWRlIGxpbmtzIGluIElFIDEwLlxuICovXG5pbWcge1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG59XG4vKiBGb3Jtc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBGaXJlZm94IGFuZCBTYWZhcmkuXG4gKi9cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAvKiAxICovXG4gIGZvbnQtc2l6ZTogMTAwJTtcbiAgLyogMSAqL1xuICBsaW5lLWhlaWdodDogMS4xNTtcbiAgLyogMSAqL1xuICBtYXJnaW46IDA7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogU2hvdyB0aGUgb3ZlcmZsb3cgaW4gSUUuXG4gKiAxLiBTaG93IHRoZSBvdmVyZmxvdyBpbiBFZGdlLlxuICovXG5idXR0b24sXG5pbnB1dCB7XG4gIC8qIDEgKi9cbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSwgRmlyZWZveCwgYW5kIElFLlxuICogMS4gUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBGaXJlZm94LlxuICovXG5idXR0b24sXG5zZWxlY3Qge1xuICAvKiAxICovXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxuICovXG5idXR0b24sXG5bdHlwZT1cImJ1dHRvblwiXSxcblt0eXBlPVwicmVzZXRcIl0sXG5bdHlwZT1cInN1Ym1pdFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIGJvcmRlciBhbmQgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT1cImJ1dHRvblwiXTo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPVwicmVzZXRcIl06Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT1cInN1Ym1pdFwiXTo6LW1vei1mb2N1cy1pbm5lciB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbiAgcGFkZGluZzogMDtcbn1cbi8qKlxuICogUmVzdG9yZSB0aGUgZm9jdXMgc3R5bGVzIHVuc2V0IGJ5IHRoZSBwcmV2aW91cyBydWxlLlxuICovXG5idXR0b246LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cImJ1dHRvblwiXTotbW96LWZvY3VzcmluZyxcblt0eXBlPVwicmVzZXRcIl06LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cInN1Ym1pdFwiXTotbW96LWZvY3VzcmluZyB7XG4gIG91dGxpbmU6IDFweCBkb3R0ZWQgQnV0dG9uVGV4dDtcbn1cbi8qKlxuICogQ29ycmVjdCB0aGUgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5maWVsZHNldCB7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjc1ZW0gMC42MjVlbTtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgdGV4dCB3cmFwcGluZyBpbiBFZGdlIGFuZCBJRS5cbiAqIDIuIENvcnJlY3QgdGhlIGNvbG9yIGluaGVyaXRhbmNlIGZyb20gYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBJRS5cbiAqIDMuIFJlbW92ZSB0aGUgcGFkZGluZyBzbyBkZXZlbG9wZXJzIGFyZSBub3QgY2F1Z2h0IG91dCB3aGVuIHRoZXkgemVybyBvdXRcbiAqICAgIGBmaWVsZHNldGAgZWxlbWVudHMgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5sZWdlbmQge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAvKiAxICovXG4gIGNvbG9yOiBpbmhlcml0O1xuICAvKiAyICovXG4gIGRpc3BsYXk6IHRhYmxlO1xuICAvKiAxICovXG4gIG1heC13aWR0aDogMTAwJTtcbiAgLyogMSAqL1xuICBwYWRkaW5nOiAwO1xuICAvKiAzICovXG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gIC8qIDEgKi9cbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IHZlcnRpY2FsIGFsaWdubWVudCBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBPcGVyYS5cbiAqL1xucHJvZ3Jlc3Mge1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgZGVmYXVsdCB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW4gSUUgMTArLlxuICovXG50ZXh0YXJlYSB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLyoqXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgYm94IHNpemluZyBpbiBJRSAxMC5cbiAqIDIuIFJlbW92ZSB0aGUgcGFkZGluZyBpbiBJRSAxMC5cbiAqL1xuW3R5cGU9XCJjaGVja2JveFwiXSxcblt0eXBlPVwicmFkaW9cIl0ge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAvKiAxICovXG4gIHBhZGRpbmc6IDA7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogQ29ycmVjdCB0aGUgY3Vyc29yIHN0eWxlIG9mIGluY3JlbWVudCBhbmQgZGVjcmVtZW50IGJ1dHRvbnMgaW4gQ2hyb21lLlxuICovXG5bdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcblt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBvZGQgYXBwZWFyYW5jZSBpbiBDaHJvbWUgYW5kIFNhZmFyaS5cbiAqIDIuIENvcnJlY3QgdGhlIG91dGxpbmUgc3R5bGUgaW4gU2FmYXJpLlxuICovXG5bdHlwZT1cInNlYXJjaFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xuICAvKiAxICovXG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xuICAvKiAyICovXG59XG4vKipcbiAqIFJlbW92ZSB0aGUgaW5uZXIgcGFkZGluZyBpbiBDaHJvbWUgYW5kIFNhZmFyaSBvbiBtYWNPUy5cbiAqL1xuW3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXG4gKiAyLiBDaGFuZ2UgZm9udCBwcm9wZXJ0aWVzIHRvIGBpbmhlcml0YCBpbiBTYWZhcmkuXG4gKi9cbjo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjtcbiAgLyogMSAqL1xuICBmb250OiBpbmhlcml0O1xuICAvKiAyICovXG59XG4vKiBJbnRlcmFjdGl2ZVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBFZGdlLCBJRSAxMCssIGFuZCBGaXJlZm94LlxuICovXG5kZXRhaWxzIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4vKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5zdW1tYXJ5IHtcbiAgZGlzcGxheTogbGlzdC1pdGVtO1xufVxuLyogTWlzY1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgMTArLlxuICovXG50ZW1wbGF0ZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIElFIDEwLlxuICovXG5baGlkZGVuXSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKiA9PT09PSBCYXNlID09PT09ICovXG5odG1sLFxuYm9keSB7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZDogI2ZhZmFmYTtcbiAgY29sb3I6ICMzMzM7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG4gIGZvbnQtZmFtaWx5OiBcIk1pY3Jvc29mdCBZYUhlaSBVSVwiLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbmE6bGluayxcbmE6dmlzaXRlZCxcbmE6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0MjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuYTpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuY29kZSB7XG4gIGZvbnQtZmFtaWx5OiBcIlNvdXJjZSBDb2RlIFByb1wiLCBDb25zb2xhcywgR2VvcmdpYSwgTW9uYWNvLCBtb25vc3BhY2UsIEFyaWFsLCBzYW5zLXNlcmlmO1xufVxuLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgd2lkdGg6IDdweDtcbiAgaGVpZ2h0OiA3cHg7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZSB7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuLyogTGF5b3V0ICovXG4uZG9jcyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGZsZXgtd3JhcDogbm93cmFwO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDEwMCU7XG4gIG1hcmdpbjogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi8qIEFzaWRlICovXG4uYXNpZGUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXNocmluazogMDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIHdpZHRoOiAyNjBweDtcbiAgbWFyZ2luOiAwO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XG4gIGNvbG9yOiAjZGRkO1xuICBib3gtc2hhZG93OiAwIDAgNXB4IDJweCAjZGRkO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi8qIE1haW4gKi9cbi5tYWluIHtcbiAgZmxleDogMTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmFzaWRlIHtcbiAgZm9udC1mYW1pbHk6IFwiU291cmNlIENvZGUgUHJvXCIsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uYXNpZGVfX2hlYWRlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBmbGV4LXNocmluazogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9fbmF2IHtcbiAgZmxleDogMTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uYXNpZGVfX2gyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogNTRweDtcbiAgbGluZS1oZWlnaHQ6IDU0cHg7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgZm9udC1mYW1pbHk6IEdlb3JnaWEsIENvbnNvbGFzLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmFzaWRlX19oMyB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nOiAwIDIwcHg7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9fbGlzdCB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMTBweCAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmFzaWRlX19pdGVtIHtcbiAgaGVpZ2h0OiAzMnB4O1xuICBsaW5lLWhlaWdodDogMzJweDtcbiAgcGFkZGluZzogMCAzMHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9faXRlbS5hY3RpdmUsXG4uYXNpZGVfX2l0ZW06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTU1O1xufVxuLmFzaWRlX19pdGVtLmFjdGl2ZSB7XG4gIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2ZmZjtcbn1cbi5hc2lkZV9fYW5jaG9yOmxpbmsge1xuICBjb2xvcjogI2RkZDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLmFzaWRlX19hbmNob3I6dmlzaXRlZCB7XG4gIGNvbG9yOiAjZGRkO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4uYXNpZGVfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjZGRkO1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cbi5tYWluX19oZWFkZXIsXG4ubWFpbl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHBhZGRpbmc6IDFlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2gxIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHBhZGRpbmctdG9wOiAxZW07XG4gIGZvbnQtc2l6ZTogNWVtO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMmVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX25hbWUge1xuICBjb2xvcjogIzFmOGRkNjtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbn1cbi5tYWluX190YWdsaW5lIHtcbiAgbWFyZ2luOiAxZW0gYXV0bztcbiAgbWF4LXdpZHRoOiA2NjBweDtcbiAgbGluZS1oZWlnaHQ6IDEuM2VtO1xuICBmb250LXNpemU6IDJlbTtcbiAgY29sb3I6ICM5OTk7XG4gIGZvbnQtd2VpZ2h0OiAxMDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fY2RuIHtcbiAgbWFyZ2luOiAyZW0gMDtcbiAgcGFkZGluZzogMmVtO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fZG93bmxvYWQge1xuICBtYXJnaW46IDFlbSBhdXRvO1xuICB3aWR0aDogMjAwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19idXR0b24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgcGFkZGluZzogMTRweCAyOXB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGZvbnQtZmFtaWx5OiBcIlNvdXJjZSBDb2RlIFByb1wiLCBDb25zb2xhcywgR2VvcmdpYSwgTW9uYWNvLCBtb25vc3BhY2UsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDU4OTQyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2J1dHRvbjpsaW5rLFxuLm1haW5fX2J1dHRvbjp2aXNpdGVkLFxuLm1haW5fX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4ubWFpbl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIDNlbTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG59XG4uc2VjdGlvbiB7XG4gIG1hcmdpbjogMWVtIDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9faGVhZGVyLFxuLnNlY3Rpb25fX2NvbnRlbnQsXG4uc2VjdGlvbl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIDNlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX190aXRsZSB7XG4gIGNvbG9yOiAjNjY2O1xufVxuLnNlY3Rpb25fX2gzIHtcbiAgY29sb3I6ICMxZjhkZDY7XG4gIGZvbnQtc2l6ZTogMS4zNWVtO1xufVxuLnNlY3Rpb25fX2g0IHtcbiAgZm9udC1zaXplOiAxLjFlbTtcbiAgY29sb3I6ICM2NjY7XG59XG4uc2VjdGlvbl9faDUge1xuICBmb250LXNpemU6IDFlbTtcbiAgY29sb3I6ICM5OTk7XG59XG4uc2VjdGlvbl9fZGwsXG4uc2VjdGlvbl9fZHQsXG4uc2VjdGlvbl9fZGQge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fZGwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG59XG4uc2VjdGlvbl9fZHQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4uc2VjdGlvbl9fZGQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLnNlY3Rpb25fX3ByZSB7XG4gIG1hcmdpbjogMmVtIDA7XG4gIHBhZGRpbmc6IDFlbTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBjb2xvcjogIzY2NjtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uc2VjdGlvbl9fY29kZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDAgYXV0bztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX19mb290ZXIge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgbWFyZ2luLXRvcDogM2VtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBjb2xvcjogIzk5OTtcbn1cbi5jYXNlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xuICBnYXA6IDQwcHg7XG4gIHBhZGRpbmc6IDFlbTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2U6YWZ0ZXIge1xuICBjb250ZW50OiAnJztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDUwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMDtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX3ByZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX2NvZGUsXG4uY2FzZV9fdGV4dGFyZWEge1xuICBmb250LWZhbWlseTogXCJDb3VyaWVyIE5ld1wiLCBDb25zb2xhcywgR2VvcmdpYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uY2FzZV9fcHJlIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX190b29sYmFyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19hY3Rpb24sXG4uY2FzZV9fcmVtb3ZlIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzA1ODk0MjtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4uY2FzZV9fYWN0aW9uIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG4uY2FzZV9fYWN0aW9uOmZpcnN0LWNoaWxkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xufVxuLmNhc2VfX3JlbW92ZSB7XG4gIGZsb2F0OiByaWdodDtcbn1cbi5jYXNlX19jb25zb2xlIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMTgwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fdGV4dGFyZWEge1xuICBtYXJnaW46IDAgYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nOiAxZW07XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2xpc3QsXG4uY2FzZV9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX2xpc3Qge1xuICBoZWlnaHQ6IDM2MHB4O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9faXRlbSB7XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLmNhc2VfX2l0ZW06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xufVxuLmJ1dHRvbnMge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTJweDtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogNTZweDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmJ1dHRvbnNfX2l0ZW0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMTBweDtcbiAgd2lkdGg6IDM2cHg7XG4gIGhlaWdodDogMzZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBib3gtc2hhZG93OiAwIDAgNnB4ICNkZGQ7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogIzk5OTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5idXR0b25zX19pdGVtOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4uYnV0dG9uc19faXRlbS5oaWRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5idXR0b25zX19hbmNob3I6bGluayxcbi5idXR0b25zX19hbmNob3I6dmlzaXRlZCxcbi5idXR0b25zX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbn1cbi5idXR0b25zX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5idXR0b25zX19pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuIiwiLyohIG5vcm1hbGl6ZS5jc3MgdjguMC4xIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xyXG5cclxuLyogRG9jdW1lbnRcclxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbi8qKlxyXG4gKiAxLiBDb3JyZWN0IHRoZSBsaW5lIGhlaWdodCBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqIDIuIFByZXZlbnQgYWRqdXN0bWVudHMgb2YgZm9udCBzaXplIGFmdGVyIG9yaWVudGF0aW9uIGNoYW5nZXMgaW4gaU9TLlxyXG4gKi9cclxuXHJcbmh0bWwge1xyXG4gIGxpbmUtaGVpZ2h0OiAxLjE1OyAvKiAxICovXHJcbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovXHJcbn1cclxuXHJcbi8qIFNlY3Rpb25zXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBtYXJnaW4gaW4gYWxsIGJyb3dzZXJzLlxyXG4gKi9cclxuXHJcbmJvZHkge1xyXG4gIG1hcmdpbjogMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbmRlciB0aGUgYG1haW5gIGVsZW1lbnQgY29uc2lzdGVudGx5IGluIElFLlxyXG4gKi9cclxuXHJcbm1haW4ge1xyXG4gIGRpc3BsYXk6IGJsb2NrO1xyXG59XHJcblxyXG4vKipcclxuICogQ29ycmVjdCB0aGUgZm9udCBzaXplIGFuZCBtYXJnaW4gb24gYGgxYCBlbGVtZW50cyB3aXRoaW4gYHNlY3Rpb25gIGFuZFxyXG4gKiBgYXJ0aWNsZWAgY29udGV4dHMgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgU2FmYXJpLlxyXG4gKi9cclxuXHJcbmgxIHtcclxuICBmb250LXNpemU6IDJlbTtcclxuICBtYXJnaW46IDAuNjdlbSAwO1xyXG59XHJcblxyXG4vKiBHcm91cGluZyBjb250ZW50XHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gRmlyZWZveC5cclxuICogMi4gU2hvdyB0aGUgb3ZlcmZsb3cgaW4gRWRnZSBhbmQgSUUuXHJcbiAqL1xyXG5cclxuaHIge1xyXG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAvKiAxICovXHJcbiAgaGVpZ2h0OiAwOyAvKiAxICovXHJcbiAgb3ZlcmZsb3c6IHZpc2libGU7IC8qIDIgKi9cclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5wcmUge1xyXG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTsgLyogMSAqL1xyXG4gIGZvbnQtc2l6ZTogMWVtOyAvKiAyICovXHJcbn1cclxuXHJcbi8qIFRleHQtbGV2ZWwgc2VtYW50aWNzXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBncmF5IGJhY2tncm91bmQgb24gYWN0aXZlIGxpbmtzIGluIElFIDEwLlxyXG4gKi9cclxuXHJcbmEge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG59XHJcblxyXG4vKipcclxuICogMS4gUmVtb3ZlIHRoZSBib3R0b20gYm9yZGVyIGluIENocm9tZSA1Ny1cclxuICogMi4gQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS5cclxuICovXHJcblxyXG5hYmJyW3RpdGxlXSB7XHJcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTsgLyogMSAqL1xyXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyAvKiAyICovXHJcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkOyAvKiAyICovXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxyXG4gKi9cclxuXHJcbmIsXHJcbnN0cm9uZyB7XHJcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5jb2RlLFxyXG5rYmQsXHJcbnNhbXAge1xyXG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTsgLyogMSAqL1xyXG4gIGZvbnQtc2l6ZTogMWVtOyAvKiAyICovXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5zbWFsbCB7XHJcbiAgZm9udC1zaXplOiA4MCU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcmV2ZW50IGBzdWJgIGFuZCBgc3VwYCBlbGVtZW50cyBmcm9tIGFmZmVjdGluZyB0aGUgbGluZSBoZWlnaHQgaW5cclxuICogYWxsIGJyb3dzZXJzLlxyXG4gKi9cclxuXHJcbnN1Yixcclxuc3VwIHtcclxuICBmb250LXNpemU6IDc1JTtcclxuICBsaW5lLWhlaWdodDogMDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xyXG59XHJcblxyXG5zdWIge1xyXG4gIGJvdHRvbTogLTAuMjVlbTtcclxufVxyXG5cclxuc3VwIHtcclxuICB0b3A6IC0wLjVlbTtcclxufVxyXG5cclxuLyogRW1iZWRkZWQgY29udGVudFxyXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgYm9yZGVyIG9uIGltYWdlcyBpbnNpZGUgbGlua3MgaW4gSUUgMTAuXHJcbiAqL1xyXG5cclxuaW1nIHtcclxuICBib3JkZXItc3R5bGU6IG5vbmU7XHJcbn1cclxuXHJcbi8qIEZvcm1zXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqIDIuIFJlbW92ZSB0aGUgbWFyZ2luIGluIEZpcmVmb3ggYW5kIFNhZmFyaS5cclxuICovXHJcblxyXG5idXR0b24sXHJcbmlucHV0LFxyXG5vcHRncm91cCxcclxuc2VsZWN0LFxyXG50ZXh0YXJlYSB7XHJcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7IC8qIDEgKi9cclxuICBmb250LXNpemU6IDEwMCU7IC8qIDEgKi9cclxuICBsaW5lLWhlaWdodDogMS4xNTsgLyogMSAqL1xyXG4gIG1hcmdpbjogMDsgLyogMiAqL1xyXG59XHJcblxyXG4vKipcclxuICogU2hvdyB0aGUgb3ZlcmZsb3cgaW4gSUUuXHJcbiAqIDEuIFNob3cgdGhlIG92ZXJmbG93IGluIEVkZ2UuXHJcbiAqL1xyXG5cclxuYnV0dG9uLFxyXG5pbnB1dCB7IC8qIDEgKi9cclxuICBvdmVyZmxvdzogdmlzaWJsZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSwgRmlyZWZveCwgYW5kIElFLlxyXG4gKiAxLiBSZW1vdmUgdGhlIGluaGVyaXRhbmNlIG9mIHRleHQgdHJhbnNmb3JtIGluIEZpcmVmb3guXHJcbiAqL1xyXG5cclxuYnV0dG9uLFxyXG5zZWxlY3QgeyAvKiAxICovXHJcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxyXG4gKi9cclxuXHJcbmJ1dHRvbixcclxuW3R5cGU9XCJidXR0b25cIl0sXHJcblt0eXBlPVwicmVzZXRcIl0sXHJcblt0eXBlPVwic3VibWl0XCJdIHtcclxuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgaW5uZXIgYm9yZGVyIGFuZCBwYWRkaW5nIGluIEZpcmVmb3guXHJcbiAqL1xyXG5cclxuYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLFxyXG5bdHlwZT1cImJ1dHRvblwiXTo6LW1vei1mb2N1cy1pbm5lcixcclxuW3R5cGU9XCJyZXNldFwiXTo6LW1vei1mb2N1cy1pbm5lcixcclxuW3R5cGU9XCJzdWJtaXRcIl06Oi1tb3otZm9jdXMtaW5uZXIge1xyXG4gIGJvcmRlci1zdHlsZTogbm9uZTtcclxuICBwYWRkaW5nOiAwO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzdG9yZSB0aGUgZm9jdXMgc3R5bGVzIHVuc2V0IGJ5IHRoZSBwcmV2aW91cyBydWxlLlxyXG4gKi9cclxuXHJcbmJ1dHRvbjotbW96LWZvY3VzcmluZyxcclxuW3R5cGU9XCJidXR0b25cIl06LW1vei1mb2N1c3JpbmcsXHJcblt0eXBlPVwicmVzZXRcIl06LW1vei1mb2N1c3JpbmcsXHJcblt0eXBlPVwic3VibWl0XCJdOi1tb3otZm9jdXNyaW5nIHtcclxuICBvdXRsaW5lOiAxcHggZG90dGVkIEJ1dHRvblRleHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb3JyZWN0IHRoZSBwYWRkaW5nIGluIEZpcmVmb3guXHJcbiAqL1xyXG5cclxuZmllbGRzZXQge1xyXG4gIHBhZGRpbmc6IDAuMzVlbSAwLjc1ZW0gMC42MjVlbTtcclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIENvcnJlY3QgdGhlIHRleHQgd3JhcHBpbmcgaW4gRWRnZSBhbmQgSUUuXHJcbiAqIDIuIENvcnJlY3QgdGhlIGNvbG9yIGluaGVyaXRhbmNlIGZyb20gYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBJRS5cclxuICogMy4gUmVtb3ZlIHRoZSBwYWRkaW5nIHNvIGRldmVsb3BlcnMgYXJlIG5vdCBjYXVnaHQgb3V0IHdoZW4gdGhleSB6ZXJvIG91dFxyXG4gKiAgICBgZmllbGRzZXRgIGVsZW1lbnRzIGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5sZWdlbmQge1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8qIDEgKi9cclxuICBjb2xvcjogaW5oZXJpdDsgLyogMiAqL1xyXG4gIGRpc3BsYXk6IHRhYmxlOyAvKiAxICovXHJcbiAgbWF4LXdpZHRoOiAxMDAlOyAvKiAxICovXHJcbiAgcGFkZGluZzogMDsgLyogMyAqL1xyXG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7IC8qIDEgKi9cclxufVxyXG5cclxuLyoqXHJcbiAqIEFkZCB0aGUgY29ycmVjdCB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgT3BlcmEuXHJcbiAqL1xyXG5cclxucHJvZ3Jlc3Mge1xyXG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgZGVmYXVsdCB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW4gSUUgMTArLlxyXG4gKi9cclxuXHJcbnRleHRhcmVhIHtcclxuICBvdmVyZmxvdzogYXV0bztcclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIEFkZCB0aGUgY29ycmVjdCBib3ggc2l6aW5nIGluIElFIDEwLlxyXG4gKiAyLiBSZW1vdmUgdGhlIHBhZGRpbmcgaW4gSUUgMTAuXHJcbiAqL1xyXG5cclxuW3R5cGU9XCJjaGVja2JveFwiXSxcclxuW3R5cGU9XCJyYWRpb1wiXSB7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLyogMSAqL1xyXG4gIHBhZGRpbmc6IDA7IC8qIDIgKi9cclxufVxyXG5cclxuLyoqXHJcbiAqIENvcnJlY3QgdGhlIGN1cnNvciBzdHlsZSBvZiBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBidXR0b25zIGluIENocm9tZS5cclxuICovXHJcblxyXG5bdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcclxuW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xyXG4gIGhlaWdodDogYXV0bztcclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIENvcnJlY3QgdGhlIG9kZCBhcHBlYXJhbmNlIGluIENocm9tZSBhbmQgU2FmYXJpLlxyXG4gKiAyLiBDb3JyZWN0IHRoZSBvdXRsaW5lIHN0eWxlIGluIFNhZmFyaS5cclxuICovXHJcblxyXG5bdHlwZT1cInNlYXJjaFwiXSB7XHJcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7IC8qIDEgKi9cclxuICBvdXRsaW5lLW9mZnNldDogLTJweDsgLyogMiAqL1xyXG59XHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBpbm5lciBwYWRkaW5nIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIG1hY09TLlxyXG4gKi9cclxuXHJcblt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uIHtcclxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAxLiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxyXG4gKiAyLiBDaGFuZ2UgZm9udCBwcm9wZXJ0aWVzIHRvIGBpbmhlcml0YCBpbiBTYWZhcmkuXHJcbiAqL1xyXG5cclxuOjotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbiB7XHJcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247IC8qIDEgKi9cclxuICBmb250OiBpbmhlcml0OyAvKiAyICovXHJcbn1cclxuXHJcbi8qIEludGVyYWN0aXZlXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBFZGdlLCBJRSAxMCssIGFuZCBGaXJlZm94LlxyXG4gKi9cclxuXHJcbmRldGFpbHMge1xyXG4gIGRpc3BsYXk6IGJsb2NrO1xyXG59XHJcblxyXG4vKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqL1xyXG5cclxuc3VtbWFyeSB7XHJcbiAgZGlzcGxheTogbGlzdC1pdGVtO1xyXG59XHJcblxyXG4vKiBNaXNjXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgMTArLlxyXG4gKi9cclxuXHJcbnRlbXBsYXRlIHtcclxuICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4vKipcclxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgMTAuXHJcbiAqL1xyXG5cclxuW2hpZGRlbl0ge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuIiwiQGltcG9ydCAnY29sb3JzJztcclxuXHJcbi8qID09PT09IEJhc2UgPT09PT0gKi9cclxuaHRtbCxcclxuYm9keSB7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIGJhY2tncm91bmQ6IEBiZ19jb2xvcjtcclxuICBjb2xvcjogQHByaW1hcnlfdGV4dF9jb2xvcjtcclxuICBmb250LXNpemU6IDE0cHg7XHJcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XHJcbiAgZm9udC1mYW1pbHk6IFwiTWljcm9zb2Z0IFlhSGVpIFVJXCIsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuXHJcbmEge1xyXG4gICY6bGluayxcclxuICAmOnZpc2l0ZWQsXHJcbiAgJjpob3ZlciB7XHJcbiAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgfVxyXG5cclxuICAmOmhvdmVyIHtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xyXG4gIH1cclxufVxyXG5cclxuY29kZSB7XHJcbiAgZm9udC1mYW1pbHk6IFwiU291cmNlIENvZGUgUHJvXCIsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbn1cclxuIiwiLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIHdpZHRoOiA3cHg7XHJcbiAgaGVpZ2h0OiA3cHg7XHJcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2stcGllY2Uge1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XHJcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XHJcbn1cclxuIiwiQGltcG9ydCAnY29sb3JzJztcclxuXHJcbi8qIExheW91dCAqL1xyXG4uZG9jcyB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICB3aWR0aDogMTAwJTtcclxuICBtYXJnaW46IDA7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLyogQXNpZGUgKi9cclxuLmFzaWRlIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtc2hyaW5rOiAwO1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgd2lkdGg6IDI2MHB4O1xyXG4gIG1hcmdpbjogMDtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogQHByaW1hcnlfdGV4dF9jb2xvcjtcclxuICBjb2xvcjogQGJvcmRlcl9jb2xvcjtcclxuICBib3gtc2hhZG93OiAwIDAgNXB4IDJweCBAYm9yZGVyX2NvbG9yO1xyXG4gIG92ZXJmbG93OiBhdXRvO1xyXG59XHJcblxyXG4vKiBNYWluICovXHJcbi5tYWluIHtcclxuICBmbGV4OiAxO1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgb3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuIiwiQGltcG9ydCAnY29sb3JzJztcclxuXHJcbi5hc2lkZSB7XHJcbiAgZm9udC1mYW1pbHk6IFwiU291cmNlIENvZGUgUHJvXCIsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XHJcblxyXG4gICZfX2hlYWRlciB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX25hdiB7XHJcbiAgICBmbGV4OiAxO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX19oMiB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGhlaWdodDogNTRweDtcclxuICAgIGxpbmUtaGVpZ2h0OiA1NHB4O1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxuICAgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCBDb25zb2xhcywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9faDMge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBwYWRkaW5nOiAwIDIwcHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9faXRlbSB7XHJcbiAgICBoZWlnaHQ6IDMycHg7XHJcbiAgICBsaW5lLWhlaWdodDogMzJweDtcclxuICAgIHBhZGRpbmc6IDAgMzBweDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgJi5hY3RpdmUsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHNlY29uZGFyeV90ZXh0X2NvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgICYuYWN0aXZlIHtcclxuICAgICAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCBAd2hpdGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19hbmNob3I6bGluayB7XHJcbiAgICBjb2xvcjogQGJvcmRlcl9jb2xvcjtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICB9XHJcblxyXG4gICZfX2FuY2hvcjp2aXNpdGVkIHtcclxuICAgIGNvbG9yOiBAYm9yZGVyX2NvbG9yO1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gIH1cclxuXHJcbiAgJl9fYW5jaG9yOmhvdmVyIHtcclxuICAgIGNvbG9yOiBAYm9yZGVyX2NvbG9yO1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJ2NvbG9ycyc7XHJcblxyXG4ubWFpbiB7XHJcbiAgJl9faGVhZGVyLFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIHBhZGRpbmc6IDFlbTtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19oMSB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIHBhZGRpbmctdG9wOiAxZW07XHJcbiAgICBmb250LXNpemU6IDVlbTtcclxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcbiAgICBsaW5lLWhlaWdodDogMi4wZW07XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbmFtZSB7XHJcbiAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xyXG4gIH1cclxuXHJcbiAgJl9fdGFnbGluZSB7XHJcbiAgICBtYXJnaW46IDFlbSBhdXRvO1xyXG4gICAgbWF4LXdpZHRoOiA2NjBweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxLjNlbTtcclxuICAgIGZvbnQtc2l6ZTogMmVtO1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgIGZvbnQtd2VpZ2h0OiAxMDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fY2RuIHtcclxuICAgIG1hcmdpbjogMmVtIDA7XHJcbiAgICBwYWRkaW5nOiAyZW07XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMTUwJTtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fZG93bmxvYWR7XHJcbiAgICBtYXJnaW46IDFlbSBhdXRvO1xyXG4gICAgd2lkdGg6IDIwMHB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2J1dHRvbiB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBwYWRkaW5nOiAxNHB4IDI5cHg7XHJcbiAgICBmb250LXNpemU6IDE4cHg7XHJcbiAgICBmb250LWZhbWlseTogXCJTb3VyY2UgQ29kZSBQcm9cIiwgQ29uc29sYXMsIEdlb3JnaWEsIE1vbmFjbywgbW9ub3NwYWNlLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAmOmxpbmssXHJcbiAgICAmOnZpc2l0ZWQsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIG1hcmdpbjogMCAzZW07XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnY29sb3JzJztcclxuXHJcbi5zZWN0aW9uIHtcclxuICBtYXJnaW46IDFlbSAwO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX2hlYWRlcixcclxuICAmX19jb250ZW50LFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBtYXJnaW46IDAgM2VtO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3RpdGxlIHtcclxuICAgIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2gzIHtcclxuICAgIGNvbG9yOiBAcHJpbWFyeV9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMS4zNWVtO1xyXG4gIH1cclxuXHJcbiAgJl9faDQge1xyXG4gICAgZm9udC1zaXplOiAxLjFlbTtcclxuICAgIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2g1IHtcclxuICAgIGZvbnQtc2l6ZTogMWVtO1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2RsLFxyXG4gICZfX2R0LFxyXG4gICZfX2RkIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fZGwge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICB9XHJcblxyXG4gICZfX2R0IHtcclxuICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1xyXG4gIH1cclxuXHJcbiAgJl9fZGQge1xyXG4gICAgZGlzcGxheTppbmxpbmUtYmxvY2s7XHJcbiAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX19wcmUge1xyXG4gICAgbWFyZ2luOiAyZW0gMDtcclxuICAgIHBhZGRpbmc6IDFlbTtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxNTAlO1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcblxyXG4gICZfX2NvZGUge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19mb290ZXIge1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBtYXJnaW4tdG9wOiAzZW07XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4uY2FzZSB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgZGlzcGxheTogZ3JpZDtcclxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xyXG4gIGdhcDogNDBweDtcclxuICBwYWRkaW5nOiAxZW07XHJcbiAgYm9yZGVyLXRvcDoxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICBib3JkZXItYm90dG9tOjFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICY6YWZ0ZXIge1xyXG4gICAgY29udGVudDogJyc7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlLFxyXG4gICZfX3RleHRhcmVhIHtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxNTAlO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlLFxyXG4gICZfX2NvZGUsXHJcbiAgJl9fdGV4dGFyZWEge1xyXG4gICAgZm9udC1mYW1pbHk6IFwiQ291cmllciBOZXdcIiwgQ29uc29sYXMsIEdlb3JnaWEsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDFlbTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcblxyXG4gICZfX3Rvb2xiYXIge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBoZWlnaHQ6IDM2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMzZweDtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2FjdGlvbixcclxuICAmX19yZW1vdmUge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgfVxyXG5cclxuICAmX19hY3Rpb24ge1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xyXG5cclxuICAgICY6Zmlyc3QtY2hpbGQge1xyXG4gICAgICBwYWRkaW5nLWxlZnQ6IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19yZW1vdmUge1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gIH1cclxuXHJcbiAgJl9fY29uc29sZSB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGhlaWdodDogMTgwcHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3RleHRhcmVhIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICBvdXRsaW5lOiBub25lO1xyXG4gICAgcGFkZGluZzogMWVtO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCxcclxuICAmX19pdGVtIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCB7XHJcbiAgICBoZWlnaHQ6IDM2MHB4O1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9faXRlbSB7XHJcbiAgICBoZWlnaHQ6IDM2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMzZweDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGhvdmVyX2JnX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4uYnV0dG9ucyB7XHJcbiAgcG9zaXRpb246IGZpeGVkO1xyXG4gIHotaW5kZXg6IDI7XHJcbiAgdG9wOiA1MCU7XHJcbiAgcmlnaHQ6IDEycHg7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHdpZHRoOiA1NnB4O1xyXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19pdGVtIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBtYXJnaW46IDEwcHg7XHJcbiAgICB3aWR0aDogMzZweDtcclxuICAgIGhlaWdodDogMzZweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBib3gtc2hhZG93OiAwIDAgNnB4IEBib3JkZXJfY29sb3I7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAmLmhpZGUge1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fYW5jaG9yIHtcclxuICAgICY6bGluayxcclxuICAgICY6dmlzaXRlZCxcclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19pY29uIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDUwJTtcclxuICAgIHdpZHRoOiAyMHB4O1xyXG4gICAgaGVpZ2h0OiAyMHB4O1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbiAgICBmaWxsOiBjdXJyZW50Y29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxufVxyXG4iXX0= */ diff --git a/docs/css/docs.min.css b/docs/css/docs.min.css index c0024396..332d551c 100644 --- a/docs/css/docs.min.css +++ b/docs/css/docs.min.css @@ -1,2 +1,2 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */button,hr,input{overflow:visible}progress,sub,sup{vertical-align:baseline}.buttons__item.hide,[hidden],template{display:none}.docs,.main,.section__dl{position:relative;z-index:1}.aside,.docs{-webkit-box-direction:normal}html{-webkit-text-size-adjust:100%}body{margin:0}details,main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}.case,.main__cdn{border-top:1px solid #ddd;border-bottom:1px solid #ddd}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}.docs,body,html{overflow:hidden}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}body,html{height:100%;background:#fafafa;color:#333;font-size:14px;line-height:150%;font-family:"Microsoft YaHei UI",Arial,sans-serif}.aside,code{font-family:"Source Code Pro",Consolas,Georgia,Monaco,monospace,Arial,sans-serif}a:hover,a:link,a:visited{color:#058942;text-decoration:none}a:hover{text-decoration:underline}::-webkit-scrollbar{width:7px;height:7px;-webkit-border-radius:5px}.aside,.docs,.main{height:100%}::-webkit-scrollbar-track-piece{-webkit-border-radius:5px}::-webkit-scrollbar-thumb:vertical{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:horizontal{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar:hover{background-color:rgba(0,0,0,.15)}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.35)}.docs{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:100%;margin:0}.aside,.main{overflow:auto}.aside{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:260px;margin:0;background-color:#333;color:#ddd;-webkit-box-shadow:0 0 5px 2px #ddd;box-shadow:0 0 5px 2px #ddd}.main{-webkit-box-flex:1;-ms-flex:1;flex:1;background-color:#fff}.aside__header{margin:0 auto;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.aside__nav{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.aside__h2{margin:0 auto;height:54px;line-height:54px;font-size:20px;font-weight:400;font-family:Georgia,Consolas,Arial,sans-serif;text-align:center;overflow:hidden}.aside__h3{margin:0 auto;padding:0 20px;font-size:16px;overflow:hidden}.aside__list{margin:0;padding:10px 0;overflow:hidden}.aside__item{height:32px;line-height:32px;padding:0 30px;cursor:pointer;font-size:13px;overflow:hidden}.aside__item.active,.aside__item:hover{background-color:#555}.aside__item.active{border-left:3px solid #fff}.aside__anchor:link,.aside__anchor:visited{color:#ddd;text-decoration:none}.aside__anchor:hover{color:#ddd;text-decoration:underline}.main__footer,.main__header{margin:0 auto;padding:1em;text-align:center;overflow:hidden}.main__h1{margin:0 auto;padding-top:1em;font-size:5em;font-weight:400;line-height:2em;overflow:hidden}.main__name{color:#1f8dd6;font-weight:400}.main__tagline{margin:1em auto;max-width:660px;line-height:1.3em;font-size:2em;color:#999;font-weight:100;overflow:hidden}.main__cdn{margin:2em 0;padding:2em;font-size:16px;line-height:150%;text-align:center;background-color:#fafafa;color:#666;overflow:hidden}.main__download{margin:1em auto;width:200px;text-align:center;overflow:hidden}.main__button{display:inline-block;border-radius:4px;padding:14px 29px;font-size:18px;font-family:"Source Code Pro",Consolas,Georgia,Monaco,monospace,Arial,sans-serif;background-color:#058942;overflow:hidden}.case__pre,.section__footer,.section__pre{background-color:#fafafa}.main__button:hover,.main__button:link,.main__button:visited{color:#fff;text-decoration:none}.main__footer{margin:0 3em;border-top:1px solid #ddd}.section{margin:1em 0;overflow:hidden}.section__content,.section__footer,.section__header{margin:0 3em;overflow:hidden}.section__title{color:#666}.section__h3{color:#1f8dd6;font-size:1.35em}.section__h4{font-size:1.1em;color:#666}.section__h5{font-size:1em;color:#999}.section__dl{overflow:hidden}.section__dt{position:absolute;z-index:2;top:0;left:0;width:60px;margin:0;overflow:hidden}.case,.section__dd{position:relative;z-index:1}.section__dd{margin:0 0 0 60px;color:#058942;overflow:hidden}.section__pre{margin:2em 0;padding:1em;font-size:14px;line-height:150%;text-align:left;border:1px solid #ddd;border-radius:4px;color:#666;overflow:auto}.section__code{display:block;margin:0 auto;overflow:hidden}.section__footer{border-top:1px solid #ddd;margin-top:3em;color:#999}.case{display:grid;grid-template-columns:repeat(2,1fr);gap:40px;padding:1em;overflow:hidden}.case:after{content:'';position:absolute;z-index:2;top:0;left:50%;height:100%;width:0;border-left:1px solid #ddd;overflow:hidden}.case__pre,.case__textarea{font-size:13px;line-height:150%}.case__code,.case__pre,.case__textarea{font-family:"Courier New",Consolas,Georgia,Arial,sans-serif}.case__pre{margin:0;padding:1em;height:100%;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.case__toolbar{margin:0 auto;height:36px;line-height:36px;font-size:14px;padding:0 16px;text-align:right;overflow:hidden}.case__action,.case__remove{cursor:pointer;color:#058942;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.case__action{font-size:13px;padding-left:10px}.case__action:first-child{padding-left:0}.case__remove{float:right}.case__console{margin:0 auto;height:180px;border:1px solid #ddd;overflow:hidden}.case__textarea{margin:0 auto;width:100%;height:100%;border:none;outline:0;padding:1em;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.case__item,.case__list{margin:0;padding:0;list-style-type:none;overflow:hidden}.case__list{height:360px;border-top:1px solid #ddd;border-bottom:1px solid #ddd;font-size:13px;overflow:auto}.buttons__item,.case__item{height:36px;cursor:pointer}.case__item{line-height:36px;padding:0 16px}.case__item:hover{background-color:#f7f8f9}.buttons{position:fixed;z-index:2;top:50%;right:12px;margin:0;width:56px;-webkit-transform:translateY(-50%);transform:translateY(-50%);overflow:hidden}.buttons__item{position:relative;z-index:1;margin:10px;width:36px;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 0 6px #ddd;box-shadow:0 0 6px #ddd;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;text-align:center;color:#999;overflow:hidden}.buttons__item:hover{color:#058942}.buttons__anchor:hover,.buttons__anchor:link,.buttons__anchor:visited{color:#999}.buttons__anchor:hover{color:#058942}.buttons__icon{position:absolute;z-index:2;top:50%;left:50%;width:20px;height:20px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);fill:currentcolor;overflow:hidden} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJjc3MvZG9jcy5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIG5vcm1hbGl6ZS5jc3MgdjguMC4xIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xuLyogRG9jdW1lbnRcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGxpbmUgaGVpZ2h0IGluIGFsbCBicm93c2Vycy5cbiAqIDIuIFByZXZlbnQgYWRqdXN0bWVudHMgb2YgZm9udCBzaXplIGFmdGVyIG9yaWVudGF0aW9uIGNoYW5nZXMgaW4gaU9TLlxuICovXG5odG1sIHtcbiAgbGluZS1oZWlnaHQ6IDEuMTU7XG4gIC8qIDEgKi9cbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlO1xuICAvKiAyICovXG59XG4vKiBTZWN0aW9uc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogUmVtb3ZlIHRoZSBtYXJnaW4gaW4gYWxsIGJyb3dzZXJzLlxuICovXG5ib2R5IHtcbiAgbWFyZ2luOiAwO1xufVxuLyoqXG4gKiBSZW5kZXIgdGhlIGBtYWluYCBlbGVtZW50IGNvbnNpc3RlbnRseSBpbiBJRS5cbiAqL1xubWFpbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBmb250IHNpemUgYW5kIG1hcmdpbiBvbiBgaDFgIGVsZW1lbnRzIHdpdGhpbiBgc2VjdGlvbmAgYW5kXG4gKiBgYXJ0aWNsZWAgY29udGV4dHMgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgU2FmYXJpLlxuICovXG5oMSB7XG4gIGZvbnQtc2l6ZTogMmVtO1xuICBtYXJnaW46IDAuNjdlbSAwO1xufVxuLyogR3JvdXBpbmcgY29udGVudFxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gRmlyZWZveC5cbiAqIDIuIFNob3cgdGhlIG92ZXJmbG93IGluIEVkZ2UgYW5kIElFLlxuICovXG5ociB7XG4gIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIC8qIDEgKi9cbiAgaGVpZ2h0OiAwO1xuICAvKiAxICovXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICAvKiAyICovXG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBDb3JyZWN0IHRoZSBvZGQgYGVtYCBmb250IHNpemluZyBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnByZSB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTtcbiAgLyogMSAqL1xuICBmb250LXNpemU6IDFlbTtcbiAgLyogMiAqL1xufVxuLyogVGV4dC1sZXZlbCBzZW1hbnRpY3NcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIG9uIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbiAqL1xuYSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuLyoqXG4gKiAxLiBSZW1vdmUgdGhlIGJvdHRvbSBib3JkZXIgaW4gQ2hyb21lIDU3LVxuICogMi4gQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS5cbiAqL1xuYWJiclt0aXRsZV0ge1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICAvKiAxICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAvKiAyICovXG4gIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xuICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xuY29kZSxcbmtiZCxcbnNhbXAge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7XG4gIC8qIDEgKi9cbiAgZm9udC1zaXplOiAxZW07XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG4vKipcbiAqIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGVsZW1lbnRzIGZyb20gYWZmZWN0aW5nIHRoZSBsaW5lIGhlaWdodCBpblxuICogYWxsIGJyb3dzZXJzLlxuICovXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuc3ViIHtcbiAgYm90dG9tOiAtMC4yNWVtO1xufVxuc3VwIHtcbiAgdG9wOiAtMC41ZW07XG59XG4vKiBFbWJlZGRlZCBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBSZW1vdmUgdGhlIGJvcmRlciBvbiBpbWFnZXMgaW5zaWRlIGxpbmtzIGluIElFIDEwLlxuICovXG5pbWcge1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG59XG4vKiBGb3Jtc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBGaXJlZm94IGFuZCBTYWZhcmkuXG4gKi9cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAvKiAxICovXG4gIGZvbnQtc2l6ZTogMTAwJTtcbiAgLyogMSAqL1xuICBsaW5lLWhlaWdodDogMS4xNTtcbiAgLyogMSAqL1xuICBtYXJnaW46IDA7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogU2hvdyB0aGUgb3ZlcmZsb3cgaW4gSUUuXG4gKiAxLiBTaG93IHRoZSBvdmVyZmxvdyBpbiBFZGdlLlxuICovXG5idXR0b24sXG5pbnB1dCB7XG4gIC8qIDEgKi9cbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSwgRmlyZWZveCwgYW5kIElFLlxuICogMS4gUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBGaXJlZm94LlxuICovXG5idXR0b24sXG5zZWxlY3Qge1xuICAvKiAxICovXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxuICovXG5idXR0b24sXG5bdHlwZT1cImJ1dHRvblwiXSxcblt0eXBlPVwicmVzZXRcIl0sXG5bdHlwZT1cInN1Ym1pdFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIGJvcmRlciBhbmQgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT1cImJ1dHRvblwiXTo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPVwicmVzZXRcIl06Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT1cInN1Ym1pdFwiXTo6LW1vei1mb2N1cy1pbm5lciB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbiAgcGFkZGluZzogMDtcbn1cbi8qKlxuICogUmVzdG9yZSB0aGUgZm9jdXMgc3R5bGVzIHVuc2V0IGJ5IHRoZSBwcmV2aW91cyBydWxlLlxuICovXG5idXR0b246LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cImJ1dHRvblwiXTotbW96LWZvY3VzcmluZyxcblt0eXBlPVwicmVzZXRcIl06LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cInN1Ym1pdFwiXTotbW96LWZvY3VzcmluZyB7XG4gIG91dGxpbmU6IDFweCBkb3R0ZWQgQnV0dG9uVGV4dDtcbn1cbi8qKlxuICogQ29ycmVjdCB0aGUgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5maWVsZHNldCB7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjc1ZW0gMC42MjVlbTtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgdGV4dCB3cmFwcGluZyBpbiBFZGdlIGFuZCBJRS5cbiAqIDIuIENvcnJlY3QgdGhlIGNvbG9yIGluaGVyaXRhbmNlIGZyb20gYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBJRS5cbiAqIDMuIFJlbW92ZSB0aGUgcGFkZGluZyBzbyBkZXZlbG9wZXJzIGFyZSBub3QgY2F1Z2h0IG91dCB3aGVuIHRoZXkgemVybyBvdXRcbiAqICAgIGBmaWVsZHNldGAgZWxlbWVudHMgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5sZWdlbmQge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLyogMSAqL1xuICBjb2xvcjogaW5oZXJpdDtcbiAgLyogMiAqL1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgLyogMSAqL1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIC8qIDEgKi9cbiAgcGFkZGluZzogMDtcbiAgLyogMyAqL1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAvKiAxICovXG59XG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgT3BlcmEuXG4gKi9cbnByb2dyZXNzIHtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGRlZmF1bHQgdmVydGljYWwgc2Nyb2xsYmFyIGluIElFIDEwKy5cbiAqL1xudGV4dGFyZWEge1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi8qKlxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gSUUgMTAuXG4gKiAyLiBSZW1vdmUgdGhlIHBhZGRpbmcgaW4gSUUgMTAuXG4gKi9cblt0eXBlPVwiY2hlY2tib3hcIl0sXG5bdHlwZT1cInJhZGlvXCJdIHtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC8qIDEgKi9cbiAgcGFkZGluZzogMDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBjdXJzb3Igc3R5bGUgb2YgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgYnV0dG9ucyBpbiBDaHJvbWUuXG4gKi9cblt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBoZWlnaHQ6IGF1dG87XG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIG9kZCBhcHBlYXJhbmNlIGluIENocm9tZSBhbmQgU2FmYXJpLlxuICogMi4gQ29ycmVjdCB0aGUgb3V0bGluZSBzdHlsZSBpbiBTYWZhcmkuXG4gKi9cblt0eXBlPVwic2VhcmNoXCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG4gIC8qIDEgKi9cbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBpbm5lciBwYWRkaW5nIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIG1hY09TLlxuICovXG5bdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cbiAqIDIuIENoYW5nZSBmb250IHByb3BlcnRpZXMgdG8gYGluaGVyaXRgIGluIFNhZmFyaS5cbiAqL1xuOjotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xuICAvKiAxICovXG4gIGZvbnQ6IGluaGVyaXQ7XG4gIC8qIDIgKi9cbn1cbi8qIEludGVyYWN0aXZlXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLypcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIEVkZ2UsIElFIDEwKywgYW5kIEZpcmVmb3guXG4gKi9cbmRldGFpbHMge1xuICBkaXNwbGF5OiBibG9jaztcbn1cbi8qXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnN1bW1hcnkge1xuICBkaXNwbGF5OiBsaXN0LWl0ZW07XG59XG4vKiBNaXNjXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSAxMCsuXG4gKi9cbnRlbXBsYXRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgMTAuXG4gKi9cbltoaWRkZW5dIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qID09PT09IEJhc2UgPT09PT0gKi9cbmh0bWwsXG5ib2R5IHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kOiAjZmFmYWZhO1xuICBjb2xvcjogIzMzMztcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgZm9udC1mYW1pbHk6IFwiTWljcm9zb2Z0IFlhSGVpIFVJXCIsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuYTpsaW5rLFxuYTp2aXNpdGVkLFxuYTpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5hOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG5jb2RlIHtcbiAgZm9udC1mYW1pbHk6IFwiU291cmNlIENvZGUgUHJvXCIsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4vKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG59XG4vKiBMYXlvdXQgKi9cbi5kb2NzIHtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtd2Via2l0LWJveC1vcmllbnQ6IGhvcml6b250YWw7XG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xuICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgLW1zLWZsZXgtd3JhcDogbm93cmFwO1xuICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLyogQXNpZGUgKi9cbi5hc2lkZSB7XG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgd2lkdGg6IDI2MHB4O1xuICBtYXJnaW46IDA7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcbiAgY29sb3I6ICNkZGQ7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDVweCAycHggI2RkZDtcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNXB4IDJweCAjZGRkO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi8qIE1haW4gKi9cbi5tYWluIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5hc2lkZSB7XG4gIGZvbnQtZmFtaWx5OiBcIlNvdXJjZSBDb2RlIFByb1wiLCBDb25zb2xhcywgR2VvcmdpYSwgTW9uYWNvLCBtb25vc3BhY2UsIEFyaWFsLCBzYW5zLXNlcmlmO1xufVxuLmFzaWRlX19oZWFkZXIge1xuICBtYXJnaW46IDAgYXV0bztcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9fbmF2IHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmFzaWRlX19oMiB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDU0cHg7XG4gIGxpbmUtaGVpZ2h0OiA1NHB4O1xuICBmb250LXNpemU6IDIwcHg7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCBDb25zb2xhcywgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9faDMge1xuICBtYXJnaW46IDAgYXV0bztcbiAgcGFkZGluZzogMCAyMHB4O1xuICBmb250LXNpemU6IDE2cHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYXNpZGVfX2xpc3Qge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDEwcHggMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9faXRlbSB7XG4gIGhlaWdodDogMzJweDtcbiAgbGluZS1oZWlnaHQ6IDMycHg7XG4gIHBhZGRpbmc6IDAgMzBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYXNpZGVfX2l0ZW0uYWN0aXZlLFxuLmFzaWRlX19pdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzU1NTtcbn1cbi5hc2lkZV9faXRlbS5hY3RpdmUge1xuICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNmZmY7XG59XG4uYXNpZGVfX2FuY2hvcjpsaW5rIHtcbiAgY29sb3I6ICNkZGQ7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5hc2lkZV9fYW5jaG9yOnZpc2l0ZWQge1xuICBjb2xvcjogI2RkZDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLmFzaWRlX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2RkZDtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG4ubWFpbl9faGVhZGVyLFxuLm1haW5fX2Zvb3RlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nOiAxZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19oMSB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nLXRvcDogMWVtO1xuICBmb250LXNpemU6IDVlbTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19uYW1lIHtcbiAgY29sb3I6ICMxZjhkZDY7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG59XG4ubWFpbl9fdGFnbGluZSB7XG4gIG1hcmdpbjogMWVtIGF1dG87XG4gIG1heC13aWR0aDogNjYwcHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjNlbTtcbiAgZm9udC1zaXplOiAyZW07XG4gIGNvbG9yOiAjOTk5O1xuICBmb250LXdlaWdodDogMTAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2NkbiB7XG4gIG1hcmdpbjogMmVtIDA7XG4gIHBhZGRpbmc6IDJlbTtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGNvbG9yOiAjNjY2O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2Rvd25sb2FkIHtcbiAgbWFyZ2luOiAxZW0gYXV0bztcbiAgd2lkdGg6IDIwMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHBhZGRpbmc6IDE0cHggMjlweDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LWZhbWlseTogXCJTb3VyY2UgQ29kZSBQcm9cIiwgQ29uc29sYXMsIEdlb3JnaWEsIE1vbmFjbywgbW9ub3NwYWNlLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0MjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19idXR0b246bGluayxcbi5tYWluX19idXR0b246dmlzaXRlZCxcbi5tYWluX19idXR0b246aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm1haW5fX2Zvb3RlciB7XG4gIG1hcmdpbjogMCAzZW07XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xufVxuLnNlY3Rpb24ge1xuICBtYXJnaW46IDFlbSAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2hlYWRlcixcbi5zZWN0aW9uX19jb250ZW50LFxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIG1hcmdpbjogMCAzZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fdGl0bGUge1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oMyB7XG4gIGNvbG9yOiAjMWY4ZGQ2O1xuICBmb250LXNpemU6IDEuMzVlbTtcbn1cbi5zZWN0aW9uX19oNCB7XG4gIGZvbnQtc2l6ZTogMS4xZW07XG4gIGNvbG9yOiAjNjY2O1xufVxuLnNlY3Rpb25fX2g1IHtcbiAgZm9udC1zaXplOiAxZW07XG4gIGNvbG9yOiAjOTk5O1xufVxuLnNlY3Rpb25fX2RsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2R0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiA2MHB4O1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fZGQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMCAwIDAgNjBweDtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fcHJlIHtcbiAgbWFyZ2luOiAyZW0gMDtcbiAgcGFkZGluZzogMWVtO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGNvbG9yOiAjNjY2O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5zZWN0aW9uX19jb2RlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBtYXJnaW4tdG9wOiAzZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGNvbG9yOiAjOTk5O1xufVxuLmNhc2Uge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7XG4gIGdhcDogNDBweDtcbiAgcGFkZGluZzogMWVtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZTphZnRlciB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogNTAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwO1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX3RleHRhcmVhIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbn1cbi5jYXNlX19wcmUsXG4uY2FzZV9fY29kZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBcIkNvdXJpZXIgTmV3XCIsIENvbnNvbGFzLCBHZW9yZ2lhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbn1cbi5jYXNlX19wcmUge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDFlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX190b29sYmFyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19hY3Rpb24sXG4uY2FzZV9fcmVtb3ZlIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzA1ODk0MjtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cbi5jYXNlX19hY3Rpb24ge1xuICBmb250LXNpemU6IDEzcHg7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbn1cbi5jYXNlX19hY3Rpb246Zmlyc3QtY2hpbGQge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG59XG4uY2FzZV9fcmVtb3ZlIHtcbiAgZmxvYXQ6IHJpZ2h0O1xufVxuLmNhc2VfX2NvbnNvbGUge1xuICBtYXJnaW46IDAgYXV0bztcbiAgaGVpZ2h0OiAxODBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX190ZXh0YXJlYSB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3JkZXI6IG5vbmU7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHBhZGRpbmc6IDFlbTtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2xpc3QsXG4uY2FzZV9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX2xpc3Qge1xuICBoZWlnaHQ6IDM2MHB4O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9faXRlbSB7XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLmNhc2VfX2l0ZW06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xufVxuLmJ1dHRvbnMge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTJweDtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogNTZweDtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmJ1dHRvbnNfX2l0ZW0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMTBweDtcbiAgd2lkdGg6IDM2cHg7XG4gIGhlaWdodDogMzZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggI2RkZDtcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNnB4ICNkZGQ7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICM5OTk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYnV0dG9uc19faXRlbTpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLmJ1dHRvbnNfX2l0ZW0uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4uYnV0dG9uc19fYW5jaG9yOmxpbmssXG4uYnV0dG9uc19fYW5jaG9yOnZpc2l0ZWQsXG4uYnV0dG9uc19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG59XG4uYnV0dG9uc19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4uYnV0dG9uc19faWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGY4O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THp4cGJuQjFkQ0JqYzNNZ01UNGlMQ0p1YjNKdFlXeHBlbVV1YkdWemN5SXNJbUpoYzJVdWJHVnpjeUlzSW5OamNtOXNiR0poY2k1c1pYTnpJaXdpYkdGNWIzVjBMbXhsYzNNaUxDSmhjMmxrWlM1c1pYTnpJaXdpYldGcGJpNXNaWE56SWl3aWMyVmpkR2x2Ymk1c1pYTnpJaXdpWTJGelpTNXNaWE56SWl3aVluVjBkRzl1Y3k1c1pYTnpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCTERSRlFVRTBSVHRCUVVNMVJUdG5Sa0ZEWjBZN1FVRkRhRVk3T3p0SFFVZEhPMEZEU1VnN1JVRkRSU3hyUWtGQlFUdEZSRVpCTEU5QlFVODdSVU5IVUN3clFrRkJRVHRGUkVSQkxFOUJRVTg3UTBGRFVqdEJRVU5FTzJkR1FVTm5SanRCUVVOb1JqczdSMEZGUnp0QlEwdElPMFZCUTBVc1ZVRkJRVHREUkVoRU8wRkJRMFE3TzBkQlJVYzdRVU5QU0R0RlFVTkZMR1ZCUVVFN1EwUk1SRHRCUVVORU96czdSMEZIUnp0QlExTklPMFZCUTBVc1pVRkJRVHRGUVVOQkxHbENRVUZCTzBORVVFUTdRVUZEUkR0blJrRkRaMFk3UVVGRGFFWTdPenRIUVVkSE8wRkRXVWc3UlVGRFJTeG5RMEZCUVR0VlFVRkJMSGRDUVVGQk8wVkVWa0VzVDBGQlR6dEZRMWRRTEZWQlFVRTdSVVJVUVN4UFFVRlBPMFZEVlZBc2EwSkJRVUU3UlVSU1FTeFBRVUZQTzBOQlExSTdRVUZEUkRzN08wZEJSMGM3UVVOWFNEdEZRVU5GTEd0RFFVRkJPMFZFVkVFc1QwRkJUenRGUTFWUUxHVkJRVUU3UlVSU1FTeFBRVUZQTzBOQlExSTdRVUZEUkR0blJrRkRaMFk3UVVGRGFFWTdPMGRCUlVjN1FVTlpTRHRGUVVORkxEaENRVUZCTzBORVZrUTdRVUZEUkRzN08wZEJSMGM3UVVOalNEdEZRVU5GTEc5Q1FVRkJPMFZFV2tFc1QwRkJUenRGUTJGUUxESkNRVUZCTzBWRVdFRXNUMEZCVHp0RlExbFFMREJEUVVGQk8xVkJRVUVzYTBOQlFVRTdSVVJXUVN4UFFVRlBPME5CUTFJN1FVRkRSRHM3UjBGRlJ6dEJRMkZJT3p0RlFVVkZMRzlDUVVGQk8wTkVXRVE3UVVGRFJEczdPMGRCUjBjN1FVTmxTRHM3TzBWQlIwVXNhME5CUVVFN1JVUmlRU3hQUVVGUE8wVkRZMUFzWlVGQlFUdEZSRnBCTEU5QlFVODdRMEZEVWp0QlFVTkVPenRIUVVWSE8wRkRaVWc3UlVGRFJTeGxRVUZCTzBORVlrUTdRVUZEUkRzN08wZEJSMGM3UVVOcFFrZzdPMFZCUlVVc1pVRkJRVHRGUVVOQkxHVkJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTkJMSGxDUVVGQk8wTkVaa1E3UVVOclFrUTdSVUZEUlN4blFrRkJRVHREUkdoQ1JEdEJRMjFDUkR0RlFVTkZMRmxCUVVFN1EwUnFRa1E3UVVGRFJEdG5Sa0ZEWjBZN1FVRkRhRVk3TzBkQlJVYzdRVU56UWtnN1JVRkRSU3h0UWtGQlFUdERSSEJDUkR0QlFVTkVPMmRHUVVOblJqdEJRVU5vUmpzN08wZEJSMGM3UVVONVFrZzdPenM3TzBWQlMwVXNjVUpCUVVFN1JVUjJRa0VzVDBGQlR6dEZRM2RDVUN4blFrRkJRVHRGUkhSQ1FTeFBRVUZQTzBWRGRVSlFMR3RDUVVGQk8wVkVja0pCTEU5QlFVODdSVU56UWxBc1ZVRkJRVHRGUkhCQ1FTeFBRVUZQTzBOQlExSTdRVUZEUkRzN08wZEJSMGM3UVVOMVFrZzdPMFZFY0VKRkxFOUJRVTg3UlVOelFsQXNhMEpCUVVFN1EwUndRa1E3UVVGRFJEczdPMGRCUjBjN1FVTjNRa2c3TzBWRWNrSkZMRTlCUVU4N1JVTjFRbEFzY1VKQlFVRTdRMFJ5UWtRN1FVRkRSRHM3UjBGRlJ6dEJRM2xDU0RzN096dEZRVWxGTERKQ1FVRkJPME5FZGtKRU8wRkJRMFE3TzBkQlJVYzdRVU15UWtnN096czdSVUZKUlN4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UTBSNlFrUTdRVUZEUkRzN1IwRkZSenRCUXpaQ1NEczdPenRGUVVsRkxDdENRVUZCTzBORU0wSkVPMEZCUTBRN08wZEJSVWM3UVVNclFrZzdSVUZEUlN3clFrRkJRVHREUkRkQ1JEdEJRVU5FT3pzN096dEhRVXRITzBGRGFVTklPMFZCUTBVc0swSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RlJDOUNRU3hQUVVGUE8wVkRaME5RTEdWQlFVRTdSVVE1UWtFc1QwRkJUenRGUXl0Q1VDeGxRVUZCTzBWRU4wSkJMRTlCUVU4N1JVTTRRbEFzWjBKQlFVRTdSVVExUWtFc1QwRkJUenRGUXpaQ1VDeFhRVUZCTzBWRU0wSkJMRTlCUVU4N1JVTTBRbEFzYjBKQlFVRTdSVVF4UWtFc1QwRkJUenREUVVOU08wRkJRMFE3TzBkQlJVYzdRVU0yUWtnN1JVRkRSU3g1UWtGQlFUdERSRE5DUkR0QlFVTkVPenRIUVVWSE8wRkRLMEpJTzBWQlEwVXNaVUZCUVR0RFJEZENSRHRCUVVORU96czdSMEZIUnp0QlEybERTRHM3UlVGRlJTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wVkVMMEpCTEU5QlFVODdSVU5uUTFBc1YwRkJRVHRGUkRsQ1FTeFBRVUZQTzBOQlExSTdRVUZEUkRzN1IwRkZSenRCUTJsRFNEczdSVUZGUlN4aFFVRkJPME5FTDBKRU8wRkJRMFE3T3p0SFFVZEhPMEZEYlVOSU8wVkJRMFVzT0VKQlFVRTdSVVJxUTBFc1QwRkJUenRGUTJ0RFVDeHhRa0ZCUVR0RlJHaERRU3hQUVVGUE8wTkJRMUk3UVVGRFJEczdSMEZGUnp0QlEyMURTRHRGUVVORkxIbENRVUZCTzBORWFrTkVPMEZCUTBRN096dEhRVWRITzBGRGNVTklPMFZCUTBVc01rSkJRVUU3UlVSdVEwRXNUMEZCVHp0RlEyOURVQ3hqUVVGQk8wVkViRU5CTEU5QlFVODdRMEZEVWp0QlFVTkVPMmRHUVVOblJqdEJRVU5vUmpzN1IwRkZSenRCUTNORFNEdEZRVU5GTEdWQlFVRTdRMFJ3UTBRN1FVRkRSRHM3UjBGRlJ6dEJRM2REU0R0RlFVTkZMRzFDUVVGQk8wTkVkRU5FTzBGQlEwUTdaMFpCUTJkR08wRkJRMmhHT3p0SFFVVkhPMEZETWtOSU8wVkJRMFVzWTBGQlFUdERSSHBEUkR0QlFVTkVPenRIUVVWSE8wRkROa05JTzBWQlEwVXNZMEZCUVR0RFJETkRSRHRCUVVORUxITkNRVUZ6UWp0QlJUbFRkRUk3TzBWQlJVVXNZVUZCUVR0RlFVTkJMRzlDUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeHhSRUZCUVR0RlFVTkJMR2xDUVVGQk8wTkdaMVJFTzBGRk5WTkRPenM3UlVGSFJTeGxRVUZCTzBWQlEwRXNjMEpCUVVFN1EwWTRVMGc3UVVVelUwTTdSVUZEUlN3eVFrRkJRVHREUmpaVFNEdEJSWHBUUkR0RlFVTkZMSGRHUVVGQk8wTkdNbE5FTzBGQlEwUXNNa0pCUVRKQ08wRkhkbFV6UWp0RlFVTkZMRmRCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzTWtKQlFVRTdRMGg1VlVRN1FVZDBWVVE3UlVGRFJTd3lRa0ZCUVR0RFNIZFZSRHRCUjNKVlJEdEZRVU5GTEhORFFVRkJPMFZCUTBFc01rSkJRVUU3UTBoMVZVUTdRVWR3VlVRN1JVRkRSU3h6UTBGQlFUdEZRVU5CTERKQ1FVRkJPME5JYzFWRU8wRkhibFZFTzBWQlEwVXNjME5CUVVFN1EwaHhWVVE3UVVkc1ZVUTdSVUZEUlN4elEwRkJRVHREU0c5VlJEdEJRVU5FTEZsQlFWazdRVWsxVmxvN1JVRkRSU3h4UWtGQlFUdEZRVUZCTEhGQ1FVRkJPMFZCUVVFc1kwRkJRVHRGUVVOQkxDdENRVUZCTzBWQlFVRXNPRUpCUVVFN1RVRkJRU3gzUWtGQlFUdFZRVUZCTEc5Q1FVRkJPMFZCUTBFc2MwSkJRVUU3VFVGQlFTeHJRa0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxHbENRVUZCTzBOS09GWkVPMEZCUTBRc1YwRkJWenRCU1ROV1dEdEZRVU5GTEhGQ1FVRkJPMFZCUVVFc2NVSkJRVUU3UlVGQlFTeGpRVUZCTzBWQlEwRXNjVUpCUVVFN1RVRkJRU3hsUVVGQk8wVkJRMEVzTmtKQlFVRTdSVUZCUVN3NFFrRkJRVHROUVVGQkxESkNRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3h6UWtGQlFUdE5RVUZCTEd0Q1FVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNkVUpCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzY1VOQlFVRTdWVUZCUVN3MlFrRkJRVHRGUVVOQkxHVkJRVUU3UTBvMlZrUTdRVUZEUkN4VlFVRlZPMEZKTVZaV08wVkJRMFVzYjBKQlFVRTdUVUZCUVN4WlFVRkJPMVZCUVVFc1VVRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3gxUWtGQlFUdEZRVU5CTEdWQlFVRTdRMG8wVmtRN1FVc3ZXRVE3UlVGRFJTeDNSa0ZCUVR0RFRHbFpSRHRCU3k5WVF6dEZRVU5GTEdWQlFVRTdSVUZEUVN4eFFrRkJRVHROUVVGQkxHVkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFRHbFpTRHRCU3psWVF6dEZRVU5GTEc5Q1FVRkJPMDFCUVVFc1dVRkJRVHRWUVVGQkxGRkJRVUU3UlVGRFFTeGxRVUZCTzBOTVoxbElPMEZMTjFoRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNiMEpCUVVFN1JVRkRRU3hyUkVGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTB3cldFZzdRVXMxV0VNN1JVRkRSU3hsUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHbENRVUZCTzBOTU9GaElPMEZMTTFoRE8wVkJRMFVzVlVGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTB3MldFZzdRVXN4V0VNN1JVRkRSU3hoUVVGQk8wVkJRMEVzYTBKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3hwUWtGQlFUdERURFJZU0R0QlN6RllSenM3UlVGRlJTeDFRa0ZCUVR0RFREUllURHRCUzNwWVJ6dEZRVU5GTERSQ1FVRkJPME5NTWxoTU8wRkxkbGhETzBWQlEwVXNXVUZCUVR0RlFVTkJMSE5DUVVGQk8wTk1lVmhJTzBGTGRGaERPMFZCUTBVc1dVRkJRVHRGUVVOQkxITkNRVUZCTzBOTWQxaElPMEZMY2xoRE8wVkJRMFVzV1VGQlFUdEZRVU5CTERKQ1FVRkJPME5NZFZoSU8wRk5NV0pET3p0RlFVVkZMR1ZCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVGpSaVNEdEJUWHBpUXp0RlFVTkZMR1ZCUVVFN1JVRkRRU3hwUWtGQlFUdEZRVU5CTEdWQlFVRTdSVUZEUVN4dlFrRkJRVHRGUVVOQkxHbENRVUZCTzBWQlEwRXNhVUpCUVVFN1EwNHlZa2c3UVUxNFlrTTdSVUZEUlN4bFFVRkJPMFZCUTBFc2IwSkJRVUU3UTA0d1lrZzdRVTEyWWtNN1JVRkRSU3hwUWtGQlFUdEZRVU5CTEdsQ1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeGxRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR2xDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMDU1WWtnN1FVMTBZa003UlVGRFJTeGpRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYTBKQlFVRTdSVUZEUVN4dFFrRkJRVHRGUVVOQkxEQkNRVUZCTzBWQlEwRXNNa0pCUVVFN1JVRkRRU3c0UWtGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4cFFrRkJRVHREVG5kaVNEdEJUWEppUXp0RlFVTkZMR2xDUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTA1MVlrZzdRVTF3WWtNN1JVRkRSU3h6UWtGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMSGRHUVVGQk8wVkJRMEVzTUVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVG5OaVNEdEJUWEJpUnpzN08wVkJSMFVzV1VGQlFUdEZRVU5CTEhOQ1FVRkJPME5PYzJKTU8wRk5iR0pETzBWQlEwVXNZMEZCUVR0RlFVTkJMREpDUVVGQk8wTk9iMkpJTzBGUE5XWkVPMFZCUTBVc1kwRkJRVHRGUVVOQkxHbENRVUZCTzBOUU9HWkVPMEZQTldaRE96czdSVUZIUlN4alFVRkJPMFZCUTBFc2FVSkJRVUU3UTFBNFprZzdRVTh6WmtNN1JVRkRSU3haUVVGQk8wTlFObVpJTzBGUE1XWkRPMFZCUTBVc1pVRkJRVHRGUVVOQkxHdENRVUZCTzBOUU5HWklPMEZQZW1aRE8wVkJRMFVzYVVKQlFVRTdSVUZEUVN4WlFVRkJPME5RTW1aSU8wRlBlR1pETzBWQlEwVXNaVUZCUVR0RlFVTkJMRmxCUVVFN1ExQXdaa2c3UVU5MlprTTdSVUZEUlN4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeHBRa0ZCUVR0RFVIbG1TRHRCVDNSbVF6dEZRVU5GTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMRlZCUVVFN1JVRkRRU3hwUWtGQlFUdERVSGRtU0R0QlQzSm1RenRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzWlVGQlFUdEZRVU5CTEdsQ1FVRkJPME5RZFdaSU8wRlBjR1pETzBWQlEwVXNZMEZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc2FVSkJRVUU3UlVGRFFTd3dRa0ZCUVR0RlFVTkJMSFZDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1pVRkJRVHREVUhObVNEdEJUMjVtUXp0RlFVTkZMR1ZCUVVFN1JVRkRRU3hsUVVGQk8wVkJRMEVzYVVKQlFVRTdRMUJ4WmtnN1FVOXNaa003UlVGRFJTd3lRa0ZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzTUVKQlFVRTdSVUZEUVN4WlFVRkJPME5RYjJaSU8wRlJhbXRDUkR0RlFVTkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEdOQlFVRTdSVUZEUVN4elEwRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNNa0pCUVVFN1JVRkRRU3c0UWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5TYld0Q1JEdEJVV3ByUWtNN1JVRkRSU3haUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1QwRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNVMEZCUVR0RlFVTkJMRFJDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMUp0YTBKSU8wRlJhR3RDUXpzN1JVRkZSU3huUWtGQlFUdEZRVU5CTEd0Q1FVRkJPME5TYTJ0Q1NEdEJVUzlxUWtNN096dEZRVWRGTEdsRlFVRkJPME5TYVd0Q1NEdEJVVGxxUWtNN1JVRkRSU3hWUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTERCQ1FVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEdWQlFVRTdRMUpuYTBKSU8wRlJOMnBDUXp0RlFVTkZMR1ZCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzYTBKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3hwUWtGQlFUdERVaXRxUWtnN1FWRTFha0pET3p0RlFVVkZMR2RDUVVGQk8wVkJRMEVzWlVGQlFUdEZRVU5CTERCQ1FVRkJPMHRCUVVFc2RVSkJRVUU3VFVGQlFTeHpRa0ZCUVR0VlFVRkJMR3RDUVVGQk8wTlNPR3BDU0R0QlVUTnFRa003UlVGRFJTeG5Ra0ZCUVR0RlFVTkJMRzFDUVVGQk8wTlNObXBDU0R0QlVUTnFRa2M3UlVGRFJTeG5Ra0ZCUVR0RFVqWnFRa3c3UVZGNmFrSkRPMFZCUTBVc1lVRkJRVHREVWpKcVFrZzdRVkY0YWtKRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEdOQlFVRTdSVUZEUVN4MVFrRkJRVHRGUVVOQkxHbENRVUZCTzBOU01HcENTRHRCVVhacVFrTTdSVUZEUlN4bFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNZMEZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3dyUWtGQlFUdFZRVUZCTEhWQ1FVRkJPMFZCUTBFc1pVRkJRVHREVW5scVFrZzdRVkYwYWtKRE96dEZRVVZGTEZWQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc2MwSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFVuZHFRa2c3UVZGeWFrSkRPMFZCUTBVc1kwRkJRVHRGUVVOQkxESkNRVUZCTzBWQlEwRXNPRUpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEdWQlFVRTdRMUoxYWtKSU8wRlJjR3BDUXp0RlFVTkZMR0ZCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc1owSkJRVUU3UTFKemFrSklPMEZSY0dwQ1J6dEZRVU5GTERCQ1FVRkJPME5TYzJwQ1REdEJVekZ4UWtRN1JVRkRSU3huUWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4VFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNiME5CUVVFN1ZVRkJRU3cwUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5VTkhGQ1JEdEJVekZ4UWtNN1JVRkRSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzYVVOQlFVRTdWVUZCUVN4NVFrRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3gxUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNhVUpCUVVFN1ExUTBjVUpJTzBGVE1YRkNSenRGUVVORkxHVkJRVUU3UTFRMGNVSk1PMEZUZW5GQ1J6dEZRVU5GTEdOQlFVRTdRMVF5Y1VKTU8wRlRkSEZDUnpzN08wVkJSMFVzV1VGQlFUdERWSGR4UWt3N1FWTnljVUpITzBWQlEwVXNaVUZCUVR0RFZIVnhRa3c3UVZOdWNVSkRPMFZCUTBVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNVMEZCUVR0RlFVTkJMRlZCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEhsRFFVRkJPMVZCUVVFc2FVTkJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTlVjWEZDU0NJc0ltWnBiR1VpT2lKa2IyTnpMbU56Y3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpOHFJU0J1YjNKdFlXeHBlbVV1WTNOeklIWTRMakF1TVNCOElFMUpWQ0JNYVdObGJuTmxJSHdnWjJsMGFIVmlMbU52YlM5dVpXTnZiR0Z6TDI1dmNtMWhiR2w2WlM1amMzTWdLaTljYmk4cUlFUnZZM1Z0Wlc1MFhHNGdJQ0E5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFNBcUwxeHVMeW9xWEc0Z0tpQXhMaUJEYjNKeVpXTjBJSFJvWlNCc2FXNWxJR2hsYVdkb2RDQnBiaUJoYkd3Z1luSnZkM05sY25NdVhHNGdLaUF5TGlCUWNtVjJaVzUwSUdGa2FuVnpkRzFsYm5SeklHOW1JR1p2Ym5RZ2MybDZaU0JoWm5SbGNpQnZjbWxsYm5SaGRHbHZiaUJqYUdGdVoyVnpJR2x1SUdsUFV5NWNiaUFxTDF4dWFIUnRiQ0I3WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUF4TGpFMU8xeHVJQ0F2S2lBeElDb3ZYRzRnSUMxM1pXSnJhWFF0ZEdWNGRDMXphWHBsTFdGa2FuVnpkRG9nTVRBd0pUdGNiaUFnTHlvZ01pQXFMMXh1ZlZ4dUx5b2dVMlZqZEdsdmJuTmNiaUFnSUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOUlDb3ZYRzR2S2lwY2JpQXFJRkpsYlc5MlpTQjBhR1VnYldGeVoybHVJR2x1SUdGc2JDQmljbTkzYzJWeWN5NWNiaUFxTDF4dVltOWtlU0I3WEc0Z0lHMWhjbWRwYmpvZ01EdGNibjFjYmk4cUtseHVJQ29nVW1WdVpHVnlJSFJvWlNCZ2JXRnBibUFnWld4bGJXVnVkQ0JqYjI1emFYTjBaVzUwYkhrZ2FXNGdTVVV1WEc0Z0tpOWNibTFoYVc0Z2UxeHVJQ0JrYVhOd2JHRjVPaUJpYkc5amF6dGNibjFjYmk4cUtseHVJQ29nUTI5eWNtVmpkQ0IwYUdVZ1ptOXVkQ0J6YVhwbElHRnVaQ0J0WVhKbmFXNGdiMjRnWUdneFlDQmxiR1Z0Wlc1MGN5QjNhWFJvYVc0Z1lITmxZM1JwYjI1Z0lHRnVaRnh1SUNvZ1lHRnlkR2xqYkdWZ0lHTnZiblJsZUhSeklHbHVJRU5vY205dFpTd2dSbWx5WldadmVDd2dZVzVrSUZOaFptRnlhUzVjYmlBcUwxeHVhREVnZTF4dUlDQm1iMjUwTFhOcGVtVTZJREpsYlR0Y2JpQWdiV0Z5WjJsdU9pQXdMalkzWlcwZ01EdGNibjFjYmk4cUlFZHliM1Z3YVc1bklHTnZiblJsYm5SY2JpQWdJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5SUNvdlhHNHZLaXBjYmlBcUlERXVJRUZrWkNCMGFHVWdZMjl5Y21WamRDQmliM2dnYzJsNmFXNW5JR2x1SUVacGNtVm1iM2d1WEc0Z0tpQXlMaUJUYUc5M0lIUm9aU0J2ZG1WeVpteHZkeUJwYmlCRlpHZGxJR0Z1WkNCSlJTNWNiaUFxTDF4dWFISWdlMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmpiMjUwWlc1MExXSnZlRHRjYmlBZ0x5b2dNU0FxTDF4dUlDQm9aV2xuYUhRNklEQTdYRzRnSUM4cUlERWdLaTljYmlBZ2IzWmxjbVpzYjNjNklIWnBjMmxpYkdVN1hHNGdJQzhxSURJZ0tpOWNibjFjYmk4cUtseHVJQ29nTVM0Z1EyOXljbVZqZENCMGFHVWdhVzVvWlhKcGRHRnVZMlVnWVc1a0lITmpZV3hwYm1jZ2IyWWdabTl1ZENCemFYcGxJR2x1SUdGc2JDQmljbTkzYzJWeWN5NWNiaUFxSURJdUlFTnZjbkpsWTNRZ2RHaGxJRzlrWkNCZ1pXMWdJR1p2Ym5RZ2MybDZhVzVuSUdsdUlHRnNiQ0JpY205M2MyVnljeTVjYmlBcUwxeHVjSEpsSUh0Y2JpQWdabTl1ZEMxbVlXMXBiSGs2SUcxdmJtOXpjR0ZqWlN3Z2JXOXViM053WVdObE8xeHVJQ0F2S2lBeElDb3ZYRzRnSUdadmJuUXRjMmw2WlRvZ01XVnRPMXh1SUNBdktpQXlJQ292WEc1OVhHNHZLaUJVWlhoMExXeGxkbVZzSUhObGJXRnVkR2xqYzF4dUlDQWdQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDBnS2k5Y2JpOHFLbHh1SUNvZ1VtVnRiM1psSUhSb1pTQm5jbUY1SUdKaFkydG5jbTkxYm1RZ2IyNGdZV04wYVhabElHeHBibXR6SUdsdUlFbEZJREV3TGx4dUlDb3ZYRzVoSUh0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dkSEpoYm5Od1lYSmxiblE3WEc1OVhHNHZLaXBjYmlBcUlERXVJRkpsYlc5MlpTQjBhR1VnWW05MGRHOXRJR0p2Y21SbGNpQnBiaUJEYUhKdmJXVWdOVGN0WEc0Z0tpQXlMaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdkR1Y0ZENCa1pXTnZjbUYwYVc5dUlHbHVJRU5vY205dFpTd2dSV1JuWlN3Z1NVVXNJRTl3WlhKaExDQmhibVFnVTJGbVlYSnBMbHh1SUNvdlhHNWhZbUp5VzNScGRHeGxYU0I3WEc0Z0lHSnZjbVJsY2kxaWIzUjBiMjA2SUc1dmJtVTdYRzRnSUM4cUlERWdLaTljYmlBZ2RHVjRkQzFrWldOdmNtRjBhVzl1T2lCMWJtUmxjbXhwYm1VN1hHNGdJQzhxSURJZ0tpOWNiaUFnZEdWNGRDMWtaV052Y21GMGFXOXVPaUIxYm1SbGNteHBibVVnWkc5MGRHVmtPMXh1SUNBdktpQXlJQ292WEc1OVhHNHZLaXBjYmlBcUlFRmtaQ0IwYUdVZ1kyOXljbVZqZENCbWIyNTBJSGRsYVdkb2RDQnBiaUJEYUhKdmJXVXNJRVZrWjJVc0lHRnVaQ0JUWVdaaGNta3VYRzRnS2k5Y2JtSXNYRzV6ZEhKdmJtY2dlMXh1SUNCbWIyNTBMWGRsYVdkb2REb2dZbTlzWkdWeU8xeHVmVnh1THlvcVhHNGdLaUF4TGlCRGIzSnlaV04wSUhSb1pTQnBibWhsY21sMFlXNWpaU0JoYm1RZ2MyTmhiR2x1WnlCdlppQm1iMjUwSUhOcGVtVWdhVzRnWVd4c0lHSnliM2R6WlhKekxseHVJQ29nTWk0Z1EyOXljbVZqZENCMGFHVWdiMlJrSUdCbGJXQWdabTl1ZENCemFYcHBibWNnYVc0Z1lXeHNJR0p5YjNkelpYSnpMbHh1SUNvdlhHNWpiMlJsTEZ4dWEySmtMRnh1YzJGdGNDQjdYRzRnSUdadmJuUXRabUZ0YVd4NU9pQnRiMjV2YzNCaFkyVXNJRzF2Ym05emNHRmpaVHRjYmlBZ0x5b2dNU0FxTDF4dUlDQm1iMjUwTFhOcGVtVTZJREZsYlR0Y2JpQWdMeW9nTWlBcUwxeHVmVnh1THlvcVhHNGdLaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdabTl1ZENCemFYcGxJR2x1SUdGc2JDQmljbTkzYzJWeWN5NWNiaUFxTDF4dWMyMWhiR3dnZTF4dUlDQm1iMjUwTFhOcGVtVTZJRGd3SlR0Y2JuMWNiaThxS2x4dUlDb2dVSEpsZG1WdWRDQmdjM1ZpWUNCaGJtUWdZSE4xY0dBZ1pXeGxiV1Z1ZEhNZ1puSnZiU0JoWm1abFkzUnBibWNnZEdobElHeHBibVVnYUdWcFoyaDBJR2x1WEc0Z0tpQmhiR3dnWW5KdmQzTmxjbk11WEc0Z0tpOWNibk4xWWl4Y2JuTjFjQ0I3WEc0Z0lHWnZiblF0YzJsNlpUb2dOelVsTzF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTUR0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCMlpYSjBhV05oYkMxaGJHbG5iam9nWW1GelpXeHBibVU3WEc1OVhHNXpkV0lnZTF4dUlDQmliM1IwYjIwNklDMHdMakkxWlcwN1hHNTlYRzV6ZFhBZ2UxeHVJQ0IwYjNBNklDMHdMalZsYlR0Y2JuMWNiaThxSUVWdFltVmtaR1ZrSUdOdmJuUmxiblJjYmlBZ0lEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlJQ292WEc0dktpcGNiaUFxSUZKbGJXOTJaU0IwYUdVZ1ltOXlaR1Z5SUc5dUlHbHRZV2RsY3lCcGJuTnBaR1VnYkdsdWEzTWdhVzRnU1VVZ01UQXVYRzRnS2k5Y2JtbHRaeUI3WEc0Z0lHSnZjbVJsY2kxemRIbHNaVG9nYm05dVpUdGNibjFjYmk4cUlFWnZjbTF6WEc0Z0lDQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQU0FxTDF4dUx5b3FYRzRnS2lBeExpQkRhR0Z1WjJVZ2RHaGxJR1p2Ym5RZ2MzUjViR1Z6SUdsdUlHRnNiQ0JpY205M2MyVnljeTVjYmlBcUlESXVJRkpsYlc5MlpTQjBhR1VnYldGeVoybHVJR2x1SUVacGNtVm1iM2dnWVc1a0lGTmhabUZ5YVM1Y2JpQXFMMXh1WW5WMGRHOXVMRnh1YVc1d2RYUXNYRzV2Y0hSbmNtOTFjQ3hjYm5ObGJHVmpkQ3hjYm5SbGVIUmhjbVZoSUh0Y2JpQWdabTl1ZEMxbVlXMXBiSGs2SUdsdWFHVnlhWFE3WEc0Z0lDOHFJREVnS2k5Y2JpQWdabTl1ZEMxemFYcGxPaUF4TURBbE8xeHVJQ0F2S2lBeElDb3ZYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQXhMakUxTzF4dUlDQXZLaUF4SUNvdlhHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ0x5b2dNaUFxTDF4dWZWeHVMeW9xWEc0Z0tpQlRhRzkzSUhSb1pTQnZkbVZ5Wm14dmR5QnBiaUJKUlM1Y2JpQXFJREV1SUZOb2IzY2dkR2hsSUc5MlpYSm1iRzkzSUdsdUlFVmtaMlV1WEc0Z0tpOWNibUoxZEhSdmJpeGNibWx1Y0hWMElIdGNiaUFnTHlvZ01TQXFMMXh1SUNCdmRtVnlabXh2ZHpvZ2RtbHphV0pzWlR0Y2JuMWNiaThxS2x4dUlDb2dVbVZ0YjNabElIUm9aU0JwYm1obGNtbDBZVzVqWlNCdlppQjBaWGgwSUhSeVlXNXpabTl5YlNCcGJpQkZaR2RsTENCR2FYSmxabTk0TENCaGJtUWdTVVV1WEc0Z0tpQXhMaUJTWlcxdmRtVWdkR2hsSUdsdWFHVnlhWFJoYm1ObElHOW1JSFJsZUhRZ2RISmhibk5tYjNKdElHbHVJRVpwY21WbWIzZ3VYRzRnS2k5Y2JtSjFkSFJ2Yml4Y2JuTmxiR1ZqZENCN1hHNGdJQzhxSURFZ0tpOWNiaUFnZEdWNGRDMTBjbUZ1YzJadmNtMDZJRzV2Ym1VN1hHNTlYRzR2S2lwY2JpQXFJRU52Y25KbFkzUWdkR2hsSUdsdVlXSnBiR2wwZVNCMGJ5QnpkSGxzWlNCamJHbGphMkZpYkdVZ2RIbHdaWE1nYVc0Z2FVOVRJR0Z1WkNCVFlXWmhjbWt1WEc0Z0tpOWNibUoxZEhSdmJpeGNibHQwZVhCbFBWd2lZblYwZEc5dVhDSmRMRnh1VzNSNWNHVTlYQ0p5WlhObGRGd2lYU3hjYmx0MGVYQmxQVndpYzNWaWJXbDBYQ0pkSUh0Y2JpQWdMWGRsWW10cGRDMWhjSEJsWVhKaGJtTmxPaUJpZFhSMGIyNDdYRzU5WEc0dktpcGNiaUFxSUZKbGJXOTJaU0IwYUdVZ2FXNXVaWElnWW05eVpHVnlJR0Z1WkNCd1lXUmthVzVuSUdsdUlFWnBjbVZtYjNndVhHNGdLaTljYm1KMWRIUnZiam82TFcxdmVpMW1iMk4xY3kxcGJtNWxjaXhjYmx0MGVYQmxQVndpWW5WMGRHOXVYQ0pkT2pvdGJXOTZMV1p2WTNWekxXbHVibVZ5TEZ4dVczUjVjR1U5WENKeVpYTmxkRndpWFRvNkxXMXZlaTFtYjJOMWN5MXBibTVsY2l4Y2JsdDBlWEJsUFZ3aWMzVmliV2wwWENKZE9qb3RiVzk2TFdadlkzVnpMV2x1Ym1WeUlIdGNiaUFnWW05eVpHVnlMWE4wZVd4bE9pQnViMjVsTzF4dUlDQndZV1JrYVc1bk9pQXdPMXh1ZlZ4dUx5b3FYRzRnS2lCU1pYTjBiM0psSUhSb1pTQm1iMk4xY3lCemRIbHNaWE1nZFc1elpYUWdZbmtnZEdobElIQnlaWFpwYjNWeklISjFiR1V1WEc0Z0tpOWNibUoxZEhSdmJqb3RiVzk2TFdadlkzVnpjbWx1Wnl4Y2JsdDBlWEJsUFZ3aVluVjBkRzl1WENKZE9pMXRiM290Wm05amRYTnlhVzVuTEZ4dVczUjVjR1U5WENKeVpYTmxkRndpWFRvdGJXOTZMV1p2WTNWemNtbHVaeXhjYmx0MGVYQmxQVndpYzNWaWJXbDBYQ0pkT2kxdGIzb3RabTlqZFhOeWFXNW5JSHRjYmlBZ2IzVjBiR2x1WlRvZ01YQjRJR1J2ZEhSbFpDQkNkWFIwYjI1VVpYaDBPMXh1ZlZ4dUx5b3FYRzRnS2lCRGIzSnlaV04wSUhSb1pTQndZV1JrYVc1bklHbHVJRVpwY21WbWIzZ3VYRzRnS2k5Y2JtWnBaV3hrYzJWMElIdGNiaUFnY0dGa1pHbHVaem9nTUM0ek5XVnRJREF1TnpWbGJTQXdMall5TldWdE8xeHVmVnh1THlvcVhHNGdLaUF4TGlCRGIzSnlaV04wSUhSb1pTQjBaWGgwSUhkeVlYQndhVzVuSUdsdUlFVmtaMlVnWVc1a0lFbEZMbHh1SUNvZ01pNGdRMjl5Y21WamRDQjBhR1VnWTI5c2IzSWdhVzVvWlhKcGRHRnVZMlVnWm5KdmJTQmdabWxsYkdSelpYUmdJR1ZzWlcxbGJuUnpJR2x1SUVsRkxseHVJQ29nTXk0Z1VtVnRiM1psSUhSb1pTQndZV1JrYVc1bklITnZJR1JsZG1Wc2IzQmxjbk1nWVhKbElHNXZkQ0JqWVhWbmFIUWdiM1YwSUhkb1pXNGdkR2hsZVNCNlpYSnZJRzkxZEZ4dUlDb2dJQ0FnWUdacFpXeGtjMlYwWUNCbGJHVnRaVzUwY3lCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEc0Z0tpOWNibXhsWjJWdVpDQjdYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYRzRnSUM4cUlERWdLaTljYmlBZ1kyOXNiM0k2SUdsdWFHVnlhWFE3WEc0Z0lDOHFJRElnS2k5Y2JpQWdaR2x6Y0d4aGVUb2dkR0ZpYkdVN1hHNGdJQzhxSURFZ0tpOWNiaUFnYldGNExYZHBaSFJvT2lBeE1EQWxPMXh1SUNBdktpQXhJQ292WEc0Z0lIQmhaR1JwYm1jNklEQTdYRzRnSUM4cUlETWdLaTljYmlBZ2QyaHBkR1V0YzNCaFkyVTZJRzV2Y20xaGJEdGNiaUFnTHlvZ01TQXFMMXh1ZlZ4dUx5b3FYRzRnS2lCQlpHUWdkR2hsSUdOdmNuSmxZM1FnZG1WeWRHbGpZV3dnWVd4cFoyNXRaVzUwSUdsdUlFTm9jbTl0WlN3Z1JtbHlaV1p2ZUN3Z1lXNWtJRTl3WlhKaExseHVJQ292WEc1d2NtOW5jbVZ6Y3lCN1hHNGdJSFpsY25ScFkyRnNMV0ZzYVdkdU9pQmlZWE5sYkdsdVpUdGNibjFjYmk4cUtseHVJQ29nVW1WdGIzWmxJSFJvWlNCa1pXWmhkV3gwSUhabGNuUnBZMkZzSUhOamNtOXNiR0poY2lCcGJpQkpSU0F4TUNzdVhHNGdLaTljYm5SbGVIUmhjbVZoSUh0Y2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hHNTlYRzR2S2lwY2JpQXFJREV1SUVGa1pDQjBhR1VnWTI5eWNtVmpkQ0JpYjNnZ2MybDZhVzVuSUdsdUlFbEZJREV3TGx4dUlDb2dNaTRnVW1WdGIzWmxJSFJvWlNCd1lXUmthVzVuSUdsdUlFbEZJREV3TGx4dUlDb3ZYRzViZEhsd1pUMWNJbU5vWldOclltOTRYQ0pkTEZ4dVczUjVjR1U5WENKeVlXUnBiMXdpWFNCN1hHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJQzhxSURFZ0tpOWNiaUFnY0dGa1pHbHVaem9nTUR0Y2JpQWdMeW9nTWlBcUwxeHVmVnh1THlvcVhHNGdLaUJEYjNKeVpXTjBJSFJvWlNCamRYSnpiM0lnYzNSNWJHVWdiMllnYVc1amNtVnRaVzUwSUdGdVpDQmtaV055WlcxbGJuUWdZblYwZEc5dWN5QnBiaUJEYUhKdmJXVXVYRzRnS2k5Y2JsdDBlWEJsUFZ3aWJuVnRZbVZ5WENKZE9qb3RkMlZpYTJsMExXbHVibVZ5TFhOd2FXNHRZblYwZEc5dUxGeHVXM1I1Y0dVOVhDSnVkVzFpWlhKY0lsMDZPaTEzWldKcmFYUXRiM1YwWlhJdGMzQnBiaTFpZFhSMGIyNGdlMXh1SUNCb1pXbG5hSFE2SUdGMWRHODdYRzU5WEc0dktpcGNiaUFxSURFdUlFTnZjbkpsWTNRZ2RHaGxJRzlrWkNCaGNIQmxZWEpoYm1ObElHbHVJRU5vY205dFpTQmhibVFnVTJGbVlYSnBMbHh1SUNvZ01pNGdRMjl5Y21WamRDQjBhR1VnYjNWMGJHbHVaU0J6ZEhsc1pTQnBiaUJUWVdaaGNta3VYRzRnS2k5Y2JsdDBlWEJsUFZ3aWMyVmhjbU5vWENKZElIdGNiaUFnTFhkbFltdHBkQzFoY0hCbFlYSmhibU5sT2lCMFpYaDBabWxsYkdRN1hHNGdJQzhxSURFZ0tpOWNiaUFnYjNWMGJHbHVaUzF2Wm1aelpYUTZJQzB5Y0hnN1hHNGdJQzhxSURJZ0tpOWNibjFjYmk4cUtseHVJQ29nVW1WdGIzWmxJSFJvWlNCcGJtNWxjaUJ3WVdSa2FXNW5JR2x1SUVOb2NtOXRaU0JoYm1RZ1UyRm1ZWEpwSUc5dUlHMWhZMDlUTGx4dUlDb3ZYRzViZEhsd1pUMWNJbk5sWVhKamFGd2lYVG82TFhkbFltdHBkQzF6WldGeVkyZ3RaR1ZqYjNKaGRHbHZiaUI3WEc0Z0lDMTNaV0pyYVhRdFlYQndaV0Z5WVc1alpUb2dibTl1WlR0Y2JuMWNiaThxS2x4dUlDb2dNUzRnUTI5eWNtVmpkQ0IwYUdVZ2FXNWhZbWxzYVhSNUlIUnZJSE4wZVd4bElHTnNhV05yWVdKc1pTQjBlWEJsY3lCcGJpQnBUMU1nWVc1a0lGTmhabUZ5YVM1Y2JpQXFJREl1SUVOb1lXNW5aU0JtYjI1MElIQnliM0JsY25ScFpYTWdkRzhnWUdsdWFHVnlhWFJnSUdsdUlGTmhabUZ5YVM1Y2JpQXFMMXh1T2pvdGQyVmlhMmwwTFdacGJHVXRkWEJzYjJGa0xXSjFkSFJ2YmlCN1hHNGdJQzEzWldKcmFYUXRZWEJ3WldGeVlXNWpaVG9nWW5WMGRHOXVPMXh1SUNBdktpQXhJQ292WEc0Z0lHWnZiblE2SUdsdWFHVnlhWFE3WEc0Z0lDOHFJRElnS2k5Y2JuMWNiaThxSUVsdWRHVnlZV04wYVhabFhHNGdJQ0E5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFNBcUwxeHVMeXBjYmlBcUlFRmtaQ0IwYUdVZ1kyOXljbVZqZENCa2FYTndiR0Y1SUdsdUlFVmtaMlVzSUVsRklERXdLeXdnWVc1a0lFWnBjbVZtYjNndVhHNGdLaTljYm1SbGRHRnBiSE1nZTF4dUlDQmthWE53YkdGNU9pQmliRzlqYXp0Y2JuMWNiaThxWEc0Z0tpQkJaR1FnZEdobElHTnZjbkpsWTNRZ1pHbHpjR3hoZVNCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEc0Z0tpOWNibk4xYlcxaGNua2dlMXh1SUNCa2FYTndiR0Y1T2lCc2FYTjBMV2wwWlcwN1hHNTlYRzR2S2lCTmFYTmpYRzRnSUNBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBTQXFMMXh1THlvcVhHNGdLaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdaR2x6Y0d4aGVTQnBiaUJKUlNBeE1Dc3VYRzRnS2k5Y2JuUmxiWEJzWVhSbElIdGNiaUFnWkdsemNHeGhlVG9nYm05dVpUdGNibjFjYmk4cUtseHVJQ29nUVdSa0lIUm9aU0JqYjNKeVpXTjBJR1JwYzNCc1lYa2dhVzRnU1VVZ01UQXVYRzRnS2k5Y2JsdG9hV1JrWlc1ZElIdGNiaUFnWkdsemNHeGhlVG9nYm05dVpUdGNibjFjYmk4cUlEMDlQVDA5SUVKaGMyVWdQVDA5UFQwZ0tpOWNibWgwYld3c1hHNWliMlI1SUh0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQmlZV05yWjNKdmRXNWtPaUFqWm1GbVlXWmhPMXh1SUNCamIyeHZjam9nSXpNek16dGNiaUFnWm05dWRDMXphWHBsT2lBeE5IQjRPMXh1SUNCc2FXNWxMV2hsYVdkb2REb2dNVFV3SlR0Y2JpQWdabTl1ZEMxbVlXMXBiSGs2SUZ3aVRXbGpjbTl6YjJaMElGbGhTR1ZwSUZWSlhDSXNJRUZ5YVdGc0xDQnpZVzV6TFhObGNtbG1PMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVZVHBzYVc1ckxGeHVZVHAyYVhOcGRHVmtMRnh1WVRwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak1EVTRPVFF5TzF4dUlDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklHNXZibVU3WEc1OVhHNWhPbWh2ZG1WeUlIdGNiaUFnZEdWNGRDMWtaV052Y21GMGFXOXVPaUIxYm1SbGNteHBibVU3WEc1OVhHNWpiMlJsSUh0Y2JpQWdabTl1ZEMxbVlXMXBiSGs2SUZ3aVUyOTFjbU5sSUVOdlpHVWdVSEp2WENJc0lFTnZibk52YkdGekxDQkhaVzl5WjJsaExDQk5iMjVoWTI4c0lHMXZibTl6Y0dGalpTd2dRWEpwWVd3c0lITmhibk10YzJWeWFXWTdYRzU5WEc0dktpQTlQVDA5UFNCVFkzSnZiR3hpWVhJZ1BUMDlQVDBnS2k5Y2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSWdlMXh1SUNCM2FXUjBhRG9nTjNCNE8xeHVJQ0JvWldsbmFIUTZJRGR3ZUR0Y2JpQWdMWGRsWW10cGRDMWliM0prWlhJdGNtRmthWFZ6T2lBMWNIZzdYRzU5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUnlZV05yTFhCcFpXTmxJSHRjYmlBZ0xYZGxZbXRwZEMxaWIzSmtaWEl0Y21Ga2FYVnpPaUExY0hnN1hHNTlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlPblpsY25ScFkyRnNJSHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ2NtZGlZU2d3TENBd0xDQXdMQ0F3TGpJMUtUdGNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEc1OVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlMWFJvZFcxaU9taHZjbWw2YjI1MFlXd2dlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TWpVcE8xeHVJQ0F0ZDJWaWEybDBMV0p2Y21SbGNpMXlZV1JwZFhNNklEVndlRHRjYm4xY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSTZhRzkyWlhJZ2UxeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJ5WjJKaEtEQXNJREFzSURBc0lEQXVNVFVwTzF4dWZWeHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaTEwYUhWdFlqcG9iM1psY2lCN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSEpuWW1Fb01Dd2dNQ3dnTUN3Z01DNHpOU2s3WEc1OVhHNHZLaUJNWVhsdmRYUWdLaTljYmk1a2IyTnpJSHRjYmlBZ1pHbHpjR3hoZVRvZ1pteGxlRHRjYmlBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUhKdmR6dGNiaUFnWm14bGVDMTNjbUZ3T2lCdWIzZHlZWEE3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUx5b2dRWE5wWkdVZ0tpOWNiaTVoYzJsa1pTQjdYRzRnSUdScGMzQnNZWGs2SUdac1pYZzdYRzRnSUdac1pYZ3RjMmh5YVc1ck9pQXdPMXh1SUNCbWJHVjRMV1JwY21WamRHbHZiam9nWTI5c2RXMXVPMXh1SUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2JpQWdkMmxrZEdnNklESTJNSEI0TzF4dUlDQnRZWEpuYVc0NklEQTdYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSXpNek16dGNiaUFnWTI5c2IzSTZJQ05rWkdRN1hHNGdJR0p2ZUMxemFHRmtiM2M2SURBZ01DQTFjSGdnTW5CNElDTmtaR1E3WEc0Z0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4dWZWeHVMeW9nVFdGcGJpQXFMMXh1TG0xaGFXNGdlMXh1SUNCbWJHVjRPaUF4TzF4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYRzRnSUhvdGFXNWtaWGc2SURFN1hHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hHNTlYRzR1WVhOcFpHVWdlMXh1SUNCbWIyNTBMV1poYldsc2VUb2dYQ0pUYjNWeVkyVWdRMjlrWlNCUWNtOWNJaXdnUTI5dWMyOXNZWE1zSUVkbGIzSm5hV0VzSUUxdmJtRmpieXdnYlc5dWIzTndZV05sTENCQmNtbGhiQ3dnYzJGdWN5MXpaWEpwWmp0Y2JuMWNiaTVoYzJsa1pWOWZhR1ZoWkdWeUlIdGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUdac1pYZ3RjMmh5YVc1ck9pQXdPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbUZ6YVdSbFgxOXVZWFlnZTF4dUlDQm1iR1Y0T2lBeE8xeHVJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNibjFjYmk1aGMybGtaVjlmYURJZ2UxeHVJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNiaUFnYUdWcFoyaDBPaUExTkhCNE8xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ05UUndlRHRjYmlBZ1ptOXVkQzF6YVhwbE9pQXlNSEI0TzF4dUlDQm1iMjUwTFhkbGFXZG9kRG9nYm05eWJXRnNPMXh1SUNCbWIyNTBMV1poYldsc2VUb2dSMlZ2Y21kcFlTd2dRMjl1YzI5c1lYTXNJRUZ5YVdGc0xDQnpZVzV6TFhObGNtbG1PMXh1SUNCMFpYaDBMV0ZzYVdkdU9pQmpaVzUwWlhJN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dVlYTnBaR1ZmWDJneklIdGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUhCaFpHUnBibWM2SURBZ01qQndlRHRjYmlBZ1ptOXVkQzF6YVhwbE9pQXhObkI0TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1GemFXUmxYMTlzYVhOMElIdGNiaUFnYldGeVoybHVPaUF3TzF4dUlDQndZV1JrYVc1bk9pQXhNSEI0SURBN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dVlYTnBaR1ZmWDJsMFpXMGdlMXh1SUNCb1pXbG5hSFE2SURNeWNIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQXpNbkI0TzF4dUlDQndZV1JrYVc1bk9pQXdJRE13Y0hnN1hHNGdJR04xY25OdmNqb2djRzlwYm5SbGNqdGNiaUFnWm05dWRDMXphWHBsT2lBeE0zQjRPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbUZ6YVdSbFgxOXBkR1Z0TG1GamRHbDJaU3hjYmk1aGMybGtaVjlmYVhSbGJUcG9iM1psY2lCN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ00xTlRVN1hHNTlYRzR1WVhOcFpHVmZYMmwwWlcwdVlXTjBhWFpsSUh0Y2JpQWdZbTl5WkdWeUxXeGxablE2SUROd2VDQnpiMnhwWkNBalptWm1PMXh1ZlZ4dUxtRnphV1JsWDE5aGJtTm9iM0k2YkdsdWF5QjdYRzRnSUdOdmJHOXlPaUFqWkdSa08xeHVJQ0IwWlhoMExXUmxZMjl5WVhScGIyNDZJRzV2Ym1VN1hHNTlYRzR1WVhOcFpHVmZYMkZ1WTJodmNqcDJhWE5wZEdWa0lIdGNiaUFnWTI5c2IzSTZJQ05rWkdRN1hHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2JuMWNiaTVoYzJsa1pWOWZZVzVqYUc5eU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTmtaR1E3WEc0Z0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2RXNWtaWEpzYVc1bE8xeHVmVnh1TG0xaGFXNWZYMmhsWVdSbGNpeGNiaTV0WVdsdVgxOW1iMjkwWlhJZ2UxeHVJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNiaUFnY0dGa1pHbHVaem9nTVdWdE8xeHVJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YldGcGJsOWZhREVnZTF4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2JpQWdjR0ZrWkdsdVp5MTBiM0E2SURGbGJUdGNiaUFnWm05dWRDMXphWHBsT2lBMVpXMDdYRzRnSUdadmJuUXRkMlZwWjJoME9pQnViM0p0WVd3N1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBeVpXMDdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViV0ZwYmw5ZmJtRnRaU0I3WEc0Z0lHTnZiRzl5T2lBak1XWTRaR1EyTzF4dUlDQm1iMjUwTFhkbGFXZG9kRG9nYm05eWJXRnNPMXh1ZlZ4dUxtMWhhVzVmWDNSaFoyeHBibVVnZTF4dUlDQnRZWEpuYVc0NklERmxiU0JoZFhSdk8xeHVJQ0J0WVhndGQybGtkR2c2SURZMk1IQjRPMXh1SUNCc2FXNWxMV2hsYVdkb2REb2dNUzR6WlcwN1hHNGdJR1p2Ym5RdGMybDZaVG9nTW1WdE8xeHVJQ0JqYjJ4dmNqb2dJems1T1R0Y2JpQWdabTl1ZEMxM1pXbG5hSFE2SURFd01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXRZV2x1WDE5alpHNGdlMXh1SUNCdFlYSm5hVzQ2SURKbGJTQXdPMXh1SUNCd1lXUmthVzVuT2lBeVpXMDdYRzRnSUdadmJuUXRjMmw2WlRvZ01UWndlRHRjYmlBZ2JHbHVaUzFvWldsbmFIUTZJREUxTUNVN1hHNGdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWmhabUZtWVR0Y2JpQWdZbTl5WkdWeUxYUnZjRG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUdKdmNtUmxjaTFpYjNSMGIyMDZJREZ3ZUNCemIyeHBaQ0FqWkdSa08xeHVJQ0JqYjJ4dmNqb2dJelkyTmp0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dFlXbHVYMTlrYjNkdWJHOWhaQ0I3WEc0Z0lHMWhjbWRwYmpvZ01XVnRJR0YxZEc4N1hHNGdJSGRwWkhSb09pQXlNREJ3ZUR0Y2JpQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTFoYVc1ZlgySjFkSFJ2YmlCN1hHNGdJR1JwYzNCc1lYazZJR2x1YkdsdVpTMWliRzlqYXp0Y2JpQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ05IQjRPMXh1SUNCd1lXUmthVzVuT2lBeE5IQjRJREk1Y0hnN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRod2VEdGNiaUFnWm05dWRDMW1ZVzFwYkhrNklGd2lVMjkxY21ObElFTnZaR1VnVUhKdlhDSXNJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JOYjI1aFkyOHNJRzF2Ym05emNHRmpaU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTXdOVGc1TkRJN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWJXRnBibDlmWW5WMGRHOXVPbXhwYm1zc1hHNHViV0ZwYmw5ZlluVjBkRzl1T25acGMybDBaV1FzWEc0dWJXRnBibDlmWW5WMGRHOXVPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ05tWm1ZN1hHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2JuMWNiaTV0WVdsdVgxOW1iMjkwWlhJZ2UxeHVJQ0J0WVhKbmFXNDZJREFnTTJWdE8xeHVJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYm4xY2JpNXpaV04wYVc5dUlIdGNiaUFnYldGeVoybHVPaUF4WlcwZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXpaV04wYVc5dVgxOW9aV0ZrWlhJc1hHNHVjMlZqZEdsdmJsOWZZMjl1ZEdWdWRDeGNiaTV6WldOMGFXOXVYMTltYjI5MFpYSWdlMXh1SUNCdFlYSm5hVzQ2SURBZ00yVnRPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbk5sWTNScGIyNWZYM1JwZEd4bElIdGNiaUFnWTI5c2IzSTZJQ00yTmpZN1hHNTlYRzR1YzJWamRHbHZibDlmYURNZ2UxeHVJQ0JqYjJ4dmNqb2dJekZtT0dSa05qdGNiaUFnWm05dWRDMXphWHBsT2lBeExqTTFaVzA3WEc1OVhHNHVjMlZqZEdsdmJsOWZhRFFnZTF4dUlDQm1iMjUwTFhOcGVtVTZJREV1TVdWdE8xeHVJQ0JqYjJ4dmNqb2dJelkyTmp0Y2JuMWNiaTV6WldOMGFXOXVYMTlvTlNCN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVdWdE8xeHVJQ0JqYjJ4dmNqb2dJems1T1R0Y2JuMWNiaTV6WldOMGFXOXVYMTlrYkNCN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2VpMXBibVJsZURvZ01UdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXpaV04wYVc5dVgxOWtkQ0I3WEc0Z0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNiaUFnZWkxcGJtUmxlRG9nTWp0Y2JpQWdkRzl3T2lBd08xeHVJQ0JzWldaME9pQXdPMXh1SUNCM2FXUjBhRG9nTmpCd2VEdGNiaUFnYldGeVoybHVPaUF3TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG5ObFkzUnBiMjVmWDJSa0lIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCdFlYSm5hVzQ2SURBZ01DQXdJRFl3Y0hnN1hHNGdJR052Ykc5eU9pQWpNRFU0T1RReU8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgzQnlaU0I3WEc0Z0lHMWhjbWRwYmpvZ01tVnRJREE3WEc0Z0lIQmhaR1JwYm1jNklERmxiVHRjYmlBZ1ptOXVkQzF6YVhwbE9pQXhOSEI0TzF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTVRVd0pUdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ2JHVm1kRHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWmhabUZtWVR0Y2JpQWdZbTl5WkdWeU9pQXhjSGdnYzI5c2FXUWdJMlJrWkR0Y2JpQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ05IQjRPMXh1SUNCamIyeHZjam9nSXpZMk5qdGNiaUFnYjNabGNtWnNiM2M2SUdGMWRHODdYRzU5WEc0dWMyVmpkR2x2Ymw5ZlkyOWtaU0I3WEc0Z0lHUnBjM0JzWVhrNklHSnNiMk5yTzF4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1elpXTjBhVzl1WDE5bWIyOTBaWElnZTF4dUlDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnSTJSa1pEdGNiaUFnYldGeVoybHVMWFJ2Y0RvZ00yVnRPMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalptRm1ZV1poTzF4dUlDQmpiMnh2Y2pvZ0l6azVPVHRjYm4xY2JpNWpZWE5sSUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0JrYVhOd2JHRjVPaUJuY21sa08xeHVJQ0JuY21sa0xYUmxiWEJzWVhSbExXTnZiSFZ0Ym5NNklISmxjR1ZoZENneUxDQXhabklwTzF4dUlDQm5ZWEE2SURRd2NIZzdYRzRnSUhCaFpHUnBibWM2SURGbGJUdGNiaUFnWW05eVpHVnlMWFJ2Y0RvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNBalpHUmtPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbU5oYzJVNllXWjBaWElnZTF4dUlDQmpiMjUwWlc1ME9pQW5KenRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQjBiM0E2SURBN1hHNGdJR3hsWm5RNklEVXdKVHRjYmlBZ2FHVnBaMmgwT2lBeE1EQWxPMXh1SUNCM2FXUjBhRG9nTUR0Y2JpQWdZbTl5WkdWeUxXeGxablE2SURGd2VDQnpiMnhwWkNBalpHUmtPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbU5oYzJWZlgzQnlaU3hjYmk1allYTmxYMTkwWlhoMFlYSmxZU0I3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURFMU1DVTdYRzU5WEc0dVkyRnpaVjlmY0hKbExGeHVMbU5oYzJWZlgyTnZaR1VzWEc0dVkyRnpaVjlmZEdWNGRHRnlaV0VnZTF4dUlDQm1iMjUwTFdaaGJXbHNlVG9nWENKRGIzVnlhV1Z5SUU1bGQxd2lMQ0JEYjI1emIyeGhjeXdnUjJWdmNtZHBZU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEc1OVhHNHVZMkZ6WlY5ZmNISmxJSHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0J3WVdSa2FXNW5PaUF4WlcwN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWVdaaFptRTdYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNiaUFnWW05eVpHVnlMWEpoWkdsMWN6b2dOSEI0TzF4dUlDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4dUlDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2JuMWNiaTVqWVhObFgxOTBiMjlzWW1GeUlIdGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUdobGFXZG9kRG9nTXpad2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklETTJjSGc3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVFJ3ZUR0Y2JpQWdjR0ZrWkdsdVp6b2dNQ0F4Tm5CNE8xeHVJQ0IwWlhoMExXRnNhV2R1T2lCeWFXZG9kRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTVqWVhObFgxOWhZM1JwYjI0c1hHNHVZMkZ6WlY5ZmNtVnRiM1psSUh0Y2JpQWdZM1Z5YzI5eU9pQndiMmx1ZEdWeU8xeHVJQ0JqYjJ4dmNqb2dJekExT0RrME1qdGNiaUFnZFhObGNpMXpaV3hsWTNRNklHNXZibVU3WEc1OVhHNHVZMkZ6WlY5ZllXTjBhVzl1SUh0Y2JpQWdabTl1ZEMxemFYcGxPaUF4TTNCNE8xeHVJQ0J3WVdSa2FXNW5MV3hsWm5RNklERXdjSGc3WEc1OVhHNHVZMkZ6WlY5ZllXTjBhVzl1T21acGNuTjBMV05vYVd4a0lIdGNiaUFnY0dGa1pHbHVaeTFzWldaME9pQXdPMXh1ZlZ4dUxtTmhjMlZmWDNKbGJXOTJaU0I3WEc0Z0lHWnNiMkYwT2lCeWFXZG9kRHRjYm4xY2JpNWpZWE5sWDE5amIyNXpiMnhsSUh0Y2JpQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hHNGdJR2hsYVdkb2REb2dNVGd3Y0hnN1hHNGdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dVkyRnpaVjlmZEdWNGRHRnlaV0VnZTF4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ1ltOXlaR1Z5T2lCdWIyNWxPMXh1SUNCdmRYUnNhVzVsT2lCdWIyNWxPMXh1SUNCd1lXUmthVzVuT2lBeFpXMDdYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYRzRnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh1ZlZ4dUxtTmhjMlZmWDJ4cGMzUXNYRzR1WTJGelpWOWZhWFJsYlNCN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2NHRmtaR2x1WnpvZ01EdGNiaUFnYkdsemRDMXpkSGxzWlMxMGVYQmxPaUJ1YjI1bE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtTmhjMlZmWDJ4cGMzUWdlMXh1SUNCb1pXbG5hSFE2SURNMk1IQjRPMXh1SUNCaWIzSmtaWEl0ZEc5d09pQXhjSGdnYzI5c2FXUWdJMlJrWkR0Y2JpQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hHNTlYRzR1WTJGelpWOWZhWFJsYlNCN1hHNGdJR2hsYVdkb2REb2dNelp3ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURNMmNIZzdYRzRnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjYmlBZ2NHRmtaR2x1WnpvZ01DQXhObkI0TzF4dWZWeHVMbU5oYzJWZlgybDBaVzA2YUc5MlpYSWdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalpqZG1PR1k1TzF4dWZWeHVMbUoxZEhSdmJuTWdlMXh1SUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEc0Z0lIb3RhVzVrWlhnNklESTdYRzRnSUhSdmNEb2dOVEFsTzF4dUlDQnlhV2RvZERvZ01USndlRHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0IzYVdSMGFEb2dOVFp3ZUR0Y2JpQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZaS0MwMU1DVXBPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbUoxZEhSdmJuTmZYMmwwWlcwZ2UxeHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEc0Z0lIb3RhVzVrWlhnNklERTdYRzRnSUcxaGNtZHBiam9nTVRCd2VEdGNiaUFnZDJsa2RHZzZJRE0yY0hnN1hHNGdJR2hsYVdkb2REb2dNelp3ZUR0Y2JpQWdZbTl5WkdWeU9pQXhjSGdnYzI5c2FXUWdJMlJrWkR0Y2JpQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ05IQjRPMXh1SUNCaWIzZ3RjMmhoWkc5M09pQXdJREFnTm5CNElDTmtaR1E3WEc0Z0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc0Z0lHTjFjbk52Y2pvZ2NHOXBiblJsY2p0Y2JpQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh1SUNCamIyeHZjam9nSXprNU9UdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNWlkWFIwYjI1elgxOXBkR1Z0T21odmRtVnlJSHRjYmlBZ1kyOXNiM0k2SUNNd05UZzVOREk3WEc1OVhHNHVZblYwZEc5dWMxOWZhWFJsYlM1b2FXUmxJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpNWlkWFIwYjI1elgxOWhibU5vYjNJNmJHbHVheXhjYmk1aWRYUjBiMjV6WDE5aGJtTm9iM0k2ZG1semFYUmxaQ3hjYmk1aWRYUjBiMjV6WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXprNU9UdGNibjFjYmk1aWRYUjBiMjV6WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXpBMU9EazBNanRjYm4xY2JpNWlkWFIwYjI1elgxOXBZMjl1SUh0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2JHVm1kRG9nTlRBbE8xeHVJQ0IzYVdSMGFEb2dNakJ3ZUR0Y2JpQWdhR1ZwWjJoME9pQXlNSEI0TzF4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaU2d0TlRBbExDQXROVEFsS1R0Y2JpQWdabWxzYkRvZ1kzVnljbVZ1ZEdOdmJHOXlPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVJaXdpTHlvaElHNXZjbTFoYkdsNlpTNWpjM01nZGpndU1DNHhJSHdnVFVsVUlFeHBZMlZ1YzJVZ2ZDQm5hWFJvZFdJdVkyOXRMMjVsWTI5c1lYTXZibTl5YldGc2FYcGxMbU56Y3lBcUwxeHlYRzVjY2x4dUx5b2dSRzlqZFcxbGJuUmNjbHh1SUNBZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMGdLaTljY2x4dVhISmNiaThxS2x4eVhHNGdLaUF4TGlCRGIzSnlaV04wSUhSb1pTQnNhVzVsSUdobGFXZG9kQ0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYSEpjYmlBcUlESXVJRkJ5WlhabGJuUWdZV1JxZFhOMGJXVnVkSE1nYjJZZ1ptOXVkQ0J6YVhwbElHRm1kR1Z5SUc5eWFXVnVkR0YwYVc5dUlHTm9ZVzVuWlhNZ2FXNGdhVTlUTGx4eVhHNGdLaTljY2x4dVhISmNibWgwYld3Z2UxeHlYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQXhMakUxT3lBdktpQXhJQ292WEhKY2JpQWdMWGRsWW10cGRDMTBaWGgwTFhOcGVtVXRZV1JxZFhOME9pQXhNREFsT3lBdktpQXlJQ292WEhKY2JuMWNjbHh1WEhKY2JpOHFJRk5sWTNScGIyNXpYSEpjYmlBZ0lEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlJQ292WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nVW1WdGIzWmxJSFJvWlNCdFlYSm5hVzRnYVc0Z1lXeHNJR0p5YjNkelpYSnpMbHh5WEc0Z0tpOWNjbHh1WEhKY2JtSnZaSGtnZTF4eVhHNGdJRzFoY21kcGJqb2dNRHRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlGSmxibVJsY2lCMGFHVWdZRzFoYVc1Z0lHVnNaVzFsYm5RZ1kyOXVjMmx6ZEdWdWRHeDVJR2x1SUVsRkxseHlYRzRnS2k5Y2NseHVYSEpjYm0xaGFXNGdlMXh5WEc0Z0lHUnBjM0JzWVhrNklHSnNiMk5yTzF4eVhHNTlYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dRMjl5Y21WamRDQjBhR1VnWm05dWRDQnphWHBsSUdGdVpDQnRZWEpuYVc0Z2IyNGdZR2d4WUNCbGJHVnRaVzUwY3lCM2FYUm9hVzRnWUhObFkzUnBiMjVnSUdGdVpGeHlYRzRnS2lCZ1lYSjBhV05zWldBZ1kyOXVkR1Y0ZEhNZ2FXNGdRMmh5YjIxbExDQkdhWEpsWm05NExDQmhibVFnVTJGbVlYSnBMbHh5WEc0Z0tpOWNjbHh1WEhKY2JtZ3hJSHRjY2x4dUlDQm1iMjUwTFhOcGVtVTZJREpsYlR0Y2NseHVJQ0J0WVhKbmFXNDZJREF1TmpkbGJTQXdPMXh5WEc1OVhISmNibHh5WEc0dktpQkhjbTkxY0dsdVp5QmpiMjUwWlc1MFhISmNiaUFnSUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOUlDb3ZYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dNUzRnUVdSa0lIUm9aU0JqYjNKeVpXTjBJR0p2ZUNCemFYcHBibWNnYVc0Z1JtbHlaV1p2ZUM1Y2NseHVJQ29nTWk0Z1UyaHZkeUIwYUdVZ2IzWmxjbVpzYjNjZ2FXNGdSV1JuWlNCaGJtUWdTVVV1WEhKY2JpQXFMMXh5WEc1Y2NseHVhSElnZTF4eVhHNGdJR0p2ZUMxemFYcHBibWM2SUdOdmJuUmxiblF0WW05NE95QXZLaUF4SUNvdlhISmNiaUFnYUdWcFoyaDBPaUF3T3lBdktpQXhJQ292WEhKY2JpQWdiM1psY21ac2IzYzZJSFpwYzJsaWJHVTdJQzhxSURJZ0tpOWNjbHh1ZlZ4eVhHNWNjbHh1THlvcVhISmNiaUFxSURFdUlFTnZjbkpsWTNRZ2RHaGxJR2x1YUdWeWFYUmhibU5sSUdGdVpDQnpZMkZzYVc1bklHOW1JR1p2Ym5RZ2MybDZaU0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYSEpjYmlBcUlESXVJRU52Y25KbFkzUWdkR2hsSUc5a1pDQmdaVzFnSUdadmJuUWdjMmw2YVc1bklHbHVJR0ZzYkNCaWNtOTNjMlZ5Y3k1Y2NseHVJQ292WEhKY2JseHlYRzV3Y21VZ2UxeHlYRzRnSUdadmJuUXRabUZ0YVd4NU9pQnRiMjV2YzNCaFkyVXNJRzF2Ym05emNHRmpaVHNnTHlvZ01TQXFMMXh5WEc0Z0lHWnZiblF0YzJsNlpUb2dNV1Z0T3lBdktpQXlJQ292WEhKY2JuMWNjbHh1WEhKY2JpOHFJRlJsZUhRdGJHVjJaV3dnYzJWdFlXNTBhV056WEhKY2JpQWdJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5SUNvdlhISmNibHh5WEc0dktpcGNjbHh1SUNvZ1VtVnRiM1psSUhSb1pTQm5jbUY1SUdKaFkydG5jbTkxYm1RZ2IyNGdZV04wYVhabElHeHBibXR6SUdsdUlFbEZJREV3TGx4eVhHNGdLaTljY2x4dVhISmNibUVnZTF4eVhHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSFJ5WVc1emNHRnlaVzUwTzF4eVhHNTlYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dNUzRnVW1WdGIzWmxJSFJvWlNCaWIzUjBiMjBnWW05eVpHVnlJR2x1SUVOb2NtOXRaU0ExTnkxY2NseHVJQ29nTWk0Z1FXUmtJSFJvWlNCamIzSnlaV04wSUhSbGVIUWdaR1ZqYjNKaGRHbHZiaUJwYmlCRGFISnZiV1VzSUVWa1oyVXNJRWxGTENCUGNHVnlZU3dnWVc1a0lGTmhabUZ5YVM1Y2NseHVJQ292WEhKY2JseHlYRzVoWW1KeVczUnBkR3hsWFNCN1hISmNiaUFnWW05eVpHVnlMV0p2ZEhSdmJUb2dibTl1WlRzZ0x5b2dNU0FxTDF4eVhHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dkVzVrWlhKc2FXNWxPeUF2S2lBeUlDb3ZYSEpjYmlBZ2RHVjRkQzFrWldOdmNtRjBhVzl1T2lCMWJtUmxjbXhwYm1VZ1pHOTBkR1ZrT3lBdktpQXlJQ292WEhKY2JuMWNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQkJaR1FnZEdobElHTnZjbkpsWTNRZ1ptOXVkQ0IzWldsbmFIUWdhVzRnUTJoeWIyMWxMQ0JGWkdkbExDQmhibVFnVTJGbVlYSnBMbHh5WEc0Z0tpOWNjbHh1WEhKY2JtSXNYSEpjYm5OMGNtOXVaeUI3WEhKY2JpQWdabTl1ZEMxM1pXbG5hSFE2SUdKdmJHUmxjanRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlERXVJRU52Y25KbFkzUWdkR2hsSUdsdWFHVnlhWFJoYm1ObElHRnVaQ0J6WTJGc2FXNW5JRzltSUdadmJuUWdjMmw2WlNCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEhKY2JpQXFJREl1SUVOdmNuSmxZM1FnZEdobElHOWtaQ0JnWlcxZ0lHWnZiblFnYzJsNmFXNW5JR2x1SUdGc2JDQmljbTkzYzJWeWN5NWNjbHh1SUNvdlhISmNibHh5WEc1amIyUmxMRnh5WEc1clltUXNYSEpjYm5OaGJYQWdlMXh5WEc0Z0lHWnZiblF0Wm1GdGFXeDVPaUJ0YjI1dmMzQmhZMlVzSUcxdmJtOXpjR0ZqWlRzZ0x5b2dNU0FxTDF4eVhHNGdJR1p2Ym5RdGMybDZaVG9nTVdWdE95QXZLaUF5SUNvdlhISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdabTl1ZENCemFYcGxJR2x1SUdGc2JDQmljbTkzYzJWeWN5NWNjbHh1SUNvdlhISmNibHh5WEc1emJXRnNiQ0I3WEhKY2JpQWdabTl1ZEMxemFYcGxPaUE0TUNVN1hISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJRY21WMlpXNTBJR0J6ZFdKZ0lHRnVaQ0JnYzNWd1lDQmxiR1Z0Wlc1MGN5Qm1jbTl0SUdGbVptVmpkR2x1WnlCMGFHVWdiR2x1WlNCb1pXbG5hSFFnYVc1Y2NseHVJQ29nWVd4c0lHSnliM2R6WlhKekxseHlYRzRnS2k5Y2NseHVYSEpjYm5OMVlpeGNjbHh1YzNWd0lIdGNjbHh1SUNCbWIyNTBMWE5wZW1VNklEYzFKVHRjY2x4dUlDQnNhVzVsTFdobGFXZG9kRG9nTUR0Y2NseHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdkbVZ5ZEdsallXd3RZV3hwWjI0NklHSmhjMlZzYVc1bE8xeHlYRzU5WEhKY2JseHlYRzV6ZFdJZ2UxeHlYRzRnSUdKdmRIUnZiVG9nTFRBdU1qVmxiVHRjY2x4dWZWeHlYRzVjY2x4dWMzVndJSHRjY2x4dUlDQjBiM0E2SUMwd0xqVmxiVHRjY2x4dWZWeHlYRzVjY2x4dUx5b2dSVzFpWldSa1pXUWdZMjl1ZEdWdWRGeHlYRzRnSUNBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBTQXFMMXh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJRkpsYlc5MlpTQjBhR1VnWW05eVpHVnlJRzl1SUdsdFlXZGxjeUJwYm5OcFpHVWdiR2x1YTNNZ2FXNGdTVVVnTVRBdVhISmNiaUFxTDF4eVhHNWNjbHh1YVcxbklIdGNjbHh1SUNCaWIzSmtaWEl0YzNSNWJHVTZJRzV2Ym1VN1hISmNibjFjY2x4dVhISmNiaThxSUVadmNtMXpYSEpjYmlBZ0lEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlJQ292WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nTVM0Z1EyaGhibWRsSUhSb1pTQm1iMjUwSUhOMGVXeGxjeUJwYmlCaGJHd2dZbkp2ZDNObGNuTXVYSEpjYmlBcUlESXVJRkpsYlc5MlpTQjBhR1VnYldGeVoybHVJR2x1SUVacGNtVm1iM2dnWVc1a0lGTmhabUZ5YVM1Y2NseHVJQ292WEhKY2JseHlYRzVpZFhSMGIyNHNYSEpjYm1sdWNIVjBMRnh5WEc1dmNIUm5jbTkxY0N4Y2NseHVjMlZzWldOMExGeHlYRzUwWlhoMFlYSmxZU0I3WEhKY2JpQWdabTl1ZEMxbVlXMXBiSGs2SUdsdWFHVnlhWFE3SUM4cUlERWdLaTljY2x4dUlDQm1iMjUwTFhOcGVtVTZJREV3TUNVN0lDOHFJREVnS2k5Y2NseHVJQ0JzYVc1bExXaGxhV2RvZERvZ01TNHhOVHNnTHlvZ01TQXFMMXh5WEc0Z0lHMWhjbWRwYmpvZ01Ec2dMeW9nTWlBcUwxeHlYRzU5WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nVTJodmR5QjBhR1VnYjNabGNtWnNiM2NnYVc0Z1NVVXVYSEpjYmlBcUlERXVJRk5vYjNjZ2RHaGxJRzkyWlhKbWJHOTNJR2x1SUVWa1oyVXVYSEpjYmlBcUwxeHlYRzVjY2x4dVluVjBkRzl1TEZ4eVhHNXBibkIxZENCN0lDOHFJREVnS2k5Y2NseHVJQ0J2ZG1WeVpteHZkem9nZG1semFXSnNaVHRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlGSmxiVzkyWlNCMGFHVWdhVzVvWlhKcGRHRnVZMlVnYjJZZ2RHVjRkQ0IwY21GdWMyWnZjbTBnYVc0Z1JXUm5aU3dnUm1seVpXWnZlQ3dnWVc1a0lFbEZMbHh5WEc0Z0tpQXhMaUJTWlcxdmRtVWdkR2hsSUdsdWFHVnlhWFJoYm1ObElHOW1JSFJsZUhRZ2RISmhibk5tYjNKdElHbHVJRVpwY21WbWIzZ3VYSEpjYmlBcUwxeHlYRzVjY2x4dVluVjBkRzl1TEZ4eVhHNXpaV3hsWTNRZ2V5QXZLaUF4SUNvdlhISmNiaUFnZEdWNGRDMTBjbUZ1YzJadmNtMDZJRzV2Ym1VN1hISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJEYjNKeVpXTjBJSFJvWlNCcGJtRmlhV3hwZEhrZ2RHOGdjM1I1YkdVZ1kyeHBZMnRoWW14bElIUjVjR1Z6SUdsdUlHbFBVeUJoYm1RZ1UyRm1ZWEpwTGx4eVhHNGdLaTljY2x4dVhISmNibUoxZEhSdmJpeGNjbHh1VzNSNWNHVTlYQ0ppZFhSMGIyNWNJbDBzWEhKY2JsdDBlWEJsUFZ3aWNtVnpaWFJjSWwwc1hISmNibHQwZVhCbFBWd2ljM1ZpYldsMFhDSmRJSHRjY2x4dUlDQXRkMlZpYTJsMExXRndjR1ZoY21GdVkyVTZJR0oxZEhSdmJqdGNjbHh1ZlZ4eVhHNWNjbHh1THlvcVhISmNiaUFxSUZKbGJXOTJaU0IwYUdVZ2FXNXVaWElnWW05eVpHVnlJR0Z1WkNCd1lXUmthVzVuSUdsdUlFWnBjbVZtYjNndVhISmNiaUFxTDF4eVhHNWNjbHh1WW5WMGRHOXVPam90Ylc5NkxXWnZZM1Z6TFdsdWJtVnlMRnh5WEc1YmRIbHdaVDFjSW1KMWRIUnZibHdpWFRvNkxXMXZlaTFtYjJOMWN5MXBibTVsY2l4Y2NseHVXM1I1Y0dVOVhDSnlaWE5sZEZ3aVhUbzZMVzF2ZWkxbWIyTjFjeTFwYm01bGNpeGNjbHh1VzNSNWNHVTlYQ0p6ZFdKdGFYUmNJbDA2T2kxdGIzb3RabTlqZFhNdGFXNXVaWElnZTF4eVhHNGdJR0p2Y21SbGNpMXpkSGxzWlRvZ2JtOXVaVHRjY2x4dUlDQndZV1JrYVc1bk9pQXdPMXh5WEc1OVhISmNibHh5WEc0dktpcGNjbHh1SUNvZ1VtVnpkRzl5WlNCMGFHVWdabTlqZFhNZ2MzUjViR1Z6SUhWdWMyVjBJR0o1SUhSb1pTQndjbVYyYVc5MWN5QnlkV3hsTGx4eVhHNGdLaTljY2x4dVhISmNibUoxZEhSdmJqb3RiVzk2TFdadlkzVnpjbWx1Wnl4Y2NseHVXM1I1Y0dVOVhDSmlkWFIwYjI1Y0lsMDZMVzF2ZWkxbWIyTjFjM0pwYm1jc1hISmNibHQwZVhCbFBWd2ljbVZ6WlhSY0lsMDZMVzF2ZWkxbWIyTjFjM0pwYm1jc1hISmNibHQwZVhCbFBWd2ljM1ZpYldsMFhDSmRPaTF0YjNvdFptOWpkWE55YVc1bklIdGNjbHh1SUNCdmRYUnNhVzVsT2lBeGNIZ2daRzkwZEdWa0lFSjFkSFJ2YmxSbGVIUTdYSEpjYm4xY2NseHVYSEpjYmk4cUtseHlYRzRnS2lCRGIzSnlaV04wSUhSb1pTQndZV1JrYVc1bklHbHVJRVpwY21WbWIzZ3VYSEpjYmlBcUwxeHlYRzVjY2x4dVptbGxiR1J6WlhRZ2UxeHlYRzRnSUhCaFpHUnBibWM2SURBdU16VmxiU0F3TGpjMVpXMGdNQzQyTWpWbGJUdGNjbHh1ZlZ4eVhHNWNjbHh1THlvcVhISmNiaUFxSURFdUlFTnZjbkpsWTNRZ2RHaGxJSFJsZUhRZ2QzSmhjSEJwYm1jZ2FXNGdSV1JuWlNCaGJtUWdTVVV1WEhKY2JpQXFJREl1SUVOdmNuSmxZM1FnZEdobElHTnZiRzl5SUdsdWFHVnlhWFJoYm1ObElHWnliMjBnWUdacFpXeGtjMlYwWUNCbGJHVnRaVzUwY3lCcGJpQkpSUzVjY2x4dUlDb2dNeTRnVW1WdGIzWmxJSFJvWlNCd1lXUmthVzVuSUhOdklHUmxkbVZzYjNCbGNuTWdZWEpsSUc1dmRDQmpZWFZuYUhRZ2IzVjBJSGRvWlc0Z2RHaGxlU0I2WlhKdklHOTFkRnh5WEc0Z0tpQWdJQ0JnWm1sbGJHUnpaWFJnSUdWc1pXMWxiblJ6SUdsdUlHRnNiQ0JpY205M2MyVnljeTVjY2x4dUlDb3ZYSEpjYmx4eVhHNXNaV2RsYm1RZ2UxeHlYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdJQzhxSURFZ0tpOWNjbHh1SUNCamIyeHZjam9nYVc1b1pYSnBkRHNnTHlvZ01pQXFMMXh5WEc0Z0lHUnBjM0JzWVhrNklIUmhZbXhsT3lBdktpQXhJQ292WEhKY2JpQWdiV0Y0TFhkcFpIUm9PaUF4TURBbE95QXZLaUF4SUNvdlhISmNiaUFnY0dGa1pHbHVaem9nTURzZ0x5b2dNeUFxTDF4eVhHNGdJSGRvYVhSbExYTndZV05sT2lCdWIzSnRZV3c3SUM4cUlERWdLaTljY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlFRmtaQ0IwYUdVZ1kyOXljbVZqZENCMlpYSjBhV05oYkNCaGJHbG5ibTFsYm5RZ2FXNGdRMmh5YjIxbExDQkdhWEpsWm05NExDQmhibVFnVDNCbGNtRXVYSEpjYmlBcUwxeHlYRzVjY2x4dWNISnZaM0psYzNNZ2UxeHlYRzRnSUhabGNuUnBZMkZzTFdGc2FXZHVPaUJpWVhObGJHbHVaVHRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlGSmxiVzkyWlNCMGFHVWdaR1ZtWVhWc2RDQjJaWEowYVdOaGJDQnpZM0p2Ykd4aVlYSWdhVzRnU1VVZ01UQXJMbHh5WEc0Z0tpOWNjbHh1WEhKY2JuUmxlSFJoY21WaElIdGNjbHh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlERXVJRUZrWkNCMGFHVWdZMjl5Y21WamRDQmliM2dnYzJsNmFXNW5JR2x1SUVsRklERXdMbHh5WEc0Z0tpQXlMaUJTWlcxdmRtVWdkR2hsSUhCaFpHUnBibWNnYVc0Z1NVVWdNVEF1WEhKY2JpQXFMMXh5WEc1Y2NseHVXM1I1Y0dVOVhDSmphR1ZqYTJKdmVGd2lYU3hjY2x4dVczUjVjR1U5WENKeVlXUnBiMXdpWFNCN1hISmNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEc2dMeW9nTVNBcUwxeHlYRzRnSUhCaFpHUnBibWM2SURBN0lDOHFJRElnS2k5Y2NseHVmVnh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJRU52Y25KbFkzUWdkR2hsSUdOMWNuTnZjaUJ6ZEhsc1pTQnZaaUJwYm1OeVpXMWxiblFnWVc1a0lHUmxZM0psYldWdWRDQmlkWFIwYjI1eklHbHVJRU5vY205dFpTNWNjbHh1SUNvdlhISmNibHh5WEc1YmRIbHdaVDFjSW01MWJXSmxjbHdpWFRvNkxYZGxZbXRwZEMxcGJtNWxjaTF6Y0dsdUxXSjFkSFJ2Yml4Y2NseHVXM1I1Y0dVOVhDSnVkVzFpWlhKY0lsMDZPaTEzWldKcmFYUXRiM1YwWlhJdGMzQnBiaTFpZFhSMGIyNGdlMXh5WEc0Z0lHaGxhV2RvZERvZ1lYVjBienRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlERXVJRU52Y25KbFkzUWdkR2hsSUc5a1pDQmhjSEJsWVhKaGJtTmxJR2x1SUVOb2NtOXRaU0JoYm1RZ1UyRm1ZWEpwTGx4eVhHNGdLaUF5TGlCRGIzSnlaV04wSUhSb1pTQnZkWFJzYVc1bElITjBlV3hsSUdsdUlGTmhabUZ5YVM1Y2NseHVJQ292WEhKY2JseHlYRzViZEhsd1pUMWNJbk5sWVhKamFGd2lYU0I3WEhKY2JpQWdMWGRsWW10cGRDMWhjSEJsWVhKaGJtTmxPaUIwWlhoMFptbGxiR1E3SUM4cUlERWdLaTljY2x4dUlDQnZkWFJzYVc1bExXOW1abk5sZERvZ0xUSndlRHNnTHlvZ01pQXFMMXh5WEc1OVhISmNibHh5WEc0dktpcGNjbHh1SUNvZ1VtVnRiM1psSUhSb1pTQnBibTVsY2lCd1lXUmthVzVuSUdsdUlFTm9jbTl0WlNCaGJtUWdVMkZtWVhKcElHOXVJRzFoWTA5VExseHlYRzRnS2k5Y2NseHVYSEpjYmx0MGVYQmxQVndpYzJWaGNtTm9YQ0pkT2pvdGQyVmlhMmwwTFhObFlYSmphQzFrWldOdmNtRjBhVzl1SUh0Y2NseHVJQ0F0ZDJWaWEybDBMV0Z3Y0dWaGNtRnVZMlU2SUc1dmJtVTdYSEpjYm4xY2NseHVYSEpjYmk4cUtseHlYRzRnS2lBeExpQkRiM0p5WldOMElIUm9aU0JwYm1GaWFXeHBkSGtnZEc4Z2MzUjViR1VnWTJ4cFkydGhZbXhsSUhSNWNHVnpJR2x1SUdsUFV5QmhibVFnVTJGbVlYSnBMbHh5WEc0Z0tpQXlMaUJEYUdGdVoyVWdabTl1ZENCd2NtOXdaWEowYVdWeklIUnZJR0JwYm1obGNtbDBZQ0JwYmlCVFlXWmhjbWt1WEhKY2JpQXFMMXh5WEc1Y2NseHVPam90ZDJWaWEybDBMV1pwYkdVdGRYQnNiMkZrTFdKMWRIUnZiaUI3WEhKY2JpQWdMWGRsWW10cGRDMWhjSEJsWVhKaGJtTmxPaUJpZFhSMGIyNDdJQzhxSURFZ0tpOWNjbHh1SUNCbWIyNTBPaUJwYm1obGNtbDBPeUF2S2lBeUlDb3ZYSEpjYm4xY2NseHVYSEpjYmk4cUlFbHVkR1Z5WVdOMGFYWmxYSEpjYmlBZ0lEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlJQ292WEhKY2JseHlYRzR2S2x4eVhHNGdLaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdaR2x6Y0d4aGVTQnBiaUJGWkdkbExDQkpSU0F4TUNzc0lHRnVaQ0JHYVhKbFptOTRMbHh5WEc0Z0tpOWNjbHh1WEhKY2JtUmxkR0ZwYkhNZ2UxeHlYRzRnSUdScGMzQnNZWGs2SUdKc2IyTnJPMXh5WEc1OVhISmNibHh5WEc0dktseHlYRzRnS2lCQlpHUWdkR2hsSUdOdmNuSmxZM1FnWkdsemNHeGhlU0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYSEpjYmlBcUwxeHlYRzVjY2x4dWMzVnRiV0Z5ZVNCN1hISmNiaUFnWkdsemNHeGhlVG9nYkdsemRDMXBkR1Z0TzF4eVhHNTlYSEpjYmx4eVhHNHZLaUJOYVhOalhISmNiaUFnSUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOUlDb3ZYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dRV1JrSUhSb1pTQmpiM0p5WldOMElHUnBjM0JzWVhrZ2FXNGdTVVVnTVRBckxseHlYRzRnS2k5Y2NseHVYSEpjYm5SbGJYQnNZWFJsSUh0Y2NseHVJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHlYRzU5WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nUVdSa0lIUm9aU0JqYjNKeVpXTjBJR1JwYzNCc1lYa2dhVzRnU1VVZ01UQXVYSEpjYmlBcUwxeHlYRzVjY2x4dVcyaHBaR1JsYmwwZ2UxeHlYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYm4xY2NseHVJaXdpUUdsdGNHOXlkQ0FuWTI5c2IzSnpKenRjY2x4dVhISmNiaThxSUQwOVBUMDlJRUpoYzJVZ1BUMDlQVDBnS2k5Y2NseHVhSFJ0YkN4Y2NseHVZbTlrZVNCN1hISmNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUdKaFkydG5jbTkxYm1RNklFQmlaMTlqYjJ4dmNqdGNjbHh1SUNCamIyeHZjam9nUUhCeWFXMWhjbmxmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0JtYjI1MExYTnBlbVU2SURFMGNIZzdYSEpjYmlBZ2JHbHVaUzFvWldsbmFIUTZJREUxTUNVN1hISmNiaUFnWm05dWRDMW1ZVzFwYkhrNklGd2lUV2xqY205emIyWjBJRmxoU0dWcElGVkpYQ0lzSUVGeWFXRnNMQ0J6WVc1ekxYTmxjbWxtTzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYm4xY2NseHVYSEpjYm1FZ2UxeHlYRzRnSUNZNmJHbHVheXhjY2x4dUlDQW1PblpwYzJsMFpXUXNYSEpjYmlBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNCamIyeHZjam9nUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmlBZ0lDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklHNXZibVU3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dkVzVrWlhKc2FXNWxPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNWNjbHh1WTI5a1pTQjdYSEpjYmlBZ1ptOXVkQzFtWVcxcGJIazZJRndpVTI5MWNtTmxJRU52WkdVZ1VISnZYQ0lzSUVOdmJuTnZiR0Z6TENCSFpXOXlaMmxoTENCTmIyNWhZMjhzSUcxdmJtOXpjR0ZqWlN3Z1FYSnBZV3dzSUhOaGJuTXRjMlZ5YVdZN1hISmNibjFjY2x4dUlpd2lMeW9nUFQwOVBUMGdVMk55YjJ4c1ltRnlJRDA5UFQwOUlDb3ZYSEpjYmpvNkxYZGxZbXRwZEMxelkzSnZiR3hpWVhJZ2UxeHlYRzRnSUhkcFpIUm9PaUEzY0hnN1hISmNiaUFnYUdWcFoyaDBPaUEzY0hnN1hISmNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEhKY2JuMWNjbHh1WEhKY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSXRkSEpoWTJzdGNHbGxZMlVnZTF4eVhHNGdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh5WEc1OVhISmNibHh5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUm9kVzFpT25abGNuUnBZMkZzSUh0Y2NseHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJ5WjJKaEtEQXNJREFzSURBc0lEQXVNalVwTzF4eVhHNGdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh5WEc1OVhISmNibHh5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUm9kVzFpT21odmNtbDZiMjUwWVd3Z2UxeHlYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR5TlNrN1hISmNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEhKY2JuMWNjbHh1WEhKY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSTZhRzkyWlhJZ2UxeHlYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR4TlNrN1hISmNibjFjY2x4dVhISmNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEl0ZEdoMWJXSTZhRzkyWlhJZ2UxeHlYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR6TlNrN1hISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5ZMjlzYjNKekp6dGNjbHh1WEhKY2JpOHFJRXhoZVc5MWRDQXFMMXh5WEc0dVpHOWpjeUI3WEhKY2JpQWdaR2x6Y0d4aGVUb2dabXhsZUR0Y2NseHVJQ0JtYkdWNExXUnBjbVZqZEdsdmJqb2djbTkzTzF4eVhHNGdJR1pzWlhndGQzSmhjRG9nYm05M2NtRndPMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNCM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNCdFlYSm5hVzQ2SURBN1hISmNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dWZWeHlYRzVjY2x4dUx5b2dRWE5wWkdVZ0tpOWNjbHh1TG1GemFXUmxJSHRjY2x4dUlDQmthWE53YkdGNU9pQm1iR1Y0TzF4eVhHNGdJR1pzWlhndGMyaHlhVzVyT2lBd08xeHlYRzRnSUdac1pYZ3RaR2x5WldOMGFXOXVPaUJqYjJ4MWJXNDdYSEpjYmlBZ1pteGxlQzEzY21Gd09pQnViM2R5WVhBN1hISmNiaUFnZDJsa2RHZzZJREkyTUhCNE8xeHlYRzRnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhCeWFXMWhjbmxmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0JqYjJ4dmNqb2dRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0JpYjNndGMyaGhaRzkzT2lBd0lEQWdOWEI0SURKd2VDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHlYRzU5WEhKY2JseHlYRzR2S2lCTllXbHVJQ292WEhKY2JpNXRZV2x1SUh0Y2NseHVJQ0JtYkdWNE9pQXhPMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5ZMjlzYjNKekp6dGNjbHh1WEhKY2JpNWhjMmxrWlNCN1hISmNiaUFnWm05dWRDMW1ZVzFwYkhrNklGd2lVMjkxY21ObElFTnZaR1VnVUhKdlhDSXNJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JOYjI1aFkyOHNJRzF2Ym05emNHRmpaU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEhKY2JseHlYRzRnSUNaZlgyaGxZV1JsY2lCN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURBZ1lYVjBienRjY2x4dUlDQWdJR1pzWlhndGMyaHlhVzVyT2lBd08xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyNWhkaUI3WEhKY2JpQWdJQ0JtYkdWNE9pQXhPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW9NaUI3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lHaGxhV2RvZERvZ05UUndlRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBMU5IQjRPMXh5WEc0Z0lDQWdabTl1ZEMxemFYcGxPaUF5TUhCNE8xeHlYRzRnSUNBZ1ptOXVkQzEzWldsbmFIUTZJRzV2Y20xaGJEdGNjbHh1SUNBZ0lHWnZiblF0Wm1GdGFXeDVPaUJIWlc5eVoybGhMQ0JEYjI1emIyeGhjeXdnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEhKY2JpQWdJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYURNZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF3SURJd2NIZzdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmJHbHpkQ0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF4TUhCNElEQTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZhWFJsYlNCN1hISmNiaUFnSUNCb1pXbG5hSFE2SURNeWNIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTXpKd2VEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNekJ3ZUR0Y2NseHVJQ0FnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdKaTVoWTNScGRtVXNYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSE5sWTI5dVpHRnllVjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDWXVZV04wYVhabElIdGNjbHh1SUNBZ0lDQWdZbTl5WkdWeUxXeGxablE2SUROd2VDQnpiMnhwWkNCQWQyaHBkR1U3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5aGJtTm9iM0k2YkdsdWF5QjdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrSUh0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ2RHVjRkQzFrWldOdmNtRjBhVzl1T2lCdWIyNWxPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWVc1amFHOXlPbWh2ZG1WeUlIdGNjbHh1SUNBZ0lHTnZiRzl5T2lCQVltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lDQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQjFibVJsY214cGJtVTdYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JpSXNJa0JwYlhCdmNuUWdKMk52Ykc5eWN5YzdYSEpjYmx4eVhHNHViV0ZwYmlCN1hISmNiaUFnSmw5ZmFHVmhaR1Z5TEZ4eVhHNGdJQ1pmWDJadmIzUmxjaUI3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklERmxiVHRjY2x4dUlDQWdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlvTVNCN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURBZ1lYVjBienRjY2x4dUlDQWdJSEJoWkdScGJtY3RkRzl3T2lBeFpXMDdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJRFZsYlR0Y2NseHVJQ0FnSUdadmJuUXRkMlZwWjJoME9pQnViM0p0WVd3N1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNaTR3WlcwN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmJtRnRaU0I3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSEJ5YVcxaGNubGZZMjlzYjNJN1hISmNiaUFnSUNCbWIyNTBMWGRsYVdkb2REb2dibTl5YldGc08xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZkR0ZuYkdsdVpTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklERmxiU0JoZFhSdk8xeHlYRzRnSUNBZ2JXRjRMWGRwWkhSb09pQTJOakJ3ZUR0Y2NseHVJQ0FnSUd4cGJtVXRhR1ZwWjJoME9pQXhMak5sYlR0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01tVnRPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQm1iM1Z5ZEdoZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNBZ0lHWnZiblF0ZDJWcFoyaDBPaUF4TURBN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlkyUnVJSHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNbVZ0SURBN1hISmNiaUFnSUNCd1lXUmthVzVuT2lBeVpXMDdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNVFV3SlR0Y2NseHVJQ0FnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2NseHVJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCaVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCamIyeHZjam9nUUhSb2FYSmtYM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWkc5M2JteHZZV1I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREZsYlNCaGRYUnZPMXh5WEc0Z0lDQWdkMmxrZEdnNklESXdNSEI0TzF4eVhHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJKMWRIUnZiaUI3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hISmNiaUFnSUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUEwY0hnN1hISmNiaUFnSUNCd1lXUmthVzVuT2lBeE5IQjRJREk1Y0hnN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERTRjSGc3WEhKY2JpQWdJQ0JtYjI1MExXWmhiV2xzZVRvZ1hDSlRiM1Z5WTJVZ1EyOWtaU0JRY205Y0lpd2dRMjl1YzI5c1lYTXNJRWRsYjNKbmFXRXNJRTF2Ym1GamJ5d2diVzl1YjNOd1lXTmxMQ0JCY21saGJDd2djMkZ1Y3kxelpYSnBaanRjY2x4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUJ6ZFdOalpYTnpYMk52Ykc5eU8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVYSEpjYmlBZ0lDQW1PbXhwYm1zc1hISmNiaUFnSUNBbU9uWnBjMmwwWldRc1hISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCM2FHbDBaVHRjY2x4dUlDQWdJQ0FnZEdWNGRDMWtaV052Y21GMGFXOXVPaUJ1YjI1bE8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZabTl2ZEdWeUlIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01DQXpaVzA3WEhKY2JpQWdJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQjlYSEpjYm4xY2NseHVJaXdpUUdsdGNHOXlkQ0FuWTI5c2IzSnpKenRjY2x4dVhISmNiaTV6WldOMGFXOXVJSHRjY2x4dUlDQnRZWEpuYVc0NklERmxiU0F3TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ1pmWDJobFlXUmxjaXhjY2x4dUlDQW1YMTlqYjI1MFpXNTBMRnh5WEc0Z0lDWmZYMlp2YjNSbGNpQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQWdNMlZ0TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNScGRHeGxJSHRjY2x4dUlDQWdJR052Ykc5eU9pQkFkR2hwY21SZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmd6SUh0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBY0hKcGJXRnllVjlqYjJ4dmNqdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNUzR6TldWdE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZhRFFnZTF4eVhHNGdJQ0FnWm05dWRDMXphWHBsT2lBeExqRmxiVHRjY2x4dUlDQWdJR052Ykc5eU9pQkFkR2hwY21SZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmcxSUh0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01XVnRPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQm1iM1Z5ZEdoZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMlJzSUh0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlpIUWdlMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dNanRjY2x4dUlDQWdJSFJ2Y0RvZ01EdGNjbHh1SUNBZ0lHeGxablE2SURBN1hISmNiaUFnSUNCM2FXUjBhRG9nTmpCd2VEdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWtaQ0I3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF4TzF4eVhHNGdJQ0FnYldGeVoybHVPaUF3SURBZ01DQTJNSEI0TzF4eVhHNGdJQ0FnWTI5c2IzSTZJRUJ6ZFdOalpYTnpYMk52Ykc5eU8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgzQnlaU0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREpsYlNBd08xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01XVnRPMXh5WEc0Z0lDQWdabTl1ZEMxemFYcGxPaUF4TkhCNE8xeHlYRzRnSUNBZ2JHbHVaUzFvWldsbmFIUTZJREUxTUNVN1hISmNiaUFnSUNCMFpYaDBMV0ZzYVdkdU9pQnNaV1owTzF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUdKblgyTnZiRzl5TzF4eVhHNGdJQ0FnWW05eVpHVnlPaUF4Y0hnZ2MyOXNhV1FnUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lHSnZjbVJsY2kxeVlXUnBkWE02SURSd2VEdGNjbHh1SUNBZ0lHTnZiRzl5T2lCQWRHaHBjbVJmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWTI5a1pTQjdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQmliRzlqYXp0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMlp2YjNSbGNpQjdYSEpjYmlBZ0lDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lHMWhjbWRwYmkxMGIzQTZJRE5sYlR0Y2NseHVJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCaVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBWm05MWNuUm9YM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdmVnh5WEc1OVhISmNiaUlzSWtCcGJYQnZjblFnSnk0dlkyOXNiM0p6Snp0Y2NseHVYSEpjYmk1allYTmxJSHRjY2x4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYSEpjYmlBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNCa2FYTndiR0Y1T2lCbmNtbGtPMXh5WEc0Z0lHZHlhV1F0ZEdWdGNHeGhkR1V0WTI5c2RXMXVjem9nY21Wd1pXRjBLRElzSURGbWNpazdYSEpjYmlBZ1oyRndPaUEwTUhCNE8xeHlYRzRnSUhCaFpHUnBibWM2SURGbGJUdGNjbHh1SUNCaWIzSmtaWEl0ZEc5d09qRndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJR0p2Y21SbGNpMWliM1IwYjIwNk1YQjRJSE52Ykdsa0lFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdKanBoWm5SbGNpQjdYSEpjYmlBZ0lDQmpiMjUwWlc1ME9pQW5KenRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjY2x4dUlDQWdJSG90YVc1a1pYZzZJREk3WEhKY2JpQWdJQ0IwYjNBNklEQTdYSEpjYmlBZ0lDQnNaV1owT2lBMU1DVTdYSEpjYmlBZ0lDQm9aV2xuYUhRNklERXdNQ1U3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNRHRjY2x4dUlDQWdJR0p2Y21SbGNpMXNaV1owT2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTl3Y21Vc1hISmNiaUFnSmw5ZmRHVjRkR0Z5WldFZ2UxeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhNM0I0TzF4eVhHNGdJQ0FnYkdsdVpTMW9aV2xuYUhRNklERTFNQ1U3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5d2NtVXNYSEpjYmlBZ0psOWZZMjlrWlN4Y2NseHVJQ0FtWDE5MFpYaDBZWEpsWVNCN1hISmNiaUFnSUNCbWIyNTBMV1poYldsc2VUb2dYQ0pEYjNWeWFXVnlJRTVsZDF3aUxDQkRiMjV6YjJ4aGN5d2dSMlZ2Y21kcFlTd2dRWEpwWVd3c0lITmhibk10YzJWeWFXWTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTl3Y21VZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01XVnRPMXh5WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRR0puWDJOdmJHOXlPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXhNREFsTzF4eVhHNGdJQ0FnWW05eVpHVnlMWEpoWkdsMWN6b2dOSEI0TzF4eVhHNGdJQ0FnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmRHOXZiR0poY2lCN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURBZ1lYVjBienRjY2x4dUlDQWdJR2hsYVdkb2REb2dNelp3ZUR0Y2NseHVJQ0FnSUd4cGJtVXRhR1ZwWjJoME9pQXpObkI0TzF4eVhHNGdJQ0FnWm05dWRDMXphWHBsT2lBeE5IQjRPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNQ0F4Tm5CNE8xeHlYRzRnSUNBZ2RHVjRkQzFoYkdsbmJqb2djbWxuYUhRN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZllXTjBhVzl1TEZ4eVhHNGdJQ1pmWDNKbGJXOTJaU0I3WEhKY2JpQWdJQ0JqZFhKemIzSTZJSEJ2YVc1MFpYSTdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FITjFZMk5sYzNOZlkyOXNiM0k3WEhKY2JpQWdJQ0IxYzJWeUxYTmxiR1ZqZERvZ2JtOXVaVHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJGamRHbHZiaUI3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURFemNIZzdYSEpjYmlBZ0lDQndZV1JrYVc1bkxXeGxablE2SURFd2NIZzdYSEpjYmx4eVhHNGdJQ0FnSmpwbWFYSnpkQzFqYUdsc1pDQjdYSEpjYmlBZ0lDQWdJSEJoWkdScGJtY3RiR1ZtZERvZ01EdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM0psYlc5MlpTQjdYSEpjYmlBZ0lDQm1iRzloZERvZ2NtbG5hSFE3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5amIyNXpiMnhsSUh0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXhPREJ3ZUR0Y2NseHVJQ0FnSUdKdmNtUmxjam9nTVhCNElITnZiR2xrSUVCaWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZkR1Y0ZEdGeVpXRWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hISmNiaUFnSUNCM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ01UQXdKVHRjY2x4dUlDQWdJR0p2Y21SbGNqb2dibTl1WlR0Y2NseHVJQ0FnSUc5MWRHeHBibVU2SUc1dmJtVTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXhaVzA3WEhKY2JpQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5c2FYTjBMRnh5WEc0Z0lDWmZYMmwwWlcwZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01EdGNjbHh1SUNBZ0lHeHBjM1F0YzNSNWJHVXRkSGx3WlRvZ2JtOXVaVHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlzYVhOMElIdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ016WXdjSGc3WEhKY2JpQWdJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnWm05dWRDMXphWHBsT2lBeE0zQjRPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXBkR1Z0SUh0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTXpad2VEdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUF6Tm5CNE8xeHlYRzRnSUNBZ1kzVnljMjl5T2lCd2IybHVkR1Z5TzF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh5WEc1Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWFHOTJaWEpmWW1kZlkyOXNiM0k3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1OVhISmNiaUlzSWtCcGJYQnZjblFnSnk0dlkyOXNiM0p6Snp0Y2NseHVYSEpjYmk1aWRYUjBiMjV6SUh0Y2NseHVJQ0J3YjNOcGRHbHZiam9nWm1sNFpXUTdYSEpjYmlBZ2VpMXBibVJsZURvZ01qdGNjbHh1SUNCMGIzQTZJRFV3SlR0Y2NseHVJQ0J5YVdkb2REb2dNVEp3ZUR0Y2NseHVJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdkMmxrZEdnNklEVTJjSGc3WEhKY2JpQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZaS0MwMU1DVXBPMXh5WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDWmZYMmwwWlcwZ2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01UQndlRHRjY2x4dUlDQWdJSGRwWkhSb09pQXpObkI0TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF6Tm5CNE8xeHlYRzRnSUNBZ1ltOXlaR1Z5T2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJR0p2Y21SbGNpMXlZV1JwZFhNNklEUndlRHRjY2x4dUlDQWdJR0p2ZUMxemFHRmtiM2M2SURBZ01DQTJjSGdnUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEhKY2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQmpkWEp6YjNJNklIQnZhVzUwWlhJN1hISmNiaUFnSUNCMFpYaDBMV0ZzYVdkdU9pQmpaVzUwWlhJN1hISmNiaUFnSUNCamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dVhISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZdWFHbGtaU0I3WEhKY2JpQWdJQ0FnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTloYm1Ob2IzSWdlMXh5WEc0Z0lDQWdKanBzYVc1ckxGeHlYRzRnSUNBZ0pqcDJhWE5wZEdWa0xGeHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lHTnZiRzl5T2lCQVptOTFjblJvWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgybGpiMjRnZTF4eVhHNGdJQ0FnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4eVhHNGdJQ0FnZWkxcGJtUmxlRG9nTWp0Y2NseHVJQ0FnSUhSdmNEb2dOVEFsTzF4eVhHNGdJQ0FnYkdWbWREb2dOVEFsTzF4eVhHNGdJQ0FnZDJsa2RHZzZJREl3Y0hnN1hISmNiaUFnSUNCb1pXbG5hSFE2SURJd2NIZzdYSEpjYmlBZ0lDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaU2d0TlRBbExDQXROVEFsS1R0Y2NseHVJQ0FnSUdacGJHdzZJR04xY25KbGJuUmpiMnh2Y2p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1OVhISmNiaUpkZlE9PSAqL1xuIl0sImZpbGUiOiJjc3MvZG9jcy5taW4uY3NzIn0= */ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */button,hr,input{overflow:visible}progress,sub,sup{vertical-align:baseline}.aside,.main,textarea{overflow:auto}.buttons__item.hide,[hidden],template{display:none}.case,.docs,.main,.section__dl{position:relative;z-index:1}.case,.docs,.main,.section__dl,sub,sup{position:relative}html{-webkit-text-size-adjust:100%}body{margin:0}details,main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}.case,.main__cdn{border-bottom:1px solid #ddd}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.docs,body,html{overflow:hidden}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}.aside,.docs{display:-webkit-box;-webkit-box-direction:normal;margin:0;height:100%}body,html{height:100%;background:#fafafa;color:#333;font-size:14px;line-height:150%;font-family:"Microsoft YaHei UI",Arial,sans-serif}.aside,code{font-family:"Source Code Pro",Consolas,Georgia,Monaco,monospace,Arial,sans-serif}a:hover,a:link,a:visited{color:#058942;text-decoration:none}a:hover{text-decoration:underline}::-webkit-scrollbar{width:7px;height:7px;-webkit-border-radius:5px}::-webkit-scrollbar-track-piece{-webkit-border-radius:5px}::-webkit-scrollbar-thumb:vertical{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:horizontal{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar:hover{background-color:rgba(0,0,0,.15)}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.35)}.docs{display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:100%}.aside{display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:260px;background-color:#333;color:#ddd;-webkit-box-shadow:0 0 5px 2px #ddd;box-shadow:0 0 5px 2px #ddd}.main__button,.section__dd,.section__dt{display:inline-block}.main{-webkit-box-flex:1;-ms-flex:1;flex:1;height:100%;background-color:#fff}.aside__header{margin:0 auto;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.aside__nav{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.aside__h2{margin:0 auto;height:54px;line-height:54px;font-size:20px;font-weight:400;font-family:Georgia,Consolas,Arial,sans-serif;text-align:center;overflow:hidden}.aside__h3{margin:0 auto;padding:0 20px;font-size:16px;overflow:hidden}.aside__list{margin:0;padding:10px 0;overflow:hidden}.aside__item{height:32px;line-height:32px;padding:0 30px;cursor:pointer;font-size:13px;overflow:hidden}.aside__item.active,.aside__item:hover{background-color:#555}.aside__item.active{border-left:3px solid #fff}.aside__anchor:link,.aside__anchor:visited{color:#ddd;text-decoration:none}.aside__anchor:hover{color:#ddd;text-decoration:underline}.main__footer,.main__header{margin:0 auto;padding:1em;text-align:center;overflow:hidden}.main__h1{margin:0 auto;padding-top:1em;font-size:5em;font-weight:400;line-height:2em;overflow:hidden}.main__name{color:#1f8dd6;font-weight:400}.main__tagline{margin:1em auto;max-width:660px;line-height:1.3em;font-size:2em;color:#999;font-weight:100;overflow:hidden}.main__cdn{margin:2em 0;padding:2em;font-size:16px;line-height:150%;text-align:center;background-color:#fafafa;border-top:1px solid #ddd;color:#666;overflow:hidden}.main__download{margin:1em auto;width:200px;text-align:center;overflow:hidden}.main__button{border-radius:4px;padding:14px 29px;font-size:18px;font-family:"Source Code Pro",Consolas,Georgia,Monaco,monospace,Arial,sans-serif;background-color:#058942;overflow:hidden}.main__button:hover,.main__button:link,.main__button:visited{color:#fff;text-decoration:none}.main__footer{margin:0 3em;border-top:1px solid #ddd}.section{margin:1em 0;overflow:hidden}.section__content,.section__footer,.section__header{margin:0 3em;overflow:hidden}.section__title{color:#666}.section__h3{color:#1f8dd6;font-size:1.35em}.section__h4{font-size:1.1em;color:#666}.section__h5{font-size:1em;color:#999}.section__dd,.section__dl,.section__dt{margin:0;padding:0;overflow:hidden}.section__dd{color:#058942}.section__pre{margin:2em 0;padding:1em;font-size:14px;line-height:150%;text-align:left;background-color:#fafafa;border:1px solid #ddd;border-radius:4px;color:#666;overflow:auto}.section__code{display:block;margin:0 auto;overflow:hidden}.section__footer{border-top:1px solid #ddd;margin-top:3em;background-color:#fafafa;color:#999}.case{display:grid;grid-template-columns:repeat(2,1fr);gap:40px;padding:1em;border-top:1px solid #ddd;overflow:hidden}.case:after{content:'';position:absolute;z-index:2;top:0;left:50%;height:100%;width:0;border-left:1px solid #ddd;overflow:hidden}.case__pre,.case__textarea{font-size:13px;line-height:150%}.case__code,.case__pre,.case__textarea{font-family:"Courier New",Consolas,Georgia,Arial,sans-serif}.case__pre{margin:0;padding:1em;background-color:#fafafa;height:100%;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.case__toolbar{margin:0 auto;height:36px;line-height:36px;font-size:14px;padding:0 16px;text-align:right;overflow:hidden}.case__action,.case__remove{cursor:pointer;color:#058942;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.case__action{font-size:13px;padding-left:10px}.case__action:first-child{padding-left:0}.case__remove{float:right}.case__console{margin:0 auto;height:180px;border:1px solid #ddd;overflow:hidden}.case__textarea{margin:0 auto;width:100%;height:100%;border:none;outline:0;padding:1em;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.case__item,.case__list{margin:0;padding:0;list-style-type:none;overflow:hidden}.case__list{height:360px;border-top:1px solid #ddd;border-bottom:1px solid #ddd;font-size:13px;overflow:auto}.buttons__item,.case__item{height:36px;cursor:pointer}.case__item{line-height:36px;padding:0 16px}.case__item:hover{background-color:#f7f8f9}.buttons{position:fixed;z-index:2;top:50%;right:12px;margin:0;width:56px;-webkit-transform:translateY(-50%);transform:translateY(-50%);overflow:hidden}.buttons__item{position:relative;z-index:1;margin:10px;width:36px;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 0 6px #ddd;box-shadow:0 0 6px #ddd;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;text-align:center;color:#999;overflow:hidden}.buttons__item:hover{color:#058942}.buttons__anchor:hover,.buttons__anchor:link,.buttons__anchor:visited{color:#999}.buttons__anchor:hover{color:#058942}.buttons__icon{position:absolute;z-index:2;top:50%;left:50%;width:20px;height:20px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);fill:currentcolor;overflow:hidden} +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJjc3MvZG9jcy5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIG5vcm1hbGl6ZS5jc3MgdjguMC4xIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xuLyogRG9jdW1lbnRcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGxpbmUgaGVpZ2h0IGluIGFsbCBicm93c2Vycy5cbiAqIDIuIFByZXZlbnQgYWRqdXN0bWVudHMgb2YgZm9udCBzaXplIGFmdGVyIG9yaWVudGF0aW9uIGNoYW5nZXMgaW4gaU9TLlxuICovXG5odG1sIHtcbiAgbGluZS1oZWlnaHQ6IDEuMTU7XG4gIC8qIDEgKi9cbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlO1xuICAvKiAyICovXG59XG4vKiBTZWN0aW9uc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogUmVtb3ZlIHRoZSBtYXJnaW4gaW4gYWxsIGJyb3dzZXJzLlxuICovXG5ib2R5IHtcbiAgbWFyZ2luOiAwO1xufVxuLyoqXG4gKiBSZW5kZXIgdGhlIGBtYWluYCBlbGVtZW50IGNvbnNpc3RlbnRseSBpbiBJRS5cbiAqL1xubWFpbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBmb250IHNpemUgYW5kIG1hcmdpbiBvbiBgaDFgIGVsZW1lbnRzIHdpdGhpbiBgc2VjdGlvbmAgYW5kXG4gKiBgYXJ0aWNsZWAgY29udGV4dHMgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgU2FmYXJpLlxuICovXG5oMSB7XG4gIGZvbnQtc2l6ZTogMmVtO1xuICBtYXJnaW46IDAuNjdlbSAwO1xufVxuLyogR3JvdXBpbmcgY29udGVudFxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gRmlyZWZveC5cbiAqIDIuIFNob3cgdGhlIG92ZXJmbG93IGluIEVkZ2UgYW5kIElFLlxuICovXG5ociB7XG4gIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIC8qIDEgKi9cbiAgaGVpZ2h0OiAwO1xuICAvKiAxICovXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICAvKiAyICovXG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBDb3JyZWN0IHRoZSBvZGQgYGVtYCBmb250IHNpemluZyBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnByZSB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTtcbiAgLyogMSAqL1xuICBmb250LXNpemU6IDFlbTtcbiAgLyogMiAqL1xufVxuLyogVGV4dC1sZXZlbCBzZW1hbnRpY3NcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIG9uIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbiAqL1xuYSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuLyoqXG4gKiAxLiBSZW1vdmUgdGhlIGJvdHRvbSBib3JkZXIgaW4gQ2hyb21lIDU3LVxuICogMi4gQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS5cbiAqL1xuYWJiclt0aXRsZV0ge1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICAvKiAxICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAvKiAyICovXG4gIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xuICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xuY29kZSxcbmtiZCxcbnNhbXAge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7XG4gIC8qIDEgKi9cbiAgZm9udC1zaXplOiAxZW07XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG4vKipcbiAqIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGVsZW1lbnRzIGZyb20gYWZmZWN0aW5nIHRoZSBsaW5lIGhlaWdodCBpblxuICogYWxsIGJyb3dzZXJzLlxuICovXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuc3ViIHtcbiAgYm90dG9tOiAtMC4yNWVtO1xufVxuc3VwIHtcbiAgdG9wOiAtMC41ZW07XG59XG4vKiBFbWJlZGRlZCBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBSZW1vdmUgdGhlIGJvcmRlciBvbiBpbWFnZXMgaW5zaWRlIGxpbmtzIGluIElFIDEwLlxuICovXG5pbWcge1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG59XG4vKiBGb3Jtc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBGaXJlZm94IGFuZCBTYWZhcmkuXG4gKi9cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAvKiAxICovXG4gIGZvbnQtc2l6ZTogMTAwJTtcbiAgLyogMSAqL1xuICBsaW5lLWhlaWdodDogMS4xNTtcbiAgLyogMSAqL1xuICBtYXJnaW46IDA7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogU2hvdyB0aGUgb3ZlcmZsb3cgaW4gSUUuXG4gKiAxLiBTaG93IHRoZSBvdmVyZmxvdyBpbiBFZGdlLlxuICovXG5idXR0b24sXG5pbnB1dCB7XG4gIC8qIDEgKi9cbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSwgRmlyZWZveCwgYW5kIElFLlxuICogMS4gUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBGaXJlZm94LlxuICovXG5idXR0b24sXG5zZWxlY3Qge1xuICAvKiAxICovXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxuICovXG5idXR0b24sXG5bdHlwZT1cImJ1dHRvblwiXSxcblt0eXBlPVwicmVzZXRcIl0sXG5bdHlwZT1cInN1Ym1pdFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIGJvcmRlciBhbmQgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT1cImJ1dHRvblwiXTo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPVwicmVzZXRcIl06Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT1cInN1Ym1pdFwiXTo6LW1vei1mb2N1cy1pbm5lciB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbiAgcGFkZGluZzogMDtcbn1cbi8qKlxuICogUmVzdG9yZSB0aGUgZm9jdXMgc3R5bGVzIHVuc2V0IGJ5IHRoZSBwcmV2aW91cyBydWxlLlxuICovXG5idXR0b246LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cImJ1dHRvblwiXTotbW96LWZvY3VzcmluZyxcblt0eXBlPVwicmVzZXRcIl06LW1vei1mb2N1c3JpbmcsXG5bdHlwZT1cInN1Ym1pdFwiXTotbW96LWZvY3VzcmluZyB7XG4gIG91dGxpbmU6IDFweCBkb3R0ZWQgQnV0dG9uVGV4dDtcbn1cbi8qKlxuICogQ29ycmVjdCB0aGUgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5maWVsZHNldCB7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjc1ZW0gMC42MjVlbTtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgdGV4dCB3cmFwcGluZyBpbiBFZGdlIGFuZCBJRS5cbiAqIDIuIENvcnJlY3QgdGhlIGNvbG9yIGluaGVyaXRhbmNlIGZyb20gYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBJRS5cbiAqIDMuIFJlbW92ZSB0aGUgcGFkZGluZyBzbyBkZXZlbG9wZXJzIGFyZSBub3QgY2F1Z2h0IG91dCB3aGVuIHRoZXkgemVybyBvdXRcbiAqICAgIGBmaWVsZHNldGAgZWxlbWVudHMgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5sZWdlbmQge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLyogMSAqL1xuICBjb2xvcjogaW5oZXJpdDtcbiAgLyogMiAqL1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgLyogMSAqL1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIC8qIDEgKi9cbiAgcGFkZGluZzogMDtcbiAgLyogMyAqL1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAvKiAxICovXG59XG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgT3BlcmEuXG4gKi9cbnByb2dyZXNzIHtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGRlZmF1bHQgdmVydGljYWwgc2Nyb2xsYmFyIGluIElFIDEwKy5cbiAqL1xudGV4dGFyZWEge1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi8qKlxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gSUUgMTAuXG4gKiAyLiBSZW1vdmUgdGhlIHBhZGRpbmcgaW4gSUUgMTAuXG4gKi9cblt0eXBlPVwiY2hlY2tib3hcIl0sXG5bdHlwZT1cInJhZGlvXCJdIHtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC8qIDEgKi9cbiAgcGFkZGluZzogMDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBjdXJzb3Igc3R5bGUgb2YgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgYnV0dG9ucyBpbiBDaHJvbWUuXG4gKi9cblt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBoZWlnaHQ6IGF1dG87XG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIG9kZCBhcHBlYXJhbmNlIGluIENocm9tZSBhbmQgU2FmYXJpLlxuICogMi4gQ29ycmVjdCB0aGUgb3V0bGluZSBzdHlsZSBpbiBTYWZhcmkuXG4gKi9cblt0eXBlPVwic2VhcmNoXCJdIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG4gIC8qIDEgKi9cbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBpbm5lciBwYWRkaW5nIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIG1hY09TLlxuICovXG5bdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cbiAqIDIuIENoYW5nZSBmb250IHByb3BlcnRpZXMgdG8gYGluaGVyaXRgIGluIFNhZmFyaS5cbiAqL1xuOjotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xuICAvKiAxICovXG4gIGZvbnQ6IGluaGVyaXQ7XG4gIC8qIDIgKi9cbn1cbi8qIEludGVyYWN0aXZlXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLypcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIEVkZ2UsIElFIDEwKywgYW5kIEZpcmVmb3guXG4gKi9cbmRldGFpbHMge1xuICBkaXNwbGF5OiBibG9jaztcbn1cbi8qXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnN1bW1hcnkge1xuICBkaXNwbGF5OiBsaXN0LWl0ZW07XG59XG4vKiBNaXNjXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSAxMCsuXG4gKi9cbnRlbXBsYXRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgMTAuXG4gKi9cbltoaWRkZW5dIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qID09PT09IEJhc2UgPT09PT0gKi9cbmh0bWwsXG5ib2R5IHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kOiAjZmFmYWZhO1xuICBjb2xvcjogIzMzMztcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgZm9udC1mYW1pbHk6IFwiTWljcm9zb2Z0IFlhSGVpIFVJXCIsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuYTpsaW5rLFxuYTp2aXNpdGVkLFxuYTpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5hOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG5jb2RlIHtcbiAgZm9udC1mYW1pbHk6IFwiU291cmNlIENvZGUgUHJvXCIsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4vKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG59XG4vKiBMYXlvdXQgKi9cbi5kb2NzIHtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtd2Via2l0LWJveC1vcmllbnQ6IGhvcml6b250YWw7XG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xuICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgLW1zLWZsZXgtd3JhcDogbm93cmFwO1xuICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLyogQXNpZGUgKi9cbi5hc2lkZSB7XG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgd2lkdGg6IDI2MHB4O1xuICBtYXJnaW46IDA7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcbiAgY29sb3I6ICNkZGQ7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDVweCAycHggI2RkZDtcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNXB4IDJweCAjZGRkO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi8qIE1haW4gKi9cbi5tYWluIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5hc2lkZSB7XG4gIGZvbnQtZmFtaWx5OiBcIlNvdXJjZSBDb2RlIFByb1wiLCBDb25zb2xhcywgR2VvcmdpYSwgTW9uYWNvLCBtb25vc3BhY2UsIEFyaWFsLCBzYW5zLXNlcmlmO1xufVxuLmFzaWRlX19oZWFkZXIge1xuICBtYXJnaW46IDAgYXV0bztcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9fbmF2IHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmFzaWRlX19oMiB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDU0cHg7XG4gIGxpbmUtaGVpZ2h0OiA1NHB4O1xuICBmb250LXNpemU6IDIwcHg7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCBDb25zb2xhcywgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9faDMge1xuICBtYXJnaW46IDAgYXV0bztcbiAgcGFkZGluZzogMCAyMHB4O1xuICBmb250LXNpemU6IDE2cHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYXNpZGVfX2xpc3Qge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDEwcHggMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9faXRlbSB7XG4gIGhlaWdodDogMzJweDtcbiAgbGluZS1oZWlnaHQ6IDMycHg7XG4gIHBhZGRpbmc6IDAgMzBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYXNpZGVfX2l0ZW0uYWN0aXZlLFxuLmFzaWRlX19pdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzU1NTtcbn1cbi5hc2lkZV9faXRlbS5hY3RpdmUge1xuICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNmZmY7XG59XG4uYXNpZGVfX2FuY2hvcjpsaW5rIHtcbiAgY29sb3I6ICNkZGQ7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5hc2lkZV9fYW5jaG9yOnZpc2l0ZWQge1xuICBjb2xvcjogI2RkZDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLmFzaWRlX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2RkZDtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG4ubWFpbl9faGVhZGVyLFxuLm1haW5fX2Zvb3RlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nOiAxZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19oMSB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nLXRvcDogMWVtO1xuICBmb250LXNpemU6IDVlbTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19uYW1lIHtcbiAgY29sb3I6ICMxZjhkZDY7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG59XG4ubWFpbl9fdGFnbGluZSB7XG4gIG1hcmdpbjogMWVtIGF1dG87XG4gIG1heC13aWR0aDogNjYwcHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjNlbTtcbiAgZm9udC1zaXplOiAyZW07XG4gIGNvbG9yOiAjOTk5O1xuICBmb250LXdlaWdodDogMTAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2NkbiB7XG4gIG1hcmdpbjogMmVtIDA7XG4gIHBhZGRpbmc6IDJlbTtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGNvbG9yOiAjNjY2O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2Rvd25sb2FkIHtcbiAgbWFyZ2luOiAxZW0gYXV0bztcbiAgd2lkdGg6IDIwMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHBhZGRpbmc6IDE0cHggMjlweDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LWZhbWlseTogXCJTb3VyY2UgQ29kZSBQcm9cIiwgQ29uc29sYXMsIEdlb3JnaWEsIE1vbmFjbywgbW9ub3NwYWNlLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0MjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19idXR0b246bGluayxcbi5tYWluX19idXR0b246dmlzaXRlZCxcbi5tYWluX19idXR0b246aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm1haW5fX2Zvb3RlciB7XG4gIG1hcmdpbjogMCAzZW07XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xufVxuLnNlY3Rpb24ge1xuICBtYXJnaW46IDFlbSAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2hlYWRlcixcbi5zZWN0aW9uX19jb250ZW50LFxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIG1hcmdpbjogMCAzZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fdGl0bGUge1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oMyB7XG4gIGNvbG9yOiAjMWY4ZGQ2O1xuICBmb250LXNpemU6IDEuMzVlbTtcbn1cbi5zZWN0aW9uX19oNCB7XG4gIGZvbnQtc2l6ZTogMS4xZW07XG4gIGNvbG9yOiAjNjY2O1xufVxuLnNlY3Rpb25fX2g1IHtcbiAgZm9udC1zaXplOiAxZW07XG4gIGNvbG9yOiAjOTk5O1xufVxuLnNlY3Rpb25fX2RsLFxuLnNlY3Rpb25fX2R0LFxuLnNlY3Rpb25fX2RkIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2RsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xufVxuLnNlY3Rpb25fX2R0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLnNlY3Rpb25fX2RkIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5zZWN0aW9uX19wcmUge1xuICBtYXJnaW46IDJlbSAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLnNlY3Rpb25fX2NvZGUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwIGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIG1hcmdpbi10b3A6IDNlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgY29sb3I6ICM5OTk7XG59XG4uY2FzZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgMWZyKTtcbiAgZ2FwOiA0MHB4O1xuICBwYWRkaW5nOiAxZW07XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlOmFmdGVyIHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiA1MCU7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDA7XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RkZDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19wcmUsXG4uY2FzZV9fdGV4dGFyZWEge1xuICBmb250LXNpemU6IDEzcHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xufVxuLmNhc2VfX3ByZSxcbi5jYXNlX19jb2RlLFxuLmNhc2VfX3RleHRhcmVhIHtcbiAgZm9udC1mYW1pbHk6IFwiQ291cmllciBOZXdcIiwgQ29uc29sYXMsIEdlb3JnaWEsIEFyaWFsLCBzYW5zLXNlcmlmO1xufVxuLmNhc2VfX3ByZSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMWVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX3Rvb2xiYXIge1xuICBtYXJnaW46IDAgYXV0bztcbiAgaGVpZ2h0OiAzNnB4O1xuICBsaW5lLWhlaWdodDogMzZweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBwYWRkaW5nOiAwIDE2cHg7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX2FjdGlvbixcbi5jYXNlX19yZW1vdmUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuLmNhc2VfX2FjdGlvbiB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuLmNhc2VfX2FjdGlvbjpmaXJzdC1jaGlsZCB7XG4gIHBhZGRpbmctbGVmdDogMDtcbn1cbi5jYXNlX19yZW1vdmUge1xuICBmbG9hdDogcmlnaHQ7XG59XG4uY2FzZV9fY29uc29sZSB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDE4MHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX3RleHRhcmVhIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgb3V0bGluZTogbm9uZTtcbiAgcGFkZGluZzogMWVtO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9fbGlzdCxcbi5jYXNlX19pdGVtIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fbGlzdCB7XG4gIGhlaWdodDogMzYwcHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX19pdGVtIHtcbiAgaGVpZ2h0OiAzNnB4O1xuICBsaW5lLWhlaWdodDogMzZweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAwIDE2cHg7XG59XG4uY2FzZV9faXRlbTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmN2Y4Zjk7XG59XG4uYnV0dG9ucyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiA1NnB4O1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYnV0dG9uc19faXRlbSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAxMHB4O1xuICB3aWR0aDogMzZweDtcbiAgaGVpZ2h0OiAzNnB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDZweCAjZGRkO1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggI2RkZDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogIzk5OTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5idXR0b25zX19pdGVtOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4uYnV0dG9uc19faXRlbS5oaWRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5idXR0b25zX19hbmNob3I6bGluayxcbi5idXR0b25zX19hbmNob3I6dmlzaXRlZCxcbi5idXR0b25zX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbn1cbi5idXR0b25zX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5idXR0b25zX19pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zjg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMenhwYm5CMWRDQmpjM01nTVQ0aUxDSnViM0p0WVd4cGVtVXViR1Z6Y3lJc0ltSmhjMlV1YkdWemN5SXNJbk5qY205c2JHSmhjaTVzWlhOeklpd2liR0Y1YjNWMExteGxjM01pTENKaGMybGtaUzVzWlhOeklpd2liV0ZwYmk1c1pYTnpJaXdpYzJWamRHbHZiaTVzWlhOeklpd2lZMkZ6WlM1c1pYTnpJaXdpWW5WMGRHOXVjeTVzWlhOeklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lKQlFVRkJMRFJGUVVFMFJUdEJRVU0xUlR0blJrRkRaMFk3UVVGRGFFWTdPenRIUVVkSE8wRkRTVWc3UlVGRFJTeHJRa0ZCUVR0RlJFWkJMRTlCUVU4N1JVTkhVQ3dyUWtGQlFUdEZSRVJCTEU5QlFVODdRMEZEVWp0QlFVTkVPMmRHUVVOblJqdEJRVU5vUmpzN1IwRkZSenRCUTB0SU8wVkJRMFVzVlVGQlFUdERSRWhFTzBGQlEwUTdPMGRCUlVjN1FVTlBTRHRGUVVORkxHVkJRVUU3UTBSTVJEdEJRVU5FT3pzN1IwRkhSenRCUTFOSU8wVkJRMFVzWlVGQlFUdEZRVU5CTEdsQ1FVRkJPME5FVUVRN1FVRkRSRHRuUmtGRFowWTdRVUZEYUVZN096dEhRVWRITzBGRFdVZzdSVUZEUlN4blEwRkJRVHRWUVVGQkxIZENRVUZCTzBWRVZrRXNUMEZCVHp0RlExZFFMRlZCUVVFN1JVUlVRU3hQUVVGUE8wVkRWVkFzYTBKQlFVRTdSVVJTUVN4UFFVRlBPME5CUTFJN1FVRkRSRHM3TzBkQlIwYzdRVU5YU0R0RlFVTkZMR3REUVVGQk8wVkVWRUVzVDBGQlR6dEZRMVZRTEdWQlFVRTdSVVJTUVN4UFFVRlBPME5CUTFJN1FVRkRSRHRuUmtGRFowWTdRVUZEYUVZN08wZEJSVWM3UVVOWlNEdEZRVU5GTERoQ1FVRkJPME5FVmtRN1FVRkRSRHM3TzBkQlIwYzdRVU5qU0R0RlFVTkZMRzlDUVVGQk8wVkVXa0VzVDBGQlR6dEZRMkZRTERKQ1FVRkJPMFZFV0VFc1QwRkJUenRGUTFsUUxEQkRRVUZCTzFWQlFVRXNhME5CUVVFN1JVUldRU3hQUVVGUE8wTkJRMUk3UVVGRFJEczdSMEZGUnp0QlEyRklPenRGUVVWRkxHOUNRVUZCTzBORVdFUTdRVUZEUkRzN08wZEJSMGM3UVVObFNEczdPMFZCUjBVc2EwTkJRVUU3UlVSaVFTeFBRVUZQTzBWRFkxQXNaVUZCUVR0RlJGcEJMRTlCUVU4N1EwRkRVanRCUVVORU96dEhRVVZITzBGRFpVZzdSVUZEUlN4bFFVRkJPME5FWWtRN1FVRkRSRHM3TzBkQlIwYzdRVU5wUWtnN08wVkJSVVVzWlVGQlFUdEZRVU5CTEdWQlFVRTdSVUZEUVN4dFFrRkJRVHRGUVVOQkxIbENRVUZCTzBORVprUTdRVU5yUWtRN1JVRkRSU3huUWtGQlFUdERSR2hDUkR0QlEyMUNSRHRGUVVORkxGbEJRVUU3UTBScVFrUTdRVUZEUkR0blJrRkRaMFk3UVVGRGFFWTdPMGRCUlVjN1FVTnpRa2c3UlVGRFJTeHRRa0ZCUVR0RFJIQkNSRHRCUVVORU8yZEdRVU5uUmp0QlFVTm9SanM3TzBkQlIwYzdRVU41UWtnN096czdPMFZCUzBVc2NVSkJRVUU3UlVSMlFrRXNUMEZCVHp0RlEzZENVQ3huUWtGQlFUdEZSSFJDUVN4UFFVRlBPMFZEZFVKUUxHdENRVUZCTzBWRWNrSkJMRTlCUVU4N1JVTnpRbEFzVlVGQlFUdEZSSEJDUVN4UFFVRlBPME5CUTFJN1FVRkRSRHM3TzBkQlIwYzdRVU4xUWtnN08wVkVjRUpGTEU5QlFVODdSVU56UWxBc2EwSkJRVUU3UTBSd1FrUTdRVUZEUkRzN08wZEJSMGM3UVVOM1FrZzdPMFZFY2tKRkxFOUJRVTg3UlVOMVFsQXNjVUpCUVVFN1EwUnlRa1E3UVVGRFJEczdSMEZGUnp0QlEzbENTRHM3T3p0RlFVbEZMREpDUVVGQk8wTkVka0pFTzBGQlEwUTdPMGRCUlVjN1FVTXlRa2c3T3pzN1JVRkpSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdRMFI2UWtRN1FVRkRSRHM3UjBGRlJ6dEJRelpDU0RzN096dEZRVWxGTEN0Q1FVRkJPME5FTTBKRU8wRkJRMFE3TzBkQlJVYzdRVU1yUWtnN1JVRkRSU3dyUWtGQlFUdERSRGRDUkR0QlFVTkVPenM3T3p0SFFVdEhPMEZEYVVOSU8wVkJRMFVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUkM5Q1FTeFBRVUZQTzBWRFowTlFMR1ZCUVVFN1JVUTVRa0VzVDBGQlR6dEZReXRDVUN4bFFVRkJPMFZFTjBKQkxFOUJRVTg3UlVNNFFsQXNaMEpCUVVFN1JVUTFRa0VzVDBGQlR6dEZRelpDVUN4WFFVRkJPMFZFTTBKQkxFOUJRVTg3UlVNMFFsQXNiMEpCUVVFN1JVUXhRa0VzVDBGQlR6dERRVU5TTzBGQlEwUTdPMGRCUlVjN1FVTTJRa2c3UlVGRFJTeDVRa0ZCUVR0RFJETkNSRHRCUVVORU96dEhRVVZITzBGREswSklPMFZCUTBVc1pVRkJRVHREUkRkQ1JEdEJRVU5FT3pzN1IwRkhSenRCUTJsRFNEczdSVUZGUlN3clFrRkJRVHRWUVVGQkxIVkNRVUZCTzBWRUwwSkJMRTlCUVU4N1JVTm5RMUFzVjBGQlFUdEZSRGxDUVN4UFFVRlBPME5CUTFJN1FVRkRSRHM3UjBGRlJ6dEJRMmxEU0RzN1JVRkZSU3hoUVVGQk8wTkVMMEpFTzBGQlEwUTdPenRIUVVkSE8wRkRiVU5JTzBWQlEwVXNPRUpCUVVFN1JVUnFRMEVzVDBGQlR6dEZRMnREVUN4eFFrRkJRVHRGUkdoRFFTeFBRVUZQTzBOQlExSTdRVUZEUkRzN1IwRkZSenRCUTIxRFNEdEZRVU5GTEhsQ1FVRkJPME5FYWtORU8wRkJRMFE3T3p0SFFVZEhPMEZEY1VOSU8wVkJRMFVzTWtKQlFVRTdSVVJ1UTBFc1QwRkJUenRGUTI5RFVDeGpRVUZCTzBWRWJFTkJMRTlCUVU4N1EwRkRVanRCUVVORU8yZEdRVU5uUmp0QlFVTm9SanM3UjBGRlJ6dEJRM05EU0R0RlFVTkZMR1ZCUVVFN1EwUndRMFE3UVVGRFJEczdSMEZGUnp0QlEzZERTRHRGUVVORkxHMUNRVUZCTzBORWRFTkVPMEZCUTBRN1owWkJRMmRHTzBGQlEyaEdPenRIUVVWSE8wRkRNa05JTzBWQlEwVXNZMEZCUVR0RFJIcERSRHRCUVVORU96dEhRVVZITzBGRE5rTklPMFZCUTBVc1kwRkJRVHREUkRORFJEdEJRVU5FTEhOQ1FVRnpRanRCUlRsVGRFSTdPMFZCUlVVc1lVRkJRVHRGUVVOQkxHOUNRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYTBKQlFVRTdSVUZEUVN4eFJFRkJRVHRGUVVOQkxHbENRVUZCTzBOR1oxUkVPMEZGTlZORE96czdSVUZIUlN4bFFVRkJPMFZCUTBFc2MwSkJRVUU3UTBZNFUwZzdRVVV6VTBNN1JVRkRSU3d5UWtGQlFUdERSalpUU0R0QlJYcFRSRHRGUVVORkxIZEdRVUZCTzBOR01sTkVPMEZCUTBRc01rSkJRVEpDTzBGSGRsVXpRanRGUVVORkxGZEJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNNa0pCUVVFN1EwaDVWVVE3UVVkMFZVUTdSVUZEUlN3eVFrRkJRVHREU0hkVlJEdEJSM0pWUkR0RlFVTkZMSE5EUVVGQk8wVkJRMEVzTWtKQlFVRTdRMGgxVlVRN1FVZHdWVVE3UlVGRFJTeHpRMEZCUVR0RlFVTkJMREpDUVVGQk8wTkljMVZFTzBGSGJsVkVPMFZCUTBVc2MwTkJRVUU3UTBoeFZVUTdRVWRzVlVRN1JVRkRSU3h6UTBGQlFUdERTRzlWUkR0QlFVTkVMRmxCUVZrN1FVazFWbG83UlVGRFJTeHhRa0ZCUVR0RlFVRkJMSEZDUVVGQk8wVkJRVUVzWTBGQlFUdEZRVU5CTEN0Q1FVRkJPMFZCUVVFc09FSkJRVUU3VFVGQlFTeDNRa0ZCUVR0VlFVRkJMRzlDUVVGQk8wVkJRMEVzYzBKQlFVRTdUVUZCUVN4clFrRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEdsQ1FVRkJPME5LT0ZaRU8wRkJRMFFzVjBGQlZ6dEJTVE5XV0R0RlFVTkZMSEZDUVVGQk8wVkJRVUVzY1VKQlFVRTdSVUZCUVN4alFVRkJPMFZCUTBFc2NVSkJRVUU3VFVGQlFTeGxRVUZCTzBWQlEwRXNOa0pCUVVFN1JVRkJRU3c0UWtGQlFUdE5RVUZCTERKQ1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTeHpRa0ZCUVR0TlFVRkJMR3RDUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc2RVSkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNjVU5CUVVFN1ZVRkJRU3cyUWtGQlFUdEZRVU5CTEdWQlFVRTdRMG8yVmtRN1FVRkRSQ3hWUVVGVk8wRkpNVlpXTzBWQlEwVXNiMEpCUVVFN1RVRkJRU3haUVVGQk8xVkJRVUVzVVVGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMR1ZCUVVFN1EwbzBWa1E3UVVzdldFUTdSVUZEUlN4M1JrRkJRVHREVEdsWlJEdEJTeTlZUXp0RlFVTkZMR1ZCUVVFN1JVRkRRU3h4UWtGQlFUdE5RVUZCTEdWQlFVRTdSVUZEUVN4cFFrRkJRVHREVEdsWlNEdEJTemxZUXp0RlFVTkZMRzlDUVVGQk8wMUJRVUVzV1VGQlFUdFZRVUZCTEZGQlFVRTdSVUZEUVN4bFFVRkJPME5NWjFsSU8wRkxOMWhETzBWQlEwVXNaVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2IwSkJRVUU3UlVGRFFTeHJSRUZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMHdyV0VnN1FVczFXRU03UlVGRFJTeGxRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5NT0ZoSU8wRkxNMWhETzBWQlEwVXNWVUZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMHcyV0VnN1FVc3hXRU03UlVGRFJTeGhRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFREUllTRHRCU3pGWVJ6czdSVUZGUlN4MVFrRkJRVHREVERSWVREdEJTM3BZUnp0RlFVTkZMRFJDUVVGQk8wTk1NbGhNTzBGTGRsaERPMFZCUTBVc1dVRkJRVHRGUVVOQkxITkNRVUZCTzBOTWVWaElPMEZMZEZoRE8wVkJRMFVzV1VGQlFUdEZRVU5CTEhOQ1FVRkJPME5NZDFoSU8wRkxjbGhETzBWQlEwVXNXVUZCUVR0RlFVTkJMREpDUVVGQk8wTk1kVmhJTzBGTk1XSkRPenRGUVVWRkxHVkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3hwUWtGQlFUdERUalJpU0R0QlRYcGlRenRGUVVORkxHVkJRVUU3UlVGRFFTeHBRa0ZCUVR0RlFVTkJMR1ZCUVVFN1JVRkRRU3h2UWtGQlFUdEZRVU5CTEdsQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTA0eVlrZzdRVTE0WWtNN1JVRkRSU3hsUVVGQk8wVkJRMEVzYjBKQlFVRTdRMDR3WWtnN1FVMTJZa003UlVGRFJTeHBRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4bFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHbENRVUZCTzBWQlEwRXNhVUpCUVVFN1EwNTVZa2c3UVUxMFlrTTdSVUZEUlN4alFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTERCQ1FVRkJPMFZCUTBFc01rSkJRVUU3UlVGRFFTdzRRa0ZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3hwUWtGQlFUdERUbmRpU0R0QlRYSmlRenRGUVVORkxHbENRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMDUxWWtnN1FVMXdZa003UlVGRFJTeHpRa0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxIZEdRVUZCTzBWQlEwRXNNRUpCUVVFN1JVRkRRU3hwUWtGQlFUdERUbk5pU0R0QlRYQmlSenM3TzBWQlIwVXNXVUZCUVR0RlFVTkJMSE5DUVVGQk8wTk9jMkpNTzBGTmJHSkRPMFZCUTBVc1kwRkJRVHRGUVVOQkxESkNRVUZCTzBOT2IySklPMEZQTldaRU8wVkJRMFVzWTBGQlFUdEZRVU5CTEdsQ1FVRkJPME5RT0daRU8wRlBOV1pET3pzN1JVRkhSU3hqUVVGQk8wVkJRMEVzYVVKQlFVRTdRMUE0WmtnN1FVOHpaa003UlVGRFJTeFpRVUZCTzBOUU5tWklPMEZQTVdaRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEd0Q1FVRkJPME5RTkdaSU8wRlBlbVpETzBWQlEwVXNhVUpCUVVFN1JVRkRRU3haUVVGQk8wTlFNbVpJTzBGUGVHWkRPMFZCUTBVc1pVRkJRVHRGUVVOQkxGbEJRVUU3UTFBd1prZzdRVTkyWmtNN096dEZRVWRGTEZWQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc2FVSkJRVUU3UTFCNVprZzdRVTkwWmtNN1JVRkRSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdRMUIzWmtnN1FVOXlaa003UlVGRFJTeHpRa0ZCUVR0RFVIVm1TRHRCVDNCbVF6dEZRVU5GTEhOQ1FVRkJPMFZCUTBFc1pVRkJRVHREVUhObVNEdEJUMjVtUXp0RlFVTkZMR05CUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHbENRVUZCTzBWQlEwRXNNRUpCUVVFN1JVRkRRU3gxUWtGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHVkJRVUU3UTFCeFprZzdRVTlzWmtNN1JVRkRSU3hsUVVGQk8wVkJRMEVzWlVGQlFUdEZRVU5CTEdsQ1FVRkJPME5RYjJaSU8wRlBhbVpETzBWQlEwVXNNa0pCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTERCQ1FVRkJPMFZCUTBFc1dVRkJRVHREVUcxbVNEdEJVVGxxUWtRN1JVRkRSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4alFVRkJPMFZCUTBFc2MwTkJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMREpDUVVGQk8wVkJRMEVzT0VKQlFVRTdSVUZEUVN4cFFrRkJRVHREVW1kclFrUTdRVkU1YWtKRE8wVkJRMFVzV1VGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMRk5CUVVFN1JVRkRRU3cwUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5TWjJ0Q1NEdEJVVGRxUWtNN08wVkJSVVVzWjBKQlFVRTdSVUZEUVN4clFrRkJRVHREVWl0cVFrZzdRVkUxYWtKRE96czdSVUZIUlN4cFJVRkJRVHREVWpocVFrZzdRVkV6YWtKRE8wVkJRMFVzVlVGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN3d1FrRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTkJMQ3RDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4bFFVRkJPME5TTm1wQ1NEdEJVVEZxUWtNN1JVRkRSU3hsUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR3RDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMUkwYWtKSU8wRlJlbXBDUXpzN1JVRkZSU3huUWtGQlFUdEZRVU5CTEdWQlFVRTdSVUZEUVN3d1FrRkJRVHRMUVVGQkxIVkNRVUZCTzAxQlFVRXNjMEpCUVVFN1ZVRkJRU3hyUWtGQlFUdERVakpxUWtnN1FWRjRha0pETzBWQlEwVXNaMEpCUVVFN1JVRkRRU3h0UWtGQlFUdERVakJxUWtnN1FWRjRha0pITzBWQlEwVXNaMEpCUVVFN1ExSXdha0pNTzBGUmRHcENRenRGUVVORkxHRkJRVUU3UTFKM2FrSklPMEZSY21wQ1F6dEZRVU5GTEdWQlFVRTdSVUZEUVN4alFVRkJPMFZCUTBFc2RVSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFVuVnFRa2c3UVZGd2FrSkRPMFZCUTBVc1pVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR05CUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUVVOQkxHVkJRVUU3UTFKemFrSklPMEZSYm1wQ1F6czdSVUZGUlN4VlFVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxITkNRVUZCTzBWQlEwRXNhVUpCUVVFN1ExSnhha0pJTzBGUmJHcENRenRGUVVORkxHTkJRVUU3UlVGRFFTd3lRa0ZCUVR0RlFVTkJMRGhDUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4bFFVRkJPME5TYjJwQ1NEdEJVV3BxUWtNN1JVRkRSU3hoUVVGQk8wVkJRMEVzYTBKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHZENRVUZCTzBOU2JXcENTRHRCVVdwcVFrYzdSVUZEUlN3d1FrRkJRVHREVW0xcVFrdzdRVk4yY1VKRU8wVkJRMFVzWjBKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1UwRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMRzlEUVVGQk8xVkJRVUVzTkVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVkhseFFrUTdRVk4yY1VKRE8wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNkVUpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEdsRFFVRkJPMVZCUVVFc2VVSkJRVUU3UlVGRFFTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wVkJRMEVzZFVKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR2xDUVVGQk8wTlVlWEZDU0R0QlUzWnhRa2M3UlVGRFJTeGxRVUZCTzBOVWVYRkNURHRCVTNSeFFrYzdSVUZEUlN4alFVRkJPME5VZDNGQ1REdEJVMjV4UWtjN096dEZRVWRGTEZsQlFVRTdRMVJ4Y1VKTU8wRlRiSEZDUnp0RlFVTkZMR1ZCUVVFN1ExUnZjVUpNTzBGVGFIRkNRenRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRk5CUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4NVEwRkJRVHRWUVVGQkxHbERRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3hwUWtGQlFUdERWR3R4UWtnaUxDSm1hV3hsSWpvaVpHOWpjeTVqYzNNaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZLaUVnYm05eWJXRnNhWHBsTG1OemN5QjJPQzR3TGpFZ2ZDQk5TVlFnVEdsalpXNXpaU0I4SUdkcGRHaDFZaTVqYjIwdmJtVmpiMnhoY3k5dWIzSnRZV3hwZW1VdVkzTnpJQ292WEc0dktpQkViMk4xYldWdWRGeHVJQ0FnUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwZ0tpOWNiaThxS2x4dUlDb2dNUzRnUTI5eWNtVmpkQ0IwYUdVZ2JHbHVaU0JvWldsbmFIUWdhVzRnWVd4c0lHSnliM2R6WlhKekxseHVJQ29nTWk0Z1VISmxkbVZ1ZENCaFpHcDFjM1J0Wlc1MGN5QnZaaUJtYjI1MElITnBlbVVnWVdaMFpYSWdiM0pwWlc1MFlYUnBiMjRnWTJoaGJtZGxjeUJwYmlCcFQxTXVYRzRnS2k5Y2JtaDBiV3dnZTF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTVM0eE5UdGNiaUFnTHlvZ01TQXFMMXh1SUNBdGQyVmlhMmwwTFhSbGVIUXRjMmw2WlMxaFpHcDFjM1E2SURFd01DVTdYRzRnSUM4cUlESWdLaTljYm4xY2JpOHFJRk5sWTNScGIyNXpYRzRnSUNBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBTQXFMMXh1THlvcVhHNGdLaUJTWlcxdmRtVWdkR2hsSUcxaGNtZHBiaUJwYmlCaGJHd2dZbkp2ZDNObGNuTXVYRzRnS2k5Y2JtSnZaSGtnZTF4dUlDQnRZWEpuYVc0NklEQTdYRzU5WEc0dktpcGNiaUFxSUZKbGJtUmxjaUIwYUdVZ1lHMWhhVzVnSUdWc1pXMWxiblFnWTI5dWMybHpkR1Z1ZEd4NUlHbHVJRWxGTGx4dUlDb3ZYRzV0WVdsdUlIdGNiaUFnWkdsemNHeGhlVG9nWW14dlkyczdYRzU5WEc0dktpcGNiaUFxSUVOdmNuSmxZM1FnZEdobElHWnZiblFnYzJsNlpTQmhibVFnYldGeVoybHVJRzl1SUdCb01XQWdaV3hsYldWdWRITWdkMmwwYUdsdUlHQnpaV04wYVc5dVlDQmhibVJjYmlBcUlHQmhjblJwWTJ4bFlDQmpiMjUwWlhoMGN5QnBiaUJEYUhKdmJXVXNJRVpwY21WbWIzZ3NJR0Z1WkNCVFlXWmhjbWt1WEc0Z0tpOWNibWd4SUh0Y2JpQWdabTl1ZEMxemFYcGxPaUF5WlcwN1hHNGdJRzFoY21kcGJqb2dNQzQyTjJWdElEQTdYRzU5WEc0dktpQkhjbTkxY0dsdVp5QmpiMjUwWlc1MFhHNGdJQ0E5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFNBcUwxeHVMeW9xWEc0Z0tpQXhMaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdZbTk0SUhOcGVtbHVaeUJwYmlCR2FYSmxabTk0TGx4dUlDb2dNaTRnVTJodmR5QjBhR1VnYjNabGNtWnNiM2NnYVc0Z1JXUm5aU0JoYm1RZ1NVVXVYRzRnS2k5Y2JtaHlJSHRjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZMjl1ZEdWdWRDMWliM2c3WEc0Z0lDOHFJREVnS2k5Y2JpQWdhR1ZwWjJoME9pQXdPMXh1SUNBdktpQXhJQ292WEc0Z0lHOTJaWEptYkc5M09pQjJhWE5wWW14bE8xeHVJQ0F2S2lBeUlDb3ZYRzU5WEc0dktpcGNiaUFxSURFdUlFTnZjbkpsWTNRZ2RHaGxJR2x1YUdWeWFYUmhibU5sSUdGdVpDQnpZMkZzYVc1bklHOW1JR1p2Ym5RZ2MybDZaU0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYRzRnS2lBeUxpQkRiM0p5WldOMElIUm9aU0J2WkdRZ1lHVnRZQ0JtYjI1MElITnBlbWx1WnlCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEc0Z0tpOWNibkJ5WlNCN1hHNGdJR1p2Ym5RdFptRnRhV3g1T2lCdGIyNXZjM0JoWTJVc0lHMXZibTl6Y0dGalpUdGNiaUFnTHlvZ01TQXFMMXh1SUNCbWIyNTBMWE5wZW1VNklERmxiVHRjYmlBZ0x5b2dNaUFxTDF4dWZWeHVMeW9nVkdWNGRDMXNaWFpsYkNCelpXMWhiblJwWTNOY2JpQWdJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5SUNvdlhHNHZLaXBjYmlBcUlGSmxiVzkyWlNCMGFHVWdaM0poZVNCaVlXTnJaM0p2ZFc1a0lHOXVJR0ZqZEdsMlpTQnNhVzVyY3lCcGJpQkpSU0F4TUM1Y2JpQXFMMXh1WVNCN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSFJ5WVc1emNHRnlaVzUwTzF4dWZWeHVMeW9xWEc0Z0tpQXhMaUJTWlcxdmRtVWdkR2hsSUdKdmRIUnZiU0JpYjNKa1pYSWdhVzRnUTJoeWIyMWxJRFUzTFZ4dUlDb2dNaTRnUVdSa0lIUm9aU0JqYjNKeVpXTjBJSFJsZUhRZ1pHVmpiM0poZEdsdmJpQnBiaUJEYUhKdmJXVXNJRVZrWjJVc0lFbEZMQ0JQY0dWeVlTd2dZVzVrSUZOaFptRnlhUzVjYmlBcUwxeHVZV0ppY2x0MGFYUnNaVjBnZTF4dUlDQmliM0prWlhJdFltOTBkRzl0T2lCdWIyNWxPMXh1SUNBdktpQXhJQ292WEc0Z0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2RXNWtaWEpzYVc1bE8xeHVJQ0F2S2lBeUlDb3ZYRzRnSUhSbGVIUXRaR1ZqYjNKaGRHbHZiam9nZFc1a1pYSnNhVzVsSUdSdmRIUmxaRHRjYmlBZ0x5b2dNaUFxTDF4dWZWeHVMeW9xWEc0Z0tpQkJaR1FnZEdobElHTnZjbkpsWTNRZ1ptOXVkQ0IzWldsbmFIUWdhVzRnUTJoeWIyMWxMQ0JGWkdkbExDQmhibVFnVTJGbVlYSnBMbHh1SUNvdlhHNWlMRnh1YzNSeWIyNW5JSHRjYmlBZ1ptOXVkQzEzWldsbmFIUTZJR0p2YkdSbGNqdGNibjFjYmk4cUtseHVJQ29nTVM0Z1EyOXljbVZqZENCMGFHVWdhVzVvWlhKcGRHRnVZMlVnWVc1a0lITmpZV3hwYm1jZ2IyWWdabTl1ZENCemFYcGxJR2x1SUdGc2JDQmljbTkzYzJWeWN5NWNiaUFxSURJdUlFTnZjbkpsWTNRZ2RHaGxJRzlrWkNCZ1pXMWdJR1p2Ym5RZ2MybDZhVzVuSUdsdUlHRnNiQ0JpY205M2MyVnljeTVjYmlBcUwxeHVZMjlrWlN4Y2JtdGlaQ3hjYm5OaGJYQWdlMXh1SUNCbWIyNTBMV1poYldsc2VUb2diVzl1YjNOd1lXTmxMQ0J0YjI1dmMzQmhZMlU3WEc0Z0lDOHFJREVnS2k5Y2JpQWdabTl1ZEMxemFYcGxPaUF4WlcwN1hHNGdJQzhxSURJZ0tpOWNibjFjYmk4cUtseHVJQ29nUVdSa0lIUm9aU0JqYjNKeVpXTjBJR1p2Ym5RZ2MybDZaU0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYRzRnS2k5Y2JuTnRZV3hzSUh0Y2JpQWdabTl1ZEMxemFYcGxPaUE0TUNVN1hHNTlYRzR2S2lwY2JpQXFJRkJ5WlhabGJuUWdZSE4xWW1BZ1lXNWtJR0J6ZFhCZ0lHVnNaVzFsYm5SeklHWnliMjBnWVdabVpXTjBhVzVuSUhSb1pTQnNhVzVsSUdobGFXZG9kQ0JwYmx4dUlDb2dZV3hzSUdKeWIzZHpaWEp6TGx4dUlDb3ZYRzV6ZFdJc1hHNXpkWEFnZTF4dUlDQm1iMjUwTFhOcGVtVTZJRGMxSlR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURBN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2RtVnlkR2xqWVd3dFlXeHBaMjQ2SUdKaGMyVnNhVzVsTzF4dWZWeHVjM1ZpSUh0Y2JpQWdZbTkwZEc5dE9pQXRNQzR5TldWdE8xeHVmVnh1YzNWd0lIdGNiaUFnZEc5d09pQXRNQzQxWlcwN1hHNTlYRzR2S2lCRmJXSmxaR1JsWkNCamIyNTBaVzUwWEc0Z0lDQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQU0FxTDF4dUx5b3FYRzRnS2lCU1pXMXZkbVVnZEdobElHSnZjbVJsY2lCdmJpQnBiV0ZuWlhNZ2FXNXphV1JsSUd4cGJtdHpJR2x1SUVsRklERXdMbHh1SUNvdlhHNXBiV2NnZTF4dUlDQmliM0prWlhJdGMzUjViR1U2SUc1dmJtVTdYRzU5WEc0dktpQkdiM0p0YzF4dUlDQWdQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDBnS2k5Y2JpOHFLbHh1SUNvZ01TNGdRMmhoYm1kbElIUm9aU0JtYjI1MElITjBlV3hsY3lCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEc0Z0tpQXlMaUJTWlcxdmRtVWdkR2hsSUcxaGNtZHBiaUJwYmlCR2FYSmxabTk0SUdGdVpDQlRZV1poY21rdVhHNGdLaTljYm1KMWRIUnZiaXhjYm1sdWNIVjBMRnh1YjNCMFozSnZkWEFzWEc1elpXeGxZM1FzWEc1MFpYaDBZWEpsWVNCN1hHNGdJR1p2Ym5RdFptRnRhV3g1T2lCcGJtaGxjbWwwTzF4dUlDQXZLaUF4SUNvdlhHNGdJR1p2Ym5RdGMybDZaVG9nTVRBd0pUdGNiaUFnTHlvZ01TQXFMMXh1SUNCc2FXNWxMV2hsYVdkb2REb2dNUzR4TlR0Y2JpQWdMeW9nTVNBcUwxeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lDOHFJRElnS2k5Y2JuMWNiaThxS2x4dUlDb2dVMmh2ZHlCMGFHVWdiM1psY21ac2IzY2dhVzRnU1VVdVhHNGdLaUF4TGlCVGFHOTNJSFJvWlNCdmRtVnlabXh2ZHlCcGJpQkZaR2RsTGx4dUlDb3ZYRzVpZFhSMGIyNHNYRzVwYm5CMWRDQjdYRzRnSUM4cUlERWdLaTljYmlBZ2IzWmxjbVpzYjNjNklIWnBjMmxpYkdVN1hHNTlYRzR2S2lwY2JpQXFJRkpsYlc5MlpTQjBhR1VnYVc1b1pYSnBkR0Z1WTJVZ2IyWWdkR1Y0ZENCMGNtRnVjMlp2Y20wZ2FXNGdSV1JuWlN3Z1JtbHlaV1p2ZUN3Z1lXNWtJRWxGTGx4dUlDb2dNUzRnVW1WdGIzWmxJSFJvWlNCcGJtaGxjbWwwWVc1alpTQnZaaUIwWlhoMElIUnlZVzV6Wm05eWJTQnBiaUJHYVhKbFptOTRMbHh1SUNvdlhHNWlkWFIwYjI0c1hHNXpaV3hsWTNRZ2UxeHVJQ0F2S2lBeElDb3ZYRzRnSUhSbGVIUXRkSEpoYm5ObWIzSnRPaUJ1YjI1bE8xeHVmVnh1THlvcVhHNGdLaUJEYjNKeVpXTjBJSFJvWlNCcGJtRmlhV3hwZEhrZ2RHOGdjM1I1YkdVZ1kyeHBZMnRoWW14bElIUjVjR1Z6SUdsdUlHbFBVeUJoYm1RZ1UyRm1ZWEpwTGx4dUlDb3ZYRzVpZFhSMGIyNHNYRzViZEhsd1pUMWNJbUoxZEhSdmJsd2lYU3hjYmx0MGVYQmxQVndpY21WelpYUmNJbDBzWEc1YmRIbHdaVDFjSW5OMVltMXBkRndpWFNCN1hHNGdJQzEzWldKcmFYUXRZWEJ3WldGeVlXNWpaVG9nWW5WMGRHOXVPMXh1ZlZ4dUx5b3FYRzRnS2lCU1pXMXZkbVVnZEdobElHbHVibVZ5SUdKdmNtUmxjaUJoYm1RZ2NHRmtaR2x1WnlCcGJpQkdhWEpsWm05NExseHVJQ292WEc1aWRYUjBiMjQ2T2kxdGIzb3RabTlqZFhNdGFXNXVaWElzWEc1YmRIbHdaVDFjSW1KMWRIUnZibHdpWFRvNkxXMXZlaTFtYjJOMWN5MXBibTVsY2l4Y2JsdDBlWEJsUFZ3aWNtVnpaWFJjSWwwNk9pMXRiM290Wm05amRYTXRhVzV1WlhJc1hHNWJkSGx3WlQxY0luTjFZbTFwZEZ3aVhUbzZMVzF2ZWkxbWIyTjFjeTFwYm01bGNpQjdYRzRnSUdKdmNtUmxjaTF6ZEhsc1pUb2dibTl1WlR0Y2JpQWdjR0ZrWkdsdVp6b2dNRHRjYm4xY2JpOHFLbHh1SUNvZ1VtVnpkRzl5WlNCMGFHVWdabTlqZFhNZ2MzUjViR1Z6SUhWdWMyVjBJR0o1SUhSb1pTQndjbVYyYVc5MWN5QnlkV3hsTGx4dUlDb3ZYRzVpZFhSMGIyNDZMVzF2ZWkxbWIyTjFjM0pwYm1jc1hHNWJkSGx3WlQxY0ltSjFkSFJ2Ymx3aVhUb3RiVzk2TFdadlkzVnpjbWx1Wnl4Y2JsdDBlWEJsUFZ3aWNtVnpaWFJjSWwwNkxXMXZlaTFtYjJOMWMzSnBibWNzWEc1YmRIbHdaVDFjSW5OMVltMXBkRndpWFRvdGJXOTZMV1p2WTNWemNtbHVaeUI3WEc0Z0lHOTFkR3hwYm1VNklERndlQ0JrYjNSMFpXUWdRblYwZEc5dVZHVjRkRHRjYm4xY2JpOHFLbHh1SUNvZ1EyOXljbVZqZENCMGFHVWdjR0ZrWkdsdVp5QnBiaUJHYVhKbFptOTRMbHh1SUNvdlhHNW1hV1ZzWkhObGRDQjdYRzRnSUhCaFpHUnBibWM2SURBdU16VmxiU0F3TGpjMVpXMGdNQzQyTWpWbGJUdGNibjFjYmk4cUtseHVJQ29nTVM0Z1EyOXljbVZqZENCMGFHVWdkR1Y0ZENCM2NtRndjR2x1WnlCcGJpQkZaR2RsSUdGdVpDQkpSUzVjYmlBcUlESXVJRU52Y25KbFkzUWdkR2hsSUdOdmJHOXlJR2x1YUdWeWFYUmhibU5sSUdaeWIyMGdZR1pwWld4a2MyVjBZQ0JsYkdWdFpXNTBjeUJwYmlCSlJTNWNiaUFxSURNdUlGSmxiVzkyWlNCMGFHVWdjR0ZrWkdsdVp5QnpieUJrWlhabGJHOXdaWEp6SUdGeVpTQnViM1FnWTJGMVoyaDBJRzkxZENCM2FHVnVJSFJvWlhrZ2VtVnlieUJ2ZFhSY2JpQXFJQ0FnSUdCbWFXVnNaSE5sZEdBZ1pXeGxiV1Z1ZEhNZ2FXNGdZV3hzSUdKeWIzZHpaWEp6TGx4dUlDb3ZYRzVzWldkbGJtUWdlMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNBdktpQXhJQ292WEc0Z0lHTnZiRzl5T2lCcGJtaGxjbWwwTzF4dUlDQXZLaUF5SUNvdlhHNGdJR1JwYzNCc1lYazZJSFJoWW14bE8xeHVJQ0F2S2lBeElDb3ZYRzRnSUcxaGVDMTNhV1IwYURvZ01UQXdKVHRjYmlBZ0x5b2dNU0FxTDF4dUlDQndZV1JrYVc1bk9pQXdPMXh1SUNBdktpQXpJQ292WEc0Z0lIZG9hWFJsTFhOd1lXTmxPaUJ1YjNKdFlXdzdYRzRnSUM4cUlERWdLaTljYm4xY2JpOHFLbHh1SUNvZ1FXUmtJSFJvWlNCamIzSnlaV04wSUhabGNuUnBZMkZzSUdGc2FXZHViV1Z1ZENCcGJpQkRhSEp2YldVc0lFWnBjbVZtYjNnc0lHRnVaQ0JQY0dWeVlTNWNiaUFxTDF4dWNISnZaM0psYzNNZ2UxeHVJQ0IyWlhKMGFXTmhiQzFoYkdsbmJqb2dZbUZ6Wld4cGJtVTdYRzU5WEc0dktpcGNiaUFxSUZKbGJXOTJaU0IwYUdVZ1pHVm1ZWFZzZENCMlpYSjBhV05oYkNCelkzSnZiR3hpWVhJZ2FXNGdTVVVnTVRBckxseHVJQ292WEc1MFpYaDBZWEpsWVNCN1hHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHVmVnh1THlvcVhHNGdLaUF4TGlCQlpHUWdkR2hsSUdOdmNuSmxZM1FnWW05NElITnBlbWx1WnlCcGJpQkpSU0F4TUM1Y2JpQXFJREl1SUZKbGJXOTJaU0IwYUdVZ2NHRmtaR2x1WnlCcGJpQkpSU0F4TUM1Y2JpQXFMMXh1VzNSNWNHVTlYQ0pqYUdWamEySnZlRndpWFN4Y2JsdDBlWEJsUFZ3aWNtRmthVzljSWwwZ2UxeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0F2S2lBeElDb3ZYRzRnSUhCaFpHUnBibWM2SURBN1hHNGdJQzhxSURJZ0tpOWNibjFjYmk4cUtseHVJQ29nUTI5eWNtVmpkQ0IwYUdVZ1kzVnljMjl5SUhOMGVXeGxJRzltSUdsdVkzSmxiV1Z1ZENCaGJtUWdaR1ZqY21WdFpXNTBJR0oxZEhSdmJuTWdhVzRnUTJoeWIyMWxMbHh1SUNvdlhHNWJkSGx3WlQxY0ltNTFiV0psY2x3aVhUbzZMWGRsWW10cGRDMXBibTVsY2kxemNHbHVMV0oxZEhSdmJpeGNibHQwZVhCbFBWd2liblZ0WW1WeVhDSmRPam90ZDJWaWEybDBMVzkxZEdWeUxYTndhVzR0WW5WMGRHOXVJSHRjYmlBZ2FHVnBaMmgwT2lCaGRYUnZPMXh1ZlZ4dUx5b3FYRzRnS2lBeExpQkRiM0p5WldOMElIUm9aU0J2WkdRZ1lYQndaV0Z5WVc1alpTQnBiaUJEYUhKdmJXVWdZVzVrSUZOaFptRnlhUzVjYmlBcUlESXVJRU52Y25KbFkzUWdkR2hsSUc5MWRHeHBibVVnYzNSNWJHVWdhVzRnVTJGbVlYSnBMbHh1SUNvdlhHNWJkSGx3WlQxY0luTmxZWEpqYUZ3aVhTQjdYRzRnSUMxM1pXSnJhWFF0WVhCd1pXRnlZVzVqWlRvZ2RHVjRkR1pwWld4a08xeHVJQ0F2S2lBeElDb3ZYRzRnSUc5MWRHeHBibVV0YjJabWMyVjBPaUF0TW5CNE8xeHVJQ0F2S2lBeUlDb3ZYRzU5WEc0dktpcGNiaUFxSUZKbGJXOTJaU0IwYUdVZ2FXNXVaWElnY0dGa1pHbHVaeUJwYmlCRGFISnZiV1VnWVc1a0lGTmhabUZ5YVNCdmJpQnRZV05QVXk1Y2JpQXFMMXh1VzNSNWNHVTlYQ0p6WldGeVkyaGNJbDA2T2kxM1pXSnJhWFF0YzJWaGNtTm9MV1JsWTI5eVlYUnBiMjRnZTF4dUlDQXRkMlZpYTJsMExXRndjR1ZoY21GdVkyVTZJRzV2Ym1VN1hHNTlYRzR2S2lwY2JpQXFJREV1SUVOdmNuSmxZM1FnZEdobElHbHVZV0pwYkdsMGVTQjBieUJ6ZEhsc1pTQmpiR2xqYTJGaWJHVWdkSGx3WlhNZ2FXNGdhVTlUSUdGdVpDQlRZV1poY21rdVhHNGdLaUF5TGlCRGFHRnVaMlVnWm05dWRDQndjbTl3WlhKMGFXVnpJSFJ2SUdCcGJtaGxjbWwwWUNCcGJpQlRZV1poY21rdVhHNGdLaTljYmpvNkxYZGxZbXRwZEMxbWFXeGxMWFZ3Ykc5aFpDMWlkWFIwYjI0Z2UxeHVJQ0F0ZDJWaWEybDBMV0Z3Y0dWaGNtRnVZMlU2SUdKMWRIUnZianRjYmlBZ0x5b2dNU0FxTDF4dUlDQm1iMjUwT2lCcGJtaGxjbWwwTzF4dUlDQXZLaUF5SUNvdlhHNTlYRzR2S2lCSmJuUmxjbUZqZEdsMlpWeHVJQ0FnUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwZ0tpOWNiaThxWEc0Z0tpQkJaR1FnZEdobElHTnZjbkpsWTNRZ1pHbHpjR3hoZVNCcGJpQkZaR2RsTENCSlJTQXhNQ3NzSUdGdVpDQkdhWEpsWm05NExseHVJQ292WEc1a1pYUmhhV3h6SUh0Y2JpQWdaR2x6Y0d4aGVUb2dZbXh2WTJzN1hHNTlYRzR2S2x4dUlDb2dRV1JrSUhSb1pTQmpiM0p5WldOMElHUnBjM0JzWVhrZ2FXNGdZV3hzSUdKeWIzZHpaWEp6TGx4dUlDb3ZYRzV6ZFcxdFlYSjVJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JHbHpkQzFwZEdWdE8xeHVmVnh1THlvZ1RXbHpZMXh1SUNBZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMGdLaTljYmk4cUtseHVJQ29nUVdSa0lIUm9aU0JqYjNKeVpXTjBJR1JwYzNCc1lYa2dhVzRnU1VVZ01UQXJMbHh1SUNvdlhHNTBaVzF3YkdGMFpTQjdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYRzU5WEc0dktpcGNiaUFxSUVGa1pDQjBhR1VnWTI5eWNtVmpkQ0JrYVhOd2JHRjVJR2x1SUVsRklERXdMbHh1SUNvdlhHNWJhR2xrWkdWdVhTQjdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYRzU5WEc0dktpQTlQVDA5UFNCQ1lYTmxJRDA5UFQwOUlDb3ZYRzVvZEcxc0xGeHVZbTlrZVNCN1hHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2JpQWdZbUZqYTJkeWIzVnVaRG9nSTJaaFptRm1ZVHRjYmlBZ1kyOXNiM0k2SUNNek16TTdYRzRnSUdadmJuUXRjMmw2WlRvZ01UUndlRHRjYmlBZ2JHbHVaUzFvWldsbmFIUTZJREUxTUNVN1hHNGdJR1p2Ym5RdFptRnRhV3g1T2lCY0lrMXBZM0p2YzI5bWRDQlpZVWhsYVNCVlNWd2lMQ0JCY21saGJDd2djMkZ1Y3kxelpYSnBaanRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNibUU2YkdsdWF5eGNibUU2ZG1semFYUmxaQ3hjYm1FNmFHOTJaWElnZTF4dUlDQmpiMnh2Y2pvZ0l6QTFPRGswTWp0Y2JpQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQnViMjVsTzF4dWZWeHVZVHBvYjNabGNpQjdYRzRnSUhSbGVIUXRaR1ZqYjNKaGRHbHZiam9nZFc1a1pYSnNhVzVsTzF4dWZWeHVZMjlrWlNCN1hHNGdJR1p2Ym5RdFptRnRhV3g1T2lCY0lsTnZkWEpqWlNCRGIyUmxJRkJ5YjF3aUxDQkRiMjV6YjJ4aGN5d2dSMlZ2Y21kcFlTd2dUVzl1WVdOdkxDQnRiMjV2YzNCaFkyVXNJRUZ5YVdGc0xDQnpZVzV6TFhObGNtbG1PMXh1ZlZ4dUx5b2dQVDA5UFQwZ1UyTnliMnhzWW1GeUlEMDlQVDA5SUNvdlhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlJSHRjYmlBZ2QybGtkR2c2SURkd2VEdGNiaUFnYUdWcFoyaDBPaUEzY0hnN1hHNGdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh1ZlZ4dU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNpMTBjbUZqYXkxd2FXVmpaU0I3WEc0Z0lDMTNaV0pyYVhRdFltOXlaR1Z5TFhKaFpHbDFjem9nTlhCNE8xeHVmVnh1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2kxMGFIVnRZanAyWlhKMGFXTmhiQ0I3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklISm5ZbUVvTUN3Z01Dd2dNQ3dnTUM0eU5TazdYRzRnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4dWZWeHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaTEwYUhWdFlqcG9iM0pwZW05dWRHRnNJSHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ2NtZGlZU2d3TENBd0xDQXdMQ0F3TGpJMUtUdGNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEc1OVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlPbWh2ZG1WeUlIdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nY21kaVlTZ3dMQ0F3TENBd0xDQXdMakUxS1R0Y2JuMWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEl0ZEdoMWJXSTZhRzkyWlhJZ2UxeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJ5WjJKaEtEQXNJREFzSURBc0lEQXVNelVwTzF4dWZWeHVMeW9nVEdGNWIzVjBJQ292WEc0dVpHOWpjeUI3WEc0Z0lHUnBjM0JzWVhrNklHWnNaWGc3WEc0Z0lHWnNaWGd0WkdseVpXTjBhVzl1T2lCeWIzYzdYRzRnSUdac1pYZ3RkM0poY0RvZ2JtOTNjbUZ3TzF4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYRzRnSUhvdGFXNWtaWGc2SURFN1hHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHMWhjbWRwYmpvZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpOHFJRUZ6YVdSbElDb3ZYRzR1WVhOcFpHVWdlMXh1SUNCa2FYTndiR0Y1T2lCbWJHVjRPMXh1SUNCbWJHVjRMWE5vY21sdWF6b2dNRHRjYmlBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUdOdmJIVnRianRjYmlBZ1pteGxlQzEzY21Gd09pQnViM2R5WVhBN1hHNGdJSGRwWkhSb09pQXlOakJ3ZUR0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCb1pXbG5hSFE2SURFd01DVTdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNNek16TTdYRzRnSUdOdmJHOXlPaUFqWkdSa08xeHVJQ0JpYjNndGMyaGhaRzkzT2lBd0lEQWdOWEI0SURKd2VDQWpaR1JrTzF4dUlDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2JuMWNiaThxSUUxaGFXNGdLaTljYmk1dFlXbHVJSHRjYmlBZ1pteGxlRG9nTVR0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0JvWldsbmFIUTZJREV3TUNVN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN1hHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHVmVnh1TG1GemFXUmxJSHRjYmlBZ1ptOXVkQzFtWVcxcGJIazZJRndpVTI5MWNtTmxJRU52WkdVZ1VISnZYQ0lzSUVOdmJuTnZiR0Z6TENCSFpXOXlaMmxoTENCTmIyNWhZMjhzSUcxdmJtOXpjR0ZqWlN3Z1FYSnBZV3dzSUhOaGJuTXRjMlZ5YVdZN1hHNTlYRzR1WVhOcFpHVmZYMmhsWVdSbGNpQjdYRzRnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh1SUNCbWJHVjRMWE5vY21sdWF6b2dNRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTVoYzJsa1pWOWZibUYySUh0Y2JpQWdabXhsZURvZ01UdGNiaUFnYjNabGNtWnNiM2M2SUdGMWRHODdYRzU5WEc0dVlYTnBaR1ZmWDJneUlIdGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUdobGFXZG9kRG9nTlRSd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklEVTBjSGc3WEc0Z0lHWnZiblF0YzJsNlpUb2dNakJ3ZUR0Y2JpQWdabTl1ZEMxM1pXbG5hSFE2SUc1dmNtMWhiRHRjYmlBZ1ptOXVkQzFtWVcxcGJIazZJRWRsYjNKbmFXRXNJRU52Ym5OdmJHRnpMQ0JCY21saGJDd2djMkZ1Y3kxelpYSnBaanRjYmlBZ2RHVjRkQzFoYkdsbmJqb2dZMlZ1ZEdWeU8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtRnphV1JsWDE5b015QjdYRzRnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh1SUNCd1lXUmthVzVuT2lBd0lESXdjSGc3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVFp3ZUR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1aGMybGtaVjlmYkdsemRDQjdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdjR0ZrWkdsdVp6b2dNVEJ3ZUNBd08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtRnphV1JsWDE5cGRHVnRJSHRjYmlBZ2FHVnBaMmgwT2lBek1uQjRPMXh1SUNCc2FXNWxMV2hsYVdkb2REb2dNekp3ZUR0Y2JpQWdjR0ZrWkdsdVp6b2dNQ0F6TUhCNE8xeHVJQ0JqZFhKemIzSTZJSEJ2YVc1MFpYSTdYRzRnSUdadmJuUXRjMmw2WlRvZ01UTndlRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTVoYzJsa1pWOWZhWFJsYlM1aFkzUnBkbVVzWEc0dVlYTnBaR1ZmWDJsMFpXMDZhRzkyWlhJZ2UxeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqTlRVMU8xeHVmVnh1TG1GemFXUmxYMTlwZEdWdExtRmpkR2wyWlNCN1hHNGdJR0p2Y21SbGNpMXNaV1owT2lBemNIZ2djMjlzYVdRZ0kyWm1aanRjYm4xY2JpNWhjMmxrWlY5ZllXNWphRzl5T214cGJtc2dlMXh1SUNCamIyeHZjam9nSTJSa1pEdGNiaUFnZEdWNGRDMWtaV052Y21GMGFXOXVPaUJ1YjI1bE8xeHVmVnh1TG1GemFXUmxYMTloYm1Ob2IzSTZkbWx6YVhSbFpDQjdYRzRnSUdOdmJHOXlPaUFqWkdSa08xeHVJQ0IwWlhoMExXUmxZMjl5WVhScGIyNDZJRzV2Ym1VN1hHNTlYRzR1WVhOcFpHVmZYMkZ1WTJodmNqcG9iM1psY2lCN1hHNGdJR052Ykc5eU9pQWpaR1JrTzF4dUlDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklIVnVaR1Z5YkdsdVpUdGNibjFjYmk1dFlXbHVYMTlvWldGa1pYSXNYRzR1YldGcGJsOWZabTl2ZEdWeUlIdGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUhCaFpHUnBibWM2SURGbGJUdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG0xaGFXNWZYMmd4SUh0Y2JpQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hHNGdJSEJoWkdScGJtY3RkRzl3T2lBeFpXMDdYRzRnSUdadmJuUXRjMmw2WlRvZ05XVnRPMXh1SUNCbWIyNTBMWGRsYVdkb2REb2dibTl5YldGc08xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ01tVnRPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTFoYVc1ZlgyNWhiV1VnZTF4dUlDQmpiMnh2Y2pvZ0l6Rm1PR1JrTmp0Y2JpQWdabTl1ZEMxM1pXbG5hSFE2SUc1dmNtMWhiRHRjYm4xY2JpNXRZV2x1WDE5MFlXZHNhVzVsSUh0Y2JpQWdiV0Z5WjJsdU9pQXhaVzBnWVhWMGJ6dGNiaUFnYldGNExYZHBaSFJvT2lBMk5qQndlRHRjYmlBZ2JHbHVaUzFvWldsbmFIUTZJREV1TTJWdE8xeHVJQ0JtYjI1MExYTnBlbVU2SURKbGJUdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNGdJR1p2Ym5RdGQyVnBaMmgwT2lBeE1EQTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViV0ZwYmw5ZlkyUnVJSHRjYmlBZ2JXRnlaMmx1T2lBeVpXMGdNRHRjYmlBZ2NHRmtaR2x1WnpvZ01tVnRPMXh1SUNCbWIyNTBMWE5wZW1VNklERTJjSGc3WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUF4TlRBbE8xeHVJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1ZV1poWm1FN1hHNGdJR0p2Y21SbGNpMTBiM0E2SURGd2VDQnpiMnhwWkNBalpHUmtPMXh1SUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnSTJSa1pEdGNiaUFnWTI5c2IzSTZJQ00yTmpZN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWJXRnBibDlmWkc5M2JteHZZV1FnZTF4dUlDQnRZWEpuYVc0NklERmxiU0JoZFhSdk8xeHVJQ0IzYVdSMGFEb2dNakF3Y0hnN1hHNGdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV0WVdsdVgxOWlkWFIwYjI0Z2UxeHVJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hHNGdJR0p2Y21SbGNpMXlZV1JwZFhNNklEUndlRHRjYmlBZ2NHRmtaR2x1WnpvZ01UUndlQ0F5T1hCNE8xeHVJQ0JtYjI1MExYTnBlbVU2SURFNGNIZzdYRzRnSUdadmJuUXRabUZ0YVd4NU9pQmNJbE52ZFhKalpTQkRiMlJsSUZCeWIxd2lMQ0JEYjI1emIyeGhjeXdnUjJWdmNtZHBZU3dnVFc5dVlXTnZMQ0J0YjI1dmMzQmhZMlVzSUVGeWFXRnNMQ0J6WVc1ekxYTmxjbWxtTzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpNRFU0T1RReU8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtMWhhVzVmWDJKMWRIUnZianBzYVc1ckxGeHVMbTFoYVc1ZlgySjFkSFJ2YmpwMmFYTnBkR1ZrTEZ4dUxtMWhhVzVmWDJKMWRIUnZianBvYjNabGNpQjdYRzRnSUdOdmJHOXlPaUFqWm1abU8xeHVJQ0IwWlhoMExXUmxZMjl5WVhScGIyNDZJRzV2Ym1VN1hHNTlYRzR1YldGcGJsOWZabTl2ZEdWeUlIdGNiaUFnYldGeVoybHVPaUF3SURObGJUdGNiaUFnWW05eVpHVnlMWFJ2Y0RvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc1OVhHNHVjMlZqZEdsdmJpQjdYRzRnSUcxaGNtZHBiam9nTVdWdElEQTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHVjMlZqZEdsdmJsOWZhR1ZoWkdWeUxGeHVMbk5sWTNScGIyNWZYMk52Ym5SbGJuUXNYRzR1YzJWamRHbHZibDlmWm05dmRHVnlJSHRjYmlBZ2JXRnlaMmx1T2lBd0lETmxiVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV6WldOMGFXOXVYMTkwYVhSc1pTQjdYRzRnSUdOdmJHOXlPaUFqTmpZMk8xeHVmVnh1TG5ObFkzUnBiMjVmWDJneklIdGNiaUFnWTI5c2IzSTZJQ014Wmpoa1pEWTdYRzRnSUdadmJuUXRjMmw2WlRvZ01TNHpOV1Z0TzF4dWZWeHVMbk5sWTNScGIyNWZYMmcwSUh0Y2JpQWdabTl1ZEMxemFYcGxPaUF4TGpGbGJUdGNiaUFnWTI5c2IzSTZJQ00yTmpZN1hHNTlYRzR1YzJWamRHbHZibDlmYURVZ2UxeHVJQ0JtYjI1MExYTnBlbVU2SURGbGJUdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNTlYRzR1YzJWamRHbHZibDlmWkd3c1hHNHVjMlZqZEdsdmJsOWZaSFFzWEc0dWMyVmpkR2x2Ymw5ZlpHUWdlMXh1SUNCdFlYSm5hVzQ2SURBN1hHNGdJSEJoWkdScGJtYzZJREE3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YzJWamRHbHZibDlmWkd3Z2UxeHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEc0Z0lIb3RhVzVrWlhnNklERTdYRzU5WEc0dWMyVmpkR2x2Ymw5ZlpIUWdlMXh1SUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczdYRzU5WEc0dWMyVmpkR2x2Ymw5ZlpHUWdlMXh1SUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczdYRzRnSUdOdmJHOXlPaUFqTURVNE9UUXlPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgzQnlaU0I3WEc0Z0lHMWhjbWRwYmpvZ01tVnRJREE3WEc0Z0lIQmhaR1JwYm1jNklERmxiVHRjYmlBZ1ptOXVkQzF6YVhwbE9pQXhOSEI0TzF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTVRVd0pUdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ2JHVm1kRHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWmhabUZtWVR0Y2JpQWdZbTl5WkdWeU9pQXhjSGdnYzI5c2FXUWdJMlJrWkR0Y2JpQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ05IQjRPMXh1SUNCamIyeHZjam9nSXpZMk5qdGNiaUFnYjNabGNtWnNiM2M2SUdGMWRHODdYRzU5WEc0dWMyVmpkR2x2Ymw5ZlkyOWtaU0I3WEc0Z0lHUnBjM0JzWVhrNklHSnNiMk5yTzF4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1elpXTjBhVzl1WDE5bWIyOTBaWElnZTF4dUlDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnSTJSa1pEdGNiaUFnYldGeVoybHVMWFJ2Y0RvZ00yVnRPMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalptRm1ZV1poTzF4dUlDQmpiMnh2Y2pvZ0l6azVPVHRjYm4xY2JpNWpZWE5sSUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0JrYVhOd2JHRjVPaUJuY21sa08xeHVJQ0JuY21sa0xYUmxiWEJzWVhSbExXTnZiSFZ0Ym5NNklISmxjR1ZoZENneUxDQXhabklwTzF4dUlDQm5ZWEE2SURRd2NIZzdYRzRnSUhCaFpHUnBibWM2SURGbGJUdGNiaUFnWW05eVpHVnlMWFJ2Y0RvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNBalpHUmtPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbU5oYzJVNllXWjBaWElnZTF4dUlDQmpiMjUwWlc1ME9pQW5KenRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQjBiM0E2SURBN1hHNGdJR3hsWm5RNklEVXdKVHRjYmlBZ2FHVnBaMmgwT2lBeE1EQWxPMXh1SUNCM2FXUjBhRG9nTUR0Y2JpQWdZbTl5WkdWeUxXeGxablE2SURGd2VDQnpiMnhwWkNBalpHUmtPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbU5oYzJWZlgzQnlaU3hjYmk1allYTmxYMTkwWlhoMFlYSmxZU0I3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURFMU1DVTdYRzU5WEc0dVkyRnpaVjlmY0hKbExGeHVMbU5oYzJWZlgyTnZaR1VzWEc0dVkyRnpaVjlmZEdWNGRHRnlaV0VnZTF4dUlDQm1iMjUwTFdaaGJXbHNlVG9nWENKRGIzVnlhV1Z5SUU1bGQxd2lMQ0JEYjI1emIyeGhjeXdnUjJWdmNtZHBZU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEc1OVhHNHVZMkZ6WlY5ZmNISmxJSHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0J3WVdSa2FXNW5PaUF4WlcwN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWVdaaFptRTdYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNiaUFnWW05eVpHVnlMWEpoWkdsMWN6b2dOSEI0TzF4dUlDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4dUlDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2JuMWNiaTVqWVhObFgxOTBiMjlzWW1GeUlIdGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUdobGFXZG9kRG9nTXpad2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklETTJjSGc3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVFJ3ZUR0Y2JpQWdjR0ZrWkdsdVp6b2dNQ0F4Tm5CNE8xeHVJQ0IwWlhoMExXRnNhV2R1T2lCeWFXZG9kRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTVqWVhObFgxOWhZM1JwYjI0c1hHNHVZMkZ6WlY5ZmNtVnRiM1psSUh0Y2JpQWdZM1Z5YzI5eU9pQndiMmx1ZEdWeU8xeHVJQ0JqYjJ4dmNqb2dJekExT0RrME1qdGNiaUFnZFhObGNpMXpaV3hsWTNRNklHNXZibVU3WEc1OVhHNHVZMkZ6WlY5ZllXTjBhVzl1SUh0Y2JpQWdabTl1ZEMxemFYcGxPaUF4TTNCNE8xeHVJQ0J3WVdSa2FXNW5MV3hsWm5RNklERXdjSGc3WEc1OVhHNHVZMkZ6WlY5ZllXTjBhVzl1T21acGNuTjBMV05vYVd4a0lIdGNiaUFnY0dGa1pHbHVaeTFzWldaME9pQXdPMXh1ZlZ4dUxtTmhjMlZmWDNKbGJXOTJaU0I3WEc0Z0lHWnNiMkYwT2lCeWFXZG9kRHRjYm4xY2JpNWpZWE5sWDE5amIyNXpiMnhsSUh0Y2JpQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hHNGdJR2hsYVdkb2REb2dNVGd3Y0hnN1hHNGdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dVkyRnpaVjlmZEdWNGRHRnlaV0VnZTF4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ1ltOXlaR1Z5T2lCdWIyNWxPMXh1SUNCdmRYUnNhVzVsT2lCdWIyNWxPMXh1SUNCd1lXUmthVzVuT2lBeFpXMDdYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYRzRnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh1ZlZ4dUxtTmhjMlZmWDJ4cGMzUXNYRzR1WTJGelpWOWZhWFJsYlNCN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2NHRmtaR2x1WnpvZ01EdGNiaUFnYkdsemRDMXpkSGxzWlMxMGVYQmxPaUJ1YjI1bE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtTmhjMlZmWDJ4cGMzUWdlMXh1SUNCb1pXbG5hSFE2SURNMk1IQjRPMXh1SUNCaWIzSmtaWEl0ZEc5d09pQXhjSGdnYzI5c2FXUWdJMlJrWkR0Y2JpQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hHNTlYRzR1WTJGelpWOWZhWFJsYlNCN1hHNGdJR2hsYVdkb2REb2dNelp3ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURNMmNIZzdYRzRnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjYmlBZ2NHRmtaR2x1WnpvZ01DQXhObkI0TzF4dWZWeHVMbU5oYzJWZlgybDBaVzA2YUc5MlpYSWdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalpqZG1PR1k1TzF4dWZWeHVMbUoxZEhSdmJuTWdlMXh1SUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEc0Z0lIb3RhVzVrWlhnNklESTdYRzRnSUhSdmNEb2dOVEFsTzF4dUlDQnlhV2RvZERvZ01USndlRHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0IzYVdSMGFEb2dOVFp3ZUR0Y2JpQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZaS0MwMU1DVXBPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbUoxZEhSdmJuTmZYMmwwWlcwZ2UxeHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEc0Z0lIb3RhVzVrWlhnNklERTdYRzRnSUcxaGNtZHBiam9nTVRCd2VEdGNiaUFnZDJsa2RHZzZJRE0yY0hnN1hHNGdJR2hsYVdkb2REb2dNelp3ZUR0Y2JpQWdZbTl5WkdWeU9pQXhjSGdnYzI5c2FXUWdJMlJrWkR0Y2JpQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ05IQjRPMXh1SUNCaWIzZ3RjMmhoWkc5M09pQXdJREFnTm5CNElDTmtaR1E3WEc0Z0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc0Z0lHTjFjbk52Y2pvZ2NHOXBiblJsY2p0Y2JpQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh1SUNCamIyeHZjam9nSXprNU9UdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNWlkWFIwYjI1elgxOXBkR1Z0T21odmRtVnlJSHRjYmlBZ1kyOXNiM0k2SUNNd05UZzVOREk3WEc1OVhHNHVZblYwZEc5dWMxOWZhWFJsYlM1b2FXUmxJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpNWlkWFIwYjI1elgxOWhibU5vYjNJNmJHbHVheXhjYmk1aWRYUjBiMjV6WDE5aGJtTm9iM0k2ZG1semFYUmxaQ3hjYmk1aWRYUjBiMjV6WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXprNU9UdGNibjFjYmk1aWRYUjBiMjV6WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXpBMU9EazBNanRjYm4xY2JpNWlkWFIwYjI1elgxOXBZMjl1SUh0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2JHVm1kRG9nTlRBbE8xeHVJQ0IzYVdSMGFEb2dNakJ3ZUR0Y2JpQWdhR1ZwWjJoME9pQXlNSEI0TzF4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaU2d0TlRBbExDQXROVEFsS1R0Y2JpQWdabWxzYkRvZ1kzVnljbVZ1ZEdOdmJHOXlPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVJaXdpTHlvaElHNXZjbTFoYkdsNlpTNWpjM01nZGpndU1DNHhJSHdnVFVsVUlFeHBZMlZ1YzJVZ2ZDQm5hWFJvZFdJdVkyOXRMMjVsWTI5c1lYTXZibTl5YldGc2FYcGxMbU56Y3lBcUwxeHlYRzVjY2x4dUx5b2dSRzlqZFcxbGJuUmNjbHh1SUNBZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMGdLaTljY2x4dVhISmNiaThxS2x4eVhHNGdLaUF4TGlCRGIzSnlaV04wSUhSb1pTQnNhVzVsSUdobGFXZG9kQ0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYSEpjYmlBcUlESXVJRkJ5WlhabGJuUWdZV1JxZFhOMGJXVnVkSE1nYjJZZ1ptOXVkQ0J6YVhwbElHRm1kR1Z5SUc5eWFXVnVkR0YwYVc5dUlHTm9ZVzVuWlhNZ2FXNGdhVTlUTGx4eVhHNGdLaTljY2x4dVhISmNibWgwYld3Z2UxeHlYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQXhMakUxT3lBdktpQXhJQ292WEhKY2JpQWdMWGRsWW10cGRDMTBaWGgwTFhOcGVtVXRZV1JxZFhOME9pQXhNREFsT3lBdktpQXlJQ292WEhKY2JuMWNjbHh1WEhKY2JpOHFJRk5sWTNScGIyNXpYSEpjYmlBZ0lEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlJQ292WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nVW1WdGIzWmxJSFJvWlNCdFlYSm5hVzRnYVc0Z1lXeHNJR0p5YjNkelpYSnpMbHh5WEc0Z0tpOWNjbHh1WEhKY2JtSnZaSGtnZTF4eVhHNGdJRzFoY21kcGJqb2dNRHRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlGSmxibVJsY2lCMGFHVWdZRzFoYVc1Z0lHVnNaVzFsYm5RZ1kyOXVjMmx6ZEdWdWRHeDVJR2x1SUVsRkxseHlYRzRnS2k5Y2NseHVYSEpjYm0xaGFXNGdlMXh5WEc0Z0lHUnBjM0JzWVhrNklHSnNiMk5yTzF4eVhHNTlYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dRMjl5Y21WamRDQjBhR1VnWm05dWRDQnphWHBsSUdGdVpDQnRZWEpuYVc0Z2IyNGdZR2d4WUNCbGJHVnRaVzUwY3lCM2FYUm9hVzRnWUhObFkzUnBiMjVnSUdGdVpGeHlYRzRnS2lCZ1lYSjBhV05zWldBZ1kyOXVkR1Y0ZEhNZ2FXNGdRMmh5YjIxbExDQkdhWEpsWm05NExDQmhibVFnVTJGbVlYSnBMbHh5WEc0Z0tpOWNjbHh1WEhKY2JtZ3hJSHRjY2x4dUlDQm1iMjUwTFhOcGVtVTZJREpsYlR0Y2NseHVJQ0J0WVhKbmFXNDZJREF1TmpkbGJTQXdPMXh5WEc1OVhISmNibHh5WEc0dktpQkhjbTkxY0dsdVp5QmpiMjUwWlc1MFhISmNiaUFnSUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOUlDb3ZYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dNUzRnUVdSa0lIUm9aU0JqYjNKeVpXTjBJR0p2ZUNCemFYcHBibWNnYVc0Z1JtbHlaV1p2ZUM1Y2NseHVJQ29nTWk0Z1UyaHZkeUIwYUdVZ2IzWmxjbVpzYjNjZ2FXNGdSV1JuWlNCaGJtUWdTVVV1WEhKY2JpQXFMMXh5WEc1Y2NseHVhSElnZTF4eVhHNGdJR0p2ZUMxemFYcHBibWM2SUdOdmJuUmxiblF0WW05NE95QXZLaUF4SUNvdlhISmNiaUFnYUdWcFoyaDBPaUF3T3lBdktpQXhJQ292WEhKY2JpQWdiM1psY21ac2IzYzZJSFpwYzJsaWJHVTdJQzhxSURJZ0tpOWNjbHh1ZlZ4eVhHNWNjbHh1THlvcVhISmNiaUFxSURFdUlFTnZjbkpsWTNRZ2RHaGxJR2x1YUdWeWFYUmhibU5sSUdGdVpDQnpZMkZzYVc1bklHOW1JR1p2Ym5RZ2MybDZaU0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYSEpjYmlBcUlESXVJRU52Y25KbFkzUWdkR2hsSUc5a1pDQmdaVzFnSUdadmJuUWdjMmw2YVc1bklHbHVJR0ZzYkNCaWNtOTNjMlZ5Y3k1Y2NseHVJQ292WEhKY2JseHlYRzV3Y21VZ2UxeHlYRzRnSUdadmJuUXRabUZ0YVd4NU9pQnRiMjV2YzNCaFkyVXNJRzF2Ym05emNHRmpaVHNnTHlvZ01TQXFMMXh5WEc0Z0lHWnZiblF0YzJsNlpUb2dNV1Z0T3lBdktpQXlJQ292WEhKY2JuMWNjbHh1WEhKY2JpOHFJRlJsZUhRdGJHVjJaV3dnYzJWdFlXNTBhV056WEhKY2JpQWdJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5SUNvdlhISmNibHh5WEc0dktpcGNjbHh1SUNvZ1VtVnRiM1psSUhSb1pTQm5jbUY1SUdKaFkydG5jbTkxYm1RZ2IyNGdZV04wYVhabElHeHBibXR6SUdsdUlFbEZJREV3TGx4eVhHNGdLaTljY2x4dVhISmNibUVnZTF4eVhHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSFJ5WVc1emNHRnlaVzUwTzF4eVhHNTlYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dNUzRnVW1WdGIzWmxJSFJvWlNCaWIzUjBiMjBnWW05eVpHVnlJR2x1SUVOb2NtOXRaU0ExTnkxY2NseHVJQ29nTWk0Z1FXUmtJSFJvWlNCamIzSnlaV04wSUhSbGVIUWdaR1ZqYjNKaGRHbHZiaUJwYmlCRGFISnZiV1VzSUVWa1oyVXNJRWxGTENCUGNHVnlZU3dnWVc1a0lGTmhabUZ5YVM1Y2NseHVJQ292WEhKY2JseHlYRzVoWW1KeVczUnBkR3hsWFNCN1hISmNiaUFnWW05eVpHVnlMV0p2ZEhSdmJUb2dibTl1WlRzZ0x5b2dNU0FxTDF4eVhHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dkVzVrWlhKc2FXNWxPeUF2S2lBeUlDb3ZYSEpjYmlBZ2RHVjRkQzFrWldOdmNtRjBhVzl1T2lCMWJtUmxjbXhwYm1VZ1pHOTBkR1ZrT3lBdktpQXlJQ292WEhKY2JuMWNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQkJaR1FnZEdobElHTnZjbkpsWTNRZ1ptOXVkQ0IzWldsbmFIUWdhVzRnUTJoeWIyMWxMQ0JGWkdkbExDQmhibVFnVTJGbVlYSnBMbHh5WEc0Z0tpOWNjbHh1WEhKY2JtSXNYSEpjYm5OMGNtOXVaeUI3WEhKY2JpQWdabTl1ZEMxM1pXbG5hSFE2SUdKdmJHUmxjanRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlERXVJRU52Y25KbFkzUWdkR2hsSUdsdWFHVnlhWFJoYm1ObElHRnVaQ0J6WTJGc2FXNW5JRzltSUdadmJuUWdjMmw2WlNCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEhKY2JpQXFJREl1SUVOdmNuSmxZM1FnZEdobElHOWtaQ0JnWlcxZ0lHWnZiblFnYzJsNmFXNW5JR2x1SUdGc2JDQmljbTkzYzJWeWN5NWNjbHh1SUNvdlhISmNibHh5WEc1amIyUmxMRnh5WEc1clltUXNYSEpjYm5OaGJYQWdlMXh5WEc0Z0lHWnZiblF0Wm1GdGFXeDVPaUJ0YjI1dmMzQmhZMlVzSUcxdmJtOXpjR0ZqWlRzZ0x5b2dNU0FxTDF4eVhHNGdJR1p2Ym5RdGMybDZaVG9nTVdWdE95QXZLaUF5SUNvdlhISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdabTl1ZENCemFYcGxJR2x1SUdGc2JDQmljbTkzYzJWeWN5NWNjbHh1SUNvdlhISmNibHh5WEc1emJXRnNiQ0I3WEhKY2JpQWdabTl1ZEMxemFYcGxPaUE0TUNVN1hISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJRY21WMlpXNTBJR0J6ZFdKZ0lHRnVaQ0JnYzNWd1lDQmxiR1Z0Wlc1MGN5Qm1jbTl0SUdGbVptVmpkR2x1WnlCMGFHVWdiR2x1WlNCb1pXbG5hSFFnYVc1Y2NseHVJQ29nWVd4c0lHSnliM2R6WlhKekxseHlYRzRnS2k5Y2NseHVYSEpjYm5OMVlpeGNjbHh1YzNWd0lIdGNjbHh1SUNCbWIyNTBMWE5wZW1VNklEYzFKVHRjY2x4dUlDQnNhVzVsTFdobGFXZG9kRG9nTUR0Y2NseHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdkbVZ5ZEdsallXd3RZV3hwWjI0NklHSmhjMlZzYVc1bE8xeHlYRzU5WEhKY2JseHlYRzV6ZFdJZ2UxeHlYRzRnSUdKdmRIUnZiVG9nTFRBdU1qVmxiVHRjY2x4dWZWeHlYRzVjY2x4dWMzVndJSHRjY2x4dUlDQjBiM0E2SUMwd0xqVmxiVHRjY2x4dWZWeHlYRzVjY2x4dUx5b2dSVzFpWldSa1pXUWdZMjl1ZEdWdWRGeHlYRzRnSUNBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBTQXFMMXh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJRkpsYlc5MlpTQjBhR1VnWW05eVpHVnlJRzl1SUdsdFlXZGxjeUJwYm5OcFpHVWdiR2x1YTNNZ2FXNGdTVVVnTVRBdVhISmNiaUFxTDF4eVhHNWNjbHh1YVcxbklIdGNjbHh1SUNCaWIzSmtaWEl0YzNSNWJHVTZJRzV2Ym1VN1hISmNibjFjY2x4dVhISmNiaThxSUVadmNtMXpYSEpjYmlBZ0lEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlJQ292WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nTVM0Z1EyaGhibWRsSUhSb1pTQm1iMjUwSUhOMGVXeGxjeUJwYmlCaGJHd2dZbkp2ZDNObGNuTXVYSEpjYmlBcUlESXVJRkpsYlc5MlpTQjBhR1VnYldGeVoybHVJR2x1SUVacGNtVm1iM2dnWVc1a0lGTmhabUZ5YVM1Y2NseHVJQ292WEhKY2JseHlYRzVpZFhSMGIyNHNYSEpjYm1sdWNIVjBMRnh5WEc1dmNIUm5jbTkxY0N4Y2NseHVjMlZzWldOMExGeHlYRzUwWlhoMFlYSmxZU0I3WEhKY2JpQWdabTl1ZEMxbVlXMXBiSGs2SUdsdWFHVnlhWFE3SUM4cUlERWdLaTljY2x4dUlDQm1iMjUwTFhOcGVtVTZJREV3TUNVN0lDOHFJREVnS2k5Y2NseHVJQ0JzYVc1bExXaGxhV2RvZERvZ01TNHhOVHNnTHlvZ01TQXFMMXh5WEc0Z0lHMWhjbWRwYmpvZ01Ec2dMeW9nTWlBcUwxeHlYRzU5WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nVTJodmR5QjBhR1VnYjNabGNtWnNiM2NnYVc0Z1NVVXVYSEpjYmlBcUlERXVJRk5vYjNjZ2RHaGxJRzkyWlhKbWJHOTNJR2x1SUVWa1oyVXVYSEpjYmlBcUwxeHlYRzVjY2x4dVluVjBkRzl1TEZ4eVhHNXBibkIxZENCN0lDOHFJREVnS2k5Y2NseHVJQ0J2ZG1WeVpteHZkem9nZG1semFXSnNaVHRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlGSmxiVzkyWlNCMGFHVWdhVzVvWlhKcGRHRnVZMlVnYjJZZ2RHVjRkQ0IwY21GdWMyWnZjbTBnYVc0Z1JXUm5aU3dnUm1seVpXWnZlQ3dnWVc1a0lFbEZMbHh5WEc0Z0tpQXhMaUJTWlcxdmRtVWdkR2hsSUdsdWFHVnlhWFJoYm1ObElHOW1JSFJsZUhRZ2RISmhibk5tYjNKdElHbHVJRVpwY21WbWIzZ3VYSEpjYmlBcUwxeHlYRzVjY2x4dVluVjBkRzl1TEZ4eVhHNXpaV3hsWTNRZ2V5QXZLaUF4SUNvdlhISmNiaUFnZEdWNGRDMTBjbUZ1YzJadmNtMDZJRzV2Ym1VN1hISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJEYjNKeVpXTjBJSFJvWlNCcGJtRmlhV3hwZEhrZ2RHOGdjM1I1YkdVZ1kyeHBZMnRoWW14bElIUjVjR1Z6SUdsdUlHbFBVeUJoYm1RZ1UyRm1ZWEpwTGx4eVhHNGdLaTljY2x4dVhISmNibUoxZEhSdmJpeGNjbHh1VzNSNWNHVTlYQ0ppZFhSMGIyNWNJbDBzWEhKY2JsdDBlWEJsUFZ3aWNtVnpaWFJjSWwwc1hISmNibHQwZVhCbFBWd2ljM1ZpYldsMFhDSmRJSHRjY2x4dUlDQXRkMlZpYTJsMExXRndjR1ZoY21GdVkyVTZJR0oxZEhSdmJqdGNjbHh1ZlZ4eVhHNWNjbHh1THlvcVhISmNiaUFxSUZKbGJXOTJaU0IwYUdVZ2FXNXVaWElnWW05eVpHVnlJR0Z1WkNCd1lXUmthVzVuSUdsdUlFWnBjbVZtYjNndVhISmNiaUFxTDF4eVhHNWNjbHh1WW5WMGRHOXVPam90Ylc5NkxXWnZZM1Z6TFdsdWJtVnlMRnh5WEc1YmRIbHdaVDFjSW1KMWRIUnZibHdpWFRvNkxXMXZlaTFtYjJOMWN5MXBibTVsY2l4Y2NseHVXM1I1Y0dVOVhDSnlaWE5sZEZ3aVhUbzZMVzF2ZWkxbWIyTjFjeTFwYm01bGNpeGNjbHh1VzNSNWNHVTlYQ0p6ZFdKdGFYUmNJbDA2T2kxdGIzb3RabTlqZFhNdGFXNXVaWElnZTF4eVhHNGdJR0p2Y21SbGNpMXpkSGxzWlRvZ2JtOXVaVHRjY2x4dUlDQndZV1JrYVc1bk9pQXdPMXh5WEc1OVhISmNibHh5WEc0dktpcGNjbHh1SUNvZ1VtVnpkRzl5WlNCMGFHVWdabTlqZFhNZ2MzUjViR1Z6SUhWdWMyVjBJR0o1SUhSb1pTQndjbVYyYVc5MWN5QnlkV3hsTGx4eVhHNGdLaTljY2x4dVhISmNibUoxZEhSdmJqb3RiVzk2TFdadlkzVnpjbWx1Wnl4Y2NseHVXM1I1Y0dVOVhDSmlkWFIwYjI1Y0lsMDZMVzF2ZWkxbWIyTjFjM0pwYm1jc1hISmNibHQwZVhCbFBWd2ljbVZ6WlhSY0lsMDZMVzF2ZWkxbWIyTjFjM0pwYm1jc1hISmNibHQwZVhCbFBWd2ljM1ZpYldsMFhDSmRPaTF0YjNvdFptOWpkWE55YVc1bklIdGNjbHh1SUNCdmRYUnNhVzVsT2lBeGNIZ2daRzkwZEdWa0lFSjFkSFJ2YmxSbGVIUTdYSEpjYm4xY2NseHVYSEpjYmk4cUtseHlYRzRnS2lCRGIzSnlaV04wSUhSb1pTQndZV1JrYVc1bklHbHVJRVpwY21WbWIzZ3VYSEpjYmlBcUwxeHlYRzVjY2x4dVptbGxiR1J6WlhRZ2UxeHlYRzRnSUhCaFpHUnBibWM2SURBdU16VmxiU0F3TGpjMVpXMGdNQzQyTWpWbGJUdGNjbHh1ZlZ4eVhHNWNjbHh1THlvcVhISmNiaUFxSURFdUlFTnZjbkpsWTNRZ2RHaGxJSFJsZUhRZ2QzSmhjSEJwYm1jZ2FXNGdSV1JuWlNCaGJtUWdTVVV1WEhKY2JpQXFJREl1SUVOdmNuSmxZM1FnZEdobElHTnZiRzl5SUdsdWFHVnlhWFJoYm1ObElHWnliMjBnWUdacFpXeGtjMlYwWUNCbGJHVnRaVzUwY3lCcGJpQkpSUzVjY2x4dUlDb2dNeTRnVW1WdGIzWmxJSFJvWlNCd1lXUmthVzVuSUhOdklHUmxkbVZzYjNCbGNuTWdZWEpsSUc1dmRDQmpZWFZuYUhRZ2IzVjBJSGRvWlc0Z2RHaGxlU0I2WlhKdklHOTFkRnh5WEc0Z0tpQWdJQ0JnWm1sbGJHUnpaWFJnSUdWc1pXMWxiblJ6SUdsdUlHRnNiQ0JpY205M2MyVnljeTVjY2x4dUlDb3ZYSEpjYmx4eVhHNXNaV2RsYm1RZ2UxeHlYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdJQzhxSURFZ0tpOWNjbHh1SUNCamIyeHZjam9nYVc1b1pYSnBkRHNnTHlvZ01pQXFMMXh5WEc0Z0lHUnBjM0JzWVhrNklIUmhZbXhsT3lBdktpQXhJQ292WEhKY2JpQWdiV0Y0TFhkcFpIUm9PaUF4TURBbE95QXZLaUF4SUNvdlhISmNiaUFnY0dGa1pHbHVaem9nTURzZ0x5b2dNeUFxTDF4eVhHNGdJSGRvYVhSbExYTndZV05sT2lCdWIzSnRZV3c3SUM4cUlERWdLaTljY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlFRmtaQ0IwYUdVZ1kyOXljbVZqZENCMlpYSjBhV05oYkNCaGJHbG5ibTFsYm5RZ2FXNGdRMmh5YjIxbExDQkdhWEpsWm05NExDQmhibVFnVDNCbGNtRXVYSEpjYmlBcUwxeHlYRzVjY2x4dWNISnZaM0psYzNNZ2UxeHlYRzRnSUhabGNuUnBZMkZzTFdGc2FXZHVPaUJpWVhObGJHbHVaVHRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlGSmxiVzkyWlNCMGFHVWdaR1ZtWVhWc2RDQjJaWEowYVdOaGJDQnpZM0p2Ykd4aVlYSWdhVzRnU1VVZ01UQXJMbHh5WEc0Z0tpOWNjbHh1WEhKY2JuUmxlSFJoY21WaElIdGNjbHh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlERXVJRUZrWkNCMGFHVWdZMjl5Y21WamRDQmliM2dnYzJsNmFXNW5JR2x1SUVsRklERXdMbHh5WEc0Z0tpQXlMaUJTWlcxdmRtVWdkR2hsSUhCaFpHUnBibWNnYVc0Z1NVVWdNVEF1WEhKY2JpQXFMMXh5WEc1Y2NseHVXM1I1Y0dVOVhDSmphR1ZqYTJKdmVGd2lYU3hjY2x4dVczUjVjR1U5WENKeVlXUnBiMXdpWFNCN1hISmNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEc2dMeW9nTVNBcUwxeHlYRzRnSUhCaFpHUnBibWM2SURBN0lDOHFJRElnS2k5Y2NseHVmVnh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJRU52Y25KbFkzUWdkR2hsSUdOMWNuTnZjaUJ6ZEhsc1pTQnZaaUJwYm1OeVpXMWxiblFnWVc1a0lHUmxZM0psYldWdWRDQmlkWFIwYjI1eklHbHVJRU5vY205dFpTNWNjbHh1SUNvdlhISmNibHh5WEc1YmRIbHdaVDFjSW01MWJXSmxjbHdpWFRvNkxYZGxZbXRwZEMxcGJtNWxjaTF6Y0dsdUxXSjFkSFJ2Yml4Y2NseHVXM1I1Y0dVOVhDSnVkVzFpWlhKY0lsMDZPaTEzWldKcmFYUXRiM1YwWlhJdGMzQnBiaTFpZFhSMGIyNGdlMXh5WEc0Z0lHaGxhV2RvZERvZ1lYVjBienRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlERXVJRU52Y25KbFkzUWdkR2hsSUc5a1pDQmhjSEJsWVhKaGJtTmxJR2x1SUVOb2NtOXRaU0JoYm1RZ1UyRm1ZWEpwTGx4eVhHNGdLaUF5TGlCRGIzSnlaV04wSUhSb1pTQnZkWFJzYVc1bElITjBlV3hsSUdsdUlGTmhabUZ5YVM1Y2NseHVJQ292WEhKY2JseHlYRzViZEhsd1pUMWNJbk5sWVhKamFGd2lYU0I3WEhKY2JpQWdMWGRsWW10cGRDMWhjSEJsWVhKaGJtTmxPaUIwWlhoMFptbGxiR1E3SUM4cUlERWdLaTljY2x4dUlDQnZkWFJzYVc1bExXOW1abk5sZERvZ0xUSndlRHNnTHlvZ01pQXFMMXh5WEc1OVhISmNibHh5WEc0dktpcGNjbHh1SUNvZ1VtVnRiM1psSUhSb1pTQnBibTVsY2lCd1lXUmthVzVuSUdsdUlFTm9jbTl0WlNCaGJtUWdVMkZtWVhKcElHOXVJRzFoWTA5VExseHlYRzRnS2k5Y2NseHVYSEpjYmx0MGVYQmxQVndpYzJWaGNtTm9YQ0pkT2pvdGQyVmlhMmwwTFhObFlYSmphQzFrWldOdmNtRjBhVzl1SUh0Y2NseHVJQ0F0ZDJWaWEybDBMV0Z3Y0dWaGNtRnVZMlU2SUc1dmJtVTdYSEpjYm4xY2NseHVYSEpjYmk4cUtseHlYRzRnS2lBeExpQkRiM0p5WldOMElIUm9aU0JwYm1GaWFXeHBkSGtnZEc4Z2MzUjViR1VnWTJ4cFkydGhZbXhsSUhSNWNHVnpJR2x1SUdsUFV5QmhibVFnVTJGbVlYSnBMbHh5WEc0Z0tpQXlMaUJEYUdGdVoyVWdabTl1ZENCd2NtOXdaWEowYVdWeklIUnZJR0JwYm1obGNtbDBZQ0JwYmlCVFlXWmhjbWt1WEhKY2JpQXFMMXh5WEc1Y2NseHVPam90ZDJWaWEybDBMV1pwYkdVdGRYQnNiMkZrTFdKMWRIUnZiaUI3WEhKY2JpQWdMWGRsWW10cGRDMWhjSEJsWVhKaGJtTmxPaUJpZFhSMGIyNDdJQzhxSURFZ0tpOWNjbHh1SUNCbWIyNTBPaUJwYm1obGNtbDBPeUF2S2lBeUlDb3ZYSEpjYm4xY2NseHVYSEpjYmk4cUlFbHVkR1Z5WVdOMGFYWmxYSEpjYmlBZ0lEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlJQ292WEhKY2JseHlYRzR2S2x4eVhHNGdLaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdaR2x6Y0d4aGVTQnBiaUJGWkdkbExDQkpSU0F4TUNzc0lHRnVaQ0JHYVhKbFptOTRMbHh5WEc0Z0tpOWNjbHh1WEhKY2JtUmxkR0ZwYkhNZ2UxeHlYRzRnSUdScGMzQnNZWGs2SUdKc2IyTnJPMXh5WEc1OVhISmNibHh5WEc0dktseHlYRzRnS2lCQlpHUWdkR2hsSUdOdmNuSmxZM1FnWkdsemNHeGhlU0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYSEpjYmlBcUwxeHlYRzVjY2x4dWMzVnRiV0Z5ZVNCN1hISmNiaUFnWkdsemNHeGhlVG9nYkdsemRDMXBkR1Z0TzF4eVhHNTlYSEpjYmx4eVhHNHZLaUJOYVhOalhISmNiaUFnSUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOUlDb3ZYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dRV1JrSUhSb1pTQmpiM0p5WldOMElHUnBjM0JzWVhrZ2FXNGdTVVVnTVRBckxseHlYRzRnS2k5Y2NseHVYSEpjYm5SbGJYQnNZWFJsSUh0Y2NseHVJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHlYRzU5WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nUVdSa0lIUm9aU0JqYjNKeVpXTjBJR1JwYzNCc1lYa2dhVzRnU1VVZ01UQXVYSEpjYmlBcUwxeHlYRzVjY2x4dVcyaHBaR1JsYmwwZ2UxeHlYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYm4xY2NseHVJaXdpUUdsdGNHOXlkQ0FuWTI5c2IzSnpKenRjY2x4dVhISmNiaThxSUQwOVBUMDlJRUpoYzJVZ1BUMDlQVDBnS2k5Y2NseHVhSFJ0YkN4Y2NseHVZbTlrZVNCN1hISmNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUdKaFkydG5jbTkxYm1RNklFQmlaMTlqYjJ4dmNqdGNjbHh1SUNCamIyeHZjam9nUUhCeWFXMWhjbmxmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0JtYjI1MExYTnBlbVU2SURFMGNIZzdYSEpjYmlBZ2JHbHVaUzFvWldsbmFIUTZJREUxTUNVN1hISmNiaUFnWm05dWRDMW1ZVzFwYkhrNklGd2lUV2xqY205emIyWjBJRmxoU0dWcElGVkpYQ0lzSUVGeWFXRnNMQ0J6WVc1ekxYTmxjbWxtTzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYm4xY2NseHVYSEpjYm1FZ2UxeHlYRzRnSUNZNmJHbHVheXhjY2x4dUlDQW1PblpwYzJsMFpXUXNYSEpjYmlBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNCamIyeHZjam9nUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmlBZ0lDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklHNXZibVU3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dkVzVrWlhKc2FXNWxPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNWNjbHh1WTI5a1pTQjdYSEpjYmlBZ1ptOXVkQzFtWVcxcGJIazZJRndpVTI5MWNtTmxJRU52WkdVZ1VISnZYQ0lzSUVOdmJuTnZiR0Z6TENCSFpXOXlaMmxoTENCTmIyNWhZMjhzSUcxdmJtOXpjR0ZqWlN3Z1FYSnBZV3dzSUhOaGJuTXRjMlZ5YVdZN1hISmNibjFjY2x4dUlpd2lMeW9nUFQwOVBUMGdVMk55YjJ4c1ltRnlJRDA5UFQwOUlDb3ZYSEpjYmpvNkxYZGxZbXRwZEMxelkzSnZiR3hpWVhJZ2UxeHlYRzRnSUhkcFpIUm9PaUEzY0hnN1hISmNiaUFnYUdWcFoyaDBPaUEzY0hnN1hISmNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEhKY2JuMWNjbHh1WEhKY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSXRkSEpoWTJzdGNHbGxZMlVnZTF4eVhHNGdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh5WEc1OVhISmNibHh5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUm9kVzFpT25abGNuUnBZMkZzSUh0Y2NseHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJ5WjJKaEtEQXNJREFzSURBc0lEQXVNalVwTzF4eVhHNGdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh5WEc1OVhISmNibHh5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUm9kVzFpT21odmNtbDZiMjUwWVd3Z2UxeHlYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR5TlNrN1hISmNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEhKY2JuMWNjbHh1WEhKY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSTZhRzkyWlhJZ2UxeHlYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR4TlNrN1hISmNibjFjY2x4dVhISmNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEl0ZEdoMWJXSTZhRzkyWlhJZ2UxeHlYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR6TlNrN1hISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5ZMjlzYjNKekp6dGNjbHh1WEhKY2JpOHFJRXhoZVc5MWRDQXFMMXh5WEc0dVpHOWpjeUI3WEhKY2JpQWdaR2x6Y0d4aGVUb2dabXhsZUR0Y2NseHVJQ0JtYkdWNExXUnBjbVZqZEdsdmJqb2djbTkzTzF4eVhHNGdJR1pzWlhndGQzSmhjRG9nYm05M2NtRndPMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNCM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNCdFlYSm5hVzQ2SURBN1hISmNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dWZWeHlYRzVjY2x4dUx5b2dRWE5wWkdVZ0tpOWNjbHh1TG1GemFXUmxJSHRjY2x4dUlDQmthWE53YkdGNU9pQm1iR1Y0TzF4eVhHNGdJR1pzWlhndGMyaHlhVzVyT2lBd08xeHlYRzRnSUdac1pYZ3RaR2x5WldOMGFXOXVPaUJqYjJ4MWJXNDdYSEpjYmlBZ1pteGxlQzEzY21Gd09pQnViM2R5WVhBN1hISmNiaUFnZDJsa2RHZzZJREkyTUhCNE8xeHlYRzRnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhCeWFXMWhjbmxmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0JqYjJ4dmNqb2dRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0JpYjNndGMyaGhaRzkzT2lBd0lEQWdOWEI0SURKd2VDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHlYRzU5WEhKY2JseHlYRzR2S2lCTllXbHVJQ292WEhKY2JpNXRZV2x1SUh0Y2NseHVJQ0JtYkdWNE9pQXhPMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5ZMjlzYjNKekp6dGNjbHh1WEhKY2JpNWhjMmxrWlNCN1hISmNiaUFnWm05dWRDMW1ZVzFwYkhrNklGd2lVMjkxY21ObElFTnZaR1VnVUhKdlhDSXNJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JOYjI1aFkyOHNJRzF2Ym05emNHRmpaU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEhKY2JseHlYRzRnSUNaZlgyaGxZV1JsY2lCN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURBZ1lYVjBienRjY2x4dUlDQWdJR1pzWlhndGMyaHlhVzVyT2lBd08xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyNWhkaUI3WEhKY2JpQWdJQ0JtYkdWNE9pQXhPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW9NaUI3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lHaGxhV2RvZERvZ05UUndlRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBMU5IQjRPMXh5WEc0Z0lDQWdabTl1ZEMxemFYcGxPaUF5TUhCNE8xeHlYRzRnSUNBZ1ptOXVkQzEzWldsbmFIUTZJRzV2Y20xaGJEdGNjbHh1SUNBZ0lHWnZiblF0Wm1GdGFXeDVPaUJIWlc5eVoybGhMQ0JEYjI1emIyeGhjeXdnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEhKY2JpQWdJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYURNZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF3SURJd2NIZzdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmJHbHpkQ0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF4TUhCNElEQTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZhWFJsYlNCN1hISmNiaUFnSUNCb1pXbG5hSFE2SURNeWNIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTXpKd2VEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNekJ3ZUR0Y2NseHVJQ0FnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdKaTVoWTNScGRtVXNYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSE5sWTI5dVpHRnllVjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDWXVZV04wYVhabElIdGNjbHh1SUNBZ0lDQWdZbTl5WkdWeUxXeGxablE2SUROd2VDQnpiMnhwWkNCQWQyaHBkR1U3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5aGJtTm9iM0k2YkdsdWF5QjdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrSUh0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ2RHVjRkQzFrWldOdmNtRjBhVzl1T2lCdWIyNWxPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWVc1amFHOXlPbWh2ZG1WeUlIdGNjbHh1SUNBZ0lHTnZiRzl5T2lCQVltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lDQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQjFibVJsY214cGJtVTdYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JpSXNJa0JwYlhCdmNuUWdKMk52Ykc5eWN5YzdYSEpjYmx4eVhHNHViV0ZwYmlCN1hISmNiaUFnSmw5ZmFHVmhaR1Z5TEZ4eVhHNGdJQ1pmWDJadmIzUmxjaUI3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklERmxiVHRjY2x4dUlDQWdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlvTVNCN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURBZ1lYVjBienRjY2x4dUlDQWdJSEJoWkdScGJtY3RkRzl3T2lBeFpXMDdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJRFZsYlR0Y2NseHVJQ0FnSUdadmJuUXRkMlZwWjJoME9pQnViM0p0WVd3N1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNaTR3WlcwN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmJtRnRaU0I3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSEJ5YVcxaGNubGZZMjlzYjNJN1hISmNiaUFnSUNCbWIyNTBMWGRsYVdkb2REb2dibTl5YldGc08xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZkR0ZuYkdsdVpTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklERmxiU0JoZFhSdk8xeHlYRzRnSUNBZ2JXRjRMWGRwWkhSb09pQTJOakJ3ZUR0Y2NseHVJQ0FnSUd4cGJtVXRhR1ZwWjJoME9pQXhMak5sYlR0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01tVnRPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQm1iM1Z5ZEdoZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNBZ0lHWnZiblF0ZDJWcFoyaDBPaUF4TURBN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlkyUnVJSHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNbVZ0SURBN1hISmNiaUFnSUNCd1lXUmthVzVuT2lBeVpXMDdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNVFV3SlR0Y2NseHVJQ0FnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2NseHVJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCaVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCamIyeHZjam9nUUhSb2FYSmtYM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWkc5M2JteHZZV1I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREZsYlNCaGRYUnZPMXh5WEc0Z0lDQWdkMmxrZEdnNklESXdNSEI0TzF4eVhHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJKMWRIUnZiaUI3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hISmNiaUFnSUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUEwY0hnN1hISmNiaUFnSUNCd1lXUmthVzVuT2lBeE5IQjRJREk1Y0hnN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERTRjSGc3WEhKY2JpQWdJQ0JtYjI1MExXWmhiV2xzZVRvZ1hDSlRiM1Z5WTJVZ1EyOWtaU0JRY205Y0lpd2dRMjl1YzI5c1lYTXNJRWRsYjNKbmFXRXNJRTF2Ym1GamJ5d2diVzl1YjNOd1lXTmxMQ0JCY21saGJDd2djMkZ1Y3kxelpYSnBaanRjY2x4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUJ6ZFdOalpYTnpYMk52Ykc5eU8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVYSEpjYmlBZ0lDQW1PbXhwYm1zc1hISmNiaUFnSUNBbU9uWnBjMmwwWldRc1hISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCM2FHbDBaVHRjY2x4dUlDQWdJQ0FnZEdWNGRDMWtaV052Y21GMGFXOXVPaUJ1YjI1bE8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZabTl2ZEdWeUlIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01DQXpaVzA3WEhKY2JpQWdJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQjlYSEpjYm4xY2NseHVJaXdpUUdsdGNHOXlkQ0FuWTI5c2IzSnpKenRjY2x4dVhISmNiaTV6WldOMGFXOXVJSHRjY2x4dUlDQnRZWEpuYVc0NklERmxiU0F3TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ1pmWDJobFlXUmxjaXhjY2x4dUlDQW1YMTlqYjI1MFpXNTBMRnh5WEc0Z0lDWmZYMlp2YjNSbGNpQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQWdNMlZ0TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNScGRHeGxJSHRjY2x4dUlDQWdJR052Ykc5eU9pQkFkR2hwY21SZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmd6SUh0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBY0hKcGJXRnllVjlqYjJ4dmNqdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNUzR6TldWdE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZhRFFnZTF4eVhHNGdJQ0FnWm05dWRDMXphWHBsT2lBeExqRmxiVHRjY2x4dUlDQWdJR052Ykc5eU9pQkFkR2hwY21SZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmcxSUh0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01XVnRPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQm1iM1Z5ZEdoZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMlJzTEZ4eVhHNGdJQ1pmWDJSMExGeHlYRzRnSUNaZlgyUmtJSHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREE3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWkd3Z2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMlIwSUh0Y2NseHVJQ0FnSUdScGMzQnNZWGs2YVc1c2FXNWxMV0pzYjJOck8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZaR1FnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVHBwYm14cGJtVXRZbXh2WTJzN1hISmNiaUFnSUNCamIyeHZjam9nUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTl3Y21VZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBeVpXMGdNRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREZsYlR0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01UUndlRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBeE5UQWxPMXh5WEc0Z0lDQWdkR1Y0ZEMxaGJHbG5iam9nYkdWbWREdGNjbHh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQmlaMTlqYjJ4dmNqdGNjbHh1SUNBZ0lHSnZjbVJsY2pvZ01YQjRJSE52Ykdsa0lFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0JpYjNKa1pYSXRjbUZrYVhWek9pQTBjSGc3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSFJvYVhKa1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyTnZaR1VnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nWW14dlkyczdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5bWIyOTBaWElnZTF4eVhHNGdJQ0FnWW05eVpHVnlMWFJ2Y0RvZ01YQjRJSE52Ykdsa0lFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0J0WVhKbmFXNHRkRzl3T2lBelpXMDdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFZbWRmWTI5c2IzSTdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FHWnZkWEowYUY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUgxY2NseHVmVnh5WEc0aUxDSkFhVzF3YjNKMElDY3VMMk52Ykc5eWN5YzdYSEpjYmx4eVhHNHVZMkZ6WlNCN1hISmNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4eVhHNGdJSG90YVc1a1pYZzZJREU3WEhKY2JpQWdaR2x6Y0d4aGVUb2daM0pwWkR0Y2NseHVJQ0JuY21sa0xYUmxiWEJzWVhSbExXTnZiSFZ0Ym5NNklISmxjR1ZoZENneUxDQXhabklwTzF4eVhHNGdJR2RoY0RvZ05EQndlRHRjY2x4dUlDQndZV1JrYVc1bk9pQXhaVzA3WEhKY2JpQWdZbTl5WkdWeUxYUnZjRG94Y0hnZ2MyOXNhV1FnUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNCaWIzSmtaWEl0WW05MGRHOXRPakZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNZNllXWjBaWElnZTF4eVhHNGdJQ0FnWTI5dWRHVnVkRG9nSnljN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeU8xeHlYRzRnSUNBZ2RHOXdPaUF3TzF4eVhHNGdJQ0FnYkdWbWREb2dOVEFsTzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUNBZ2QybGtkR2c2SURBN1hISmNiaUFnSUNCaWIzSmtaWEl0YkdWbWREb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmNISmxMRnh5WEc0Z0lDWmZYM1JsZUhSaGNtVmhJSHRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUF4TlRBbE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZjSEpsTEZ4eVhHNGdJQ1pmWDJOdlpHVXNYSEpjYmlBZ0psOWZkR1Y0ZEdGeVpXRWdlMXh5WEc0Z0lDQWdabTl1ZEMxbVlXMXBiSGs2SUZ3aVEyOTFjbWxsY2lCT1pYZGNJaXdnUTI5dWMyOXNZWE1zSUVkbGIzSm5hV0VzSUVGeWFXRnNMQ0J6WVc1ekxYTmxjbWxtTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmNISmxJSHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREZsYlR0Y2NseHVJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCaVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNBZ0lHSnZjbVJsY2kxeVlXUnBkWE02SURSd2VEdGNjbHh1SUNBZ0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM1J2YjJ4aVlYSWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hISmNiaUFnSUNCb1pXbG5hSFE2SURNMmNIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTXpad2VEdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNVFJ3ZUR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBZ01UWndlRHRjY2x4dUlDQWdJSFJsZUhRdFlXeHBaMjQ2SUhKcFoyaDBPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMkZqZEdsdmJpeGNjbHh1SUNBbVgxOXlaVzF2ZG1VZ2UxeHlYRzRnSUNBZ1kzVnljMjl5T2lCd2IybHVkR1Z5TzF4eVhHNGdJQ0FnWTI5c2IzSTZJRUJ6ZFdOalpYTnpYMk52Ykc5eU8xeHlYRzRnSUNBZ2RYTmxjaTF6Wld4bFkzUTZJRzV2Ym1VN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWhZM1JwYjI0Z2UxeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhNM0I0TzF4eVhHNGdJQ0FnY0dGa1pHbHVaeTFzWldaME9pQXhNSEI0TzF4eVhHNWNjbHh1SUNBZ0lDWTZabWx5YzNRdFkyaHBiR1FnZTF4eVhHNGdJQ0FnSUNCd1lXUmthVzVuTFd4bFpuUTZJREE3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5eVpXMXZkbVVnZTF4eVhHNGdJQ0FnWm14dllYUTZJSEpwWjJoME8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZMjl1YzI5c1pTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTVRnd2NIZzdYSEpjYmlBZ0lDQmliM0prWlhJNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNSbGVIUmhjbVZoSUh0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh5WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnSUNCaWIzSmtaWEk2SUc1dmJtVTdYSEpjYmlBZ0lDQnZkWFJzYVc1bE9pQnViMjVsTzF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTVdWdE8xeHlYRzRnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZiR2x6ZEN4Y2NseHVJQ0FtWDE5cGRHVnRJSHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREE3WEhKY2JpQWdJQ0JzYVhOMExYTjBlV3hsTFhSNWNHVTZJRzV2Ym1VN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmJHbHpkQ0I3WEhKY2JpQWdJQ0JvWldsbmFIUTZJRE0yTUhCNE8xeHlYRzRnSUNBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYVhSbGJTQjdYSEpjYmlBZ0lDQm9aV2xuYUhRNklETTJjSGc3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ016WndlRHRjY2x4dUlDQWdJR04xY25OdmNqb2djRzlwYm5SbGNqdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRR2h2ZG1WeVgySm5YMk52Ykc5eU8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVmVnh5WEc0aUxDSkFhVzF3YjNKMElDY3VMMk52Ykc5eWN5YzdYSEpjYmx4eVhHNHVZblYwZEc5dWN5QjdYSEpjYmlBZ2NHOXphWFJwYjI0NklHWnBlR1ZrTzF4eVhHNGdJSG90YVc1a1pYZzZJREk3WEhKY2JpQWdkRzl3T2lBMU1DVTdYSEpjYmlBZ2NtbG5hSFE2SURFeWNIZzdYSEpjYmlBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUhkcFpIUm9PaUExTm5CNE8xeHlYRzRnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdTZ3ROVEFsS1R0Y2NseHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc1Y2NseHVJQ0FtWDE5cGRHVnRJSHRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjY2x4dUlDQWdJSG90YVc1a1pYZzZJREU3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREV3Y0hnN1hISmNiaUFnSUNCM2FXUjBhRG9nTXpad2VEdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ016WndlRHRjY2x4dUlDQWdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUEwY0hnN1hISmNiaUFnSUNCaWIzZ3RjMmhoWkc5M09pQXdJREFnTm5CNElFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHlYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJQ0FnWTNWeWMyOXlPaUJ3YjJsdWRHVnlPMXh5WEc0Z0lDQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQm1iM1Z5ZEdoZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1MbWhwWkdVZ2UxeHlYRzRnSUNBZ0lDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZllXNWphRzl5SUh0Y2NseHVJQ0FnSUNZNmJHbHVheXhjY2x4dUlDQWdJQ1k2ZG1semFYUmxaQ3hjY2x4dUlDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0JqYjJ4dmNqb2dRR1p2ZFhKMGFGOTBaWGgwWDJOdmJHOXlPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCamIyeHZjam9nUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlwWTI5dUlIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQjBiM0E2SURVd0pUdGNjbHh1SUNBZ0lHeGxablE2SURVd0pUdGNjbHh1SUNBZ0lIZHBaSFJvT2lBeU1IQjRPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXlNSEI0TzF4eVhHNGdJQ0FnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdVb0xUVXdKU3dnTFRVd0pTazdYSEpjYmlBZ0lDQm1hV3hzT2lCamRYSnlaVzUwWTI5c2IzSTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVmVnh5WEc0aVhYMD0gKi9cbiJdLCJmaWxlIjoiY3NzL2RvY3MubWluLmNzcyJ9 */ diff --git a/docs/css/example.css b/docs/css/example.css index 4a315091..55db275e 100644 --- a/docs/css/example.css +++ b/docs/css/example.css @@ -54,26 +54,23 @@ font-size: 1em; color: #999; } +.section__dl, +.section__dt, +.section__dd { + margin: 0; + padding: 0; + overflow: hidden; +} .section__dl { position: relative; z-index: 1; - overflow: hidden; } .section__dt { - position: absolute; - z-index: 2; - top: 0; - left: 0; - width: 60px; - margin: 0; - overflow: hidden; + display: inline-block; } .section__dd { - position: relative; - z-index: 1; - margin: 0 0 0 60px; + display: inline-block; color: #058942; - overflow: hidden; } .section__pre { margin: 2em 0; @@ -999,4 +996,4 @@ code, display: none; } -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLzxpbnB1dCBjc3MgMj4iLCJzY3JvbGxiYXIubGVzcyIsInNlY3Rpb24ubGVzcyIsImNhc2UubGVzcyIsInBhZ2VyLmxlc3MiLCIuLi8uLi9zcmMvdGhlbWUvc2hhZG93Lmxlc3MiLCIuLi8uLi9zcmMvdGhlbWUvaWNvbnMubGVzcyIsIi4uLy4uL3NyYy90aGVtZS92YXJpYWJsZXMubGVzcyIsIi4uLy4uL3NyYy90aGVtZS9kcmF3ZXIubGVzcyIsIi4uLy4uL3NyYy90aGVtZS9hbmNob3JzLmxlc3MiLCIuLi8uLi9zcmMvdGhlbWUvY2hhcHRlcnMubGVzcyIsIi4uLy4uL3NyYy90aGVtZS9lbGxpcHNpcy5sZXNzIiwiLi4vLi4vc3JjL3RoZW1lL3Rvb2xiYXIubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUNILG1EQUFtRDtBQUNuRCw0QkFBNEI7QUFDNUIsMkJBQTJCO0FDUDNCO0VBQ0UsV0FBQTtFQUNBLFlBQUE7RUFDQSwyQkFBQTtDRFNEO0FDTkQ7RUFDRSwyQkFBQTtDRFFEO0FDTEQ7RUFDRSxzQ0FBQTtFQUNBLDJCQUFBO0NET0Q7QUNKRDtFQUNFLHNDQUFBO0VBQ0EsMkJBQUE7Q0RNRDtBQ0hEO0VBQ0Usc0NBQUE7Q0RLRDtBQ0ZEO0VBQ0Usc0NBQUE7Q0RJRDtBRTVCRDtFQUNFLGNBQUE7RUFDQSxpQkFBQTtDRjhCRDtBRTVCQzs7O0VBR0UsY0FBQTtFQUNBLGlCQUFBO0NGOEJIO0FFM0JDO0VBQ0UsWUFBQTtDRjZCSDtBRTFCQztFQUNFLGVBQUE7RUFDQSxrQkFBQTtDRjRCSDtBRXpCQztFQUNFLGlCQUFBO0VBQ0EsWUFBQTtDRjJCSDtBRXhCQztFQUNFLGVBQUE7RUFDQSxZQUFBO0NGMEJIO0FFdkJDO0VBQ0UsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsaUJBQUE7Q0Z5Qkg7QUV0QkM7RUFDRSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLFlBQUE7RUFDQSxVQUFBO0VBQ0Es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UDtBWXJ3Qkc7RUFDRSxvQkFBQTtDWnV3Qkw7QVlod0JLOzs7Ozs7OztFQUlFLG9CQUFBO0VBQ0EsWUFBQTtDWnN3QlA7QVlwd0JPOzs7Ozs7OztFQUNFLFlBQUE7Q1o2d0JUO0FZendCSzs7RUFDRSwwQkFBQTtDWjR3QlA7QVl2d0JDOztFQUVFLFVBQUE7RUFDQSxvQ0FBQTtVQUFBLDRCQUFBO0NaeXdCSDtBWTV3QkM7O0VBTUksc0JBQUE7Q1owd0JMO0FZdHdCQztFQUNFLFVBQUE7Q1p3d0JIO0FZdHdCRztFQUNFLFdBQUE7Q1p3d0JMO0FZcHdCQztFQUNFLGFBQUE7Q1pzd0JIO0FZcHdCRztFQUNFLGNBQUE7Q1pzd0JMO0FZbHdCQzs7RUFFRSxvQ0FBQTtVQUFBLDRCQUFBO0VBQ0EsWUFBQTtDWm93Qkg7QVlqd0JDO0VBQ0UsU0FBQTtFQUNBLFlBQUE7Q1ptd0JIO0FZandCRztFQUNFLGFBQUE7Q1ptd0JMO0FZL3ZCQztFQUNFLFNBQUE7RUFDQSxXQUFBO0NaaXdCSDtBWS92Qkc7RUFDRSxZQUFBO0NaaXdCTDtBWXh2Qks7Ozs7RUFDRSxjQUFBO0NaNnZCUCIsImZpbGUiOiJleGFtcGxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc2hhZG93Lmxlc3MgLSDpmLTlvbHmoLflvI/orr7nva4gbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMjBcbiAqL1xuLyogPT09PT09PT09PSBjb2xvcnMudGhlbWUgLSDln7rnoYDpopzoibLlj5jph4/pm4blkIggPT09PT09PT09PSAqL1xuLyogPT09PT09IOmYtOW9seagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cbi8qID09PT09IFNjcm9sbGJhciA9PT09PSAqL1xuOjotd2Via2l0LXNjcm9sbGJhciB7XG4gIHdpZHRoOiA3cHg7XG4gIGhlaWdodDogN3B4O1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2stcGllY2Uge1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6dmVydGljYWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG9yaXpvbnRhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhcjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM1KTtcbn1cbi5zZWN0aW9uIHtcbiAgbWFyZ2luOiAxZW0gMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX19oZWFkZXIsXG4uc2VjdGlvbl9fY29udGVudCxcbi5zZWN0aW9uX19mb290ZXIge1xuICBtYXJnaW46IDAgM2VtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX3RpdGxlIHtcbiAgY29sb3I6ICM2NjY7XG59XG4uc2VjdGlvbl9faDMge1xuICBjb2xvcjogIzFmOGRkNjtcbiAgZm9udC1zaXplOiAxLjM1ZW07XG59XG4uc2VjdGlvbl9faDQge1xuICBmb250LXNpemU6IDEuMWVtO1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oNSB7XG4gIGZvbnQtc2l6ZTogMWVtO1xuICBjb2xvcjogIzk5OTtcbn1cbi5zZWN0aW9uX19kbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX19kdCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogNjBweDtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2RkIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDAgMCAwIDYwcHg7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX3ByZSB7XG4gIG1hcmdpbjogMmVtIDA7XG4gIHBhZGRpbmc6IDFlbTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBjb2xvcjogIzY2NjtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uc2VjdGlvbl9fY29kZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDAgYXV0bztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX19mb290ZXIge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgbWFyZ2luLXRvcDogM2VtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBjb2xvcjogIzk5OTtcbn1cbi5jYXNlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xuICBnYXA6IDQwcHg7XG4gIHBhZGRpbmc6IDFlbTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2U6YWZ0ZXIge1xuICBjb250ZW50OiAnJztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDUwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMDtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX3ByZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX2NvZGUsXG4uY2FzZV9fdGV4dGFyZWEge1xuICBmb250LWZhbWlseTogXCJDb3VyaWVyIE5ld1wiLCBDb25zb2xhcywgR2VvcmdpYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uY2FzZV9fcHJlIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX190b29sYmFyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19hY3Rpb24sXG4uY2FzZV9fcmVtb3ZlIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzA1ODk0MjtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4uY2FzZV9fYWN0aW9uIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG4uY2FzZV9fYWN0aW9uOmZpcnN0LWNoaWxkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xufVxuLmNhc2VfX3JlbW92ZSB7XG4gIGZsb2F0OiByaWdodDtcbn1cbi5jYXNlX19jb25zb2xlIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMTgwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fdGV4dGFyZWEge1xuICBtYXJnaW46IDAgYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nOiAxZW07XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2xpc3QsXG4uY2FzZV9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX2xpc3Qge1xuICBoZWlnaHQ6IDM2MHB4O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9faXRlbSB7XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLmNhc2VfX2l0ZW06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xufVxuLnBhcGVyIHtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgbWFyZ2luOiAyZW0gYXV0bztcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHBhZGRpbmc6IDJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5wYXBlci5mbGV4IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnBhcGVyLmZsZXggLmFydGljbGUge1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB3aWR0aDogMTAwJTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5wYXBlci5mbGV4IC5hcnRpY2xlX19tYWluIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5wYXBlci5mbGV4IC5hcnRpY2xlX19hc2lkZSB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4uaGVhZGVyIHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgei1pbmRleDogMztcbiAgdG9wOiAwO1xuICBtYXJnaW46IDAgYXV0bztcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5oZWFkZXJfc3RpY2t5IHtcbiAgcGFkZGluZy1sZWZ0OiAyNjBweDtcbn1cbi5hcnRpY2xlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBhZGRpbmc6IDJlbSAwO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xufVxuLmFydGljbGVfX21haW4ge1xuICBmbGV4OiAxO1xuICBwYWRkaW5nOiAwIDJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9fY29udGVudCxcbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uX19mb290ZXIsXG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9faGVhZGVyIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9faGVhZGVyLFxuLmFydGljbGVfX21haW4gLnNlY3Rpb25fX2NvbnRlbnQge1xuICBtYXJnaW46IDA7XG59XG4uYXJ0aWNsZV9fYXNpZGUge1xuICBmbGV4LXNocmluazogMDtcbiAgd2lkdGg6IDI0MHB4O1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG59XG4uYXJ0aWNsZV9fYXNpZGUubHRyIHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWxlZnQ6IG5vbmU7XG59XG4uYXJ0aWNsZV9fYXNpZGUgLm91dGxpbmUtY2hhcHRlcnMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxucHJlLFxuLnNlY3Rpb25fX3ByZSB7XG4gIHBhZGRpbmc6IDJlbTtcbiAgZm9udC1mYW1pbHk6IFwiQ291cmllciBOZXdcIiwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuY29kZSxcbi5zZWN0aW9uX19jb2RlIHtcbiAgZm9udC1mYW1pbHk6IFwiQ291cmllciBOZXdcIiwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbn1cbi5mb290ZXIge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RjZGZlNjtcbiAgcGFkZGluZzogM2VtIDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5mb290ZXIgYTpsaW5rLFxuLmZvb3RlciBhOnZpc2l0ZWQsXG4uZm9vdGVyIGE6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLmZvb3RlciBhOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG4udXRpbHMtYm9yZGVyLXJpZ2h0IHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLyogPT09PT09PT09PSBpY29uLnRoZW1lIC0gc3ZnIOWbvuagh+eahOagt+W8jyA9PT09PT09PT09ICovXG4ub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdpZHRoOiAxZW07XG4gIGhlaWdodDogMWVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaWNvbl9fc3ZnIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbjpyb290IHtcbiAgLS1vdXRsaW5lLXpJbmRleDogMjAwMDtcbiAgLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQ6IDEwMCU7XG4gIC0tb3V0bGluZS1jaGFwdGVycy13aWR0aDogMTAwJTtcbn1cbi5vdXRsaW5lLWRyYXdlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogLTE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX21vZGFsIHtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjE7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19tYWluLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICB3aWR0aDogMTAwJTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX190aXRsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogNTJweDtcbiAgbGluZS1oZWlnaHQ6IDUycHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBtYXJnaW46IDAgMTZweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBjb2xvcjogIzk5OTtcbiAgZm9udC1zaXplOiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlOmhvdmVyIHtcbiAgY29sb3I6ICM2NjY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19vdmVybGF5IHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAwLjE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICB3aWR0aDogMjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21pbmkge1xuICB3aWR0aDogNDgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3NtYWxsLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9zbWFsbCB7XG4gIHdpZHRoOiA1NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIHdpZHRoOiA2ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICB3aWR0aDogNzIwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX2xhcmdlLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9sYXJnZSB7XG4gIHdpZHRoOiA5NjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTczMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTI5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC02OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yixcbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueSB7XG4gIGhlaWdodDogMjQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21pbmkge1xuICBoZWlnaHQ6IDMyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICBoZWlnaHQ6IDM2MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyIHtcbiAgaGVpZ2h0OiA0MDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICBoZWlnaHQ6IDQ0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICBoZWlnaHQ6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB0b3A6IGluaXRpYWw7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA0ZW0pO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3J0bCB7XG4gIHJpZ2h0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBsZWZ0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl90dGIge1xuICB0b3A6IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIGJvdHRvbTogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfcnRsLFxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xufVxuLm91dGxpbmUtZHJhd2VyX2Z1bGwge1xuICBwYWRkaW5nOiAwO1xufVxuLm91dGxpbmUtaGVhZGluZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6bGluayxcbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMWY4ZGQ2O1xufVxuLm91dGxpbmUtaGVhZGluZzpob3ZlciAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ub3V0bGluZS1oZWFkaW5nX3N0YXJ0OmhvdmVyIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4ub3V0bGluZS1oZWFkaW5nX3N0YXJ0IC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgbGVmdDogLTFlbTtcbn1cbi8qKlxuICogZWxsaXBzaXMubGVzcyAtIOaWh+acrOecgeeVpSBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxuICovXG4vKiA9PT09PT0g5paH5pys55yB55Wl5Ye95pWwID09PT09PSAqL1xuLm91dGxpbmUtY2hhcHRlcnMge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IHZhcigtLW91dGxpbmUtY2hhcHRlcnMtd2lkdGgpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX190aXRsZSB7XG4gIG1hcmdpbjogMCAxNnB4O1xuICBoZWlnaHQ6IDQwcHg7XG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICBwYWRkaW5nOiAwIDE2cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1jaGFwdGVyc19fbWFpbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX2xpc3QsXG4ub3V0bGluZS1jaGFwdGVyc19fc3ViamVjdCxcbi5vdXRsaW5lLWNoYXB0ZXJzX19pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX19saXN0IHtcbiAgcGFkZGluZzogMC41ZW0gMDtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX19zdWJqZWN0IHtcbiAgcGFkZGluZy1sZWZ0OiAxZW07XG59XG4ub3V0bGluZS1jaGFwdGVyc19faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX19wbGFjZWhvbGRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAzMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xuICBib3JkZXItbGVmdDogMnB4IHNvbGlkICMwNTg5NDI7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1jaGFwdGVyc19fYW5jaG9yIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAwIDEuNWVtO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICM1NTU7XG59XG4ub3V0bGluZS1jaGFwdGVyc19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS1jaGFwdGVyc19fY29kZSB7XG4gIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfYWN0aXZlLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtY2hhcHRlcnNfYWN0aXZlLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtY2hhcHRlcnNfYWN0aXZlLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBmb250LXdlaWdodDogNDAwO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfc3RpY2t5LFxuLm91dGxpbmUtY2hhcHRlcnNfZml4ZWQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xuICB0b3A6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1jaGFwdGVyc19zdGlja3kgLm91dGxpbmUtY2hhcHRlcnNfX3RpdGxlLFxuLm91dGxpbmUtY2hhcHRlcnNfZml4ZWQgLm91dGxpbmUtY2hhcHRlcnNfX3RpdGxlLFxuLm91dGxpbmUtY2hhcHRlcnNfc3RpY2t5IC5vdXRsaW5lLWNoYXB0ZXJzX19tYWluLFxuLm91dGxpbmUtY2hhcHRlcnNfZml4ZWQgLm91dGxpbmUtY2hhcHRlcnNfX21haW4ge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLm91dGxpbmUtY2hhcHRlcnNfc3RpY2t5IC5vdXRsaW5lLWNoYXB0ZXJzX190aXRsZSxcbi5vdXRsaW5lLWNoYXB0ZXJzX2ZpeGVkIC5vdXRsaW5lLWNoYXB0ZXJzX190aXRsZSB7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfc3RpY2t5IC5vdXRsaW5lLWNoYXB0ZXJzX19tYWluLFxuLm91dGxpbmUtY2hhcHRlcnNfZml4ZWQgLm91dGxpbmUtY2hhcHRlcnNfX21haW4ge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX3N0aWNreSB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIG1heC1oZWlnaHQ6IHZhcigtLW91dGxpbmUtc3RpY2t5LWhlaWdodCk7XG59XG4ub3V0bGluZS1jaGFwdGVyc19maXhlZCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgbWF4LWhlaWdodDogMTAwJTtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1jaGFwdGVyc19mb2xkZWQge1xuICB3aWR0aDogMDtcbn1cbi8qID09PT09PT09PT0gYnV0dG9ucy50aGVtZSAtIOaMiemSruWvvOiIquagt+W8jyA9PT09PT09PT09ICovXG4ub3V0bGluZS10b29sYmFyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiA5OTk5OTtcbiAgbWFyZ2luOiAwO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDEwcHg7XG4gIHdpZHRoOiAzNnB4O1xuICBoZWlnaHQ6IDM2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiAjNTU1O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5oaWRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS10b29sYmFyX19pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0MjtcbiAgYm9yZGVyLWNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcm91bmRlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJvcmRlci1yYWRpdXM6IDE4cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIGNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluazpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZDpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQ6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXI6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG59XG4ub3V0bGluZS10b29sYmFyX3R0Yixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IHtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiAub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2J0dCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiB7XG4gIHRvcDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICB0b3A6IC01NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9idHQge1xuICBib3R0b206IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX2J0dC5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgYm90dG9tOiAtNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsLFxuLm91dGxpbmUtdG9vbGJhcl9sdHIge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIHdpZHRoOiA1NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwge1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bC5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgcmlnaHQ6IC04NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9sdHIge1xuICB0b3A6IDUwJTtcbiAgbGVmdDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfbHRyLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBsZWZ0OiAtODZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9ydGwgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX2J0dCAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfbHRyIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbiIsIi8qID09PT09IFNjcm9sbGJhciA9PT09PSAqL1xyXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcclxuICB3aWR0aDogN3B4O1xyXG4gIGhlaWdodDogN3B4O1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcclxuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxufVxyXG5cclxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcclxuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxufVxyXG5cclxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG59XHJcbiIsIkBpbXBvcnQgJ2NvbG9ycyc7XHJcblxyXG4uc2VjdGlvbiB7XHJcbiAgbWFyZ2luOiAxZW0gMDtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19oZWFkZXIsXHJcbiAgJl9fY29udGVudCxcclxuICAmX19mb290ZXIge1xyXG4gICAgbWFyZ2luOiAwIDNlbTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX19oMyB7XHJcbiAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDEuMzVlbTtcclxuICB9XHJcblxyXG4gICZfX2g0IHtcclxuICAgIGZvbnQtc2l6ZTogMS4xZW07XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX19oNSB7XHJcbiAgICBmb250LXNpemU6IDFlbTtcclxuICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX19kbCB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2R0IHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDYwcHg7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fZGQge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIG1hcmdpbjogMCAwIDAgNjBweDtcclxuICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19wcmUge1xyXG4gICAgbWFyZ2luOiAyZW0gMDtcclxuICAgIHBhZGRpbmc6IDFlbTtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxNTAlO1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcblxyXG4gICZfX2NvZGUge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19mb290ZXIge1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBtYXJnaW4tdG9wOiAzZW07XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4uY2FzZSB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgZGlzcGxheTogZ3JpZDtcclxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xyXG4gIGdhcDogNDBweDtcclxuICBwYWRkaW5nOiAxZW07XHJcbiAgYm9yZGVyLXRvcDoxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICBib3JkZXItYm90dG9tOjFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICY6YWZ0ZXIge1xyXG4gICAgY29udGVudDogJyc7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlLFxyXG4gICZfX3RleHRhcmVhIHtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxNTAlO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlLFxyXG4gICZfX2NvZGUsXHJcbiAgJl9fdGV4dGFyZWEge1xyXG4gICAgZm9udC1mYW1pbHk6IFwiQ291cmllciBOZXdcIiwgQ29uc29sYXMsIEdlb3JnaWEsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDFlbTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcblxyXG4gICZfX3Rvb2xiYXIge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBoZWlnaHQ6IDM2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMzZweDtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2FjdGlvbixcclxuICAmX19yZW1vdmUge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgfVxyXG5cclxuICAmX19hY3Rpb24ge1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xyXG5cclxuICAgICY6Zmlyc3QtY2hpbGQge1xyXG4gICAgICBwYWRkaW5nLWxlZnQ6IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19yZW1vdmUge1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gIH1cclxuXHJcbiAgJl9fY29uc29sZSB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGhlaWdodDogMTgwcHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3RleHRhcmVhIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICBvdXRsaW5lOiBub25lO1xyXG4gICAgcGFkZGluZzogMWVtO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCxcclxuICAmX19pdGVtIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCB7XHJcbiAgICBoZWlnaHQ6IDM2MHB4O1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9faXRlbSB7XHJcbiAgICBoZWlnaHQ6IDM2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMzZweDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGhvdmVyX2JnX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCIucGFwZXIge1xyXG4gIC5zaGFkb3dfbGlnaHRfcmVndWxhcigpO1xyXG4gIG1hcmdpbjogMmVtIGF1dG87XHJcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XHJcbiAgcGFkZGluZzogMmVtO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG5cclxuICAmLmZsZXgge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICBmbGV4LXdyYXA6IG5vd3JhcDtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgLmFydGljbGUge1xyXG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuXHJcbiAgICAgICZfX21haW4ge1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX19hc2lkZSB7XHJcbiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4uaGVhZGVyIHtcclxuICBwb3NpdGlvbjogc3RpY2t5O1xyXG4gIHotaW5kZXg6IDM7XHJcbiAgdG9wOiAwO1xyXG4gIG1hcmdpbjogMCBhdXRvO1xyXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX3N0aWNreSB7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDI2MHB4O1xyXG4gIH1cclxufVxyXG5cclxuLmFydGljbGUge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICBmbGV4LXdyYXA6IG5vd3JhcDtcclxuICBwYWRkaW5nOiAyZW0gMDtcclxuICBmb250LXNpemU6IDE2cHg7XHJcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XHJcblxyXG4gICZfX21haW4ge1xyXG4gICAgZmxleDogMTtcclxuICAgIHBhZGRpbmc6IDAgMmVtO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAuc2VjdGlvbiB7XHJcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xyXG5cclxuICAgICAgJl9fY29udGVudCxcclxuICAgICAgJl9fZm9vdGVyLFxyXG4gICAgICAmX19oZWFkZXIge1xyXG4gICAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX19oZWFkZXIsXHJcbiAgICAgICZfX2NvbnRlbnQge1xyXG4gICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fYXNpZGUge1xyXG4gICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICB3aWR0aDogMjQwcHg7XHJcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xyXG5cclxuICAgICYubHRyIHtcclxuICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XHJcbiAgICB9XHJcblxyXG4gICAgLm91dGxpbmUtY2hhcHRlcnMge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5wcmUsXHJcbi5zZWN0aW9uX19wcmUge1xyXG4gIHBhZGRpbmc6IDJlbTtcclxuICBmb250LWZhbWlseTogXCJDb3VyaWVyIE5ld1wiLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgb3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuXHJcbmNvZGUsXHJcbi5zZWN0aW9uX19jb2RlIHtcclxuICBmb250LWZhbWlseTogXCJDb3VyaWVyIE5ld1wiLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxuICBmb250LXNpemU6IDE2cHg7XHJcbn1cclxuXHJcbi5mb290ZXIge1xyXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbiAgcGFkZGluZzogM2VtIDA7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG5cclxuICBhIHtcclxuICAgICY6bGluayxcclxuICAgICY6dmlzaXRlZCxcclxuICAgICY6aG92ZXIge1xyXG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4udXRpbHMtYm9yZGVyLXJpZ2h0IHtcclxuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbn1cclxuXHJcbi5oaWRkZW4ge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuIiwiLyoqXHJcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXHJcbiAqIFVwZGF0ZTogMjAyMi4zLjIwXHJcbiAqL1xyXG5AaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4vKiA9PT09PT0g6Zi05b2x5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xyXG4uc2hhZG93KEBvZmZzZXQ6IDAgMCA2cHggMXB4LCBAY29sb3I6IEBwcmltYXJ5X2JvcmRlcl9jb2xvcikge1xyXG4gIGJveC1zaGFkb3c6IEBvZmZzZXQgQGNvbG9yO1xyXG59XHJcblxyXG4uc2hhZG93X3JlZ3VsYXIoQGNvbG9yOiBAcHJpbWFyeV9ib3JkZXJfY29sb3IpIHtcclxuICAuc2hhZG93KDAgMCA2cHggMXB4LCBAY29sb3IpO1xyXG59XHJcblxyXG4uc2hhZG93X2xhcmdlKEBjb2xvcjogQHByaW1hcnlfYm9yZGVyX2NvbG9yKSB7XHJcbiAgLnNoYWRvdygwIDAgMTJweCAxcHgsIEBjb2xvcik7XHJcbn1cclxuXHJcbi5zaGFkb3dfbGlnaHRfcmVndWxhcigpIHtcclxuICAuc2hhZG93X3JlZ3VsYXIoKTtcclxufVxyXG5cclxuLnNoYWRvd19saWdodF9sYXJnZSgpIHtcclxuICAuc2hhZG93X2xhcmdlKCk7XHJcbn1cclxuXHJcbi5zaGFkb3dfZGFya19yZWd1bGFyKCkge1xyXG4gIC5zaGFkb3dfcmVndWxhcihAc2Vjb25kYXJ5X2JvcmRlcl9jb2xvcik7XHJcbn1cclxuXHJcbi5zaGFkb3dfZGFya19sYXJnZSgpIHtcclxuICAuc2hhZG93X2xhcmdlKEBzZWNvbmRhcnlfYm9yZGVyX2NvbG9yKTtcclxufVxyXG4iLCIvKiA9PT09PT09PT09IGljb24udGhlbWUgLSBzdmcg5Zu+5qCH55qE5qC35byPID09PT09PT09PT0gKi9cclxuLm91dGxpbmUtaWNvbiB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcbiAgd2lkdGg6IDFlbTtcclxuICBoZWlnaHQ6IDFlbTtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19zdmcge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgd2lkdGg6IDFlbTtcclxuICAgIGhlaWdodDogMWVtO1xyXG4gICAgZmlsbDogY3VycmVudGNvbG9yO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxufVxyXG4iLCI6cm9vdCB7XHJcbiAgLS1vdXRsaW5lLXpJbmRleDogMjAwMDtcclxuICAtLW91dGxpbmUtc3RpY2t5LWhlaWdodDogMTAwJTtcclxuICAtLW91dGxpbmUtY2hhcHRlcnMtd2lkdGg6IDEwMCU7XHJcbn1cclxuIiwiQGltcG9ydCAnLi92YXJpYWJsZXMnO1xyXG5AaW1wb3J0ICcuL2NvbG9ycyc7XHJcbkBpbXBvcnQgJy4vc2hhZG93JztcclxuXHJcbi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IC0xO1xyXG4gIHRvcDogMDtcclxuICBsZWZ0OiAwO1xyXG4gIG1hcmdpbjogMDtcclxuICB3aWR0aDogMTAwJTtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICB2aXNpYmlsaXR5OiBoaWRkZW47XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fbW9kYWwge1xyXG4gICAgLnNoYWRvd19saWdodF9yZWd1bGFyKCk7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjE7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjRzO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2hlYWRlcixcclxuICAmX19tYWluLFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgfVxyXG5cclxuICAmX19oZWFkZXIsXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gIH1cclxuXHJcbiAgJl9fdGl0bGUsXHJcbiAgJl9fbWFpbixcclxuICAmX19mb290ZXIge1xyXG4gICAgcGFkZGluZzogMCAxNnB4O1xyXG4gIH1cclxuXHJcbiAgJl9faGVhZGVyLFxyXG4gICZfX3RpdGxlIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGhlaWdodDogNTJweDtcclxuICAgIGxpbmUtaGVpZ2h0OiA1MnB4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3RpdGxlIHtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgICBtYXJnaW46IDAgMTZweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fY2xvc2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgcmlnaHQ6IDEycHg7XHJcbiAgICB3aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgLm91dGxpbmUtaWNvbiB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgei1pbmRleDogMjtcclxuICAgICAgdG9wOiAwO1xyXG4gICAgICBsZWZ0OiAwO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19tYWluIHtcclxuICAgIGZsZXg6IDE7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcblxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX292ZXJsYXkge1xyXG4gICAgY29udGVudDogJyc7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgb3BhY2l0eTogMC4xO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfcnRsLFxyXG4gICZfbHRyIHtcclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgIHdpZHRoOiAyODBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICB3aWR0aDogNDgwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgIHdpZHRoOiA1NDBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICB3aWR0aDogNjgwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICB3aWR0aDogNzIwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgIHdpZHRoOiA5NjBweDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9ydGwge1xyXG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC0yOTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC00OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtNTUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtNjkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC03MzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtOTcwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2x0ciB7XHJcbiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTI5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtNDkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtNTUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC02OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtNzMwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtOTcwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YixcclxuICAmX2J0dCB7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgaGVpZ2h0OiAyNDBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICBoZWlnaHQ6IDMyMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICBoZWlnaHQ6IDM2MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgIGhlaWdodDogNDAwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICBoZWlnaHQ6IDQ0MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICBoZWlnaHQ6IDQ4MHB4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YiB7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTI1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC0zMzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTM3MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC00MTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC00NTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTQ5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9idHQge1xyXG4gICAgdG9wOiBpbml0aWFsO1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC0yNTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtMzMwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC0zNzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtNDEwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtNDUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC00OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfb3BlbmVkIHtcclxuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XHJcbiAgICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuXHJcbiAgICAgICZfcnRsIHtcclxuICAgICAgICByaWdodDogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sdHIge1xyXG4gICAgICAgIGxlZnQ6IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfdHRiIHtcclxuICAgICAgICB0b3A6IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfYnR0IHtcclxuICAgICAgICBib3R0b206IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfb2Zmc2V0IHtcclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3J0bCxcclxuICAgICAgJl9sdHIge1xyXG4gICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcclxuICAgICAgICB0b3A6IDUwJTtcclxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfdHRiLFxyXG4gICAgICAmX2J0dCB7XHJcbiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDRlbSk7XHJcbiAgICAgICAgbGVmdDogNTAlO1xyXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9vcGVuZWQge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAgICAgJl9ydGwge1xyXG4gICAgICAgICAgICByaWdodDogMmVtO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICZfbHRyIHtcclxuICAgICAgICAgICAgbGVmdDogMmVtO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICZfdHRiIHtcclxuICAgICAgICAgICAgdG9wOiAyZW07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgJl9idHQge1xyXG4gICAgICAgICAgICBib3R0b206IDJlbTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfYXV0byB7XHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl9ydGwsXHJcbiAgICAgICZfbHRyIHtcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9mdWxsIHtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJy4vY29sb3JzJztcclxuXHJcbi5vdXRsaW5lLWhlYWRpbmcge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX2FuY2hvciB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG5cclxuICAgICY6bGluayxcclxuICAgICY6dmlzaXRlZCxcclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICB9XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAcHJpbWFyeV9jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICY6aG92ZXIge1xyXG4gICAgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcclxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9zdGFydCB7XHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcbiAgICB9XHJcblxyXG4gICAgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICB6LWluZGV4OiAyO1xyXG4gICAgICB0b3A6IDUwJTtcclxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xyXG4gICAgICBsZWZ0OiAtMWVtO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuL3ZhcmlhYmxlcyc7XHJcbkBpbXBvcnQgJy4vY29sb3JzJztcclxuQGltcG9ydCAnLi9lbGxpcHNpcyc7XHJcblxyXG4ub3V0bGluZS1jaGFwdGVycyB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHdpZHRoOiB2YXIoLS1vdXRsaW5lLWNoYXB0ZXJzLXdpZHRoKTtcclxuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xyXG4gIG92ZXJmbG93OiBhdXRvO1xyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBtYXJnaW46IDAgMTZweDtcclxuICAgIGhlaWdodDogNDBweDtcclxuICAgIGxpbmUtaGVpZ2h0OiA0MHB4O1xyXG4gICAgcGFkZGluZzogMCAxNnB4O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbWFpbiB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2xpc3QsXHJcbiAgJl9fc3ViamVjdCxcclxuICAmX19pdGVtIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2xpc3Qge1xyXG4gICAgcGFkZGluZzogMC41ZW0gMDtcclxuICB9XHJcblxyXG4gICZfX3N1YmplY3Qge1xyXG4gICAgcGFkZGluZy1sZWZ0OiAxZW07XHJcbiAgfVxyXG5cclxuICAmX19pdGVtIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGxpbmUtaGVpZ2h0OiAzMHB4O1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3BsYWNlaG9sZGVyIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDMwcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAaG92ZXJfYmdfY29sb3I7XHJcbiAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkIEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fYW5jaG9yIHtcclxuICAgIC5lbGxpcHNpcygxKTtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgcGFkZGluZzogMCAxLjVlbTtcclxuXHJcbiAgICAmOmxpbmssXHJcbiAgICAmOnZpc2l0ZWQsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgICBjb2xvcjogQHNlY29uZGFyeV90ZXh0X2NvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19jb2RlIHtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xyXG4gIH1cclxuXHJcbiAgJl9hY3RpdmUge1xyXG4gICAgJi5vdXRsaW5lLWNoYXB0ZXJzX19hbmNob3Ige1xyXG4gICAgICAmOmxpbmssXHJcbiAgICAgICY6dmlzaXRlZCxcclxuICAgICAgJjpob3ZlciB7XHJcbiAgICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfc3RpY2t5LFxyXG4gICZfZml4ZWQge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcclxuICAgIHRvcDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgLm91dGxpbmUtY2hhcHRlcnMge1xyXG4gICAgICAmX190aXRsZSxcclxuICAgICAgJl9fbWFpbiB7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fdGl0bGUge1xyXG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX19tYWluIHtcclxuICAgICAgICBmbGV4OiAxO1xyXG4gICAgICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3N0aWNreSB7XHJcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xyXG4gICAgbWF4LWhlaWdodDogdmFyKC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0KTtcclxuICB9XHJcblxyXG4gICZfZml4ZWQge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgbWF4LWhlaWdodDogMTAwJTtcclxuICB9XHJcblxyXG4gICZfaGlkZGVuIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG5cclxuICAmX2ZvbGRlZCB7XHJcbiAgICB3aWR0aDogMDtcclxuICB9XHJcbn1cclxuIiwiLyoqXG4gKiBlbGxpcHNpcy5sZXNzIC0g5paH5pys55yB55WlIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjExXG4gKi9cblxuLyogPT09PT09IOaWh+acrOecgeeVpeWHveaVsCA9PT09PT0gKi9cbi5lbGxpcHNpcyAoQGxpbmVzKSB3aGVuIChAbGluZXM9MSkge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmVsbGlwc2lzIChAbGluZXMpIHdoZW4gKEBsaW5lcz49Mikge1xuICAtd2Via2l0LWxpbmUtY2xhbXA6IEBsaW5lcztcbiAgZGlzcGxheTogYm94O1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbiIsIi8qID09PT09PT09PT0gYnV0dG9ucy50aGVtZSAtIOaMiemSruWvvOiIquagt+W8jyA9PT09PT09PT09ICovXHJcbkBpbXBvcnQgJy4vY29sb3JzJztcclxuQGltcG9ydCAnLi9zaGFkb3cnO1xyXG5cclxuLm91dGxpbmUtdG9vbGJhciB7XHJcbiAgcG9zaXRpb246IGZpeGVkO1xyXG4gIHotaW5kZXg6IDk5OTk5O1xyXG4gIG1hcmdpbjogMDtcclxuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX2J1dHRvbiB7XHJcbiAgICAuc2hhZG93X2xpZ2h0X3JlZ3VsYXIoKTtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBtYXJnaW46IDEwcHg7XHJcbiAgICB3aWR0aDogMzZweDtcclxuICAgIGhlaWdodDogMzZweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjb2xvcjogQHNlY29uZGFyeV90ZXh0X2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgICBib3JkZXItY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgICYuaGlkZSB7XHJcbiAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19hbmNob3Ige1xyXG4gICAgJjpsaW5rLFxyXG4gICAgJjp2aXNpdGVkLFxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9faWNvbiB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICB3aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgZmlsbDogY3VycmVudGNvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfYWN0aXZlIHtcclxuICAgICYub3V0bGluZS10b29sYmFyIHtcclxuICAgICAgJl9fYnV0dG9uIHtcclxuICAgICAgICBjb2xvcjogQHdoaXRlO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcblxyXG4gICAgICAgICY6aG92ZXIge1xyXG4gICAgICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAub3V0bGluZS10b29sYmFyX19hbmNob3Ige1xyXG4gICAgICAmOmxpbmssXHJcbiAgICAgICY6dmlzaXRlZCxcclxuICAgICAgJjpob3ZlciB7XHJcbiAgICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9yb3VuZGVkIHtcclxuICAgICYub3V0bGluZS10b29sYmFyX19idXR0b24ge1xyXG4gICAgICBib3JkZXItcmFkaXVzOiAxOHB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9kaXNhYmxlZCB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcixcclxuICAgIC5vdXRsaW5lLXRvb2xiYXIge1xyXG4gICAgICAmX19hbmNob3I6bGluayxcclxuICAgICAgJl9fYW5jaG9yOnZpc2l0ZWQsXHJcbiAgICAgICZfX2FuY2hvcjpob3ZlcixcclxuICAgICAgJl9fYnV0dG9uIHtcclxuICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG4gICAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcblxyXG4gICAgICAgICY6aG92ZXIge1xyXG4gICAgICAgICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRpc2FibGVkX2JnX2NvbG9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YixcclxuICAmX2J0dCB7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcblxyXG4gICAgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcclxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIge1xyXG4gICAgdG9wOiAxMnB4O1xyXG5cclxuICAgICYub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XHJcbiAgICAgIHRvcDogLTU2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2J0dCB7XHJcbiAgICBib3R0b206IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgYm90dG9tOiAtNTZweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcnRsLFxyXG4gICZfbHRyIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIHdpZHRoOiA1NnB4O1xyXG4gIH1cclxuXHJcbiAgJl9ydGwge1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICByaWdodDogMTJweDtcclxuXHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICByaWdodDogLTg2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2x0ciB7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgbGVmdDogLTg2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YixcclxuICAmX3J0bCxcclxuICAmX2J0dCxcclxuICAmX2x0ciB7XHJcbiAgICAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xyXG4gICAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19 */ +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLzxpbnB1dCBjc3MgMj4iLCJzY3JvbGxiYXIubGVzcyIsInNlY3Rpb24ubGVzcyIsImNhc2UubGVzcyIsInBhZ2VyLmxlc3MiLCIuLi8uLi9zcmMvdGhlbWUvc2hhZG93Lmxlc3MiLCIuLi8uLi9zcmMvdGhlbWUvaWNvbnMubGVzcyIsIi4uLy4uL3NyYy90aGVtZS92YXJpYWJsZXMubGVzcyIsIi4uLy4uL3NyYy90aGVtZS9kcmF3ZXIubGVzcyIsIi4uLy4uL3NyYy90aGVtZS9hbmNob3JzLmxlc3MiLCIuLi8uLi9zcmMvdGhlbWUvY2hhcHRlcnMubGVzcyIsIi4uLy4uL3NyYy90aGVtZS9lbGxpcHNpcy5sZXNzIiwiLi4vLi4vc3JjL3RoZW1lL3Rvb2xiYXIubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUNILG1EQUFtRDtBQUNuRCw0QkFBNEI7QUFDNUIsMkJBQTJCO0FDUDNCO0VBQ0UsV0FBQTtFQUNBLFlBQUE7RUFDQSwyQkFBQTtDRFNEO0FDTkQ7RUFDRSwyQkFBQTtDRFFEO0FDTEQ7RUFDRSxzQ0FBQTtFQUNBLDJCQUFBO0NET0Q7QUNKRDtFQUNFLHNDQUFBO0VBQ0EsMkJBQUE7Q0RNRDtBQ0hEO0VBQ0Usc0NBQUE7Q0RLRDtBQ0ZEO0VBQ0Usc0NBQUE7Q0RJRDtBRTVCRDtFQUNFLGNBQUE7RUFDQSxpQkFBQTtDRjhCRDtBRTVCQzs7O0VBR0UsY0FBQTtFQUNBLGlCQUFBO0NGOEJIO0FFM0JDO0VBQ0UsWUFBQTtDRjZCSDtBRTFCQztFQUNFLGVBQUE7RUFDQSxrQkFBQTtDRjRCSDtBRXpCQztFQUNFLGlCQUFBO0VBQ0EsWUFBQTtDRjJCSDtBRXhCQztFQUNFLGVBQUE7RUFDQSxZQUFBO0NGMEJIO0FFdkJDOzs7RUFHRSxVQUFBO0VBQ0EsV0FBQTtFQUNBLGlCQUFBO0NGeUJIO0FFdEJDO0VBQ0UsbUJBQUE7RUFDQSxXQUFBO0NGd0JIO0FFckJDO0VBQ0Usc0JBQUE7Q0Z1Qkg7QUVwQkM7RUFDRSxzQkFBQTtFQUNBLGVBQUE7Q0ZzQkg7QUVuQkM7RUFDRSxjQUFBO0VBQ0EsYUFBQTtFQUNBLGdCQUFBO0VBQ0Esa0JBQUE7RUFDQSxpQkFBQTtFQUNBLDBCQUFBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtFQUNBLFlBQUE7RUFDQSxlQUFBO0NGcUJIO0FFbEJDO0VBQ0UsZUFBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTtDRm9CSDtBRWpCQztFQUNFLDJCQUFBO0VBQ0EsZ0JBQUE7RUFDQSwwQkFBQTtFQUNBLFlBQUE7Q0ZtQkg7QUc5RkQ7RUFDRSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxjQUFBO0VBQ0Esc0NBQUE7RUFDQSxVQUFBO0VBQ0EsYUFBQTtFQUNBLDJCQUFBO0VBQ0EsOEJBQUE7RUFDQSxpQkFBQTtDSGdHRDtBRzlGQztFQUNFLFlBQUE7RUFDQSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxPQUFBO0VBQ0EsVUFBQTtFQUNBLGFBQUE7RUFDQSxTQUFBO0VBQ0EsNEJBQUE7RUFDQSxpQkFBQTtDSGdHSDtBRzdGQzs7RUFFRSxnQkFBQTtFQUNBLGtCQUFBO0NIK0ZIO0FHNUZDOzs7RUFHRSxpRUFBQTtDSDhGSDtBRzNGQztFQUNFLFVBQUE7RUFDQSxhQUFBO0VBQ0EsMEJBQUE7RUFDQSxhQUFBO0VBQ0EsbUJBQUE7RUFDQSwrQkFBQTtVQUFBLHVCQUFBO0VBQ0EsZUFBQTtDSDZGSDtBRzFGQztFQUNFLGVBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBO0VBQ0Esa0JBQUE7RUFDQSxpQkFBQTtDSDRGSDtBR3pGQzs7RUFFRSxnQkFBQTtFQUNBLGVBQUE7RUFDQSwwQkFBQTtLQUFBLHVCQUFBO01BQUEsc0JBQUE7VUFBQSxrQkFBQTtDSDJGSDtBR3hGQztFQUNFLGdCQUFBO0VBQ0EsbUJBQUE7Q0gwRkg7QUd4Rkc7RUFDRSxnQkFBQTtDSDBGTDtBR3RGQztFQUNFLGFBQUE7Q0h3Rkg7QUdyRkM7RUFDRSxlQUFBO0VBQ0EsY0FBQTtFQUNBLHVCQUFBO0VBQ0EsaUJBQUE7Q0h1Rkg7QUdwRkM7RUFDRSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxhQUFBO0VBQ0EsY0FBQTtFQUNBLGFBQUE7RUFDQSwrQkFBQTtVQUFBLHVCQUFBO0VBQ0EsZUFBQTtDSHNGSDtBR25GQzs7RUFFRSxVQUFBO0VBQ0EsV0FBQTtFQUNBLHNCQUFBO0VBQ0EsaUJBQUE7Q0hxRkg7QUdsRkM7RUFDRSxjQUFBO0VBQ0EsMkJBQUE7RUFDQSw4QkFBQTtFQUNBLGdCQUFBO0VBQ0EsZUFBQTtDSG9GSDtBR2pGQztFQUNFLGFBQUE7RUFDQSxrQkFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7Q0htRkg7QUdqRkc7RUFDRSwwQkFBQTtDSG1GTDtBSXpNRDtFQ1N3RCx3Q0FBQTtVQUFBLGdDQUFBO0VEUHRELGlCQUFBO0VBQ0Esa0JBQUE7RUFDQSxhQUFBO0VBQ0EsdUJBQUE7RUFDQSwrQkFBQTtVQUFBLHVCQUFBO0NKMk1EO0FJek1DO0VBQ0UscUJBQUE7RUFBQSxxQkFBQTtFQUFBLGNBQUE7RUFDQSwrQkFBQTtFQUFBLDhCQUFBO01BQUEsd0JBQUE7VUFBQSxvQkFBQTtFQUNBLHNCQUFBO01BQUEsa0JBQUE7RUFDQSxVQUFBO0VBQ0EsWUFBQTtFQUNBLGdCQUFBO0VBQ0EsYUFBQTtFQUNBLFdBQUE7RUFDQSxpQkFBQTtDSjJNSDtBSXBOQztFQVlJLDZCQUFBO0VBQUEsOEJBQUE7TUFBQSwyQkFBQTtVQUFBLHVCQUFBO0VBQ0EsWUFBQTtFQUNBLCtCQUFBO1VBQUEsdUJBQUE7Q0oyTUw7QUl6TUs7RUFDRSxhQUFBO0VBQ0EsK0JBQUE7VUFBQSx1QkFBQTtFQUNBLGVBQUE7Q0oyTVA7QUl4TUs7RUFDRSxnQ0FBQTtDSjBNUDtBSXBNRDtFQUNFLGlCQUFBO0VBQ0EsV0FBQTtFQUNBLE9BQUE7RUFDQSxlQUFBO0VBQ0EsOEJBQUE7RUFDQSx1QkFBQTtFQUNBLG1CQUFBO0VBQ0Esa0NBQUE7VUFBQSwwQkFBQTtFQUNBLGlCQUFBO0NKc01EO0FJcE1DO0VBQ0Usb0JBQUE7Q0pzTUg7QUlsTUQ7RUFDRSxxQkFBQTtFQUFBLHFCQUFBO0VBQUEsY0FBQTtFQUNBLCtCQUFBO0VBQUEsOEJBQUE7TUFBQSx3QkFBQTtVQUFBLG9CQUFBO0VBQ0Esc0JBQUE7TUFBQSxrQkFBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTtFQUNBLGtCQUFBO0NKb01EO0FJbE1DO0VBQ0Usb0JBQUE7TUFBQSxZQUFBO1VBQUEsUUFBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTtDSm9NSDtBSXZNQztFQU1JLGtCQUFBO0NKb01MO0FJbE1LOzs7RUFHRSxrQkFBQTtDSm9NUDtBSWpNSzs7RUFFRSxVQUFBO0NKbU1QO0FJOUxDO0VBQ0UscUJBQUE7TUFBQSxlQUFBO0VBQ0EsYUFBQTtFQUNBLDRCQUFBO0VBQ0Esa0NBQUE7VUFBQSwwQkFBQTtDSmdNSDtBSTlMRztFQUNFLDZCQUFBO0VBQ0Esa0JBQUE7Q0pnTUw7QUl4TUM7RUFZSSx1QkFBQTtDSitMTDtBSTFMRDs7RUFFRSxhQUFBO0VBQ0EsOENBQUE7RUFDQSwwQkFBQTtFQUNBLGVBQUE7Q0o0TEQ7QUl6TEQ7O0VBRUUsOENBQUE7RUFDQSxnQkFBQTtDSjJMRDtBSXhMRDtFQUNFLDhCQUFBO0VBQ0EsZUFBQTtFQUNBLG1CQUFBO0NKMExEO0FJdkxHOzs7RUFHRSxzQkFBQTtFQUNBLGVBQUE7Q0p5TEw7QUl0TEc7RUFDRSwyQkFBQTtDSndMTDtBSW5MRDtFQUNFLGdDQUFBO0NKcUxEO0FJbExEO0VBQ0UsY0FBQTtDSm9MRDtBQUNELGtEQUFrRDtBTTdUbEQ7RUFDRSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxzQkFBQTtFQUNBLHVCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxpQkFBQTtDTitURDtBTTdUQztFQUNFLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7RUFDQSxVQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxtQkFBQTtFQUNBLHlDQUFBO1VBQUEsaUNBQUE7RUFDQSxpQkFBQTtDTitUSDtBT2xWRDtFQUNDLHVCQUFBO0VBQ0QsOEJBQUE7RUFBaUMsK0JBQUE7Q1BxVmhDO0FRblZEO0VBQ0UsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsT0FBQTtFQUNBLFFBQUE7RUFDQSxVQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSwrQkFBQTtVQUFBLHVCQUFBO0VBQ0EsbUJBQUE7RUFDQSxpQkFBQTtDUnFWRDtBUW5WQztFSFBzRCx3Q0FBQTtVQUFBLGdDQUFBO0VHU3BELHFCQUFBO0VBQUEscUJBQUE7RUFBQSxjQUFBO0VBQ0EsNkJBQUE7RUFBQSw4QkFBQTtNQUFBLDJCQUFBO1VBQUEsdUJBQUE7RUFDQSxzQkFBQTtNQUFBLGtCQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLHVCQUFBO0VBQ0Esa0NBQUE7VUFBQSwwQkFBQTtFQUNBLGlCQUFBO0NScVZIO0FRbFZDOzs7RUFHRSxZQUFBO0VBQ0EsK0JBQUE7VUFBQSx1QkFBQTtDUm9WSDtBUWpWQzs7RUFFRSxxQkFBQTtNQUFBLGVBQUE7Q1JtVkg7QVFoVkM7OztFQUdFLGdCQUFBO0NSa1ZIO0FRL1VDOztFQUVFLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLGVBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxpQkFBQTtDUmlWSDtBUTlVQztFQUNFLGdCQUFBO0VBQ0EsaUJBQUE7RUFDQSxlQUFBO0VBQ0EsK0JBQUE7VUFBQSx1QkFBQTtFQUNBLGlDQUFBO0NSZ1ZIO0FRN1VDO0VBQ0UsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsU0FBQTtFQUNBLFlBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0VBQ0EsWUFBQTtFQUNBLGdCQUFBO0VBQ0EsbUJBQUE7RUFDQSxnQkFBQTtFQUNBLG9DQUFBO1VBQUEsNEJBQUE7RUFDQSxpQkFBQTtDUitVSDtBUTVWQztFQWdCSSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxPQUFBO0VBQ0EsUUFBQTtDUitVTDtBUTVVRztFQUNFLFlBQUE7Q1I4VUw7QVExVUM7RUFDRSxvQkFBQTtNQUFBLFlBQUE7VUFBQSxRQUFBO0VBQ0EsZUFBQTtDUjRVSDtBUXpVQztFQUNFLGVBQUE7RUFDQSxrQkFBQTtFQUNBLGlCQUFBO0NSMlVIO0FReFVDO0VBQ0UsWUFBQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLE9BQUE7RUFDQSxRQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSx1QkFBQTtFQUNBLGFBQUE7RUFDQSxpQkFBQTtDUjBVSDtBUXBVSzs7RUFDRSxhQUFBO0NSdVVQO0FRcFVLOztFQUNFLGFBQUE7Q1J1VVA7QVFwVUs7O0VBQ0UsYUFBQTtDUnVVUDtBUXBVSzs7RUFDRSxhQUFBO0NSdVVQO0FRcFVLOztFQUNFLGFBQUE7Q1J1VVA7QVFwVUs7O0VBQ0UsYUFBQTtDUnVVUDtBUWxVQztFQUNFLCtCQUFBO0NSb1VIO0FRaFVPO0VBQ0UsY0FBQTtDUmtVVDtBUTdUTztFQUNFLGNBQUE7Q1IrVFQ7QVExVE87RUFDRSxjQUFBO0NSNFRUO0FRdlRPO0VBQ0UsY0FBQTtDUnlUVDtBUXBUTztFQUNFLGNBQUE7Q1JzVFQ7QVFqVE87RUFDRSxjQUFBO0NSbVRUO0FRN1NDO0VBQ0UsZ0NBQUE7Q1IrU0g7QVEzU087RUFDRSxhQUFBO0NSNlNUO0FReFNPO0VBQ0UsYUFBQTtDUjBTVDtBUXJTTztFQUNFLGFBQUE7Q1J1U1Q7QVFsU087RUFDRSxhQUFBO0NSb1NUO0FRL1JPO0VBQ0UsYUFBQTtDUmlTVDtBUTVSTztFQUNFLGFBQUE7Q1I4UlQ7QVF4UkM7O0VBRUUsUUFBQTtFQUNBLFlBQUE7Q1IwUkg7QVF2Uks7O0VBQ0UsY0FBQTtDUjBSUDtBUXZSSzs7RUFDRSxjQUFBO0NSMFJQO0FRdlJLOztFQUNFLGNBQUE7Q1IwUlA7QVF2Uks7O0VBQ0UsY0FBQTtDUjBSUDtBUXZSSzs7RUFDRSxjQUFBO0NSMFJQO0FRdlJLOztFQUNFLGNBQUE7Q1IwUlA7QVFyUkM7RUFDRSxpQ0FBQTtDUnVSSDtBUW5STztFQUNFLFlBQUE7Q1JxUlQ7QVFoUk87RUFDRSxZQUFBO0NSa1JUO0FRN1FPO0VBQ0UsWUFBQTtDUitRVDtBUTFRTztFQUNFLFlBQUE7Q1I0UVQ7QVF2UU87RUFDRSxZQUFBO0NSeVFUO0FRcFFPO0VBQ0UsWUFBQTtDUnNRVDtBUWhRQztFQUNFLGFBQUE7RUFDQSw4QkFBQTtDUmtRSDtBUTlQTztFQUNFLGVBQUE7Q1JnUVQ7QVEzUE87RUFDRSxlQUFBO0NSNlBUO0FReFBPO0VBQ0UsZUFBQTtDUjBQVDtBUXJQTztFQUNFLGVBQUE7Q1J1UFQ7QVFsUE87RUFDRSxlQUFBO0NSb1BUO0FRL09PO0VBQ0UsZUFBQTtDUmlQVDtBUTNPQztFQUNFLG9CQUFBO0VBQ0EsK0JBQUE7Q1I2T0g7QVEzT0c7RUFDRSxnQkFBQTtDUjZPTDtBUTNPSztFQUNFLFNBQUE7Q1I2T1A7QVExT0s7RUFDRSxRQUFBO0NSNE9QO0FRek9LO0VBQ0UsT0FBQTtDUjJPUDtBUXhPSztFQUNFLFVBQUE7Q1IwT1A7QVFuT0s7O0VBRUUseUJBQUE7RUFDQSxTQUFBO0VBQ0Esb0NBQUE7VUFBQSw0QkFBQTtDUnFPUDtBUWxPSzs7RUFFRSx3QkFBQTtFQUNBLFVBQUE7RUFDQSxvQ0FBQTtVQUFBLDRCQUFBO0NSb09QO0FRL05TO0VBQ0UsV0FBQTtDUmlPWDtBUTlOUztFQUNFLFVBQUE7Q1JnT1g7QVE3TlM7RUFDRSxTQUFBO0NSK05YO0FRNU5TO0VBQ0UsWUFBQTtDUjhOWDtBUXJOSzs7RUFFRSxhQUFBO0VBQ0EsNkJBQUE7Q1J1TlA7QVFsTkM7RUFDRSxXQUFBO0NSb05IO0FTdG5CRDtFQUNFLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLGlCQUFBO0NUd25CRDtBU3RuQkM7RUFDRSxjQUFBO0NUd25CSDtBU3RuQkc7OztFQUdFLFlBQUE7RUFDQSxzQkFBQTtDVHduQkw7QVNybkJHO0VBQ0UsZUFBQTtDVHVuQkw7QVNubkJDO0VBRUksc0JBQUE7Q1RvbkJMO0FTL21CRztFQUNFLGtCQUFBO0NUaW5CTDtBU25uQkM7RUFNSSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxTQUFBO0VBQ0Esb0NBQUE7VUFBQSw0QkFBQTtFQUNBLFdBQUE7Q1RnbkJMO0FBQ0Q7Ozs7O0dBS0c7QUFDSCwwQkFBMEI7QVV6cEIxQjtFQUNFLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFVBQUE7RUFDQSxxQ0FBQTtFQUNBLGtDQUFBO1VBQUEsMEJBQUE7RUFDQSxlQUFBO0NWMnBCRDtBVXpwQkM7RUFDRSxlQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxpQ0FBQTtFQUNBLGdCQUFBO0VBQ0EsaUJBQUE7RUFDQSxpQkFBQTtDVjJwQkg7QVV4cEJDO0VBQ0UsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsVUFBQTtFQUNBLGlCQUFBO0NWMHBCSDtBVXZwQkM7OztFQUdFLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFVBQUE7RUFDQSxXQUFBO0VBQ0Esc0JBQUE7RUFDQSxpQkFBQTtDVnlwQkg7QVV0cEJDO0VBQ0UsaUJBQUE7Q1Z3cEJIO0FVcnBCQztFQUNFLGtCQUFBO0NWdXBCSDtBVXBwQkM7RUFDRSxVQUFBO0VBQ0Esa0JBQUE7RUFDQSxnQkFBQTtFQUNBLGlCQUFBO0NWc3BCSDtBVW5wQkM7RUFDRSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0EsMEJBQUE7RUFDQSwrQkFBQTtFQUNBLGtDQUFBO1VBQUEsMEJBQUE7RUFDQSwrQkFBQTtVQUFBLHVCQUFBO0VBQ0EsaUJBQUE7Q1ZxcEJIO0FVbHBCQztFQzdEQSxvQkFBQTtFQUNBLHdCQUFBO0VBQ0EsaUJBQUE7RUQ2REUsZUFBQTtFQUNBLGlCQUFBO0NWc3BCSDtBVXBwQkc7OztFQUdFLHNCQUFBO0VBQ0EsWUFBQTtDVnNwQkw7QVVucEJHO0VBQ0UsZUFBQTtDVnFwQkw7QVVqcEJDO0VBQ0UscUJBQUE7Q1ZtcEJIO0FVOW9CSzs7O0VBR0UsZUFBQTtFQUNBLGlCQUFBO0NWZ3BCUDtBVTNvQkM7O0VBRUUscUJBQUE7RUFBQSxxQkFBQTtFQUFBLGNBQUE7RUFDQSxzQkFBQTtNQUFBLGtCQUFBO0VBQ0EsNkJBQUE7RUFBQSw4QkFBQTtNQUFBLDJCQUFBO1VBQUEsdUJBQUE7RUFDQSwrQkFBQTtFQUNBLE9BQUE7RUFDQSxpQkFBQTtDVjZvQkg7QVUxb0JLOzs7O0VBRUUsK0JBQUE7VUFBQSx1QkFBQTtDVjhvQlA7QVUzb0JLOztFQUNFLHFCQUFBO01BQUEsZUFBQTtDVjhvQlA7QVUzb0JLOztFQUNFLG9CQUFBO01BQUEsWUFBQTtVQUFBLFFBQUE7RUFDQSxlQUFBO0NWOG9CUDtBVXpvQkM7RUFDRSxpQkFBQTtFQUNBLHlDQUFBO0NWMm9CSDtBVXhvQkM7RUFDRSxnQkFBQTtFQUNBLGlCQUFBO0NWMG9CSDtBVXZvQkM7RUFDRSxjQUFBO0NWeW9CSDtBVXRvQkM7RUFDRSxTQUFBO0NWd29CSDtBQUNELGtEQUFrRDtBWXB4QmxEO0VBQ0UsZ0JBQUE7RUFDQSxlQUFBO0VBQ0EsVUFBQTtFQUNBLGtDQUFBO1VBQUEsMEJBQUE7RUFDQSxpQkFBQTtDWnN4QkQ7QVlweEJDO0VQRnNELHdDQUFBO1VBQUEsZ0NBQUE7RU9JcEQsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsYUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0EsMEJBQUE7RUFDQSxtQkFBQTtFQUNBLCtCQUFBO1VBQUEsdUJBQUE7RUFDQSx1QkFBQTtFQUNBLGdCQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsaUJBQUE7Q1pzeEJIO0FZcHhCRztFQUNFLGVBQUE7RUFDQSxzQkFBQTtDWnN4Qkw7QVlueEJHO0VBQ0UsY0FBQTtDWnF4Qkw7QVloeEJHOzs7RUFHRSxZQUFBO0VBQ0Esc0JBQUE7Q1preEJMO0FZL3dCRztFQUNFLGVBQUE7Q1ppeEJMO0FZN3dCQztFQUNFLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7RUFDQSxVQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSx5Q0FBQTtVQUFBLGlDQUFBO0VBQ0EsbUJBQUE7RUFDQSxpQkFBQTtDWit3Qkg7QVkxd0JLO0VBQ0UsWUFBQTtFQUNBLDBCQUFBO0VBQ0Esc0JBQUE7Q1o0d0JQO0FZMXdCTztFQUNFLFlBQUE7Q1o0d0JUO0FZdHdCSzs7O0VBR0UsWUFBQTtDWnd3QlA7QVlsd0JHO0VBQ0Usb0JBQUE7Q1pvd0JMO0FZN3ZCSzs7Ozs7Ozs7RUFJRSxvQkFBQTtFQUNBLFlBQUE7Q1ptd0JQO0FZandCTzs7Ozs7Ozs7RUFDRSxZQUFBO0NaMHdCVDtBWXR3Qks7O0VBQ0UsMEJBQUE7Q1p5d0JQO0FZcHdCQzs7RUFFRSxVQUFBO0VBQ0Esb0NBQUE7VUFBQSw0QkFBQTtDWnN3Qkg7QVl6d0JDOztFQU1JLHNCQUFBO0NadXdCTDtBWW53QkM7RUFDRSxVQUFBO0NacXdCSDtBWW53Qkc7RUFDRSxXQUFBO0NacXdCTDtBWWp3QkM7RUFDRSxhQUFBO0NabXdCSDtBWWp3Qkc7RUFDRSxjQUFBO0NabXdCTDtBWS92QkM7O0VBRUUsb0NBQUE7VUFBQSw0QkFBQTtFQUNBLFlBQUE7Q1ppd0JIO0FZOXZCQztFQUNFLFNBQUE7RUFDQSxZQUFBO0NaZ3dCSDtBWTl2Qkc7RUFDRSxhQUFBO0NaZ3dCTDtBWTV2QkM7RUFDRSxTQUFBO0VBQ0EsV0FBQTtDWjh2Qkg7QVk1dkJHO0VBQ0UsWUFBQTtDWjh2Qkw7QVlydkJLOzs7O0VBQ0UsY0FBQTtDWjB2QlAiLCJmaWxlIjoiZXhhbXBsZS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjIwXG4gKi9cbi8qID09PT09PT09PT0gY29sb3JzLnRoZW1lIC0g5Z+656GA6aKc6Imy5Y+Y6YeP6ZuG5ZCIID09PT09PT09PT0gKi9cbi8qID09PT09PSDpmLTlvbHmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXG4vKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG59XG4uc2VjdGlvbiB7XG4gIG1hcmdpbjogMWVtIDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9faGVhZGVyLFxuLnNlY3Rpb25fX2NvbnRlbnQsXG4uc2VjdGlvbl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIDNlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX190aXRsZSB7XG4gIGNvbG9yOiAjNjY2O1xufVxuLnNlY3Rpb25fX2gzIHtcbiAgY29sb3I6ICMxZjhkZDY7XG4gIGZvbnQtc2l6ZTogMS4zNWVtO1xufVxuLnNlY3Rpb25fX2g0IHtcbiAgZm9udC1zaXplOiAxLjFlbTtcbiAgY29sb3I6ICM2NjY7XG59XG4uc2VjdGlvbl9faDUge1xuICBmb250LXNpemU6IDFlbTtcbiAgY29sb3I6ICM5OTk7XG59XG4uc2VjdGlvbl9fZGwsXG4uc2VjdGlvbl9fZHQsXG4uc2VjdGlvbl9fZGQge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fZGwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG59XG4uc2VjdGlvbl9fZHQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4uc2VjdGlvbl9fZGQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLnNlY3Rpb25fX3ByZSB7XG4gIG1hcmdpbjogMmVtIDA7XG4gIHBhZGRpbmc6IDFlbTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBjb2xvcjogIzY2NjtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uc2VjdGlvbl9fY29kZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDAgYXV0bztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX19mb290ZXIge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgbWFyZ2luLXRvcDogM2VtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBjb2xvcjogIzk5OTtcbn1cbi5jYXNlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xuICBnYXA6IDQwcHg7XG4gIHBhZGRpbmc6IDFlbTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2U6YWZ0ZXIge1xuICBjb250ZW50OiAnJztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDUwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMDtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX3ByZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX2NvZGUsXG4uY2FzZV9fdGV4dGFyZWEge1xuICBmb250LWZhbWlseTogXCJDb3VyaWVyIE5ld1wiLCBDb25zb2xhcywgR2VvcmdpYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uY2FzZV9fcHJlIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX190b29sYmFyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19hY3Rpb24sXG4uY2FzZV9fcmVtb3ZlIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzA1ODk0MjtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4uY2FzZV9fYWN0aW9uIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG4uY2FzZV9fYWN0aW9uOmZpcnN0LWNoaWxkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xufVxuLmNhc2VfX3JlbW92ZSB7XG4gIGZsb2F0OiByaWdodDtcbn1cbi5jYXNlX19jb25zb2xlIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMTgwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fdGV4dGFyZWEge1xuICBtYXJnaW46IDAgYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nOiAxZW07XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2xpc3QsXG4uY2FzZV9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX2xpc3Qge1xuICBoZWlnaHQ6IDM2MHB4O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9faXRlbSB7XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLmNhc2VfX2l0ZW06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xufVxuLnBhcGVyIHtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgbWFyZ2luOiAyZW0gYXV0bztcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHBhZGRpbmc6IDJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5wYXBlci5mbGV4IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnBhcGVyLmZsZXggLmFydGljbGUge1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB3aWR0aDogMTAwJTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5wYXBlci5mbGV4IC5hcnRpY2xlX19tYWluIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5wYXBlci5mbGV4IC5hcnRpY2xlX19hc2lkZSB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4uaGVhZGVyIHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgei1pbmRleDogMztcbiAgdG9wOiAwO1xuICBtYXJnaW46IDAgYXV0bztcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5oZWFkZXJfc3RpY2t5IHtcbiAgcGFkZGluZy1sZWZ0OiAyNjBweDtcbn1cbi5hcnRpY2xlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBhZGRpbmc6IDJlbSAwO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xufVxuLmFydGljbGVfX21haW4ge1xuICBmbGV4OiAxO1xuICBwYWRkaW5nOiAwIDJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9fY29udGVudCxcbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uX19mb290ZXIsXG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9faGVhZGVyIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9faGVhZGVyLFxuLmFydGljbGVfX21haW4gLnNlY3Rpb25fX2NvbnRlbnQge1xuICBtYXJnaW46IDA7XG59XG4uYXJ0aWNsZV9fYXNpZGUge1xuICBmbGV4LXNocmluazogMDtcbiAgd2lkdGg6IDI0MHB4O1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG59XG4uYXJ0aWNsZV9fYXNpZGUubHRyIHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWxlZnQ6IG5vbmU7XG59XG4uYXJ0aWNsZV9fYXNpZGUgLm91dGxpbmUtY2hhcHRlcnMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxucHJlLFxuLnNlY3Rpb25fX3ByZSB7XG4gIHBhZGRpbmc6IDJlbTtcbiAgZm9udC1mYW1pbHk6IFwiQ291cmllciBOZXdcIiwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuY29kZSxcbi5zZWN0aW9uX19jb2RlIHtcbiAgZm9udC1mYW1pbHk6IFwiQ291cmllciBOZXdcIiwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbn1cbi5mb290ZXIge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RjZGZlNjtcbiAgcGFkZGluZzogM2VtIDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5mb290ZXIgYTpsaW5rLFxuLmZvb3RlciBhOnZpc2l0ZWQsXG4uZm9vdGVyIGE6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLmZvb3RlciBhOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG4udXRpbHMtYm9yZGVyLXJpZ2h0IHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLyogPT09PT09PT09PSBpY29uLnRoZW1lIC0gc3ZnIOWbvuagh+eahOagt+W8jyA9PT09PT09PT09ICovXG4ub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdpZHRoOiAxZW07XG4gIGhlaWdodDogMWVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaWNvbl9fc3ZnIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbjpyb290IHtcbiAgLS1vdXRsaW5lLXpJbmRleDogMjAwMDtcbiAgLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQ6IDEwMCU7XG4gIC0tb3V0bGluZS1jaGFwdGVycy13aWR0aDogMTAwJTtcbn1cbi5vdXRsaW5lLWRyYXdlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogLTE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX21vZGFsIHtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjE7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19tYWluLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICB3aWR0aDogMTAwJTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX190aXRsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogNTJweDtcbiAgbGluZS1oZWlnaHQ6IDUycHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBtYXJnaW46IDAgMTZweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBjb2xvcjogIzk5OTtcbiAgZm9udC1zaXplOiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlOmhvdmVyIHtcbiAgY29sb3I6ICM2NjY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19vdmVybGF5IHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAwLjE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICB3aWR0aDogMjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21pbmkge1xuICB3aWR0aDogNDgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3NtYWxsLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9zbWFsbCB7XG4gIHdpZHRoOiA1NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIHdpZHRoOiA2ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICB3aWR0aDogNzIwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX2xhcmdlLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9sYXJnZSB7XG4gIHdpZHRoOiA5NjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTczMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTI5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC02OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yixcbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueSB7XG4gIGhlaWdodDogMjQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21pbmkge1xuICBoZWlnaHQ6IDMyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICBoZWlnaHQ6IDM2MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyIHtcbiAgaGVpZ2h0OiA0MDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICBoZWlnaHQ6IDQ0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICBoZWlnaHQ6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB0b3A6IGluaXRpYWw7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA0ZW0pO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3J0bCB7XG4gIHJpZ2h0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBsZWZ0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl90dGIge1xuICB0b3A6IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIGJvdHRvbTogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfcnRsLFxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xufVxuLm91dGxpbmUtZHJhd2VyX2Z1bGwge1xuICBwYWRkaW5nOiAwO1xufVxuLm91dGxpbmUtaGVhZGluZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6bGluayxcbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMWY4ZGQ2O1xufVxuLm91dGxpbmUtaGVhZGluZzpob3ZlciAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ub3V0bGluZS1oZWFkaW5nX3N0YXJ0OmhvdmVyIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4ub3V0bGluZS1oZWFkaW5nX3N0YXJ0IC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgbGVmdDogLTFlbTtcbn1cbi8qKlxuICogZWxsaXBzaXMubGVzcyAtIOaWh+acrOecgeeVpSBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxuICovXG4vKiA9PT09PT0g5paH5pys55yB55Wl5Ye95pWwID09PT09PSAqL1xuLm91dGxpbmUtY2hhcHRlcnMge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IHZhcigtLW91dGxpbmUtY2hhcHRlcnMtd2lkdGgpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX190aXRsZSB7XG4gIG1hcmdpbjogMCAxNnB4O1xuICBoZWlnaHQ6IDQwcHg7XG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICBwYWRkaW5nOiAwIDE2cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1jaGFwdGVyc19fbWFpbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX2xpc3QsXG4ub3V0bGluZS1jaGFwdGVyc19fc3ViamVjdCxcbi5vdXRsaW5lLWNoYXB0ZXJzX19pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX19saXN0IHtcbiAgcGFkZGluZzogMC41ZW0gMDtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX19zdWJqZWN0IHtcbiAgcGFkZGluZy1sZWZ0OiAxZW07XG59XG4ub3V0bGluZS1jaGFwdGVyc19faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX19wbGFjZWhvbGRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAzMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xuICBib3JkZXItbGVmdDogMnB4IHNvbGlkICMwNTg5NDI7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1jaGFwdGVyc19fYW5jaG9yIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAwIDEuNWVtO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICM1NTU7XG59XG4ub3V0bGluZS1jaGFwdGVyc19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS1jaGFwdGVyc19fY29kZSB7XG4gIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfYWN0aXZlLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtY2hhcHRlcnNfYWN0aXZlLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtY2hhcHRlcnNfYWN0aXZlLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBmb250LXdlaWdodDogNDAwO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfc3RpY2t5LFxuLm91dGxpbmUtY2hhcHRlcnNfZml4ZWQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xuICB0b3A6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1jaGFwdGVyc19zdGlja3kgLm91dGxpbmUtY2hhcHRlcnNfX3RpdGxlLFxuLm91dGxpbmUtY2hhcHRlcnNfZml4ZWQgLm91dGxpbmUtY2hhcHRlcnNfX3RpdGxlLFxuLm91dGxpbmUtY2hhcHRlcnNfc3RpY2t5IC5vdXRsaW5lLWNoYXB0ZXJzX19tYWluLFxuLm91dGxpbmUtY2hhcHRlcnNfZml4ZWQgLm91dGxpbmUtY2hhcHRlcnNfX21haW4ge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLm91dGxpbmUtY2hhcHRlcnNfc3RpY2t5IC5vdXRsaW5lLWNoYXB0ZXJzX190aXRsZSxcbi5vdXRsaW5lLWNoYXB0ZXJzX2ZpeGVkIC5vdXRsaW5lLWNoYXB0ZXJzX190aXRsZSB7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfc3RpY2t5IC5vdXRsaW5lLWNoYXB0ZXJzX19tYWluLFxuLm91dGxpbmUtY2hhcHRlcnNfZml4ZWQgLm91dGxpbmUtY2hhcHRlcnNfX21haW4ge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX3N0aWNreSB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIG1heC1oZWlnaHQ6IHZhcigtLW91dGxpbmUtc3RpY2t5LWhlaWdodCk7XG59XG4ub3V0bGluZS1jaGFwdGVyc19maXhlZCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgbWF4LWhlaWdodDogMTAwJTtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1jaGFwdGVyc19mb2xkZWQge1xuICB3aWR0aDogMDtcbn1cbi8qID09PT09PT09PT0gYnV0dG9ucy50aGVtZSAtIOaMiemSruWvvOiIquagt+W8jyA9PT09PT09PT09ICovXG4ub3V0bGluZS10b29sYmFyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiA5OTk5OTtcbiAgbWFyZ2luOiAwO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDEwcHg7XG4gIHdpZHRoOiAzNnB4O1xuICBoZWlnaHQ6IDM2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiAjNTU1O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5oaWRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS10b29sYmFyX19pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0MjtcbiAgYm9yZGVyLWNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcm91bmRlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJvcmRlci1yYWRpdXM6IDE4cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIGNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluazpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZDpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQ6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXI6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG59XG4ub3V0bGluZS10b29sYmFyX3R0Yixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IHtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiAub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2J0dCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiB7XG4gIHRvcDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICB0b3A6IC01NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9idHQge1xuICBib3R0b206IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX2J0dC5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgYm90dG9tOiAtNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsLFxuLm91dGxpbmUtdG9vbGJhcl9sdHIge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIHdpZHRoOiA1NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwge1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bC5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgcmlnaHQ6IC04NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9sdHIge1xuICB0b3A6IDUwJTtcbiAgbGVmdDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfbHRyLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBsZWZ0OiAtODZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9ydGwgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX2J0dCAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfbHRyIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbiIsIi8qID09PT09IFNjcm9sbGJhciA9PT09PSAqL1xyXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcclxuICB3aWR0aDogN3B4O1xyXG4gIGhlaWdodDogN3B4O1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcclxuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxufVxyXG5cclxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcclxuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxufVxyXG5cclxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG59XHJcbiIsIkBpbXBvcnQgJ2NvbG9ycyc7XHJcblxyXG4uc2VjdGlvbiB7XHJcbiAgbWFyZ2luOiAxZW0gMDtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19oZWFkZXIsXHJcbiAgJl9fY29udGVudCxcclxuICAmX19mb290ZXIge1xyXG4gICAgbWFyZ2luOiAwIDNlbTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX19oMyB7XHJcbiAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDEuMzVlbTtcclxuICB9XHJcblxyXG4gICZfX2g0IHtcclxuICAgIGZvbnQtc2l6ZTogMS4xZW07XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX19oNSB7XHJcbiAgICBmb250LXNpemU6IDFlbTtcclxuICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX19kbCxcclxuICAmX19kdCxcclxuICAmX19kZCB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2RsIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgfVxyXG5cclxuICAmX19kdCB7XHJcbiAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcclxuICB9XHJcblxyXG4gICZfX2RkIHtcclxuICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1xyXG4gICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlIHtcclxuICAgIG1hcmdpbjogMmVtIDA7XHJcbiAgICBwYWRkaW5nOiAxZW07XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMTUwJTtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX19jb2RlIHtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgbWFyZ2luLXRvcDogM2VtO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJnX2NvbG9yO1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5cclxuLmNhc2Uge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIGRpc3BsYXk6IGdyaWQ7XHJcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgMWZyKTtcclxuICBnYXA6IDQwcHg7XHJcbiAgcGFkZGluZzogMWVtO1xyXG4gIGJvcmRlci10b3A6MXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmOmFmdGVyIHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDUwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHdpZHRoOiAwO1xyXG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3ByZSxcclxuICAmX190ZXh0YXJlYSB7XHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICBsaW5lLWhlaWdodDogMTUwJTtcclxuICB9XHJcblxyXG4gICZfX3ByZSxcclxuICAmX19jb2RlLFxyXG4gICZfX3RleHRhcmVhIHtcclxuICAgIGZvbnQtZmFtaWx5OiBcIkNvdXJpZXIgTmV3XCIsIENvbnNvbGFzLCBHZW9yZ2lhLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxuICB9XHJcblxyXG4gICZfX3ByZSB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAxZW07XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX190b29sYmFyIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgaGVpZ2h0OiAzNnB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDM2cHg7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBwYWRkaW5nOiAwIDE2cHg7XHJcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19hY3Rpb24sXHJcbiAgJl9fcmVtb3ZlIHtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG4gIH1cclxuXHJcbiAgJl9fYWN0aW9uIHtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuXHJcbiAgICAmOmZpcnN0LWNoaWxkIHtcclxuICAgICAgcGFkZGluZy1sZWZ0OiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fcmVtb3ZlIHtcclxuICAgIGZsb2F0OiByaWdodDtcclxuICB9XHJcblxyXG4gICZfX2NvbnNvbGUge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBoZWlnaHQ6IDE4MHB4O1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX190ZXh0YXJlYSB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgb3V0bGluZTogbm9uZTtcclxuICAgIHBhZGRpbmc6IDFlbTtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcblxyXG4gICZfX2xpc3QsXHJcbiAgJl9faXRlbSB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2xpc3Qge1xyXG4gICAgaGVpZ2h0OiAzNjBweDtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcblxyXG4gICZfX2l0ZW0ge1xyXG4gICAgaGVpZ2h0OiAzNnB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDM2cHg7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBwYWRkaW5nOiAwIDE2cHg7XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBob3Zlcl9iZ19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiLnBhcGVyIHtcclxuICAuc2hhZG93X2xpZ2h0X3JlZ3VsYXIoKTtcclxuICBtYXJnaW46IDJlbSBhdXRvO1xyXG4gIG1heC13aWR0aDogMTIwMHB4O1xyXG4gIHBhZGRpbmc6IDJlbTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuXHJcbiAgJi5mbGV4IHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gICAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIG1heC13aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgIC5hcnRpY2xlIHtcclxuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcblxyXG4gICAgICAmX19tYWluIHtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgICBvdmVyZmxvdzogYXV0bztcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fYXNpZGUge1xyXG4gICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLmhlYWRlciB7XHJcbiAgcG9zaXRpb246IHN0aWNreTtcclxuICB6LWluZGV4OiAzO1xyXG4gIHRvcDogMDtcclxuICBtYXJnaW46IDAgYXV0bztcclxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9zdGlja3kge1xyXG4gICAgcGFkZGluZy1sZWZ0OiAyNjBweDtcclxuICB9XHJcbn1cclxuXHJcbi5hcnRpY2xlIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgcGFkZGluZzogMmVtIDA7XHJcbiAgZm9udC1zaXplOiAxNnB4O1xyXG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xyXG5cclxuICAmX19tYWluIHtcclxuICAgIGZsZXg6IDE7XHJcbiAgICBwYWRkaW5nOiAwIDJlbTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgLnNlY3Rpb24ge1xyXG4gICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuXHJcbiAgICAgICZfX2NvbnRlbnQsXHJcbiAgICAgICZfX2Zvb3RlcixcclxuICAgICAgJl9faGVhZGVyIHtcclxuICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9faGVhZGVyLFxyXG4gICAgICAmX19jb250ZW50IHtcclxuICAgICAgICBtYXJnaW46IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX2FzaWRlIHtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgd2lkdGg6IDI0MHB4O1xyXG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcclxuXHJcbiAgICAmLmx0ciB7XHJcbiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICAgIGJvcmRlci1sZWZ0OiBub25lO1xyXG4gICAgfVxyXG5cclxuICAgIC5vdXRsaW5lLWNoYXB0ZXJzIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxucHJlLFxyXG4uc2VjdGlvbl9fcHJlIHtcclxuICBwYWRkaW5nOiAyZW07XHJcbiAgZm9udC1mYW1pbHk6IFwiQ291cmllciBOZXdcIiwgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogQGJnX2NvbG9yO1xyXG4gIG92ZXJmbG93OiBhdXRvO1xyXG59XHJcblxyXG5jb2RlLFxyXG4uc2VjdGlvbl9fY29kZSB7XHJcbiAgZm9udC1mYW1pbHk6IFwiQ291cmllciBOZXdcIiwgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgZm9udC1zaXplOiAxNnB4O1xyXG59XHJcblxyXG4uZm9vdGVyIHtcclxuICBib3JkZXItdG9wOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG4gIHBhZGRpbmc6IDNlbSAwO1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuXHJcbiAgYSB7XHJcbiAgICAmOmxpbmssXHJcbiAgICAmOnZpc2l0ZWQsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLnV0aWxzLWJvcmRlci1yaWdodCB7XHJcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG59XHJcblxyXG4uaGlkZGVuIHtcclxuICBkaXNwbGF5OiBub25lO1xyXG59XHJcbiIsIi8qKlxyXG4gKiBzaGFkb3cubGVzcyAtIOmYtOW9seagt+W8j+iuvue9riBtaXhpbngg5Ye95pWwXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xyXG4gKiBVcGRhdGU6IDIwMjIuMy4yMFxyXG4gKi9cclxuQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5cclxuLyogPT09PT09IOmYtOW9seagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cclxuLnNoYWRvdyhAb2Zmc2V0OiAwIDAgNnB4IDFweCwgQGNvbG9yOiBAcHJpbWFyeV9ib3JkZXJfY29sb3IpIHtcclxuICBib3gtc2hhZG93OiBAb2Zmc2V0IEBjb2xvcjtcclxufVxyXG5cclxuLnNoYWRvd19yZWd1bGFyKEBjb2xvcjogQHByaW1hcnlfYm9yZGVyX2NvbG9yKSB7XHJcbiAgLnNoYWRvdygwIDAgNnB4IDFweCwgQGNvbG9yKTtcclxufVxyXG5cclxuLnNoYWRvd19sYXJnZShAY29sb3I6IEBwcmltYXJ5X2JvcmRlcl9jb2xvcikge1xyXG4gIC5zaGFkb3coMCAwIDEycHggMXB4LCBAY29sb3IpO1xyXG59XHJcblxyXG4uc2hhZG93X2xpZ2h0X3JlZ3VsYXIoKSB7XHJcbiAgLnNoYWRvd19yZWd1bGFyKCk7XHJcbn1cclxuXHJcbi5zaGFkb3dfbGlnaHRfbGFyZ2UoKSB7XHJcbiAgLnNoYWRvd19sYXJnZSgpO1xyXG59XHJcblxyXG4uc2hhZG93X2RhcmtfcmVndWxhcigpIHtcclxuICAuc2hhZG93X3JlZ3VsYXIoQHNlY29uZGFyeV9ib3JkZXJfY29sb3IpO1xyXG59XHJcblxyXG4uc2hhZG93X2RhcmtfbGFyZ2UoKSB7XHJcbiAgLnNoYWRvd19sYXJnZShAc2Vjb25kYXJ5X2JvcmRlcl9jb2xvcik7XHJcbn1cclxuIiwiLyogPT09PT09PT09PSBpY29uLnRoZW1lIC0gc3ZnIOWbvuagh+eahOagt+W8jyA9PT09PT09PT09ICovXHJcbi5vdXRsaW5lLWljb24ge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gIHdpZHRoOiAxZW07XHJcbiAgaGVpZ2h0OiAxZW07XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fc3ZnIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDUwJTtcclxuICAgIHdpZHRoOiAxZW07XHJcbiAgICBoZWlnaHQ6IDFlbTtcclxuICAgIGZpbGw6IGN1cnJlbnRjb2xvcjtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcbn1cclxuIiwiOnJvb3Qge1xyXG4gIC0tb3V0bGluZS16SW5kZXg6IDIwMDA7XHJcbiAgLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQ6IDEwMCU7XHJcbiAgLS1vdXRsaW5lLWNoYXB0ZXJzLXdpZHRoOiAxMDAlO1xyXG59XHJcbiIsIkBpbXBvcnQgJy4vdmFyaWFibGVzJztcclxuQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5AaW1wb3J0ICcuL3NoYWRvdyc7XHJcblxyXG4ub3V0bGluZS1kcmF3ZXIge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAtMTtcclxuICB0b3A6IDA7XHJcbiAgbGVmdDogMDtcclxuICBtYXJnaW46IDA7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX21vZGFsIHtcclxuICAgIC5zaGFkb3dfbGlnaHRfcmVndWxhcigpO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBmbGV4LXdyYXA6IG5vd3JhcDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDIxO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19oZWFkZXIsXHJcbiAgJl9fbWFpbixcclxuICAmX19mb290ZXIge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIH1cclxuXHJcbiAgJl9faGVhZGVyLFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBmbGV4LXNocmluazogMDtcclxuICB9XHJcblxyXG4gICZfX3RpdGxlLFxyXG4gICZfX21haW4sXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuICB9XHJcblxyXG4gICZfX2hlYWRlcixcclxuICAmX190aXRsZSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBoZWlnaHQ6IDUycHg7XHJcbiAgICBsaW5lLWhlaWdodDogNTJweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgbWFyZ2luOiAwIDE2cHg7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2Nsb3NlIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIHJpZ2h0OiAxMnB4O1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICBsaW5lLWhlaWdodDogMjBweDtcclxuICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogMDtcclxuICAgICAgbGVmdDogMDtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fbWFpbiB7XHJcbiAgICBmbGV4OiAxO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX19mb290ZXIge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19vdmVybGF5IHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIG9wYWNpdHk6IDAuMTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX3J0bCxcclxuICAmX2x0ciB7XHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICB3aWR0aDogMjgwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgd2lkdGg6IDQ4MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICB3aWR0aDogNTQwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgd2lkdGg6IDY4MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgd2lkdGg6IDcyMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICB3aWR0aDogOTYwcHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcnRsIHtcclxuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtMjkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtNDkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTU1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTY5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtNzMwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTk3MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9sdHIge1xyXG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC0yOTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTQ5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTU1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtNjkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTczMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTk3MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIsXHJcbiAgJl9idHQge1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgIGhlaWdodDogMjQwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgaGVpZ2h0OiAzMjBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgaGVpZ2h0OiAzNjBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICBoZWlnaHQ6IDQwMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgaGVpZ2h0OiA0NDBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgaGVpZ2h0OiA0ODBweDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIge1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC0yNTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtMzMwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC0zNzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtNDEwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtNDUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC00OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfYnR0IHtcclxuICAgIHRvcDogaW5pdGlhbDtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtMjUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTMzMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtMzcwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTQxMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTQ1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtNDkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX29wZW5lZCB7XHJcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xyXG4gICAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcblxyXG4gICAgICAmX3J0bCB7XHJcbiAgICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbHRyIHtcclxuICAgICAgICBsZWZ0OiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3R0YiB7XHJcbiAgICAgICAgdG9wOiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2J0dCB7XHJcbiAgICAgICAgYm90dG9tOiAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX29mZnNldCB7XHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl9ydGwsXHJcbiAgICAgICZfbHRyIHtcclxuICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDRlbSk7XHJcbiAgICAgICAgdG9wOiA1MCU7XHJcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3R0YixcclxuICAgICAgJl9idHQge1xyXG4gICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSA0ZW0pO1xyXG4gICAgICAgIGxlZnQ6IDUwJTtcclxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfb3BlbmVkIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgICAgICZfcnRsIHtcclxuICAgICAgICAgICAgcmlnaHQ6IDJlbTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAmX2x0ciB7XHJcbiAgICAgICAgICAgIGxlZnQ6IDJlbTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAmX3R0YiB7XHJcbiAgICAgICAgICAgIHRvcDogMmVtO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICZfYnR0IHtcclxuICAgICAgICAgICAgYm90dG9tOiAyZW07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2F1dG8ge1xyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfcnRsLFxyXG4gICAgICAmX2x0ciB7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIDRlbSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfZnVsbCB7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4ub3V0bGluZS1oZWFkaW5nIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgei1pbmRleDogMTtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19hbmNob3Ige1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuXHJcbiAgICAmOmxpbmssXHJcbiAgICAmOnZpc2l0ZWQsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmOmhvdmVyIHtcclxuICAgIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfc3RhcnQge1xyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgei1pbmRleDogMjtcclxuICAgICAgdG9wOiA1MCU7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgICAgbGVmdDogLTFlbTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnLi92YXJpYWJsZXMnO1xyXG5AaW1wb3J0ICcuL2NvbG9ycyc7XHJcbkBpbXBvcnQgJy4vZWxsaXBzaXMnO1xyXG5cclxuLm91dGxpbmUtY2hhcHRlcnMge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIG1hcmdpbjogMDtcclxuICB3aWR0aDogdmFyKC0tb3V0bGluZS1jaGFwdGVycy13aWR0aCk7XHJcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcclxuICBvdmVyZmxvdzogYXV0bztcclxuXHJcbiAgJl9fdGl0bGUge1xyXG4gICAgbWFyZ2luOiAwIDE2cHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBsaW5lLWhlaWdodDogNDBweDtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX21haW4ge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19saXN0LFxyXG4gICZfX3N1YmplY3QsXHJcbiAgJl9faXRlbSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19saXN0IHtcclxuICAgIHBhZGRpbmc6IDAuNWVtIDA7XHJcbiAgfVxyXG5cclxuICAmX19zdWJqZWN0IHtcclxuICAgIHBhZGRpbmctbGVmdDogMWVtO1xyXG4gIH1cclxuXHJcbiAgJl9faXRlbSB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBsaW5lLWhlaWdodDogMzBweDtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19wbGFjZWhvbGRlciB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAzMHB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGhvdmVyX2JnX2NvbG9yO1xyXG4gICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCBAc3VjY2Vzc19jb2xvcjtcclxuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2FuY2hvciB7XHJcbiAgICAuZWxsaXBzaXMoMSk7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIHBhZGRpbmc6IDAgMS41ZW07XHJcblxyXG4gICAgJjpsaW5rLFxyXG4gICAgJjp2aXNpdGVkLFxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgICAgY29sb3I6IEBzZWNvbmRhcnlfdGV4dF9jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fY29kZSB7XHJcbiAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTtcclxuICB9XHJcblxyXG4gICZfYWN0aXZlIHtcclxuICAgICYub3V0bGluZS1jaGFwdGVyc19fYW5jaG9yIHtcclxuICAgICAgJjpsaW5rLFxyXG4gICAgICAmOnZpc2l0ZWQsXHJcbiAgICAgICY6aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3N0aWNreSxcclxuICAmX2ZpeGVkIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LXdyYXA6IG5vd3JhcDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgIC5vdXRsaW5lLWNoYXB0ZXJzIHtcclxuICAgICAgJl9fdGl0bGUsXHJcbiAgICAgICZfX21haW4ge1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX3RpdGxlIHtcclxuICAgICAgICBmbGV4LXNocmluazogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fbWFpbiB7XHJcbiAgICAgICAgZmxleDogMTtcclxuICAgICAgICBvdmVyZmxvdzogYXV0bztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9zdGlja3kge1xyXG4gICAgcG9zaXRpb246IHN0aWNreTtcclxuICAgIG1heC1oZWlnaHQ6IHZhcigtLW91dGxpbmUtc3RpY2t5LWhlaWdodCk7XHJcbiAgfVxyXG5cclxuICAmX2ZpeGVkIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIG1heC1oZWlnaHQ6IDEwMCU7XHJcbiAgfVxyXG5cclxuICAmX2hpZGRlbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gIH1cclxuXHJcbiAgJl9mb2xkZWQge1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgfVxyXG59XHJcbiIsIi8qKlxuICogZWxsaXBzaXMubGVzcyAtIOaWh+acrOecgeeVpSBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxuICovXG5cbi8qID09PT09PSDmlofmnKznnIHnlaXlh73mlbAgPT09PT09ICovXG4uZWxsaXBzaXMgKEBsaW5lcykgd2hlbiAoQGxpbmVzPTEpIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5lbGxpcHNpcyAoQGxpbmVzKSB3aGVuIChAbGluZXM+PTIpIHtcbiAgLXdlYmtpdC1saW5lLWNsYW1wOiBAbGluZXM7XG4gIGRpc3BsYXk6IGJveDtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4iLCIvKiA9PT09PT09PT09IGJ1dHRvbnMudGhlbWUgLSDmjInpkq7lr7zoiKrmoLflvI8gPT09PT09PT09PSAqL1xyXG5AaW1wb3J0ICcuL2NvbG9ycyc7XHJcbkBpbXBvcnQgJy4vc2hhZG93JztcclxuXHJcbi5vdXRsaW5lLXRvb2xiYXIge1xyXG4gIHBvc2l0aW9uOiBmaXhlZDtcclxuICB6LWluZGV4OiA5OTk5OTtcclxuICBtYXJnaW46IDA7XHJcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19idXR0b24ge1xyXG4gICAgLnNoYWRvd19saWdodF9yZWd1bGFyKCk7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgbWFyZ2luOiAxMHB4O1xyXG4gICAgd2lkdGg6IDM2cHg7XHJcbiAgICBoZWlnaHQ6IDM2cHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgY29sb3I6IEBzZWNvbmRhcnlfdGV4dF9jb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgYm9yZGVyLWNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAmLmhpZGUge1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fYW5jaG9yIHtcclxuICAgICY6bGluayxcclxuICAgICY6dmlzaXRlZCxcclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICB9XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX2ljb24ge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcclxuICAgIGZpbGw6IGN1cnJlbnRjb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX2FjdGl2ZSB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhciB7XHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICBib3JkZXItY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG5cclxuICAgICAgICAmOmhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiBAd2hpdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yIHtcclxuICAgICAgJjpsaW5rLFxyXG4gICAgICAmOnZpc2l0ZWQsXHJcbiAgICAgICY6aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBAd2hpdGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcm91bmRlZCB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcclxuICAgICAgYm9yZGVyLXJhZGl1czogMThweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfZGlzYWJsZWQge1xyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXIsXHJcbiAgICAub3V0bGluZS10b29sYmFyIHtcclxuICAgICAgJl9fYW5jaG9yOmxpbmssXHJcbiAgICAgICZfX2FuY2hvcjp2aXNpdGVkLFxyXG4gICAgICAmX19hbmNob3I6aG92ZXIsXHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxuICAgICAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG5cclxuICAgICAgICAmOmhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX19idXR0b24ge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBkaXNhYmxlZF9iZ19jb2xvcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIsXHJcbiAgJl9idHQge1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xyXG5cclxuICAgIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdHRiIHtcclxuICAgIHRvcDogMTJweDtcclxuXHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICB0b3A6IC01NnB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9idHQge1xyXG4gICAgYm90dG9tOiAxMnB4O1xyXG5cclxuICAgICYub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XHJcbiAgICAgIGJvdHRvbTogLTU2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3J0bCxcclxuICAmX2x0ciB7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgICB3aWR0aDogNTZweDtcclxuICB9XHJcblxyXG4gICZfcnRsIHtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgcmlnaHQ6IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgcmlnaHQ6IC04NnB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9sdHIge1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiAxMnB4O1xyXG5cclxuICAgICYub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XHJcbiAgICAgIGxlZnQ6IC04NnB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIsXHJcbiAgJl9ydGwsXHJcbiAgJl9idHQsXHJcbiAgJl9sdHIge1xyXG4gICAgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcclxuICAgICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ== */ diff --git a/docs/css/example.min.css b/docs/css/example.min.css index f00c480e..098f7d73 100644 --- a/docs/css/example.min.css +++ b/docs/css/example.min.css @@ -1,2 +1,2 @@ -.case:after,.outline-drawer__overlay{content:''}.case,.section__footer{border-top:1px solid #ddd}::-webkit-scrollbar{width:7px;height:7px;-webkit-border-radius:5px}::-webkit-scrollbar-track-piece{-webkit-border-radius:5px}::-webkit-scrollbar-thumb:vertical{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:horizontal{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar:hover{background-color:rgba(0,0,0,.15)}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.35)}.section{margin:1em 0;overflow:hidden}.section__content,.section__footer,.section__header{margin:0 3em;overflow:hidden}.section__title{color:#666}.section__h3{color:#1f8dd6;font-size:1.35em}.section__h4{font-size:1.1em;color:#666}.section__h5{font-size:1em;color:#999}.section__dl{position:relative;z-index:1;overflow:hidden}.section__dt{position:absolute;z-index:2;top:0;left:0;width:60px;margin:0;overflow:hidden}.case,.section__dd{position:relative;overflow:hidden}.section__dd{z-index:1;margin:0 0 0 60px;color:#058942}.section__pre{margin:2em 0;font-size:14px;line-height:150%;text-align:left;border:1px solid #ddd;border-radius:4px;color:#666}.section__code{display:block;margin:0 auto;overflow:hidden}.section__footer{margin-top:3em;background-color:#fafafa;color:#999}.case{z-index:1;display:grid;grid-template-columns:repeat(2,1fr);gap:40px;padding:1em;border-bottom:1px solid #ddd}.case:after{position:absolute;z-index:2;top:0;left:50%;height:100%;width:0;border-left:1px solid #ddd;overflow:hidden}.case__pre,.case__textarea{font-size:13px;line-height:150%}.case__code,.case__pre,.case__textarea{font-family:"Courier New",Consolas,Georgia,Arial,sans-serif}.case__pre{margin:0;padding:1em;background-color:#fafafa;height:100%;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.case__textarea,.paper,.paper.flex .article{-webkit-box-sizing:border-box}.case__toolbar{margin:0 auto;height:36px;line-height:36px;font-size:14px;padding:0 16px;text-align:right;overflow:hidden}.case__action,.case__remove{cursor:pointer;color:#058942;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.case__action{font-size:13px;padding-left:10px}.case__action:first-child{padding-left:0}.case__remove{float:right}.case__console{margin:0 auto;height:180px;border:1px solid #ddd;overflow:hidden}.case__textarea{margin:0 auto;width:100%;height:100%;border:none;outline:0;padding:1em;box-sizing:border-box;overflow:auto}.case__list,.header{border-bottom:1px solid #ddd}.case__item,.case__list{margin:0;padding:0;list-style-type:none;overflow:hidden}.case__list{height:360px;border-top:1px solid #ddd;font-size:13px;overflow:auto}.footer,.outline-drawer_btt{border-top:1px solid #dcdfe6}.case__item{height:36px;line-height:36px;cursor:pointer;padding:0 16px}.case__item:hover{background-color:#f7f8f9}.article__aside .outline-chapters,.header,.outline-drawer__modal,.outline-drawer__overlay,.paper{background-color:#fff}.paper{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;margin:2em auto;max-width:1200px;padding:2em;box-sizing:border-box}.paper.flex{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin:0;width:100%;max-width:100%;height:100%;padding:0;overflow:hidden}.outline-chapters_fixed,.outline-chapters_sticky,.outline-drawer__modal,.paper.flex .article{-webkit-box-orient:vertical;-webkit-box-direction:normal}.paper.flex .article{-ms-flex-direction:column;flex-direction:column;width:100%;box-sizing:border-box}.paper.flex .article__main{height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.paper.flex .article__aside{border-right:1px solid #dcdfe6}.header{position:sticky;z-index:3;top:0;margin:0 auto;text-align:center;-webkit-transition-duration:.3s;transition-duration:.3s;overflow:hidden}.header_sticky{padding-left:260px}.article{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:2em 0;font-size:16px;line-height:150%}.hidden,.outline-heading__anchor{display:none}.article__main{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 2em;overflow:hidden}.article__main .section,.article__main .section__content,.article__main .section__footer,.article__main .section__header{overflow:visible}.article__main .section__content,.article__main .section__header{margin:0}.article__aside{-ms-flex-negative:0;flex-shrink:0;width:240px;border-left:1px solid #ddd;-webkit-transition-duration:.3s;transition-duration:.3s}.article__aside.ltr{border-right:1px solid #ddd;border-left:none}.outline-drawer_ltr,.utils-border-right{border-right:1px solid #dcdfe6}.section__pre,pre{padding:2em;font-family:"Courier New",Arial,sans-serif;background-color:#fafafa;overflow:auto}.section__code,code{font-family:"Courier New",Arial,sans-serif;font-size:16px}.footer{padding:3em 0;text-align:center}.footer a:hover,.footer a:link,.footer a:visited{text-decoration:none;color:#058942}.footer a:hover{text-decoration:underline}.outline-icon{position:relative;z-index:1;display:inline-block;vertical-align:middle;width:1em;height:1em;overflow:hidden}.outline-icon__svg{position:absolute;z-index:2;top:50%;left:50%;width:1em;height:1em;fill:currentcolor;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);overflow:hidden}:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-chapters-width:100%}.outline-drawer{position:relative;z-index:-1;top:0;left:0;margin:0;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;visibility:hidden;overflow:hidden}.outline-drawer__modal{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:absolute;z-index:21;height:100%;-webkit-transition-duration:.4s;transition-duration:.4s;overflow:hidden}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__footer,.outline-drawer__header{-ms-flex-negative:0;flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{position:relative;z-index:1;margin:0 auto;height:52px;line-height:52px;overflow:hidden}.outline-drawer__title{font-size:16px;font-weight:400;margin:0 16px;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #dcdfe6}.outline-drawer__close{position:absolute;z-index:2;top:50%;right:12px;width:20px;height:20px;line-height:20px;color:#999;font-size:20px;text-align:center;cursor:pointer;-webkit-transform:translateY(-50%);transform:translateY(-50%);overflow:hidden}.outline-drawer__close .outline-icon{position:absolute;z-index:2;top:0;left:0}.outline-drawer__close:hover{color:#666}.outline-drawer__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-drawer__footer{margin:0 auto;text-align:right;overflow:hidden}.outline-drawer__overlay{position:relative;z-index:1;top:0;left:0;width:100%;height:100%;opacity:.1;overflow:hidden}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{top:initial}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{width:calc(100% - 4em);left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0}.outline-heading{position:relative;z-index:1;overflow:hidden}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#1f8dd6}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{position:absolute;z-index:2;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:-1em}.outline-chapters{position:relative;z-index:1;margin:0;width:var(--outline-chapters-width);-webkit-transition-duration:.3s;transition-duration:.3s;overflow:auto}.outline-chapters__title{margin:0 16px;height:40px;line-height:40px;padding:0 16px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;overflow:hidden}.outline-chapters__main{position:relative;z-index:1;margin:0;overflow:hidden}.outline-chapters__item,.outline-chapters__list,.outline-chapters__subject{position:relative;z-index:2;margin:0;padding:0;list-style-type:none;overflow:hidden}.outline-chapters__list{padding:.5em 0}.outline-chapters__subject{padding-left:1em}.outline-chapters__item{margin:0;line-height:30px;font-size:13px;overflow:hidden}.outline-chapters__placeholder{position:absolute;z-index:1;top:0;left:0;width:100%;height:30px;background-color:#f7f8f9;border-left:2px solid #058942;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.outline-chapters__anchor{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;padding:0 1.5em}.outline-chapters__anchor:hover,.outline-chapters__anchor:link,.outline-chapters__anchor:visited{text-decoration:none;color:#555}.outline-chapters__anchor:hover{color:#058942}.outline-chapters__code{padding-right:.5em}.outline-chapters_active.outline-chapters__anchor:hover,.outline-chapters_active.outline-chapters__anchor:link,.outline-chapters_active.outline-chapters__anchor:visited{color:#058942;font-weight:400}.outline-chapters_fixed,.outline-chapters_sticky{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-direction:column;flex-direction:column;z-index:var(--outline-zIndex);top:0;overflow:hidden}.outline-chapters_hidden,.outline-toolbar__button.hide{display:none}.outline-chapters_fixed .outline-chapters__main,.outline-chapters_fixed .outline-chapters__title,.outline-chapters_sticky .outline-chapters__main,.outline-chapters_sticky .outline-chapters__title{-webkit-box-sizing:border-box;box-sizing:border-box}.outline-chapters_fixed .outline-chapters__title,.outline-chapters_sticky .outline-chapters__title{-ms-flex-negative:0;flex-shrink:0}.outline-chapters_fixed .outline-chapters__main,.outline-chapters_sticky .outline-chapters__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-chapters_sticky{position:sticky;max-height:var(--outline-sticky-height)}.outline-chapters_fixed{position:fixed;max-height:100%}.outline-chapters_folded{width:0}.outline-toolbar{position:fixed;z-index:99999;margin:0;-webkit-transition-duration:.3s;transition-duration:.3s;overflow:hidden}.outline-toolbar__button{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;position:relative;z-index:1;margin:10px;width:36px;height:36px;border:1px solid #dcdfe6;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;cursor:pointer;text-align:center;color:#555;overflow:hidden}.outline-toolbar__button:hover{color:#058942;border-color:#058942}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{position:absolute;z-index:2;top:50%;left:50%;width:20px;height:20px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{color:#fff;background-color:#058942;border-color:#058942}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited,.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{cursor:not-allowed;color:#999}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{-webkit-transform:translateY(-50%);transform:translateY(-50%);width:56px}.outline-toolbar_rtl{top:50%;right:12px}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{top:50%;left:12px}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJjc3MvZXhhbXBsZS5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzaGFkb3cubGVzcyAtIOmYtOW9seagt+W8j+iuvue9riBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4yMFxuICovXG4vKiA9PT09PT09PT09IGNvbG9ycy50aGVtZSAtIOWfuuehgOminOiJsuWPmOmHj+mbhuWQiCA9PT09PT09PT09ICovXG4vKiA9PT09PT0g6Zi05b2x5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xuLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgd2lkdGg6IDdweDtcbiAgaGVpZ2h0OiA3cHg7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZSB7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuLnNlY3Rpb24ge1xuICBtYXJnaW46IDFlbSAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2hlYWRlcixcbi5zZWN0aW9uX19jb250ZW50LFxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIG1hcmdpbjogMCAzZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fdGl0bGUge1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oMyB7XG4gIGNvbG9yOiAjMWY4ZGQ2O1xuICBmb250LXNpemU6IDEuMzVlbTtcbn1cbi5zZWN0aW9uX19oNCB7XG4gIGZvbnQtc2l6ZTogMS4xZW07XG4gIGNvbG9yOiAjNjY2O1xufVxuLnNlY3Rpb25fX2g1IHtcbiAgZm9udC1zaXplOiAxZW07XG4gIGNvbG9yOiAjOTk5O1xufVxuLnNlY3Rpb25fX2RsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2R0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiA2MHB4O1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fZGQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMCAwIDAgNjBweDtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fcHJlIHtcbiAgbWFyZ2luOiAyZW0gMDtcbiAgcGFkZGluZzogMWVtO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGNvbG9yOiAjNjY2O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5zZWN0aW9uX19jb2RlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBtYXJnaW4tdG9wOiAzZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGNvbG9yOiAjOTk5O1xufVxuLmNhc2Uge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7XG4gIGdhcDogNDBweDtcbiAgcGFkZGluZzogMWVtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZTphZnRlciB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogNTAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwO1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX3RleHRhcmVhIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbn1cbi5jYXNlX19wcmUsXG4uY2FzZV9fY29kZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBcIkNvdXJpZXIgTmV3XCIsIENvbnNvbGFzLCBHZW9yZ2lhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbn1cbi5jYXNlX19wcmUge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDFlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX190b29sYmFyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19hY3Rpb24sXG4uY2FzZV9fcmVtb3ZlIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzA1ODk0MjtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cbi5jYXNlX19hY3Rpb24ge1xuICBmb250LXNpemU6IDEzcHg7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbn1cbi5jYXNlX19hY3Rpb246Zmlyc3QtY2hpbGQge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG59XG4uY2FzZV9fcmVtb3ZlIHtcbiAgZmxvYXQ6IHJpZ2h0O1xufVxuLmNhc2VfX2NvbnNvbGUge1xuICBtYXJnaW46IDAgYXV0bztcbiAgaGVpZ2h0OiAxODBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX190ZXh0YXJlYSB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3JkZXI6IG5vbmU7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHBhZGRpbmc6IDFlbTtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2xpc3QsXG4uY2FzZV9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX2xpc3Qge1xuICBoZWlnaHQ6IDM2MHB4O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9faXRlbSB7XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLmNhc2VfX2l0ZW06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xufVxuLnBhcGVyIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIG1hcmdpbjogMmVtIGF1dG87XG4gIG1heC13aWR0aDogMTIwMHB4O1xuICBwYWRkaW5nOiAyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLnBhcGVyLmZsZXgge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC13ZWJraXQtYm94LW9yaWVudDogaG9yaXpvbnRhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ucGFwZXIuZmxleCAuYXJ0aWNsZSB7XG4gIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xuICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgd2lkdGg6IDEwMCU7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLnBhcGVyLmZsZXggLmFydGljbGVfX21haW4ge1xuICBoZWlnaHQ6IDEwMCU7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5wYXBlci5mbGV4IC5hcnRpY2xlX19hc2lkZSB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4uaGVhZGVyIHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgei1pbmRleDogMztcbiAgdG9wOiAwO1xuICBtYXJnaW46IDAgYXV0bztcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uaGVhZGVyX3N0aWNreSB7XG4gIHBhZGRpbmctbGVmdDogMjYwcHg7XG59XG4uYXJ0aWNsZSB7XG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiBob3Jpem9udGFsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICBwYWRkaW5nOiAyZW0gMDtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbn1cbi5hcnRpY2xlX19tYWluIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIHBhZGRpbmc6IDAgMmVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmFydGljbGVfX21haW4gLnNlY3Rpb24ge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uX19jb250ZW50LFxuLmFydGljbGVfX21haW4gLnNlY3Rpb25fX2Zvb3Rlcixcbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uX19oZWFkZXIge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uX19oZWFkZXIsXG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9fY29udGVudCB7XG4gIG1hcmdpbjogMDtcbn1cbi5hcnRpY2xlX19hc2lkZSB7XG4gIC1tcy1mbGV4LW5lZ2F0aXZlOiAwO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gIHdpZHRoOiAyNDBweDtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbn1cbi5hcnRpY2xlX19hc2lkZS5sdHIge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItbGVmdDogbm9uZTtcbn1cbi5hcnRpY2xlX19hc2lkZSAub3V0bGluZS1jaGFwdGVycyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG5wcmUsXG4uc2VjdGlvbl9fcHJlIHtcbiAgcGFkZGluZzogMmVtO1xuICBmb250LWZhbWlseTogXCJDb3VyaWVyIE5ld1wiLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5jb2RlLFxuLnNlY3Rpb25fX2NvZGUge1xuICBmb250LWZhbWlseTogXCJDb3VyaWVyIE5ld1wiLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxNnB4O1xufVxuLmZvb3RlciB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGNkZmU2O1xuICBwYWRkaW5nOiAzZW0gMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLmZvb3RlciBhOmxpbmssXG4uZm9vdGVyIGE6dmlzaXRlZCxcbi5mb290ZXIgYTpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4uZm9vdGVyIGE6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cbi51dGlscy1ib3JkZXItcmlnaHQge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKiA9PT09PT09PT09IGljb24udGhlbWUgLSBzdmcg5Zu+5qCH55qE5qC35byPID09PT09PT09PT0gKi9cbi5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX19zdmcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAxZW07XG4gIGhlaWdodDogMWVtO1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG46cm9vdCB7XG4gIC0tb3V0bGluZS16SW5kZXg6IDIwMDA7XG4gIC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0OiAxMDAlO1xuICAtLW91dGxpbmUtY2hhcHRlcnMtd2lkdGg6IDEwMCU7XG59XG4ub3V0bGluZS1kcmF3ZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IC0xO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fbW9kYWwge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDIxO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjRzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHdpZHRoOiAxMDAlO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICAtbXMtZmxleC1uZWdhdGl2ZTogMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX190aXRsZSxcbi5vdXRsaW5lLWRyYXdlcl9fbWFpbixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDAgYXV0bztcbiAgaGVpZ2h0OiA1MnB4O1xuICBsaW5lLWhlaWdodDogNTJweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUge1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIG1hcmdpbjogMCAxNnB4O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBjb2xvcjogIzk5OTtcbiAgZm9udC1zaXplOiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlOmhvdmVyIHtcbiAgY29sb3I6ICM2NjY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ge1xuICAtd2Via2l0LWJveC1mbGV4OiAxO1xuICAgICAgLW1zLWZsZXg6IDE7XG4gICAgICAgICAgZmxleDogMTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fb3ZlcmxheSB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3BhY2l0eTogMC4xO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55LFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55IHtcbiAgd2lkdGg6IDI4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgd2lkdGg6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICB3aWR0aDogNTQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIsXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIge1xuICB3aWR0aDogNjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgd2lkdGg6IDcyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICB3aWR0aDogOTYwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtMjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTY5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICBoZWlnaHQ6IDI0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgaGVpZ2h0OiAzMjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3NtYWxsIHtcbiAgaGVpZ2h0OiAzNjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIGhlaWdodDogNDAwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgaGVpZ2h0OiA0NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2UsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX2xhcmdlIHtcbiAgaGVpZ2h0OiA0ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgdG9wOiBpbml0aWFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgcmlnaHQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIHRvcDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgYm90dG9tOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9ydGwsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbiAgdG9wOiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfdHRiLFxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB3aWR0aDogY2FsYygxMDAlIC0gNGVtKTtcbiAgbGVmdDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogYXV0bztcbiAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9mdWxsIHtcbiAgcGFkZGluZzogMDtcbn1cbi5vdXRsaW5lLWhlYWRpbmcge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzFmOGRkNjtcbn1cbi5vdXRsaW5lLWhlYWRpbmc6aG92ZXIgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLm91dGxpbmUtaGVhZGluZ19zdGFydDpob3ZlciB7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuLm91dGxpbmUtaGVhZGluZ19zdGFydCAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIGxlZnQ6IC0xZW07XG59XG4vKipcbiAqIGVsbGlwc2lzLmxlc3MgLSDmlofmnKznnIHnlaUgbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyogPT09PT09IOaWh+acrOecgeeVpeWHveaVsCA9PT09PT0gKi9cbi5vdXRsaW5lLWNoYXB0ZXJzIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiB2YXIoLS1vdXRsaW5lLWNoYXB0ZXJzLXdpZHRoKTtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX3RpdGxlIHtcbiAgbWFyZ2luOiAwIDE2cHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX19tYWluIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1jaGFwdGVyc19fbGlzdCxcbi5vdXRsaW5lLWNoYXB0ZXJzX19zdWJqZWN0LFxuLm91dGxpbmUtY2hhcHRlcnNfX2l0ZW0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDI7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX2xpc3Qge1xuICBwYWRkaW5nOiAwLjVlbSAwO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX3N1YmplY3Qge1xuICBwYWRkaW5nLWxlZnQ6IDFlbTtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX19pdGVtIHtcbiAgbWFyZ2luOiAwO1xuICBsaW5lLWhlaWdodDogMzBweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX3BsYWNlaG9sZGVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAxO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDMwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmN2Y4Zjk7XG4gIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzA1ODk0MjtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjJzO1xuICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvciB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMCAxLjVlbTtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX19hbmNob3I6bGluayxcbi5vdXRsaW5lLWNoYXB0ZXJzX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLWNoYXB0ZXJzX19hbmNob3I6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjNTU1O1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX2NvZGUge1xuICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX2FjdGl2ZS5vdXRsaW5lLWNoYXB0ZXJzX19hbmNob3I6bGluayxcbi5vdXRsaW5lLWNoYXB0ZXJzX2FjdGl2ZS5vdXRsaW5lLWNoYXB0ZXJzX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLWNoYXB0ZXJzX2FjdGl2ZS5vdXRsaW5lLWNoYXB0ZXJzX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0MjtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX3N0aWNreSxcbi5vdXRsaW5lLWNoYXB0ZXJzX2ZpeGVkIHtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XG4gIHRvcDogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX3N0aWNreSAub3V0bGluZS1jaGFwdGVyc19fdGl0bGUsXG4ub3V0bGluZS1jaGFwdGVyc19maXhlZCAub3V0bGluZS1jaGFwdGVyc19fdGl0bGUsXG4ub3V0bGluZS1jaGFwdGVyc19zdGlja3kgLm91dGxpbmUtY2hhcHRlcnNfX21haW4sXG4ub3V0bGluZS1jaGFwdGVyc19maXhlZCAub3V0bGluZS1jaGFwdGVyc19fbWFpbiB7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLm91dGxpbmUtY2hhcHRlcnNfc3RpY2t5IC5vdXRsaW5lLWNoYXB0ZXJzX190aXRsZSxcbi5vdXRsaW5lLWNoYXB0ZXJzX2ZpeGVkIC5vdXRsaW5lLWNoYXB0ZXJzX190aXRsZSB7XG4gIC1tcy1mbGV4LW5lZ2F0aXZlOiAwO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG59XG4ub3V0bGluZS1jaGFwdGVyc19zdGlja3kgLm91dGxpbmUtY2hhcHRlcnNfX21haW4sXG4ub3V0bGluZS1jaGFwdGVyc19maXhlZCAub3V0bGluZS1jaGFwdGVyc19fbWFpbiB7XG4gIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX3N0aWNreSB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIG1heC1oZWlnaHQ6IHZhcigtLW91dGxpbmUtc3RpY2t5LWhlaWdodCk7XG59XG4ub3V0bGluZS1jaGFwdGVyc19maXhlZCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgbWF4LWhlaWdodDogMTAwJTtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1jaGFwdGVyc19mb2xkZWQge1xuICB3aWR0aDogMDtcbn1cbi8qID09PT09PT09PT0gYnV0dG9ucy50aGVtZSAtIOaMiemSruWvvOiIquagt+W8jyA9PT09PT09PT09ICovXG4ub3V0bGluZS10b29sYmFyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiA5OTk5OTtcbiAgbWFyZ2luOiAwO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMTBweDtcbiAgd2lkdGg6IDM2cHg7XG4gIGhlaWdodDogMzZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RjZGZlNjtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiAjNTU1O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5oaWRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS10b29sYmFyX19pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZS5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDU4OTQyO1xuICBib3JkZXItY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZS5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtdG9vbGJhcl9yb3VuZGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYm9yZGVyLXJhZGl1czogMThweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbms6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZDpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXI6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiLFxuLm91dGxpbmUtdG9vbGJhcl9idHQge1xuICBsZWZ0OiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIHtcbiAgdG9wOiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIHRvcDogLTU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2J0dCB7XG4gIGJvdHRvbTogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYnR0Lm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBib3R0b206IC01NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwsXG4ub3V0bGluZS10b29sYmFyX2x0ciB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgd2lkdGg6IDU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bCB7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICByaWdodDogLTg2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2x0ciB7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9sdHIub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGxlZnQ6IC04NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX3J0bCAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9sdHIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGY4O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THp4cGJuQjFkQ0JqYzNNZ01qNGlMQ0p6WTNKdmJHeGlZWEl1YkdWemN5SXNJbk5sWTNScGIyNHViR1Z6Y3lJc0ltTmhjMlV1YkdWemN5SXNJbkJoWjJWeUxteGxjM01pTENJdUxpOHVMaTl6Y21NdmRHaGxiV1V2YzJoaFpHOTNMbXhsYzNNaUxDSXVMaTh1TGk5emNtTXZkR2hsYldVdmFXTnZibk11YkdWemN5SXNJaTR1THk0dUwzTnlZeTkwYUdWdFpTOTJZWEpwWVdKc1pYTXViR1Z6Y3lJc0lpNHVMeTR1TDNOeVl5OTBhR1Z0WlM5a2NtRjNaWEl1YkdWemN5SXNJaTR1THk0dUwzTnlZeTkwYUdWdFpTOWhibU5vYjNKekxteGxjM01pTENJdUxpOHVMaTl6Y21NdmRHaGxiV1V2WTJoaGNIUmxjbk11YkdWemN5SXNJaTR1THk0dUwzTnlZeTkwYUdWdFpTOWxiR3hwY0hOcGN5NXNaWE56SWl3aUxpNHZMaTR2YzNKakwzUm9aVzFsTDNSdmIyeGlZWEl1YkdWemN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkJRVHM3T3pzN1IwRkxSenRCUVVOSUxHMUVRVUZ0UkR0QlFVTnVSQ3cwUWtGQk5FSTdRVUZETlVJc01rSkJRVEpDTzBGRFVETkNPMFZCUTBVc1YwRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTd3lRa0ZCUVR0RFJGTkVPMEZEVGtRN1JVRkRSU3d5UWtGQlFUdERSRkZFTzBGRFRFUTdSVUZEUlN4elEwRkJRVHRGUVVOQkxESkNRVUZCTzBORVQwUTdRVU5LUkR0RlFVTkZMSE5EUVVGQk8wVkJRMEVzTWtKQlFVRTdRMFJOUkR0QlEwaEVPMFZCUTBVc2MwTkJRVUU3UTBSTFJEdEJRMFpFTzBWQlEwVXNjME5CUVVFN1EwUkpSRHRCUlRWQ1JEdEZRVU5GTEdOQlFVRTdSVUZEUVN4cFFrRkJRVHREUmpoQ1JEdEJSVFZDUXpzN08wVkJSMFVzWTBGQlFUdEZRVU5CTEdsQ1FVRkJPME5HT0VKSU8wRkZNMEpETzBWQlEwVXNXVUZCUVR0RFJqWkNTRHRCUlRGQ1F6dEZRVU5GTEdWQlFVRTdSVUZEUVN4clFrRkJRVHREUmpSQ1NEdEJSWHBDUXp0RlFVTkZMR2xDUVVGQk8wVkJRMEVzV1VGQlFUdERSakpDU0R0QlJYaENRenRGUVVORkxHVkJRVUU3UlVGRFFTeFpRVUZCTzBOR01FSklPMEZGZGtKRE8wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc2FVSkJRVUU3UTBaNVFrZzdRVVYwUWtNN1JVRkRSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4UFFVRkJPMFZCUTBFc1VVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNhVUpCUVVFN1EwWjNRa2c3UVVWeVFrTTdSVUZEUlN4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTkJMR1ZCUVVFN1JVRkRRU3hwUWtGQlFUdERSblZDU0R0QlJYQkNRenRGUVVORkxHTkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdsQ1FVRkJPMFZCUTBFc01FSkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEdWQlFVRTdRMFp6UWtnN1FVVnVRa003UlVGRFJTeGxRVUZCTzBWQlEwRXNaVUZCUVR0RlFVTkJMR2xDUVVGQk8wTkdjVUpJTzBGRmJFSkRPMFZCUTBVc01rSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMREJDUVVGQk8wVkJRMEVzV1VGQlFUdERSbTlDU0R0QlIycEhSRHRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMR05CUVVFN1JVRkRRU3h6UTBGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc01rSkJRVUU3UlVGRFFTdzRRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTkliVWRFTzBGSGFrZERPMFZCUTBVc1dVRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRTlCUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEZOQlFVRTdSVUZEUVN3MFFrRkJRVHRGUVVOQkxHbENRVUZCTzBOSWJVZElPMEZIYUVkRE96dEZRVVZGTEdkQ1FVRkJPMFZCUTBFc2EwSkJRVUU3UTBoclIwZzdRVWN2UmtNN096dEZRVWRGTEdsRlFVRkJPME5JYVVkSU8wRkhPVVpETzBWQlEwVXNWVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3d3UWtGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4dFFrRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3hsUVVGQk8wTklaMGRJTzBGSE4wWkRPMFZCUTBVc1pVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeHJRa0ZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHbENRVUZCTzBOSUswWklPMEZITlVaRE96dEZRVVZGTEdkQ1FVRkJPMFZCUTBFc1pVRkJRVHRGUVVOQkxEQkNRVUZCTzB0QlFVRXNkVUpCUVVFN1RVRkJRU3h6UWtGQlFUdFZRVUZCTEd0Q1FVRkJPME5JT0VaSU8wRkhNMFpETzBWQlEwVXNaMEpCUVVFN1JVRkRRU3h0UWtGQlFUdERTRFpHU0R0QlJ6TkdSenRGUVVORkxHZENRVUZCTzBOSU5rWk1PMEZIZWtaRE8wVkJRMFVzWVVGQlFUdERTREpHU0R0QlIzaEdRenRGUVVORkxHVkJRVUU3UlVGRFFTeGpRVUZCTzBWQlEwRXNkVUpCUVVFN1JVRkRRU3hwUWtGQlFUdERTREJHU0R0QlIzWkdRenRGUVVORkxHVkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3hqUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTeGxRVUZCTzBOSWVVWklPMEZIZEVaRE96dEZRVVZGTEZWQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc2MwSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFNIZEdTRHRCUjNKR1F6dEZRVU5GTEdOQlFVRTdSVUZEUVN3eVFrRkJRVHRGUVVOQkxEaENRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3hsUVVGQk8wTklkVVpJTzBGSGNFWkRPMFZCUTBVc1lVRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3huUWtGQlFUdERTSE5HU0R0QlIzQkdSenRGUVVORkxEQkNRVUZCTzBOSWMwWk1PMEZKTlUxRU8wVkRVM2RFTEhkRFFVRkJPMVZCUVVFc1owTkJRVUU3UlVSUWRFUXNhVUpCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4MVFrRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1EwbzRUVVE3UVVrMVRVTTdSVUZEUlN4eFFrRkJRVHRGUVVGQkxIRkNRVUZCTzBWQlFVRXNZMEZCUVR0RlFVTkJMQ3RDUVVGQk8wVkJRVUVzT0VKQlFVRTdUVUZCUVN4M1FrRkJRVHRWUVVGQkxHOUNRVUZCTzBWQlEwRXNjMEpCUVVFN1RVRkJRU3hyUWtGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMR2xDUVVGQk8wTktPRTFJTzBGSmRrNURPMFZCV1Vrc05rSkJRVUU3UlVGQlFTdzRRa0ZCUVR0TlFVRkJMREpDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc0swSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RFNqaE5URHRCU1RWTlN6dEZRVU5GTEdGQlFVRTdSVUZEUVN3clFrRkJRVHRWUVVGQkxIVkNRVUZCTzBWQlEwRXNaVUZCUVR0RFNqaE5VRHRCU1ROTlN6dEZRVU5GTEdkRFFVRkJPME5LTmsxUU8wRkpkazFFTzBWQlEwVXNhVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVDBGQlFUdEZRVU5CTEdWQlFVRTdSVUZEUVN3NFFrRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3hyUTBGQlFUdFZRVUZCTERCQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTBwNVRVUTdRVWwyVFVNN1JVRkRSU3h2UWtGQlFUdERTbmxOU0R0QlNYSk5SRHRGUVVORkxIRkNRVUZCTzBWQlFVRXNjVUpCUVVFN1JVRkJRU3hqUVVGQk8wVkJRMEVzSzBKQlFVRTdSVUZCUVN3NFFrRkJRVHROUVVGQkxIZENRVUZCTzFWQlFVRXNiMEpCUVVFN1JVRkRRU3h6UWtGQlFUdE5RVUZCTEd0Q1FVRkJPMFZCUTBFc1pVRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNhMEpCUVVFN1EwcDFUVVE3UVVseVRVTTdSVUZEUlN4dlFrRkJRVHROUVVGQkxGbEJRVUU3VlVGQlFTeFJRVUZCTzBWQlEwRXNaVUZCUVR0RlFVTkJMR2xDUVVGQk8wTktkVTFJTzBGSk1VMURPMFZCVFVrc2EwSkJRVUU3UTBwMVRVdzdRVWx5VFVzN096dEZRVWRGTEd0Q1FVRkJPME5LZFUxUU8wRkpjRTFMT3p0RlFVVkZMRlZCUVVFN1EwcHpUVkE3UVVscVRVTTdSVUZEUlN4eFFrRkJRVHROUVVGQkxHVkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNORUpCUVVFN1JVRkRRU3hyUTBGQlFUdFZRVUZCTERCQ1FVRkJPME5LYlUxSU8wRkphazFITzBWQlEwVXNOa0pCUVVFN1JVRkRRU3hyUWtGQlFUdERTbTFOVER0QlNUTk5RenRGUVZsSkxIVkNRVUZCTzBOS2EwMU1PMEZKTjB4RU96dEZRVVZGTEdGQlFVRTdSVUZEUVN3NFEwRkJRVHRGUVVOQkxEQkNRVUZCTzBWQlEwRXNaVUZCUVR0RFNpdE1SRHRCU1RWTVJEczdSVUZGUlN3NFEwRkJRVHRGUVVOQkxHZENRVUZCTzBOS09FeEVPMEZKTTB4RU8wVkJRMFVzT0VKQlFVRTdSVUZEUVN4bFFVRkJPMFZCUTBFc2JVSkJRVUU3UTBvMlRFUTdRVWt4VEVjN096dEZRVWRGTEhOQ1FVRkJPMFZCUTBFc1pVRkJRVHREU2pSTVREdEJTWHBNUnp0RlFVTkZMREpDUVVGQk8wTktNa3hNTzBGSmRFeEVPMFZCUTBVc1owTkJRVUU3UTBwM1RFUTdRVWx5VEVRN1JVRkRSU3hqUVVGQk8wTktkVXhFTzBGQlEwUXNhMFJCUVd0RU8wRk5hRlZzUkR0RlFVTkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEhOQ1FVRkJPMFZCUTBFc2RVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR2xDUVVGQk8wTk9hMVZFTzBGTmFGVkRPMFZCUTBVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNVMEZCUVR0RlFVTkJMRlZCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc2VVTkJRVUU3VlVGQlFTeHBRMEZCUVR0RlFVTkJMR2xDUVVGQk8wTk9hMVZJTzBGUGNsWkVPMFZCUTBNc2RVSkJRVUU3UlVGRFJDdzRRa0ZCUVR0RlFVRnBReXdyUWtGQlFUdERVSGRXYUVNN1FWRjBWa1E3UlVGRFJTeHRRa0ZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3hQUVVGQk8wVkJRMEVzVVVGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5TZDFaRU8wRlJkRlpETzBWSVVITkVMSGREUVVGQk8xVkJRVUVzWjBOQlFVRTdSVWRUY0VRc2NVSkJRVUU3UlVGQlFTeHhRa0ZCUVR0RlFVRkJMR05CUVVFN1JVRkRRU3cyUWtGQlFUdEZRVUZCTERoQ1FVRkJPMDFCUVVFc01rSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RlFVTkJMSE5DUVVGQk8wMUJRVUVzYTBKQlFVRTdSVUZEUVN4dFFrRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNkVUpCUVVFN1JVRkRRU3hyUTBGQlFUdFZRVUZCTERCQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTFKM1ZrZzdRVkZ5VmtNN096dEZRVWRGTEZsQlFVRTdSVUZEUVN3clFrRkJRVHRWUVVGQkxIVkNRVUZCTzBOU2RWWklPMEZSY0ZaRE96dEZRVVZGTEhGQ1FVRkJPMDFCUVVFc1pVRkJRVHREVW5OV1NEdEJVVzVXUXpzN08wVkJSMFVzWjBKQlFVRTdRMUp4VmtnN1FWRnNWa003TzBWQlJVVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzWlVGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHbENRVUZCTzBOU2IxWklPMEZSYWxaRE8wVkJRMFVzWjBKQlFVRTdSVUZEUVN4cFFrRkJRVHRGUVVOQkxHVkJRVUU3UlVGRFFTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wVkJRMEVzYVVOQlFVRTdRMUp0VmtnN1FWRm9Wa003UlVGRFJTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hUUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2IwTkJRVUU3VlVGQlFTdzBRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTlNhMVpJTzBGUkwxWkRPMFZCWjBKSkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRTlCUVVFN1JVRkRRU3hSUVVGQk8wTlNhMVpNTzBGUkwxVkhPMFZCUTBVc1dVRkJRVHREVW1sV1REdEJVVGRWUXp0RlFVTkZMRzlDUVVGQk8wMUJRVUVzV1VGQlFUdFZRVUZCTEZGQlFVRTdSVUZEUVN4bFFVRkJPME5TSzFWSU8wRlJOVlZETzBWQlEwVXNaVUZCUVR0RlFVTkJMR3RDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMUk0VlVnN1FWRXpWVU03UlVGRFJTeFpRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVDBGQlFUdEZRVU5CTEZGQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR2xDUVVGQk8wTlNObFZJTzBGUmRsVkxPenRGUVVORkxHRkJRVUU3UTFJd1ZWQTdRVkYyVlVzN08wVkJRMFVzWVVGQlFUdERVakJWVUR0QlVYWlZTenM3UlVGRFJTeGhRVUZCTzBOU01GVlFPMEZSZGxWTE96dEZRVU5GTEdGQlFVRTdRMUl3VlZBN1FWRjJWVXM3TzBWQlEwVXNZVUZCUVR0RFVqQlZVRHRCVVhaVlN6czdSVUZEUlN4aFFVRkJPME5TTUZWUU8wRlJjbFZETzBWQlEwVXNLMEpCUVVFN1ExSjFWVWc3UVZGdVZVODdSVUZEUlN4alFVRkJPME5TY1ZWVU8wRlJhRlZQTzBWQlEwVXNZMEZCUVR0RFVtdFZWRHRCVVRkVVR6dEZRVU5GTEdOQlFVRTdRMUlyVkZRN1FWRXhWRTg3UlVGRFJTeGpRVUZCTzBOU05GUlVPMEZSZGxSUE8wVkJRMFVzWTBGQlFUdERVbmxVVkR0QlVYQlVUenRGUVVORkxHTkJRVUU3UTFKelZGUTdRVkZvVkVNN1JVRkRSU3huUTBGQlFUdERVbXRVU0R0QlVUbFRUenRGUVVORkxHRkJRVUU3UTFKblZGUTdRVkV6VTA4N1JVRkRSU3hoUVVGQk8wTlNObE5VTzBGUmVGTlBPMFZCUTBVc1lVRkJRVHREVWpCVFZEdEJVWEpUVHp0RlFVTkZMR0ZCUVVFN1ExSjFVMVE3UVZGc1UwODdSVUZEUlN4aFFVRkJPME5TYjFOVU8wRlJMMUpQTzBWQlEwVXNZVUZCUVR0RFVtbFRWRHRCVVROU1F6czdSVUZGUlN4UlFVRkJPMFZCUTBFc1dVRkJRVHREVWpaU1NEdEJVVEZTU3pzN1JVRkRSU3hqUVVGQk8wTlNObEpRTzBGUk1WSkxPenRGUVVORkxHTkJRVUU3UTFJMlVsQTdRVkV4VWtzN08wVkJRMFVzWTBGQlFUdERValpTVUR0QlVURlNTenM3UlVGRFJTeGpRVUZCTzBOU05sSlFPMEZSTVZKTE96dEZRVU5GTEdOQlFVRTdRMUkyVWxBN1FWRXhVa3M3TzBWQlEwVXNZMEZCUVR0RFVqWlNVRHRCVVhoU1F6dEZRVU5GTEdsRFFVRkJPME5TTUZKSU8wRlJkRkpQTzBWQlEwVXNXVUZCUVR0RFVuZFNWRHRCVVc1U1R6dEZRVU5GTEZsQlFVRTdRMUp4VWxRN1FWRm9Vazg3UlVGRFJTeFpRVUZCTzBOU2ExSlVPMEZSTjFGUE8wVkJRMFVzV1VGQlFUdERVaXRSVkR0QlVURlJUenRGUVVORkxGbEJRVUU3UTFJMFVWUTdRVkYyVVU4N1JVRkRSU3haUVVGQk8wTlNlVkZVTzBGUmJsRkRPMFZCUTBVc1lVRkJRVHRGUVVOQkxEaENRVUZCTzBOU2NWRklPMEZSYWxGUE8wVkJRMFVzWlVGQlFUdERVbTFSVkR0QlVUbFFUenRGUVVORkxHVkJRVUU3UTFKblVWUTdRVkV6VUU4N1JVRkRSU3hsUVVGQk8wTlNObEJVTzBGUmVGQlBPMFZCUTBVc1pVRkJRVHREVWpCUVZEdEJVWEpRVHp0RlFVTkZMR1ZCUVVFN1ExSjFVRlE3UVZGc1VFODdSVUZEUlN4bFFVRkJPME5TYjFCVU8wRlJPVTlETzBWQlEwVXNiMEpCUVVFN1JVRkRRU3dyUWtGQlFUdERVbWRRU0R0QlVUbFBSenRGUVVORkxHZENRVUZCTzBOU1oxQk1PMEZST1U5TE8wVkJRMFVzVTBGQlFUdERVbWRRVUR0QlVUZFBTenRGUVVORkxGRkJRVUU3UTFJclQxQTdRVkUxVDBzN1JVRkRSU3hQUVVGQk8wTlNPRTlRTzBGUk0wOUxPMFZCUTBVc1ZVRkJRVHREVWpaUFVEdEJVWFJQU3pzN1JVRkZSU3g1UWtGQlFUdEZRVU5CTEZOQlFVRTdSVUZEUVN4dlEwRkJRVHRWUVVGQkxEUkNRVUZCTzBOU2QwOVFPMEZSY2s5TE96dEZRVVZGTEhkQ1FVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxHOURRVUZCTzFWQlFVRXNORUpCUVVFN1ExSjFUMUE3UVZGc1QxTTdSVUZEUlN4WFFVRkJPME5TYjA5WU8wRlJhazlUTzBWQlEwVXNWVUZCUVR0RFVtMVBXRHRCVVdoUFV6dEZRVU5GTEZOQlFVRTdRMUpyVDFnN1FWRXZUbE03UlVGRFJTeFpRVUZCTzBOU2FVOVlPMEZSZUU1TE96dEZRVVZGTEdGQlFVRTdSVUZEUVN3MlFrRkJRVHREVWpCT1VEdEJVWEpPUXp0RlFVTkZMRmRCUVVFN1ExSjFUa2c3UVZONmJrSkVPMFZCUTBVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNhVUpCUVVFN1ExUXlia0pFTzBGVGVtNUNRenRGUVVORkxHTkJRVUU3UTFReWJrSklPMEZUZW01Q1J6czdPMFZCUjBVc1dVRkJRVHRGUVVOQkxITkNRVUZCTzBOVU1tNUNURHRCVTNodVFrYzdSVUZEUlN4bFFVRkJPME5VTUc1Q1REdEJVM1J1UWtNN1JVRkZTU3h6UWtGQlFUdERWSFZ1UWt3N1FWTnNia0pITzBWQlEwVXNhMEpCUVVFN1ExUnZia0pNTzBGVGRHNUNRenRGUVUxSkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRk5CUVVFN1JVRkRRU3h2UTBGQlFUdFZRVUZCTERSQ1FVRkJPMFZCUTBFc1YwRkJRVHREVkcxdVFrdzdRVUZEUkRzN096czdSMEZMUnp0QlFVTklMREJDUVVFd1FqdEJWVFZ3UWpGQ08wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxIRkRRVUZCTzBWQlEwRXNhME5CUVVFN1ZVRkJRU3d3UWtGQlFUdEZRVU5CTEdWQlFVRTdRMVk0Y0VKRU8wRlZOWEJDUXp0RlFVTkZMR1ZCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzYTBKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHbERRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3hwUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5XT0hCQ1NEdEJWVE53UWtNN1JVRkRSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc2FVSkJRVUU3UTFZMmNFSklPMEZWTVhCQ1F6czdPMFZCUjBVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNWVUZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3h6UWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5XTkhCQ1NEdEJWWHB3UWtNN1JVRkRSU3hwUWtGQlFUdERWakp3UWtnN1FWVjRjRUpETzBWQlEwVXNhMEpCUVVFN1ExWXdjRUpJTzBGVmRuQkNRenRGUVVORkxGVkJRVUU3UlVGRFFTeHJRa0ZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMVo1Y0VKSU8wRlZkSEJDUXp0RlFVTkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEU5QlFVRTdSVUZEUVN4UlFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTd3dRa0ZCUVR0RlFVTkJMQ3RDUVVGQk8wVkJRMEVzYTBOQlFVRTdWVUZCUVN3d1FrRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3hwUWtGQlFUdERWbmR3UWtnN1FWVnljRUpETzBWRE4wUkJMRzlDUVVGQk8wVkJRMEVzZDBKQlFVRTdSVUZEUVN4cFFrRkJRVHRGUkRaRVJTeGxRVUZCTzBWQlEwRXNhVUpCUVVFN1ExWjVjRUpJTzBGVmRuQkNSenM3TzBWQlIwVXNjMEpCUVVFN1JVRkRRU3haUVVGQk8wTldlWEJDVER0QlZYUndRa2M3UlVGRFJTeGxRVUZCTzBOV2QzQkNURHRCVlhCd1FrTTdSVUZEUlN4eFFrRkJRVHREVm5Od1FrZzdRVlZxY0VKTE96czdSVUZIUlN4bFFVRkJPMFZCUTBFc2FVSkJRVUU3UTFadGNFSlFPMEZWT1c5Q1F6czdSVUZGUlN4eFFrRkJRVHRGUVVGQkxIRkNRVUZCTzBWQlFVRXNZMEZCUVR0RlFVTkJMSE5DUVVGQk8wMUJRVUVzYTBKQlFVRTdSVUZEUVN3MlFrRkJRVHRGUVVGQkxEaENRVUZCTzAxQlFVRXNNa0pCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEN0Q1FVRkJPMFZCUTBFc1QwRkJRVHRGUVVOQkxHbENRVUZCTzBOV1ozQkNTRHRCVlRkdlFrczdPenM3UlVGRlJTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wTldhWEJDVUR0QlZUbHZRa3M3TzBWQlEwVXNjVUpCUVVFN1RVRkJRU3hsUVVGQk8wTldhWEJDVUR0QlZUbHZRa3M3TzBWQlEwVXNiMEpCUVVFN1RVRkJRU3haUVVGQk8xVkJRVUVzVVVGQlFUdEZRVU5CTEdWQlFVRTdRMVpwY0VKUU8wRlZOVzlDUXp0RlFVTkZMR2xDUVVGQk8wVkJRMEVzZVVOQlFVRTdRMVk0YjBKSU8wRlZNMjlDUXp0RlFVTkZMR2RDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMVkyYjBKSU8wRlZNVzlDUXp0RlFVTkZMR05CUVVFN1ExWTBiMEpJTzBGVmVtOUNRenRGUVVORkxGTkJRVUU3UTFZeWIwSklPMEZCUTBRc2EwUkJRV3RFTzBGWmRuaENiRVE3UlVGRFJTeG5Ra0ZCUVR0RlFVTkJMR1ZCUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzYTBOQlFVRTdWVUZCUVN3d1FrRkJRVHRGUVVOQkxHbENRVUZCTzBOYWVYaENSRHRCV1haNFFrTTdSVkJHYzBRc2QwTkJRVUU3VlVGQlFTeG5RMEZCUVR0RlQwbHdSQ3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTd3dRa0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4cFFrRkJRVHREV25sNFFrZzdRVmwyZUVKSE8wVkJRMFVzWlVGQlFUdEZRVU5CTEhOQ1FVRkJPME5hZVhoQ1REdEJXWFI0UWtjN1JVRkRSU3hqUVVGQk8wTmFkM2hDVER0QldXNTRRa2M3T3p0RlFVZEZMRmxCUVVFN1JVRkRRU3h6UWtGQlFUdERXbkY0UWt3N1FWbHNlRUpITzBWQlEwVXNaVUZCUVR0RFdtOTRRa3c3UVZsb2VFSkRPMFZCUTBVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNVMEZCUVR0RlFVTkJMRlZCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEhsRFFVRkJPMVZCUVVFc2FVTkJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTmFhM2hDU0R0QldUZDNRa3M3UlVGRFJTeFpRVUZCTzBWQlEwRXNNRUpCUVVFN1JVRkRRU3h6UWtGQlFUdERXaXQzUWxBN1FWazNkMEpQTzBWQlEwVXNXVUZCUVR0RFdpdDNRbFE3UVZsNmQwSkxPenM3UlVGSFJTeFpRVUZCTzBOYU1uZENVRHRCV1hKM1FrYzdSVUZEUlN4dlFrRkJRVHREV25WM1FrdzdRVmxvZDBKTE96czdPenM3T3p0RlFVbEZMRzlDUVVGQk8wVkJRMEVzV1VGQlFUdERXbk4zUWxBN1FWbHdkMEpQT3pzN096czdPenRGUVVORkxGbEJRVUU3UTFvMmQwSlVPMEZaZW5kQ1N6czdSVUZEUlN3d1FrRkJRVHREV2pSM1FsQTdRVmwyZDBKRE96dEZRVVZGTEZWQlFVRTdSVUZEUVN4dlEwRkJRVHRWUVVGQkxEUkNRVUZCTzBOYWVYZENTRHRCV1RWM1FrTTdPMFZCVFVrc2MwSkJRVUU3UTFvd2QwSk1PMEZaZEhkQ1F6dEZRVU5GTEZWQlFVRTdRMXAzZDBKSU8wRlpkSGRDUnp0RlFVTkZMRmRCUVVFN1ExcDNkMEpNTzBGWmNIZENRenRGUVVORkxHRkJRVUU3UTFwemQwSklPMEZaY0hkQ1J6dEZRVU5GTEdOQlFVRTdRMXB6ZDBKTU8wRlpiSGRDUXpzN1JVRkZSU3h2UTBGQlFUdFZRVUZCTERSQ1FVRkJPMFZCUTBFc1dVRkJRVHREV205M1FrZzdRVmxxZDBKRE8wVkJRMFVzVTBGQlFUdEZRVU5CTEZsQlFVRTdRMXB0ZDBKSU8wRlphbmRDUnp0RlFVTkZMR0ZCUVVFN1ExcHRkMEpNTzBGWkwzWkNRenRGUVVORkxGTkJRVUU3UlVGRFFTeFhRVUZCTzBOYWFYZENTRHRCV1M5MlFrYzdSVUZEUlN4WlFVRkJPME5hYVhkQ1REdEJXWGgyUWtzN096czdSVUZEUlN4alFVRkJPME5hTm5aQ1VDSXNJbVpwYkdVaU9pSmxlR0Z0Y0d4bExtTnpjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSWk4cUtseHVJQ29nYzJoaFpHOTNMbXhsYzNNZ0xTRHBtTFRsdmJIbW9MZmx2SS9vcnI3bnZhNGdiV2w0YVc1NElPV0h2ZWFWc0Z4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHVJQ29nVlhCa1lYUmxPaUF5TURJeUxqTXVNakJjYmlBcUwxeHVMeW9nUFQwOVBUMDlQVDA5UFNCamIyeHZjbk11ZEdobGJXVWdMU0Rsbjdybm9ZRHBvcHpvaWJMbGo1anBoNC9wbTRibGtJZ2dQVDA5UFQwOVBUMDlQU0FxTDF4dUx5b2dQVDA5UFQwOUlPbVl0T1c5c2VhZ3QrVzhqK2l1dnVlOXJ1V0h2ZWFWc0NBOVBUMDlQVDBnS2k5Y2JpOHFJRDA5UFQwOUlGTmpjbTlzYkdKaGNpQTlQVDA5UFNBcUwxeHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaUI3WEc0Z0lIZHBaSFJvT2lBM2NIZzdYRzRnSUdobGFXZG9kRG9nTjNCNE8xeHVJQ0F0ZDJWaWEybDBMV0p2Y21SbGNpMXlZV1JwZFhNNklEVndlRHRjYm4xY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSXRkSEpoWTJzdGNHbGxZMlVnZTF4dUlDQXRkMlZpYTJsMExXSnZjbVJsY2kxeVlXUnBkWE02SURWd2VEdGNibjFjYmpvNkxYZGxZbXRwZEMxelkzSnZiR3hpWVhJdGRHaDFiV0k2ZG1WeWRHbGpZV3dnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1qVXBPMXh1SUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2JuMWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEl0ZEdoMWJXSTZhRzl5YVhwdmJuUmhiQ0I3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklISm5ZbUVvTUN3Z01Dd2dNQ3dnTUM0eU5TazdYRzRnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4dWZWeHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjanBvYjNabGNpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR4TlNrN1hHNTlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlPbWh2ZG1WeUlIdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nY21kaVlTZ3dMQ0F3TENBd0xDQXdMak0xS1R0Y2JuMWNiaTV6WldOMGFXOXVJSHRjYmlBZ2JXRnlaMmx1T2lBeFpXMGdNRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV6WldOMGFXOXVYMTlvWldGa1pYSXNYRzR1YzJWamRHbHZibDlmWTI5dWRHVnVkQ3hjYmk1elpXTjBhVzl1WDE5bWIyOTBaWElnZTF4dUlDQnRZWEpuYVc0NklEQWdNMlZ0TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG5ObFkzUnBiMjVmWDNScGRHeGxJSHRjYmlBZ1kyOXNiM0k2SUNNMk5qWTdYRzU5WEc0dWMyVmpkR2x2Ymw5ZmFETWdlMXh1SUNCamIyeHZjam9nSXpGbU9HUmtOanRjYmlBZ1ptOXVkQzF6YVhwbE9pQXhMak0xWlcwN1hHNTlYRzR1YzJWamRHbHZibDlmYURRZ2UxeHVJQ0JtYjI1MExYTnBlbVU2SURFdU1XVnRPMXh1SUNCamIyeHZjam9nSXpZMk5qdGNibjFjYmk1elpXTjBhVzl1WDE5b05TQjdYRzRnSUdadmJuUXRjMmw2WlRvZ01XVnRPMXh1SUNCamIyeHZjam9nSXprNU9UdGNibjFjYmk1elpXTjBhVzl1WDE5a2JDQjdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV6WldOMGFXOXVYMTlrZENCN1hHNGdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnZEc5d09pQXdPMXh1SUNCc1pXWjBPaUF3TzF4dUlDQjNhV1IwYURvZ05qQndlRHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgyUmtJSHRjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHVJQ0I2TFdsdVpHVjRPaUF4TzF4dUlDQnRZWEpuYVc0NklEQWdNQ0F3SURZd2NIZzdYRzRnSUdOdmJHOXlPaUFqTURVNE9UUXlPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbk5sWTNScGIyNWZYM0J5WlNCN1hHNGdJRzFoY21kcGJqb2dNbVZ0SURBN1hHNGdJSEJoWkdScGJtYzZJREZsYlR0Y2JpQWdabTl1ZEMxemFYcGxPaUF4TkhCNE8xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ01UVXdKVHRjYmlBZ2RHVjRkQzFoYkdsbmJqb2diR1ZtZER0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlpoWm1GbVlUdGNiaUFnWW05eVpHVnlPaUF4Y0hnZ2MyOXNhV1FnSTJSa1pEdGNiaUFnWW05eVpHVnlMWEpoWkdsMWN6b2dOSEI0TzF4dUlDQmpiMnh2Y2pvZ0l6WTJOanRjYmlBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEc1OVhHNHVjMlZqZEdsdmJsOWZZMjlrWlNCN1hHNGdJR1JwYzNCc1lYazZJR0pzYjJOck8xeHVJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXpaV04wYVc5dVgxOW1iMjkwWlhJZ2UxeHVJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYmlBZ2JXRnlaMmx1TFhSdmNEb2dNMlZ0TzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabUZtWVdaaE8xeHVJQ0JqYjJ4dmNqb2dJems1T1R0Y2JuMWNiaTVqWVhObElIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCa2FYTndiR0Y1T2lCbmNtbGtPMXh1SUNCbmNtbGtMWFJsYlhCc1lYUmxMV052YkhWdGJuTTZJSEpsY0dWaGRDZ3lMQ0F4Wm5JcE8xeHVJQ0JuWVhBNklEUXdjSGc3WEc0Z0lIQmhaR1JwYm1jNklERmxiVHRjYmlBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNGdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1OaGMyVTZZV1owWlhJZ2UxeHVJQ0JqYjI1MFpXNTBPaUFuSnp0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEQTdYRzRnSUd4bFpuUTZJRFV3SlR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQjNhV1IwYURvZ01EdGNiaUFnWW05eVpHVnlMV3hsWm5RNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1OaGMyVmZYM0J5WlN4Y2JpNWpZWE5sWDE5MFpYaDBZWEpsWVNCN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklERTFNQ1U3WEc1OVhHNHVZMkZ6WlY5ZmNISmxMRnh1TG1OaGMyVmZYMk52WkdVc1hHNHVZMkZ6WlY5ZmRHVjRkR0Z5WldFZ2UxeHVJQ0JtYjI1MExXWmhiV2xzZVRvZ1hDSkRiM1Z5YVdWeUlFNWxkMXdpTENCRGIyNXpiMnhoY3l3Z1IyVnZjbWRwWVN3Z1FYSnBZV3dzSUhOaGJuTXRjMlZ5YVdZN1hHNTlYRzR1WTJGelpWOWZjSEpsSUh0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCd1lXUmthVzVuT2lBeFpXMDdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVlXWmhabUU3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nTkhCNE8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNibjFjYmk1allYTmxYMTkwYjI5c1ltRnlJSHRjYmlBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEc0Z0lHaGxhV2RvZERvZ016WndlRHRjYmlBZ2JHbHVaUzFvWldsbmFIUTZJRE0yY0hnN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRSd2VEdGNiaUFnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh1SUNCMFpYaDBMV0ZzYVdkdU9pQnlhV2RvZER0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1allYTmxYMTloWTNScGIyNHNYRzR1WTJGelpWOWZjbVZ0YjNabElIdGNiaUFnWTNWeWMyOXlPaUJ3YjJsdWRHVnlPMXh1SUNCamIyeHZjam9nSXpBMU9EazBNanRjYmlBZ2RYTmxjaTF6Wld4bFkzUTZJRzV2Ym1VN1hHNTlYRzR1WTJGelpWOWZZV04wYVc5dUlIdGNiaUFnWm05dWRDMXphWHBsT2lBeE0zQjRPMXh1SUNCd1lXUmthVzVuTFd4bFpuUTZJREV3Y0hnN1hHNTlYRzR1WTJGelpWOWZZV04wYVc5dU9tWnBjbk4wTFdOb2FXeGtJSHRjYmlBZ2NHRmtaR2x1Wnkxc1pXWjBPaUF3TzF4dWZWeHVMbU5oYzJWZlgzSmxiVzkyWlNCN1hHNGdJR1pzYjJGME9pQnlhV2RvZER0Y2JuMWNiaTVqWVhObFgxOWpiMjV6YjJ4bElIdGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUdobGFXZG9kRG9nTVRnd2NIZzdYRzRnSUdKdmNtUmxjam9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHVZMkZ6WlY5ZmRHVjRkR0Z5WldFZ2UxeHVJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNiaUFnZDJsa2RHZzZJREV3TUNVN1hHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2JpQWdZbTl5WkdWeU9pQnViMjVsTzF4dUlDQnZkWFJzYVc1bE9pQnViMjVsTzF4dUlDQndZV1JrYVc1bk9pQXhaVzA3WEc0Z0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEc0Z0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4dWZWeHVMbU5oYzJWZlgyeHBjM1FzWEc0dVkyRnpaVjlmYVhSbGJTQjdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdjR0ZrWkdsdVp6b2dNRHRjYmlBZ2JHbHpkQzF6ZEhsc1pTMTBlWEJsT2lCdWIyNWxPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbU5oYzJWZlgyeHBjM1FnZTF4dUlDQm9aV2xuYUhRNklETTJNSEI0TzF4dUlDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnSTJSa1pEdGNiaUFnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNiaUFnYjNabGNtWnNiM2M2SUdGMWRHODdYRzU5WEc0dVkyRnpaVjlmYVhSbGJTQjdYRzRnSUdobGFXZG9kRG9nTXpad2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklETTJjSGc3WEc0Z0lHTjFjbk52Y2pvZ2NHOXBiblJsY2p0Y2JpQWdjR0ZrWkdsdVp6b2dNQ0F4Tm5CNE8xeHVmVnh1TG1OaGMyVmZYMmwwWlcwNmFHOTJaWElnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpaamRtT0dZNU8xeHVmVnh1TG5CaGNHVnlJSHRjYmlBZ1ltOTRMWE5vWVdSdmR6b2dNQ0F3SURad2VDQXhjSGdnSTJSalpHWmxOanRjYmlBZ2JXRnlaMmx1T2lBeVpXMGdZWFYwYnp0Y2JpQWdiV0Y0TFhkcFpIUm9PaUF4TWpBd2NIZzdYRzRnSUhCaFpHUnBibWM2SURKbGJUdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJabVpqdGNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNibjFjYmk1d1lYQmxjaTVtYkdWNElIdGNiaUFnWkdsemNHeGhlVG9nWm14bGVEdGNiaUFnWm14bGVDMWthWEpsWTNScGIyNDZJSEp2ZHp0Y2JpQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHMWhlQzEzYVdSMGFEb2dNVEF3SlR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQndZV1JrYVc1bk9pQXdPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbkJoY0dWeUxtWnNaWGdnTG1GeWRHbGpiR1VnZTF4dUlDQm1iR1Y0TFdScGNtVmpkR2x2YmpvZ1kyOXNkVzF1TzF4dUlDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjYm4xY2JpNXdZWEJsY2k1bWJHVjRJQzVoY25ScFkyeGxYMTl0WVdsdUlIdGNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNibjFjYmk1d1lYQmxjaTVtYkdWNElDNWhjblJwWTJ4bFgxOWhjMmxrWlNCN1hHNGdJR0p2Y21SbGNpMXlhV2RvZERvZ01YQjRJSE52Ykdsa0lDTmtZMlJtWlRZN1hHNTlYRzR1YUdWaFpHVnlJSHRjYmlBZ2NHOXphWFJwYjI0NklITjBhV05yZVR0Y2JpQWdlaTFwYm1SbGVEb2dNenRjYmlBZ2RHOXdPaUF3TzF4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2JpQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNiaUFnZEhKaGJuTnBkR2x2Ymkxa2RYSmhkR2x2YmpvZ01DNHpjenRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTVvWldGa1pYSmZjM1JwWTJ0NUlIdGNiaUFnY0dGa1pHbHVaeTFzWldaME9pQXlOakJ3ZUR0Y2JuMWNiaTVoY25ScFkyeGxJSHRjYmlBZ1pHbHpjR3hoZVRvZ1pteGxlRHRjYmlBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUhKdmR6dGNiaUFnWm14bGVDMTNjbUZ3T2lCdWIzZHlZWEE3WEc0Z0lIQmhaR1JwYm1jNklESmxiU0F3TzF4dUlDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBeE5UQWxPMXh1ZlZ4dUxtRnlkR2xqYkdWZlgyMWhhVzRnZTF4dUlDQm1iR1Y0T2lBeE8xeHVJQ0J3WVdSa2FXNW5PaUF3SURKbGJUdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNWhjblJwWTJ4bFgxOXRZV2x1SUM1elpXTjBhVzl1SUh0Y2JpQWdiM1psY21ac2IzYzZJSFpwYzJsaWJHVTdYRzU5WEc0dVlYSjBhV05zWlY5ZmJXRnBiaUF1YzJWamRHbHZibDlmWTI5dWRHVnVkQ3hjYmk1aGNuUnBZMnhsWDE5dFlXbHVJQzV6WldOMGFXOXVYMTltYjI5MFpYSXNYRzR1WVhKMGFXTnNaVjlmYldGcGJpQXVjMlZqZEdsdmJsOWZhR1ZoWkdWeUlIdGNiaUFnYjNabGNtWnNiM2M2SUhacGMybGliR1U3WEc1OVhHNHVZWEowYVdOc1pWOWZiV0ZwYmlBdWMyVmpkR2x2Ymw5ZmFHVmhaR1Z5TEZ4dUxtRnlkR2xqYkdWZlgyMWhhVzRnTG5ObFkzUnBiMjVmWDJOdmJuUmxiblFnZTF4dUlDQnRZWEpuYVc0NklEQTdYRzU5WEc0dVlYSjBhV05zWlY5ZllYTnBaR1VnZTF4dUlDQm1iR1Y0TFhOb2NtbHVhem9nTUR0Y2JpQWdkMmxrZEdnNklESTBNSEI0TzF4dUlDQmliM0prWlhJdGJHVm1kRG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUhSeVlXNXphWFJwYjI0dFpIVnlZWFJwYjI0NklEQXVNM003WEc1OVhHNHVZWEowYVdOc1pWOWZZWE5wWkdVdWJIUnlJSHRjYmlBZ1ltOXlaR1Z5TFhKcFoyaDBPaUF4Y0hnZ2MyOXNhV1FnSTJSa1pEdGNiaUFnWW05eVpHVnlMV3hsWm5RNklHNXZibVU3WEc1OVhHNHVZWEowYVdOc1pWOWZZWE5wWkdVZ0xtOTFkR3hwYm1VdFkyaGhjSFJsY25NZ2UxeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abU8xeHVmVnh1Y0hKbExGeHVMbk5sWTNScGIyNWZYM0J5WlNCN1hHNGdJSEJoWkdScGJtYzZJREpsYlR0Y2JpQWdabTl1ZEMxbVlXMXBiSGs2SUZ3aVEyOTFjbWxsY2lCT1pYZGNJaXdnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1ZV1poWm1FN1hHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHVmVnh1WTI5a1pTeGNiaTV6WldOMGFXOXVYMTlqYjJSbElIdGNiaUFnWm05dWRDMW1ZVzFwYkhrNklGd2lRMjkxY21sbGNpQk9aWGRjSWl3Z1FYSnBZV3dzSUhOaGJuTXRjMlZ5YVdZN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRad2VEdGNibjFjYmk1bWIyOTBaWElnZTF4dUlDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYmlBZ2NHRmtaR2x1WnpvZ00yVnRJREE3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNibjFjYmk1bWIyOTBaWElnWVRwc2FXNXJMRnh1TG1admIzUmxjaUJoT25acGMybDBaV1FzWEc0dVptOXZkR1Z5SUdFNmFHOTJaWElnZTF4dUlDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklHNXZibVU3WEc0Z0lHTnZiRzl5T2lBak1EVTRPVFF5TzF4dWZWeHVMbVp2YjNSbGNpQmhPbWh2ZG1WeUlIdGNiaUFnZEdWNGRDMWtaV052Y21GMGFXOXVPaUIxYm1SbGNteHBibVU3WEc1OVhHNHVkWFJwYkhNdFltOXlaR1Z5TFhKcFoyaDBJSHRjYmlBZ1ltOXlaR1Z5TFhKcFoyaDBPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYm4xY2JpNW9hV1JrWlc0Z2UxeHVJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHVmVnh1THlvZ1BUMDlQVDA5UFQwOVBTQnBZMjl1TG5Sb1pXMWxJQzBnYzNabklPV2J2dWFnaCtlYWhPYWd0K1c4anlBOVBUMDlQVDA5UFQwOUlDb3ZYRzR1YjNWMGJHbHVaUzFwWTI5dUlIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczdYRzRnSUhabGNuUnBZMkZzTFdGc2FXZHVPaUJ0YVdSa2JHVTdYRzRnSUhkcFpIUm9PaUF4WlcwN1hHNGdJR2hsYVdkb2REb2dNV1Z0TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0YVdOdmJsOWZjM1puSUh0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2JHVm1kRG9nTlRBbE8xeHVJQ0IzYVdSMGFEb2dNV1Z0TzF4dUlDQm9aV2xuYUhRNklERmxiVHRjYmlBZ1ptbHNiRG9nWTNWeWNtVnVkR052Ykc5eU8xeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlNndE5UQWxMQ0F0TlRBbEtUdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JqcHliMjkwSUh0Y2JpQWdMUzF2ZFhSc2FXNWxMWHBKYm1SbGVEb2dNakF3TUR0Y2JpQWdMUzF2ZFhSc2FXNWxMWE4wYVdOcmVTMW9aV2xuYUhRNklERXdNQ1U3WEc0Z0lDMHRiM1YwYkdsdVpTMWphR0Z3ZEdWeWN5MTNhV1IwYURvZ01UQXdKVHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2lCN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2VpMXBibVJsZURvZ0xURTdYRzRnSUhSdmNEb2dNRHRjYmlBZ2JHVm1kRG9nTUR0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0IyYVhOcFltbHNhWFI1T2lCb2FXUmtaVzQ3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMjF2WkdGc0lIdGNiaUFnWW05NExYTm9ZV1J2ZHpvZ01DQXdJRFp3ZUNBeGNIZ2dJMlJqWkdabE5qdGNiaUFnWkdsemNHeGhlVG9nWm14bGVEdGNiaUFnWm14bGVDMWthWEpsWTNScGIyNDZJR052YkhWdGJqdGNiaUFnWm14bGVDMTNjbUZ3T2lCdWIzZHlZWEE3WEc0Z0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNiaUFnZWkxcGJtUmxlRG9nTWpFN1hHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdkSEpoYm5OcGRHbHZiaTFrZFhKaGRHbHZiam9nTUM0MGN6dGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmFHVmhaR1Z5TEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5dFlXbHVMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTltYjI5MFpYSWdlMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmYUdWaFpHVnlMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTltYjI5MFpYSWdlMXh1SUNCbWJHVjRMWE5vY21sdWF6b2dNRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmRHbDBiR1VzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDIxaGFXNHNYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMlp2YjNSbGNpQjdYRzRnSUhCaFpHUnBibWM2SURBZ01UWndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmFHVmhaR1Z5TEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5MGFYUnNaU0I3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JpQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hHNGdJR2hsYVdkb2REb2dOVEp3ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURVeWNIZzdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgzUnBkR3hsSUh0Y2JpQWdabTl1ZEMxemFYcGxPaUF4Tm5CNE8xeHVJQ0JtYjI1MExYZGxhV2RvZERvZ05EQXdPMXh1SUNCdFlYSm5hVzQ2SURBZ01UWndlRHRjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjYmlBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUNOa1kyUm1aVFk3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyTnNiM05sSUh0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2NtbG5hSFE2SURFeWNIZzdYRzRnSUhkcFpIUm9PaUF5TUhCNE8xeHVJQ0JvWldsbmFIUTZJREl3Y0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBeU1IQjRPMXh1SUNCamIyeHZjam9nSXprNU9UdGNiaUFnWm05dWRDMXphWHBsT2lBeU1IQjRPMXh1SUNCMFpYaDBMV0ZzYVdkdU9pQmpaVzUwWlhJN1hHNGdJR04xY25OdmNqb2djRzlwYm5SbGNqdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWktDMDFNQ1VwTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTlqYkc5elpTQXViM1YwYkdsdVpTMXBZMjl1SUh0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEQTdYRzRnSUd4bFpuUTZJREE3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyTnNiM05sT21odmRtVnlJSHRjYmlBZ1kyOXNiM0k2SUNNMk5qWTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDIxaGFXNGdlMXh1SUNCbWJHVjRPaUF4TzF4dUlDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZabTl2ZEdWeUlIdGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUhSbGVIUXRZV3hwWjI0NklISnBaMmgwTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTl2ZG1WeWJHRjVJSHRjYmlBZ1kyOXVkR1Z1ZERvZ0p5YzdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2RHOXdPaUF3TzF4dUlDQnNaV1owT2lBd08xeHVJQ0IzYVdSMGFEb2dNVEF3SlR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptTzF4dUlDQnZjR0ZqYVhSNU9pQXdMakU3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYM1JwYm5rc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUnBibmtnZTF4dUlDQjNhV1IwYURvZ01qZ3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMXBibWtzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDIxcGJta2dlMXh1SUNCM2FXUjBhRG9nTkRnd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNOdFlXeHNMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDl6YldGc2JDQjdYRzRnSUhkcFpIUm9PaUExTkRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3dWIzVjBiR2x1WlMxa2NtRjNaWEpmY21WbmRXeGhjaXhjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmY21WbmRXeGhjaUI3WEc0Z0lIZHBaSFJvT2lBMk9EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZmJXVmthWFZ0TEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5dFpXUnBkVzBnZTF4dUlDQjNhV1IwYURvZ056SXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeGhjbWRsTEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5c1lYSm5aU0I3WEc0Z0lIZHBaSFJvT2lBNU5qQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd2dlMXh1SUNCaWIzSmtaWEl0YkdWbWREb2dNWEI0SUhOdmJHbGtJQ05rWTJSbVpUWTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNScGJua3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdjbWxuYUhRNklDMHlPVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZiV2x1YVM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCeWFXZG9kRG9nTFRRNU1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDNXZkWFJzYVc1bExXUnlZWGRsY2w5emJXRnNiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0J5YVdkb2REb2dMVFUxTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDl5WldkMWJHRnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSEpwWjJoME9pQXROamt3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYMjFsWkdsMWJTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnlhV2RvZERvZ0xUY3pNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCeWFXZG9kRG9nTFRrM01IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpQjdYRzRnSUdKdmNtUmxjaTF5YVdkb2REb2dNWEI0SUhOdmJHbGtJQ05rWTJSbVpUWTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNScGJua3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdiR1ZtZERvZ0xUSTVNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRhVzVwTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUd4bFpuUTZJQzAwT1RCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYzIxaGJHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdiR1ZtZERvZ0xUVTFNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlaV2QxYkdGeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lHeGxablE2SUMwMk9UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXVmthWFZ0TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUd4bFpuUTZJQzAzTXpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYkdGeVoyVXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdiR1ZtZERvZ0xUazNNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaXhjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRZ2UxeHVJQ0JzWldaME9pQXdPMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJdWIzVjBiR2x1WlMxa2NtRjNaWEpmZEdsdWVTeGNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZkR2x1ZVNCN1hHNGdJR2hsYVdkb2REb2dNalF3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZkSFJpTG05MWRHeHBibVV0WkhKaGQyVnlYMjFwYm1rc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMXBibWtnZTF4dUlDQm9aV2xuYUhRNklETXlNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXpiV0ZzYkN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUXViM1YwYkdsdVpTMWtjbUYzWlhKZmMyMWhiR3dnZTF4dUlDQm9aV2xuYUhRNklETTJNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlaV2QxYkdGeUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlaV2QxYkdGeUlIdGNiaUFnYUdWcFoyaDBPaUEwTURCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYldWa2FYVnRMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl0WldScGRXMGdlMXh1SUNCb1pXbG5hSFE2SURRME1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpNXZkWFJzYVc1bExXUnlZWGRsY2w5c1lYSm5aU3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmYkdGeVoyVWdlMXh1SUNCb1pXbG5hSFE2SURRNE1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpQjdYRzRnSUdKdmNtUmxjaTFpYjNSMGIyMDZJREZ3ZUNCemIyeHBaQ0FqWkdOa1ptVTJPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGFXNTVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSFJ2Y0RvZ0xUSTFNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRhVzVwTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhSdmNEb2dMVE16TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl6YldGc2JDNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQjBiM0E2SUMwek56QndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmNtVm5kV3hoY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCMGIzQTZJQzAwTVRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYldWa2FYVnRMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSFJ2Y0RvZ0xUUTFNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCMGIzQTZJQzAwT1RCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRZ2UxeHVJQ0IwYjNBNklHbHVhWFJwWVd3N1hHNGdJR0p2Y21SbGNpMTBiM0E2SURGd2VDQnpiMnhwWkNBalpHTmtabVUyTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBhVzU1TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUdKdmRIUnZiVG9nTFRJMU1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5dGFXNXBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR0p2ZEhSdmJUb2dMVE16TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl6YldGc2JDNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQmliM1IwYjIwNklDMHpOekJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZjbVZuZFd4aGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQmliM1IwYjIwNklDMDBNVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiV1ZrYVhWdExtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lHSnZkSFJ2YlRvZ0xUUTFNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCaWIzUjBiMjA2SUMwME9UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1FnZTF4dUlDQjJhWE5wWW1sc2FYUjVPaUIyYVhOcFlteGxPMXh1SUNCNkxXbHVaR1Y0T2lCMllYSW9MUzF2ZFhSc2FXNWxMWHBKYm1SbGVDazdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjNCbGJtVmtMbTkxZEd4cGJtVXRaSEpoZDJWeUlIdGNiaUFnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDI5d1pXNWxaQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3dnZTF4dUlDQnlhV2RvZERvZ01EdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Y0dWdVpXUXViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlJSHRjYmlBZ2JHVm1kRG9nTUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXZjR1Z1WldRdWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUlIdGNiaUFnZEc5d09pQXdPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDI5d1pXNWxaQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFFnZTF4dUlDQmliM1IwYjIwNklEQTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjJabWMyVjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQ3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Wm1aelpYUXViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlJSHRjYmlBZ2FHVnBaMmgwT2lCallXeGpLREV3TUNVZ0xTQTBaVzBwTzF4dUlDQjBiM0E2SURVd0pUdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWktDMDFNQ1VwTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOW1abk5sZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIyWm1jMlYwTG05MWRHeHBibVV0WkhKaGQyVnlYMkowZENCN1hHNGdJSGRwWkhSb09pQmpZV3hqS0RFd01DVWdMU0EwWlcwcE8xeHVJQ0JzWldaME9pQTFNQ1U3WEc0Z0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXQ2d0TlRBbEtUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Wm1aelpYUXViM1YwYkdsdVpTMWtjbUYzWlhKZmIzQmxibVZrTG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkNCN1hHNGdJSEpwWjJoME9pQXlaVzA3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIyWm1jMlYwTG05MWRHeHBibVV0WkhKaGQyVnlYMjl3Wlc1bFpDNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISWdlMXh1SUNCc1pXWjBPaUF5WlcwN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiMlptYzJWMExtOTFkR3hwYm1VdFpISmhkMlZ5WDI5d1pXNWxaQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0lnZTF4dUlDQjBiM0E2SURKbGJUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Wm1aelpYUXViM1YwYkdsdVpTMWtjbUYzWlhKZmIzQmxibVZrTG05MWRHeHBibVV0WkhKaGQyVnlYMkowZENCN1hHNGdJR0p2ZEhSdmJUb2dNbVZ0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyRjFkRzh1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJGMWRHOHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlJSHRjYmlBZ2FHVnBaMmgwT2lCaGRYUnZPMXh1SUNCdFlYZ3RhR1ZwWjJoME9pQmpZV3hqS0RFd01DVWdMU0EwWlcwcE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMloxYkd3Z2UxeHVJQ0J3WVdSa2FXNW5PaUF3TzF4dWZWeHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVp5QjdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNpQjdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYRzU5WEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuWDE5aGJtTm9iM0k2YkdsdWF5eGNiaTV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNqcDJhWE5wZEdWa0xGeHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVoxOWZZVzVqYUc5eU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTTVPVGs3WEc0Z0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjYm4xY2JpNXZkWFJzYVc1bExXaGxZV1JwYm1kZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak1XWTRaR1EyTzF4dWZWeHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVp6cG9iM1psY2lBdWIzVjBiR2x1WlMxb1pXRmthVzVuWDE5aGJtTm9iM0lnZTF4dUlDQmthWE53YkdGNU9pQnBibXhwYm1VdFlteHZZMnM3WEc1OVhHNHViM1YwYkdsdVpTMW9aV0ZrYVc1blgzTjBZWEowT21odmRtVnlJSHRjYmlBZ2IzWmxjbVpzYjNjNklIWnBjMmxpYkdVN1hHNTlYRzR1YjNWMGJHbHVaUzFvWldGa2FXNW5YM04wWVhKMElDNXZkWFJzYVc1bExXaGxZV1JwYm1kZlgyRnVZMmh2Y2lCN1hHNGdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnZEc5d09pQTFNQ1U3WEc0Z0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXU2d0TlRBbEtUdGNiaUFnYkdWbWREb2dMVEZsYlR0Y2JuMWNiaThxS2x4dUlDb2daV3hzYVhCemFYTXViR1Z6Y3lBdElPYVdoK2Fjck9lY2dlZVZwU0J0YVhocGJuZ2c1WWU5NXBXd1hHNGdLaUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYRzRnS2lCVmNHUmhkR1U2SURJd01qSXVNeTR4TVZ4dUlDb3ZYRzR2S2lBOVBUMDlQVDBnNXBhSDVweXM1NXlCNTVXbDVZZTk1cFd3SUQwOVBUMDlQU0FxTDF4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25NZ2UxeHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEc0Z0lIb3RhVzVrWlhnNklERTdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdkMmxrZEdnNklIWmhjaWd0TFc5MWRHeHBibVV0WTJoaGNIUmxjbk10ZDJsa2RHZ3BPMXh1SUNCMGNtRnVjMmwwYVc5dUxXUjFjbUYwYVc5dU9pQXdMak56TzF4dUlDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2JuMWNiaTV2ZFhSc2FXNWxMV05vWVhCMFpYSnpYMTkwYVhSc1pTQjdYRzRnSUcxaGNtZHBiam9nTUNBeE5uQjRPMXh1SUNCb1pXbG5hSFE2SURRd2NIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQTBNSEI0TzF4dUlDQndZV1JrYVc1bk9pQXdJREUyY0hnN1hHNGdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQWpaR05rWm1VMk8xeHVJQ0JtYjI1MExYTnBlbVU2SURFMmNIZzdYRzRnSUdadmJuUXRkMlZwWjJoME9pQTBNREE3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFqYUdGd2RHVnljMTlmYldGcGJpQjdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25OZlgyeHBjM1FzWEc0dWIzVjBiR2x1WlMxamFHRndkR1Z5YzE5ZmMzVmlhbVZqZEN4Y2JpNXZkWFJzYVc1bExXTm9ZWEIwWlhKelgxOXBkR1Z0SUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lIQmhaR1JwYm1jNklEQTdYRzRnSUd4cGMzUXRjM1I1YkdVdGRIbHdaVG9nYm05dVpUdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXTm9ZWEIwWlhKelgxOXNhWE4wSUh0Y2JpQWdjR0ZrWkdsdVp6b2dNQzQxWlcwZ01EdGNibjFjYmk1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDE5emRXSnFaV04wSUh0Y2JpQWdjR0ZrWkdsdVp5MXNaV1owT2lBeFpXMDdYRzU5WEc0dWIzVjBiR2x1WlMxamFHRndkR1Z5YzE5ZmFYUmxiU0I3WEc0Z0lHMWhjbWRwYmpvZ01EdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklETXdjSGc3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDE5d2JHRmpaV2h2YkdSbGNpQjdYRzRnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2RHOXdPaUF3TzF4dUlDQnNaV1owT2lBd08xeHVJQ0IzYVdSMGFEb2dNVEF3SlR0Y2JpQWdhR1ZwWjJoME9pQXpNSEI0TzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpaamRtT0dZNU8xeHVJQ0JpYjNKa1pYSXRiR1ZtZERvZ01uQjRJSE52Ykdsa0lDTXdOVGc1TkRJN1hHNGdJSFJ5WVc1emFYUnBiMjR0WkhWeVlYUnBiMjQ2SURBdU1uTTdYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMWphR0Z3ZEdWeWMxOWZZVzVqYUc5eUlIdGNiaUFnZDJocGRHVXRjM0JoWTJVNklHNXZkM0poY0R0Y2JpQWdkR1Y0ZEMxdmRtVnlabXh2ZHpvZ1pXeHNhWEJ6YVhNN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzRnSUdScGMzQnNZWGs2SUdKc2IyTnJPMXh1SUNCd1lXUmthVzVuT2lBd0lERXVOV1Z0TzF4dWZWeHVMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZYMkZ1WTJodmNqcHNhVzVyTEZ4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25OZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrTEZ4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25OZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjYmlBZ1kyOXNiM0k2SUNNMU5UVTdYRzU5WEc0dWIzVjBiR2x1WlMxamFHRndkR1Z5YzE5ZllXNWphRzl5T21odmRtVnlJSHRjYmlBZ1kyOXNiM0k2SUNNd05UZzVOREk3WEc1OVhHNHViM1YwYkdsdVpTMWphR0Z3ZEdWeWMxOWZZMjlrWlNCN1hHNGdJSEJoWkdScGJtY3RjbWxuYUhRNklEQXVOV1Z0TzF4dWZWeHVMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZZV04wYVhabExtOTFkR3hwYm1VdFkyaGhjSFJsY25OZlgyRnVZMmh2Y2pwc2FXNXJMRnh1TG05MWRHeHBibVV0WTJoaGNIUmxjbk5mWVdOMGFYWmxMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZYMkZ1WTJodmNqcDJhWE5wZEdWa0xGeHVMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZZV04wYVhabExtOTFkR3hwYm1VdFkyaGhjSFJsY25OZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak1EVTRPVFF5TzF4dUlDQm1iMjUwTFhkbGFXZG9kRG9nTkRBd08xeHVmVnh1TG05MWRHeHBibVV0WTJoaGNIUmxjbk5mYzNScFkydDVMRnh1TG05MWRHeHBibVV0WTJoaGNIUmxjbk5mWm1sNFpXUWdlMXh1SUNCa2FYTndiR0Y1T2lCbWJHVjRPMXh1SUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2JpQWdabXhsZUMxa2FYSmxZM1JwYjI0NklHTnZiSFZ0Ymp0Y2JpQWdlaTFwYm1SbGVEb2dkbUZ5S0MwdGIzVjBiR2x1WlMxNlNXNWtaWGdwTzF4dUlDQjBiM0E2SURBN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxamFHRndkR1Z5YzE5emRHbGphM2tnTG05MWRHeHBibVV0WTJoaGNIUmxjbk5mWDNScGRHeGxMRnh1TG05MWRHeHBibVV0WTJoaGNIUmxjbk5mWm1sNFpXUWdMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZYM1JwZEd4bExGeHVMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZjM1JwWTJ0NUlDNXZkWFJzYVc1bExXTm9ZWEIwWlhKelgxOXRZV2x1TEZ4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25OZlptbDRaV1FnTG05MWRHeHBibVV0WTJoaGNIUmxjbk5mWDIxaGFXNGdlMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25OZmMzUnBZMnQ1SUM1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDE5MGFYUnNaU3hjYmk1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDJacGVHVmtJQzV2ZFhSc2FXNWxMV05vWVhCMFpYSnpYMTkwYVhSc1pTQjdYRzRnSUdac1pYZ3RjMmh5YVc1ck9pQXdPMXh1ZlZ4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25OZmMzUnBZMnQ1SUM1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDE5dFlXbHVMRnh1TG05MWRHeHBibVV0WTJoaGNIUmxjbk5mWm1sNFpXUWdMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZYMjFoYVc0Z2UxeHVJQ0JtYkdWNE9pQXhPMXh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjYm4xY2JpNXZkWFJzYVc1bExXTm9ZWEIwWlhKelgzTjBhV05yZVNCN1hHNGdJSEJ2YzJsMGFXOXVPaUJ6ZEdsamEzazdYRzRnSUcxaGVDMW9aV2xuYUhRNklIWmhjaWd0TFc5MWRHeHBibVV0YzNScFkydDVMV2hsYVdkb2RDazdYRzU5WEc0dWIzVjBiR2x1WlMxamFHRndkR1Z5YzE5bWFYaGxaQ0I3WEc0Z0lIQnZjMmwwYVc5dU9pQm1hWGhsWkR0Y2JpQWdiV0Y0TFdobGFXZG9kRG9nTVRBd0pUdGNibjFjYmk1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDJocFpHUmxiaUI3WEc0Z0lHUnBjM0JzWVhrNklHNXZibVU3WEc1OVhHNHViM1YwYkdsdVpTMWphR0Z3ZEdWeWMxOW1iMnhrWldRZ2UxeHVJQ0IzYVdSMGFEb2dNRHRjYm4xY2JpOHFJRDA5UFQwOVBUMDlQVDBnWW5WMGRHOXVjeTUwYUdWdFpTQXRJT2FNaWVtU3J1V3Z2T2lJcXVhZ3QrVzhqeUE5UFQwOVBUMDlQVDA5SUNvdlhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeUlIdGNiaUFnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh1SUNCNkxXbHVaR1Y0T2lBNU9UazVPVHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0IwY21GdWMybDBhVzl1TFdSMWNtRjBhVzl1T2lBd0xqTnpPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNiaUFnWW05NExYTm9ZV1J2ZHpvZ01DQXdJRFp3ZUNBeGNIZ2dJMlJqWkdabE5qdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCdFlYSm5hVzQ2SURFd2NIZzdYRzRnSUhkcFpIUm9PaUF6Tm5CNE8xeHVJQ0JvWldsbmFIUTZJRE0yY0hnN1hHNGdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJQ05rWTJSbVpUWTdYRzRnSUdKdmNtUmxjaTF5WVdScGRYTTZJRE53ZUR0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdZM1Z5YzI5eU9pQndiMmx1ZEdWeU8xeHVJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEc0Z0lHTnZiRzl5T2lBak5UVTFPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTXdOVGc1TkRJN1hHNGdJR0p2Y21SbGNpMWpiMnh2Y2pvZ0l6QTFPRGswTWp0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpNW9hV1JsSUh0Y2JpQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcHNhVzVyTEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T25acGMybDBaV1FzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXprNU9UdGNiaUFnZEdWNGRDMWtaV052Y21GMGFXOXVPaUJ1YjI1bE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ013TlRnNU5ESTdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5cFkyOXVJSHRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQjBiM0E2SURVd0pUdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQjNhV1IwYURvZ01qQndlRHRjYmlBZ2FHVnBaMmgwT2lBeU1IQjRPMXh1SUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpTZ3ROVEFsTENBdE5UQWxLVHRjYmlBZ1ptbHNiRG9nWTNWeWNtVnVkR052Ykc5eU8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5aFkzUnBkbVV1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh1SUNCamIyeHZjam9nSTJabVpqdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSXpBMU9EazBNanRjYmlBZ1ltOXlaR1Z5TFdOdmJHOXlPaUFqTURVNE9UUXlPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5aFkzUnBkbVV1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNDZhRzkyWlhJZ2UxeHVJQ0JqYjJ4dmNqb2dJMlptWmp0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZZV04wYVhabElDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwc2FXNXJMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDloWTNScGRtVWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9uWnBjMmwwWldRc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyRmpkR2wyWlNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSTJabVpqdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmY205MWJtUmxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdKdmNtUmxjaTF5WVdScGRYTTZJREU0Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9teHBibXNzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBzYVc1ckxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrTEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2ZG1semFYUmxaQ3hjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZhRzkyWlhJc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0lDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNHNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdOMWNuTnZjam9nYm05MExXRnNiRzkzWldRN1hHNGdJR052Ykc5eU9pQWpPVGs1TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwc2FXNXJPbWh2ZG1WeUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmJHbHVhenBvYjNabGNpeGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZaR2x6WVdKc1pXUXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmRtbHphWFJsWkRwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPblpwYzJsMFpXUTZhRzkyWlhJc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T21odmRtVnlPbWh2ZG1WeUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmFHOTJaWEk2YUc5MlpYSXNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dU9taHZkbVZ5TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aWRYUjBiMjQ2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXprNU9UdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNHNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObU5XWTFaalU3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzUjBZaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWW5SMElIdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmdvTFRVd0pTazdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDNSMFlpQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0c1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgySjBkQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh1SUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDNSMFlpQjdYRzRnSUhSdmNEb2dNVEp3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZkSFJpTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh1SUNCMGIzQTZJQzAxTm5CNE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlpZEhRZ2UxeHVJQ0JpYjNSMGIyMDZJREV5Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMkowZEM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjYmlBZ1ltOTBkRzl0T2lBdE5UWndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmNuUnNMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlzZEhJZ2UxeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZrb0xUVXdKU2s3WEc0Z0lIZHBaSFJvT2lBMU5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5eWRHd2dlMXh1SUNCMGIzQTZJRFV3SlR0Y2JpQWdjbWxuYUhRNklERXljSGc3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzSjBiQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZhR2xrWkdWdUlIdGNiaUFnY21sbmFIUTZJQzA0Tm5CNE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlzZEhJZ2UxeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2JHVm1kRG9nTVRKd2VEdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYkhSeUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRnZTF4dUlDQnNaV1owT2lBdE9EWndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmRIUmlJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5eWRHd2dMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJKMGRDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYkhSeUlDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2Ymk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpSXNJaThxSUQwOVBUMDlJRk5qY205c2JHSmhjaUE5UFQwOVBTQXFMMXh5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUlIdGNjbHh1SUNCM2FXUjBhRG9nTjNCNE8xeHlYRzRnSUdobGFXZG9kRG9nTjNCNE8xeHlYRzRnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4eVhHNTlYSEpjYmx4eVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlMWFJ5WVdOckxYQnBaV05sSUh0Y2NseHVJQ0F0ZDJWaWEybDBMV0p2Y21SbGNpMXlZV1JwZFhNNklEVndlRHRjY2x4dWZWeHlYRzVjY2x4dU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNpMTBhSFZ0WWpwMlpYSjBhV05oYkNCN1hISmNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nY21kaVlTZ3dMQ0F3TENBd0xDQXdMakkxS1R0Y2NseHVJQ0F0ZDJWaWEybDBMV0p2Y21SbGNpMXlZV1JwZFhNNklEVndlRHRjY2x4dWZWeHlYRzVjY2x4dU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNpMTBhSFZ0WWpwb2IzSnBlbTl1ZEdGc0lIdGNjbHh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TWpVcE8xeHlYRzRnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4eVhHNTlYSEpjYmx4eVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlPbWh2ZG1WeUlIdGNjbHh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TVRVcE8xeHlYRzU5WEhKY2JseHlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlPbWh2ZG1WeUlIdGNjbHh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TXpVcE8xeHlYRzU5WEhKY2JpSXNJa0JwYlhCdmNuUWdKMk52Ykc5eWN5YzdYSEpjYmx4eVhHNHVjMlZqZEdsdmJpQjdYSEpjYmlBZ2JXRnlaMmx1T2lBeFpXMGdNRHRjY2x4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzVjY2x4dUlDQW1YMTlvWldGa1pYSXNYSEpjYmlBZ0psOWZZMjl1ZEdWdWRDeGNjbHh1SUNBbVgxOW1iMjkwWlhJZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lETmxiVHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTkwYVhSc1pTQjdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FIUm9hWEprWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW9NeUI3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSEJ5YVcxaGNubGZZMjlzYjNJN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERXVNelZsYlR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyZzBJSHRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVM0eFpXMDdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FIUm9hWEprWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW9OU0I3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURGbGJUdGNjbHh1SUNBZ0lHTnZiRzl5T2lCQVptOTFjblJvWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWtiQ0I3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF4TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJSMElIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQjBiM0E2SURBN1hISmNiaUFnSUNCc1pXWjBPaUF3TzF4eVhHNGdJQ0FnZDJsa2RHZzZJRFl3Y0hnN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURBN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlpHUWdlMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dNVHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNQ0F3SURBZ05qQndlRHRjY2x4dUlDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5d2NtVWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXlaVzBnTUR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURGbGJUdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNVFJ3ZUR0Y2NseHVJQ0FnSUd4cGJtVXRhR1ZwWjJoME9pQXhOVEFsTzF4eVhHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ2JHVm1kRHRjY2x4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUJpWjE5amIyeHZjanRjY2x4dUlDQWdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUEwY0hnN1hISmNiaUFnSUNCamIyeHZjam9nUUhSb2FYSmtYM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMk52WkdVZ2UxeHlYRzRnSUNBZ1pHbHpjR3hoZVRvZ1lteHZZMnM3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW1iMjkwWlhJZ2UxeHlYRzRnSUNBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCdFlYSm5hVzR0ZEc5d09pQXpaVzA3WEhKY2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBWW1kZlkyOXNiM0k3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRR1p2ZFhKMGFGOTBaWGgwWDJOdmJHOXlPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0pBYVcxd2IzSjBJQ2N1TDJOdmJHOXljeWM3WEhKY2JseHlYRzR1WTJGelpTQjdYSEpjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnWkdsemNHeGhlVG9nWjNKcFpEdGNjbHh1SUNCbmNtbGtMWFJsYlhCc1lYUmxMV052YkhWdGJuTTZJSEpsY0dWaGRDZ3lMQ0F4Wm5JcE8xeHlYRzRnSUdkaGNEb2dOREJ3ZUR0Y2NseHVJQ0J3WVdSa2FXNW5PaUF4WlcwN1hISmNiaUFnWW05eVpHVnlMWFJ2Y0RveGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQmliM0prWlhJdFltOTBkRzl0T2pGd2VDQnpiMnhwWkNCQVltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDWTZZV1owWlhJZ2UxeHlYRzRnSUNBZ1kyOXVkR1Z1ZERvZ0p5YzdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXlPMXh5WEc0Z0lDQWdkRzl3T2lBd08xeHlYRzRnSUNBZ2JHVm1kRG9nTlRBbE8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lDQWdkMmxrZEdnNklEQTdYSEpjYmlBZ0lDQmliM0prWlhJdGJHVm1kRG9nTVhCNElITnZiR2xrSUVCaWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZjSEpsTEZ4eVhHNGdJQ1pmWDNSbGVIUmhjbVZoSUh0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01UTndlRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBeE5UQWxPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmY0hKbExGeHlYRzRnSUNaZlgyTnZaR1VzWEhKY2JpQWdKbDlmZEdWNGRHRnlaV0VnZTF4eVhHNGdJQ0FnWm05dWRDMW1ZVzFwYkhrNklGd2lRMjkxY21sbGNpQk9aWGRjSWl3Z1EyOXVjMjlzWVhNc0lFZGxiM0puYVdFc0lFRnlhV0ZzTENCellXNXpMWE5sY21sbU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZjSEpsSUh0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURGbGJUdGNjbHh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQmlaMTlqYjJ4dmNqdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ01UQXdKVHRjY2x4dUlDQWdJR0p2Y21SbGNpMXlZV1JwZFhNNklEUndlRHRjY2x4dUlDQWdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNSdmIyeGlZWElnZTF4eVhHNGdJQ0FnYldGeVoybHVPaUF3SUdGMWRHODdYSEpjYmlBZ0lDQm9aV2xuYUhRNklETTJjSGc3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ016WndlRHRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVRSd2VEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2NseHVJQ0FnSUhSbGVIUXRZV3hwWjI0NklISnBaMmgwTzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJGamRHbHZiaXhjY2x4dUlDQW1YMTl5WlcxdmRtVWdlMXh5WEc0Z0lDQWdZM1Z5YzI5eU9pQndiMmx1ZEdWeU8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdkWE5sY2kxelpXeGxZM1E2SUc1dmJtVTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTloWTNScGIyNGdlMXh5WEc0Z0lDQWdabTl1ZEMxemFYcGxPaUF4TTNCNE8xeHlYRzRnSUNBZ2NHRmtaR2x1Wnkxc1pXWjBPaUF4TUhCNE8xeHlYRzVjY2x4dUlDQWdJQ1k2Wm1seWMzUXRZMmhwYkdRZ2UxeHlYRzRnSUNBZ0lDQndZV1JrYVc1bkxXeGxablE2SURBN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXlaVzF2ZG1VZ2UxeHlYRzRnSUNBZ1pteHZZWFE2SUhKcFoyaDBPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWTI5dWMyOXNaU0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lHaGxhV2RvZERvZ01UZ3djSGc3WEhKY2JpQWdJQ0JpYjNKa1pYSTZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgzUmxlSFJoY21WaElIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01DQmhkWFJ2TzF4eVhHNGdJQ0FnZDJsa2RHZzZJREV3TUNVN1hISmNiaUFnSUNCb1pXbG5hSFE2SURFd01DVTdYSEpjYmlBZ0lDQmliM0prWlhJNklHNXZibVU3WEhKY2JpQWdJQ0J2ZFhSc2FXNWxPaUJ1YjI1bE8xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01XVnRPMXh5WEc0Z0lDQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYkdsemRDeGNjbHh1SUNBbVgxOXBkR1Z0SUh0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBN1hISmNiaUFnSUNCc2FYTjBMWE4wZVd4bExYUjVjR1U2SUc1dmJtVTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZiR2x6ZENCN1hISmNiaUFnSUNCb1pXbG5hSFE2SURNMk1IQjRPMXh5WEc0Z0lDQWdZbTl5WkdWeUxYUnZjRG9nTVhCNElITnZiR2xrSUVCaWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ0lDQmliM0prWlhJdFltOTBkRzl0T2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFYUmxiU0I3WEhKY2JpQWdJQ0JvWldsbmFIUTZJRE0yY0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNelp3ZUR0Y2NseHVJQ0FnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNjbHh1WEhKY2JpQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUdodmRtVnlYMkpuWDJOdmJHOXlPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0l1Y0dGd1pYSWdlMXh5WEc0Z0lDNXphR0ZrYjNkZmJHbG5hSFJmY21WbmRXeGhjaWdwTzF4eVhHNGdJRzFoY21kcGJqb2dNbVZ0SUdGMWRHODdYSEpjYmlBZ2JXRjRMWGRwWkhSb09pQXhNakF3Y0hnN1hISmNiaUFnY0dGa1pHbHVaem9nTW1WdE8xeHlYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCM2FHbDBaVHRjY2x4dUlDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNWNjbHh1SUNBbUxtWnNaWGdnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nWm14bGVEdGNjbHh1SUNBZ0lHWnNaWGd0WkdseVpXTjBhVzl1T2lCeWIzYzdYSEpjYmlBZ0lDQm1iR1Y0TFhkeVlYQTZJRzV2ZDNKaGNEdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lIZHBaSFJvT2lBeE1EQWxPMXh5WEc0Z0lDQWdiV0Y0TFhkcFpIUm9PaUF4TURBbE8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ0FnTG1GeWRHbGpiR1VnZTF4eVhHNGdJQ0FnSUNCbWJHVjRMV1JwY21WamRHbHZiam9nWTI5c2RXMXVPMXh5WEc0Z0lDQWdJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0FnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dVhISmNiaUFnSUNBZ0lDWmZYMjFoYVc0Z2UxeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dNVEF3SlR0Y2NseHVJQ0FnSUNBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJQ0FnSUNBZ0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDE5aGMybGtaU0I3WEhKY2JpQWdJQ0FnSUNBZ1ltOXlaR1Z5TFhKcFoyaDBPaUF4Y0hnZ2MyOXNhV1FnUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JseHlYRzR1YUdWaFpHVnlJSHRjY2x4dUlDQndiM05wZEdsdmJqb2djM1JwWTJ0NU8xeHlYRzRnSUhvdGFXNWtaWGc2SURNN1hISmNiaUFnZEc5d09pQXdPMXh5WEc0Z0lHMWhjbWRwYmpvZ01DQmhkWFJ2TzF4eVhHNGdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNCMFpYaDBMV0ZzYVdkdU9pQmpaVzUwWlhJN1hISmNiaUFnZEhKaGJuTnBkR2x2Ymkxa2RYSmhkR2x2YmpvZ01DNHpjenRjY2x4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzVjY2x4dUlDQW1YM04wYVdOcmVTQjdYSEpjYmlBZ0lDQndZV1JrYVc1bkxXeGxablE2SURJMk1IQjRPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNWNjbHh1TG1GeWRHbGpiR1VnZTF4eVhHNGdJR1JwYzNCc1lYazZJR1pzWlhnN1hISmNiaUFnWm14bGVDMWthWEpsWTNScGIyNDZJSEp2ZHp0Y2NseHVJQ0JtYkdWNExYZHlZWEE2SUc1dmQzSmhjRHRjY2x4dUlDQndZV1JrYVc1bk9pQXlaVzBnTUR0Y2NseHVJQ0JtYjI1MExYTnBlbVU2SURFMmNIZzdYSEpjYmlBZ2JHbHVaUzFvWldsbmFIUTZJREUxTUNVN1hISmNibHh5WEc0Z0lDWmZYMjFoYVc0Z2UxeHlYRzRnSUNBZ1pteGxlRG9nTVR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBZ01tVnRPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdJQ0F1YzJWamRHbHZiaUI3WEhKY2JpQWdJQ0FnSUc5MlpYSm1iRzkzT2lCMmFYTnBZbXhsTzF4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmWTI5dWRHVnVkQ3hjY2x4dUlDQWdJQ0FnSmw5ZlptOXZkR1Z5TEZ4eVhHNGdJQ0FnSUNBbVgxOW9aV0ZrWlhJZ2UxeHlYRzRnSUNBZ0lDQWdJRzkyWlhKbWJHOTNPaUIyYVhOcFlteGxPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMTlvWldGa1pYSXNYSEpjYmlBZ0lDQWdJQ1pmWDJOdmJuUmxiblFnZTF4eVhHNGdJQ0FnSUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWVhOcFpHVWdlMXh5WEc0Z0lDQWdabXhsZUMxemFISnBibXM2SURBN1hISmNiaUFnSUNCM2FXUjBhRG9nTWpRd2NIZzdYSEpjYmlBZ0lDQmliM0prWlhJdGJHVm1kRG9nTVhCNElITnZiR2xrSUVCaWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ0lDQjBjbUZ1YzJsMGFXOXVMV1IxY21GMGFXOXVPaUF3TGpOek8xeHlYRzVjY2x4dUlDQWdJQ1l1YkhSeUlIdGNjbHh1SUNBZ0lDQWdZbTl5WkdWeUxYSnBaMmgwT2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJQ0FnWW05eVpHVnlMV3hsWm5RNklHNXZibVU3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0xtOTFkR3hwYm1VdFkyaGhjSFJsY25NZ2UxeHlYRzRnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFkMmhwZEdVN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNTlYSEpjYmx4eVhHNXdjbVVzWEhKY2JpNXpaV04wYVc5dVgxOXdjbVVnZTF4eVhHNGdJSEJoWkdScGJtYzZJREpsYlR0Y2NseHVJQ0JtYjI1MExXWmhiV2xzZVRvZ1hDSkRiM1Z5YVdWeUlFNWxkMXdpTENCQmNtbGhiQ3dnYzJGdWN5MXpaWEpwWmp0Y2NseHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBWW1kZlkyOXNiM0k3WEhKY2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNibjFjY2x4dVhISmNibU52WkdVc1hISmNiaTV6WldOMGFXOXVYMTlqYjJSbElIdGNjbHh1SUNCbWIyNTBMV1poYldsc2VUb2dYQ0pEYjNWeWFXVnlJRTVsZDF3aUxDQkJjbWxoYkN3Z2MyRnVjeTF6WlhKcFpqdGNjbHh1SUNCbWIyNTBMWE5wZW1VNklERTJjSGc3WEhKY2JuMWNjbHh1WEhKY2JpNW1iMjkwWlhJZ2UxeHlYRzRnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdjR0ZrWkdsdVp6b2dNMlZ0SURBN1hISmNiaUFnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4eVhHNWNjbHh1SUNCaElIdGNjbHh1SUNBZ0lDWTZiR2x1YXl4Y2NseHVJQ0FnSUNZNmRtbHphWFJsWkN4Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUc1dmJtVTdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQjFibVJsY214cGJtVTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JseHlYRzR1ZFhScGJITXRZbTl5WkdWeUxYSnBaMmgwSUh0Y2NseHVJQ0JpYjNKa1pYSXRjbWxuYUhRNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JuMWNjbHh1WEhKY2JpNW9hV1JrWlc0Z2UxeHlYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYm4xY2NseHVJaXdpTHlvcVhISmNiaUFxSUhOb1lXUnZkeTVzWlhOeklDMGc2WmkwNWIyeDVxQzM1YnlQNks2KzU3MnVJRzFwZUdsdWVDRGxoNzNtbGJCY2NseHVJQ29nUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVnh5WEc0Z0tpQkRjbVZoZEdWa0lFSjVPaUJaWVc5b1lXbDRhV0Z2WEhKY2JpQXFJRlZ3WkdGMFpUb2dNakF5TWk0ekxqSXdYSEpjYmlBcUwxeHlYRzVBYVcxd2IzSjBJQ2N1TDJOdmJHOXljeWM3WEhKY2JseHlYRzR2S2lBOVBUMDlQVDBnNlppMDViMng1cUMzNWJ5UDZLNis1NzJ1NVllOTVwV3dJRDA5UFQwOVBTQXFMMXh5WEc0dWMyaGhaRzkzS0VCdlptWnpaWFE2SURBZ01DQTJjSGdnTVhCNExDQkFZMjlzYjNJNklFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjaWtnZTF4eVhHNGdJR0p2ZUMxemFHRmtiM2M2SUVCdlptWnpaWFFnUUdOdmJHOXlPMXh5WEc1OVhISmNibHh5WEc0dWMyaGhaRzkzWDNKbFozVnNZWElvUUdOdmJHOXlPaUJBY0hKcGJXRnllVjlpYjNKa1pYSmZZMjlzYjNJcElIdGNjbHh1SUNBdWMyaGhaRzkzS0RBZ01DQTJjSGdnTVhCNExDQkFZMjlzYjNJcE8xeHlYRzU5WEhKY2JseHlYRzR1YzJoaFpHOTNYMnhoY21kbEtFQmpiMnh2Y2pvZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlLU0I3WEhKY2JpQWdMbk5vWVdSdmR5Z3dJREFnTVRKd2VDQXhjSGdzSUVCamIyeHZjaWs3WEhKY2JuMWNjbHh1WEhKY2JpNXphR0ZrYjNkZmJHbG5hSFJmY21WbmRXeGhjaWdwSUh0Y2NseHVJQ0F1YzJoaFpHOTNYM0psWjNWc1lYSW9LVHRjY2x4dWZWeHlYRzVjY2x4dUxuTm9ZV1J2ZDE5c2FXZG9kRjlzWVhKblpTZ3BJSHRjY2x4dUlDQXVjMmhoWkc5M1gyeGhjbWRsS0NrN1hISmNibjFjY2x4dVhISmNiaTV6YUdGa2IzZGZaR0Z5YTE5eVpXZDFiR0Z5S0NrZ2UxeHlYRzRnSUM1emFHRmtiM2RmY21WbmRXeGhjaWhBYzJWamIyNWtZWEo1WDJKdmNtUmxjbDlqYjJ4dmNpazdYSEpjYm4xY2NseHVYSEpjYmk1emFHRmtiM2RmWkdGeWExOXNZWEpuWlNncElIdGNjbHh1SUNBdWMyaGhaRzkzWDJ4aGNtZGxLRUJ6WldOdmJtUmhjbmxmWW05eVpHVnlYMk52Ykc5eUtUdGNjbHh1ZlZ4eVhHNGlMQ0l2S2lBOVBUMDlQVDA5UFQwOUlHbGpiMjR1ZEdobGJXVWdMU0J6ZG1jZzVadSs1cUNINTVxRTVxQzM1YnlQSUQwOVBUMDlQVDA5UFQwZ0tpOWNjbHh1TG05MWRHeHBibVV0YVdOdmJpQjdYSEpjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnWkdsemNHeGhlVG9nYVc1c2FXNWxMV0pzYjJOck8xeHlYRzRnSUhabGNuUnBZMkZzTFdGc2FXZHVPaUJ0YVdSa2JHVTdYSEpjYmlBZ2QybGtkR2c2SURGbGJUdGNjbHh1SUNCb1pXbG5hSFE2SURGbGJUdGNjbHh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBbVgxOXpkbWNnZTF4eVhHNGdJQ0FnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4eVhHNGdJQ0FnZWkxcGJtUmxlRG9nTWp0Y2NseHVJQ0FnSUhSdmNEb2dOVEFsTzF4eVhHNGdJQ0FnYkdWbWREb2dOVEFsTzF4eVhHNGdJQ0FnZDJsa2RHZzZJREZsYlR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTVdWdE8xeHlYRzRnSUNBZ1ptbHNiRG9nWTNWeWNtVnVkR052Ykc5eU8xeHlYRzRnSUNBZ2RISmhibk5tYjNKdE9pQjBjbUZ1YzJ4aGRHVW9MVFV3SlN3Z0xUVXdKU2s3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0k2Y205dmRDQjdYSEpjYmlBZ0xTMXZkWFJzYVc1bExYcEpibVJsZURvZ01qQXdNRHRjY2x4dUlDQXRMVzkxZEd4cGJtVXRjM1JwWTJ0NUxXaGxhV2RvZERvZ01UQXdKVHRjY2x4dUlDQXRMVzkxZEd4cGJtVXRZMmhoY0hSbGNuTXRkMmxrZEdnNklERXdNQ1U3WEhKY2JuMWNjbHh1SWl3aVFHbHRjRzl5ZENBbkxpOTJZWEpwWVdKc1pYTW5PMXh5WEc1QWFXMXdiM0owSUNjdUwyTnZiRzl5Y3ljN1hISmNia0JwYlhCdmNuUWdKeTR2YzJoaFpHOTNKenRjY2x4dVhISmNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNpQjdYSEpjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUhvdGFXNWtaWGc2SUMweE8xeHlYRzRnSUhSdmNEb2dNRHRjY2x4dUlDQnNaV1owT2lBd08xeHlYRzRnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNjbHh1SUNCMmFYTnBZbWxzYVhSNU9pQm9hV1JrWlc0N1hISmNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dVhISmNiaUFnSmw5ZmJXOWtZV3dnZTF4eVhHNGdJQ0FnTG5Ob1lXUnZkMTlzYVdkb2RGOXlaV2QxYkdGeUtDazdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQm1iR1Y0TzF4eVhHNGdJQ0FnWm14bGVDMWthWEpsWTNScGIyNDZJR052YkhWdGJqdGNjbHh1SUNBZ0lHWnNaWGd0ZDNKaGNEb2dibTkzY21Gd08xeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01qRTdYSEpjYmlBZ0lDQm9aV2xuYUhRNklERXdNQ1U3WEhKY2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQjBjbUZ1YzJsMGFXOXVMV1IxY21GMGFXOXVPaUF3TGpSek8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyaGxZV1JsY2l4Y2NseHVJQ0FtWDE5dFlXbHVMRnh5WEc0Z0lDWmZYMlp2YjNSbGNpQjdYSEpjYmlBZ0lDQjNhV1IwYURvZ01UQXdKVHRjY2x4dUlDQWdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW9aV0ZrWlhJc1hISmNiaUFnSmw5ZlptOXZkR1Z5SUh0Y2NseHVJQ0FnSUdac1pYZ3RjMmh5YVc1ck9pQXdPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmZEdsMGJHVXNYSEpjYmlBZ0psOWZiV0ZwYml4Y2NseHVJQ0FtWDE5bWIyOTBaWElnZTF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYUdWaFpHVnlMRnh5WEc0Z0lDWmZYM1JwZEd4bElIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTlRKd2VEdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUExTW5CNE8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgzUnBkR3hsSUh0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01UWndlRHRjY2x4dUlDQWdJR1p2Ym5RdGQyVnBaMmgwT2lBME1EQTdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQWdNVFp3ZUR0Y2NseHVJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQmliM0prWlhJdFltOTBkRzl0T2lBeGNIZ2djMjlzYVdRZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWTJ4dmMyVWdlMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dNanRjY2x4dUlDQWdJSFJ2Y0RvZ05UQWxPMXh5WEc0Z0lDQWdjbWxuYUhRNklERXljSGc3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNakJ3ZUR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTWpCd2VEdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUF5TUhCNE8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCbWIzVnlkR2hmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01qQndlRHRjY2x4dUlDQWdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjY2x4dUlDQWdJR04xY25OdmNqb2djRzlwYm5SbGNqdGNjbHh1SUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXU2d0TlRBbEtUdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRhV052YmlCN1hISmNiaUFnSUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lDQWdlaTFwYm1SbGVEb2dNanRjY2x4dUlDQWdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdJQ0JzWldaME9pQXdPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCamIyeHZjam9nUUhSb2FYSmtYM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5dFlXbHVJSHRjY2x4dUlDQWdJR1pzWlhnNklERTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyWnZiM1JsY2lCN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURBZ1lYVjBienRjY2x4dUlDQWdJSFJsZUhRdFlXeHBaMjQ2SUhKcFoyaDBPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMjkyWlhKc1lYa2dlMXh5WEc0Z0lDQWdZMjl1ZEdWdWREb2dKeWM3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF4TzF4eVhHNGdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdiR1ZtZERvZ01EdGNjbHh1SUNBZ0lIZHBaSFJvT2lBeE1EQWxPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXhNREFsTzF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhkb2FYUmxPMXh5WEc0Z0lDQWdiM0JoWTJsMGVUb2dNQzR4TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmY25Sc0xGeHlYRzRnSUNaZmJIUnlJSHRjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSWdlMXh5WEc0Z0lDQWdJQ0FtWDNScGJua2dlMXh5WEc0Z0lDQWdJQ0FnSUhkcFpIUm9PaUF5T0RCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXRhVzVwSUh0Y2NseHVJQ0FnSUNBZ0lDQjNhV1IwYURvZ05EZ3djSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYzIxaGJHd2dlMXh5WEc0Z0lDQWdJQ0FnSUhkcFpIUm9PaUExTkRCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXlaV2QxYkdGeUlIdGNjbHh1SUNBZ0lDQWdJQ0IzYVdSMGFEb2dOamd3Y0hnN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJXVmthWFZ0SUh0Y2NseHVJQ0FnSUNBZ0lDQjNhV1IwYURvZ056SXdjSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYkdGeVoyVWdlMXh5WEc0Z0lDQWdJQ0FnSUhkcFpIUm9PaUE1TmpCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDl5ZEd3Z2UxeHlYRzRnSUNBZ1ltOXlaR1Z5TFd4bFpuUTZJREZ3ZUNCemIyeHBaQ0JBY0hKcGJXRnllVjlpYjNKa1pYSmZZMjlzYjNJN1hISmNibHh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNpQjdYSEpjYmlBZ0lDQWdJQ1pmZEdsdWVTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NtbG5hSFE2SUMweU9UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJXbHVhU0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdjbWxuYUhRNklDMDBPVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZjMjFoYkd3Z2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhKcFoyaDBPaUF0TlRVd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNKbFozVnNZWElnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSEpwWjJoME9pQXROamt3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFsWkdsMWJTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NtbG5hSFE2SUMwM016QndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJHRnlaMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSEpwWjJoME9pQXRPVGN3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJ4MGNpQjdYSEpjYmlBZ0lDQmliM0prWlhJdGNtbG5hSFE2SURGd2VDQnpiMnhwWkNCQWNISnBiV0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSTdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNaZmRHbHVlU0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdiR1ZtZERvZ0xUSTVNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXRhVzVwSUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0JzWldaME9pQXRORGt3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM050WVd4c0lIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCc1pXWjBPaUF0TlRVd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNKbFozVnNZWElnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR3hsWm5RNklDMDJPVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiV1ZrYVhWdElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCc1pXWjBPaUF0TnpNd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDJ4aGNtZGxJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnNaV1owT2lBdE9UY3djSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YM1IwWWl4Y2NseHVJQ0FtWDJKMGRDQjdYSEpjYmlBZ0lDQnNaV1owT2lBd08xeHlYRzRnSUNBZ2QybGtkR2c2SURFd01DVTdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNaZmRHbHVlU0I3WEhKY2JpQWdJQ0FnSUNBZ2FHVnBaMmgwT2lBeU5EQndlRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl0YVc1cElIdGNjbHh1SUNBZ0lDQWdJQ0JvWldsbmFIUTZJRE15TUhCNE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgzTnRZV3hzSUh0Y2NseHVJQ0FnSUNBZ0lDQm9aV2xuYUhRNklETTJNSEI0TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNKbFozVnNZWElnZTF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ05EQXdjSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldWa2FYVnRJSHRjY2x4dUlDQWdJQ0FnSUNCb1pXbG5hSFE2SURRME1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMnhoY21kbElIdGNjbHh1SUNBZ0lDQWdJQ0JvWldsbmFIUTZJRFE0TUhCNE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YM1IwWWlCN1hISmNiaUFnSUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eU8xeHlYRzVjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSWdlMXh5WEc0Z0lDQWdJQ0FtWDNScGJua2dlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lIUnZjRG9nTFRJMU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dGFXNXBJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQjBiM0E2SUMwek16QndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmMyMWhiR3dnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFJ2Y0RvZ0xUTTNNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXlaV2QxYkdGeUlIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCMGIzQTZJQzAwTVRCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldWa2FYVnRJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQjBiM0E2SUMwME5UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJHRnlaMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFJ2Y0RvZ0xUUTVNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlpZEhRZ2UxeHlYRzRnSUNBZ2RHOXdPaUJwYm1sMGFXRnNPMXh5WEc0Z0lDQWdZbTl5WkdWeUxYUnZjRG9nTVhCNElITnZiR2xrSUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlJSHRjY2x4dUlDQWdJQ0FnSmw5MGFXNTVJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQmliM1IwYjIwNklDMHlOVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiV2x1YVNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWW05MGRHOXRPaUF0TXpNd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNOdFlXeHNJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQmliM1IwYjIwNklDMHpOekJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZjbVZuZFd4aGNpQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1ltOTBkRzl0T2lBdE5ERXdjSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyMWxaR2wxYlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWW05MGRHOXRPaUF0TkRVd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDJ4aGNtZGxJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQmliM1IwYjIwNklDMDBPVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmYjNCbGJtVmtJSHRjY2x4dUlDQWdJSFpwYzJsaWFXeHBkSGs2SUhacGMybGliR1U3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUIyWVhJb0xTMXZkWFJzYVc1bExYcEpibVJsZUNrN1hISmNibHh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNpQjdYSEpjYmlBZ0lDQWdJSEJ2YzJsMGFXOXVPaUJtYVhobFpEdGNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNuUnNJSHRjY2x4dUlDQWdJQ0FnSUNCeWFXZG9kRG9nTUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5c2RISWdlMXh5WEc0Z0lDQWdJQ0FnSUd4bFpuUTZJREE3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmZEhSaUlIdGNjbHh1SUNBZ0lDQWdJQ0IwYjNBNklEQTdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZZblIwSUh0Y2NseHVJQ0FnSUNBZ0lDQmliM1IwYjIwNklEQTdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmYjJabWMyVjBJSHRjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSWdlMXh5WEc0Z0lDQWdJQ0FtWDNKMGJDeGNjbHh1SUNBZ0lDQWdKbDlzZEhJZ2UxeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dZMkZzWXlneE1EQWxJQzBnTkdWdEtUdGNjbHh1SUNBZ0lDQWdJQ0IwYjNBNklEVXdKVHRjY2x4dUlDQWdJQ0FnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFV3SlNrN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmRIUmlMRnh5WEc0Z0lDQWdJQ0FtWDJKMGRDQjdYSEpjYmlBZ0lDQWdJQ0FnZDJsa2RHZzZJR05oYkdNb01UQXdKU0F0SURSbGJTazdYSEpjYmlBZ0lDQWdJQ0FnYkdWbWREb2dOVEFsTzF4eVhHNGdJQ0FnSUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXQ2d0TlRBbEtUdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXZjR1Z1WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0psOXlkR3dnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5YVdkb2REb2dNbVZ0TzF4eVhHNGdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ1pmYkhSeUlIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2JHVm1kRG9nTW1WdE8xeHlYRzRnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNaZmRIUmlJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdkRzl3T2lBeVpXMDdYSEpjYmlBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0psOWlkSFFnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JpYjNSMGIyMDZJREpsYlR0Y2NseHVJQ0FnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZZWFYwYnlCN1hISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOXlkR3dzWEhKY2JpQWdJQ0FnSUNaZmJIUnlJSHRjY2x4dUlDQWdJQ0FnSUNCb1pXbG5hSFE2SUdGMWRHODdYSEpjYmlBZ0lDQWdJQ0FnYldGNExXaGxhV2RvZERvZ1kyRnNZeWd4TURBbElDMGdOR1Z0S1R0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOW1kV3hzSUh0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBN1hISmNiaUFnZlZ4eVhHNTlYSEpjYmlJc0lrQnBiWEJ2Y25RZ0p5NHZZMjlzYjNKekp6dGNjbHh1WEhKY2JpNXZkWFJzYVc1bExXaGxZV1JwYm1jZ2UxeHlYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0I2TFdsdVpHVjRPaUF4TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ1pmWDJGdVkyaHZjaUI3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHlYRzVjY2x4dUlDQWdJQ1k2YkdsdWF5eGNjbHh1SUNBZ0lDWTZkbWx6YVhSbFpDeGNjbHh1SUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQmpiMnh2Y2pvZ1FHWnZkWEowYUY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklHNXZibVU3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lHTnZiRzl5T2lCQWNISnBiV0Z5ZVY5amIyeHZjanRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRhR1ZoWkdsdVoxOWZZVzVqYUc5eUlIdGNjbHh1SUNBZ0lDQWdaR2x6Y0d4aGVUb2dhVzVzYVc1bExXSnNiMk5yTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5emRHRnlkQ0I3WEhKY2JpQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnYjNabGNtWnNiM2M2SUhacGMybGliR1U3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0xtOTFkR3hwYm1VdGFHVmhaR2x1WjE5ZllXNWphRzl5SUh0Y2NseHVJQ0FnSUNBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHlYRzRnSUNBZ0lDQjZMV2x1WkdWNE9pQXlPMXh5WEc0Z0lDQWdJQ0IwYjNBNklEVXdKVHRjY2x4dUlDQWdJQ0FnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWktDMDFNQ1VwTzF4eVhHNGdJQ0FnSUNCc1pXWjBPaUF0TVdWdE8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVmVnh5WEc0aUxDSkFhVzF3YjNKMElDY3VMM1poY21saFlteGxjeWM3WEhKY2JrQnBiWEJ2Y25RZ0p5NHZZMjlzYjNKekp6dGNjbHh1UUdsdGNHOXlkQ0FuTGk5bGJHeHBjSE5wY3ljN1hISmNibHh5WEc0dWIzVjBiR2x1WlMxamFHRndkR1Z5Y3lCN1hISmNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4eVhHNGdJSG90YVc1a1pYZzZJREU3WEhKY2JpQWdiV0Z5WjJsdU9pQXdPMXh5WEc0Z0lIZHBaSFJvT2lCMllYSW9MUzF2ZFhSc2FXNWxMV05vWVhCMFpYSnpMWGRwWkhSb0tUdGNjbHh1SUNCMGNtRnVjMmwwYVc5dUxXUjFjbUYwYVc5dU9pQXdMak56TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHlYRzVjY2x4dUlDQW1YMTkwYVhSc1pTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQWdNVFp3ZUR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTkRCd2VEdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUEwTUhCNE8xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01DQXhObkI0TzF4eVhHNGdJQ0FnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01UWndlRHRjY2x4dUlDQWdJR1p2Ym5RdGQyVnBaMmgwT2lBME1EQTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZiV0ZwYmlCN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyeHBjM1FzWEhKY2JpQWdKbDlmYzNWaWFtVmpkQ3hjY2x4dUlDQW1YMTlwZEdWdElIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdPMXh5WEc0Z0lDQWdiR2x6ZEMxemRIbHNaUzEwZVhCbE9pQnViMjVsTzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJ4cGMzUWdlMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNQzQxWlcwZ01EdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM04xWW1wbFkzUWdlMXh5WEc0Z0lDQWdjR0ZrWkdsdVp5MXNaV1owT2lBeFpXMDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlwZEdWdElIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUF6TUhCNE8xeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhNM0I0TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNCc1lXTmxhRzlzWkdWeUlIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ0lDQjBiM0E2SURBN1hISmNiaUFnSUNCc1pXWjBPaUF3TzF4eVhHNGdJQ0FnZDJsa2RHZzZJREV3TUNVN1hISmNiaUFnSUNCb1pXbG5hSFE2SURNd2NIZzdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFhRzkyWlhKZlltZGZZMjlzYjNJN1hISmNiaUFnSUNCaWIzSmtaWEl0YkdWbWREb2dNbkI0SUhOdmJHbGtJRUJ6ZFdOalpYTnpYMk52Ykc5eU8xeHlYRzRnSUNBZ2RISmhibk5wZEdsdmJpMWtkWEpoZEdsdmJqb2dNQzR5Y3p0Y2NseHVJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZVzVqYUc5eUlIdGNjbHh1SUNBZ0lDNWxiR3hwY0hOcGN5Z3hLVHRjY2x4dUlDQWdJR1JwYzNCc1lYazZJR0pzYjJOck8xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01DQXhMalZsYlR0Y2NseHVYSEpjYmlBZ0lDQW1PbXhwYm1zc1hISmNiaUFnSUNBbU9uWnBjMmwwWldRc1hISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ2RHVjRkQzFrWldOdmNtRjBhVzl1T2lCdWIyNWxPMXh5WEc0Z0lDQWdJQ0JqYjJ4dmNqb2dRSE5sWTI5dVpHRnllVjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQmpiMnh2Y2pvZ1FITjFZMk5sYzNOZlkyOXNiM0k3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5amIyUmxJSHRjY2x4dUlDQWdJSEJoWkdScGJtY3RjbWxuYUhRNklEQXVOV1Z0TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5aFkzUnBkbVVnZTF4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDE5aGJtTm9iM0lnZTF4eVhHNGdJQ0FnSUNBbU9teHBibXNzWEhKY2JpQWdJQ0FnSUNZNmRtbHphWFJsWkN4Y2NseHVJQ0FnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lDQWdZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNBZ0lHWnZiblF0ZDJWcFoyaDBPaUEwTURBN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZjM1JwWTJ0NUxGeHlYRzRnSUNaZlptbDRaV1FnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nWm14bGVEdGNjbHh1SUNBZ0lHWnNaWGd0ZDNKaGNEb2dibTkzY21Gd08xeHlYRzRnSUNBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUdOdmJIVnRianRjY2x4dUlDQWdJSG90YVc1a1pYZzZJSFpoY2lndExXOTFkR3hwYm1VdGVrbHVaR1Y0S1R0Y2NseHVJQ0FnSUhSdmNEb2dNRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ0FnTG05MWRHeHBibVV0WTJoaGNIUmxjbk1nZTF4eVhHNGdJQ0FnSUNBbVgxOTBhWFJzWlN4Y2NseHVJQ0FnSUNBZ0psOWZiV0ZwYmlCN1hISmNiaUFnSUNBZ0lDQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5ZmRHbDBiR1VnZTF4eVhHNGdJQ0FnSUNBZ0lHWnNaWGd0YzJoeWFXNXJPaUF3TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDE5dFlXbHVJSHRjY2x4dUlDQWdJQ0FnSUNCbWJHVjRPaUF4TzF4eVhHNGdJQ0FnSUNBZ0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzTjBhV05yZVNCN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ2MzUnBZMnQ1TzF4eVhHNGdJQ0FnYldGNExXaGxhV2RvZERvZ2RtRnlLQzB0YjNWMGJHbHVaUzF6ZEdsamEza3RhR1ZwWjJoMEtUdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZabWw0WldRZ2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklHWnBlR1ZrTzF4eVhHNGdJQ0FnYldGNExXaGxhV2RvZERvZ01UQXdKVHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmYUdsa1pHVnVJSHRjY2x4dUlDQWdJR1JwYzNCc1lYazZJRzV2Ym1VN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyWnZiR1JsWkNCN1hISmNiaUFnSUNCM2FXUjBhRG9nTUR0Y2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aUx5b3FYRzRnS2lCbGJHeHBjSE5wY3k1c1pYTnpJQzBnNXBhSDVweXM1NXlCNTVXbElHMXBlR2x1ZUNEbGg3M21sYkJjYmlBcUlEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2JpQXFJRU55WldGMFpXUWdRbms2SUZsaGIyaGhhWGhwWVc5Y2JpQXFJRlZ3WkdGMFpUb2dNakF5TWk0ekxqRXhYRzRnS2k5Y2JseHVMeW9nUFQwOVBUMDlJT2FXaCthY3JPZWNnZWVWcGVXSHZlYVZzQ0E5UFQwOVBUMGdLaTljYmk1bGJHeHBjSE5wY3lBb1FHeHBibVZ6S1NCM2FHVnVJQ2hBYkdsdVpYTTlNU2tnZTF4dUlDQjNhR2wwWlMxemNHRmpaVG9nYm05M2NtRndPMXh1SUNCMFpYaDBMVzkyWlhKbWJHOTNPaUJsYkd4cGNITnBjenRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNibHh1TG1Wc2JHbHdjMmx6SUNoQWJHbHVaWE1wSUhkb1pXNGdLRUJzYVc1bGN6NDlNaWtnZTF4dUlDQXRkMlZpYTJsMExXeHBibVV0WTJ4aGJYQTZJRUJzYVc1bGN6dGNiaUFnWkdsemNHeGhlVG9nWW05NE8xeHVJQ0F0ZDJWaWEybDBMV0p2ZUMxdmNtbGxiblE2SUhabGNuUnBZMkZzTzF4dUlDQjBaWGgwTFc5MlpYSm1iRzkzT2lCbGJHeHBjSE5wY3p0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmlJc0lpOHFJRDA5UFQwOVBUMDlQVDBnWW5WMGRHOXVjeTUwYUdWdFpTQXRJT2FNaWVtU3J1V3Z2T2lJcXVhZ3QrVzhqeUE5UFQwOVBUMDlQVDA5SUNvdlhISmNia0JwYlhCdmNuUWdKeTR2WTI5c2IzSnpKenRjY2x4dVFHbHRjRzl5ZENBbkxpOXphR0ZrYjNjbk8xeHlYRzVjY2x4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2lCN1hISmNiaUFnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh5WEc0Z0lIb3RhVzVrWlhnNklEazVPVGs1TzF4eVhHNGdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQjBjbUZ1YzJsMGFXOXVMV1IxY21GMGFXOXVPaUF3TGpOek8xeHlYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNaZlgySjFkSFJ2YmlCN1hISmNiaUFnSUNBdWMyaGhaRzkzWDJ4cFoyaDBYM0psWjNWc1lYSW9LVHRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjY2x4dUlDQWdJSG90YVc1a1pYZzZJREU3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREV3Y0hnN1hISmNiaUFnSUNCM2FXUjBhRG9nTXpad2VEdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ016WndlRHRjY2x4dUlDQWdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUdKdmNtUmxjaTF5WVdScGRYTTZJRE53ZUR0Y2NseHVJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFkMmhwZEdVN1hISmNiaUFnSUNCamRYSnpiM0k2SUhCdmFXNTBaWEk3WEhKY2JpQWdJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSE5sWTI5dVpHRnllVjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dVhISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0JpYjNKa1pYSXRZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDWXVhR2xrWlNCN1hISmNiaUFnSUNBZ0lHUnBjM0JzWVhrNklHNXZibVU3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5aGJtTm9iM0lnZTF4eVhHNGdJQ0FnSmpwc2FXNXJMRnh5WEc0Z0lDQWdKanAyYVhOcGRHVmtMRnh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFXTnZiaUI3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF5TzF4eVhHNGdJQ0FnZEc5d09pQTFNQ1U3WEhKY2JpQWdJQ0JzWldaME9pQTFNQ1U3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNakJ3ZUR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTWpCd2VEdGNjbHh1SUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxLQzAxTUNVc0lDMDFNQ1VwTzF4eVhHNGdJQ0FnWm1sc2JEb2dZM1Z5Y21WdWRHTnZiRzl5TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWVdOMGFYWmxJSHRjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzEwYjI5c1ltRnlJSHRjY2x4dUlDQWdJQ0FnSmw5ZlluVjBkRzl1SUh0Y2NseHVJQ0FnSUNBZ0lDQmpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNBZ0lHSnZjbVJsY2kxamIyeHZjam9nUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJZ2UxeHlYRzRnSUNBZ0lDQW1PbXhwYm1zc1hISmNiaUFnSUNBZ0lDWTZkbWx6YVhSbFpDeGNjbHh1SUNBZ0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJQ0FnWTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDl5YjNWdVpHVmtJSHRjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh5WEc0Z0lDQWdJQ0JpYjNKa1pYSXRjbUZrYVhWek9pQXhPSEI0TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5a2FYTmhZbXhsWkNCN1hISmNiaUFnSUNBbUxtOTFkR3hwYm1VdGRHOXZiR0poY2l4Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFhSdmIyeGlZWElnZTF4eVhHNGdJQ0FnSUNBbVgxOWhibU5vYjNJNmJHbHVheXhjY2x4dUlDQWdJQ0FnSmw5ZllXNWphRzl5T25acGMybDBaV1FzWEhKY2JpQWdJQ0FnSUNaZlgyRnVZMmh2Y2pwb2IzWmxjaXhjY2x4dUlDQWdJQ0FnSmw5ZlluVjBkRzl1SUh0Y2NseHVJQ0FnSUNBZ0lDQmpkWEp6YjNJNklHNXZkQzFoYkd4dmQyVmtPMXh5WEc0Z0lDQWdJQ0FnSUdOdmJHOXlPaUJBWm05MWNuUm9YM1JsZUhSZlkyOXNiM0k3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1kyOXNiM0k2SUVCbWIzVnlkR2hmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZYMkoxZEhSdmJpQjdYSEpjYmlBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUdScGMyRmliR1ZrWDJKblgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzUjBZaXhjY2x4dUlDQW1YMkowZENCN1hISmNiaUFnSUNCc1pXWjBPaUExTUNVN1hISmNiaUFnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWZ29MVFV3SlNrN1hISmNibHh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNjbHh1SUNBZ0lDQWdaR2x6Y0d4aGVUb2dhVzVzYVc1bExXSnNiMk5yTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5MGRHSWdlMXh5WEc0Z0lDQWdkRzl3T2lBeE1uQjRPMXh5WEc1Y2NseHVJQ0FnSUNZdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaUI3WEhKY2JpQWdJQ0FnSUhSdmNEb2dMVFUyY0hnN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgySjBkQ0I3WEhKY2JpQWdJQ0JpYjNSMGIyMDZJREV5Y0hnN1hISmNibHh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZhR2xrWkdWdUlIdGNjbHh1SUNBZ0lDQWdZbTkwZEc5dE9pQXROVFp3ZUR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmNuUnNMRnh5WEc0Z0lDWmZiSFJ5SUh0Y2NseHVJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdTZ3ROVEFsS1R0Y2NseHVJQ0FnSUhkcFpIUm9PaUExTm5CNE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXlkR3dnZTF4eVhHNGdJQ0FnZEc5d09pQTFNQ1U3WEhKY2JpQWdJQ0J5YVdkb2REb2dNVEp3ZUR0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRkRzl2YkdKaGNsOW9hV1JrWlc0Z2UxeHlYRzRnSUNBZ0lDQnlhV2RvZERvZ0xUZzJjSGc3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJ4MGNpQjdYSEpjYmlBZ0lDQjBiM0E2SURVd0pUdGNjbHh1SUNBZ0lHeGxablE2SURFeWNIZzdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjY2x4dUlDQWdJQ0FnYkdWbWREb2dMVGcyY0hnN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzUjBZaXhjY2x4dUlDQW1YM0owYkN4Y2NseHVJQ0FtWDJKMGRDeGNjbHh1SUNBbVgyeDBjaUI3WEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh5WEc0Z0lDQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh5WEc0Z0lDQWdJQ0FnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYm4xY2NseHVJbDE5ICovXG4iXSwiZmlsZSI6ImNzcy9leGFtcGxlLm1pbi5jc3MifQ== */ +.section__dd,.section__dt{display:inline-block}.case,.section__dl{position:relative;z-index:1}.case:after,.outline-drawer__overlay{content:''}.case,.section__footer{border-top:1px solid #ddd}::-webkit-scrollbar{width:7px;height:7px;-webkit-border-radius:5px}::-webkit-scrollbar-track-piece{-webkit-border-radius:5px}::-webkit-scrollbar-thumb:vertical{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:horizontal{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar:hover{background-color:rgba(0,0,0,.15)}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.35)}.section{margin:1em 0;overflow:hidden}.section__content,.section__footer,.section__header{margin:0 3em;overflow:hidden}.section__title{color:#666}.section__h3{color:#1f8dd6;font-size:1.35em}.section__h4{font-size:1.1em;color:#666}.section__h5{font-size:1em;color:#999}.section__dd,.section__dl,.section__dt{margin:0;padding:0;overflow:hidden}.section__dd{color:#058942}.section__pre{margin:2em 0;font-size:14px;line-height:150%;text-align:left;border:1px solid #ddd;border-radius:4px;color:#666}.section__code{display:block;margin:0 auto;overflow:hidden}.section__footer{margin-top:3em;background-color:#fafafa;color:#999}.case{display:grid;grid-template-columns:repeat(2,1fr);gap:40px;padding:1em;border-bottom:1px solid #ddd;overflow:hidden}.case:after{position:absolute;z-index:2;top:0;left:50%;height:100%;width:0;border-left:1px solid #ddd;overflow:hidden}.case__pre,.case__textarea{font-size:13px;line-height:150%}.case__code,.case__pre,.case__textarea{font-family:"Courier New",Consolas,Georgia,Arial,sans-serif}.case__pre{margin:0;padding:1em;background-color:#fafafa;height:100%;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.case__textarea,.paper,.paper.flex .article{-webkit-box-sizing:border-box}.case__toolbar{margin:0 auto;height:36px;line-height:36px;font-size:14px;padding:0 16px;text-align:right;overflow:hidden}.case__action,.case__remove{cursor:pointer;color:#058942;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.case__action{font-size:13px;padding-left:10px}.case__action:first-child{padding-left:0}.case__remove{float:right}.case__console{margin:0 auto;height:180px;border:1px solid #ddd;overflow:hidden}.case__textarea{margin:0 auto;width:100%;height:100%;border:none;outline:0;padding:1em;box-sizing:border-box;overflow:auto}.case__list,.header{border-bottom:1px solid #ddd}.case__item,.case__list{margin:0;padding:0;list-style-type:none;overflow:hidden}.case__list{height:360px;border-top:1px solid #ddd;font-size:13px;overflow:auto}.footer,.outline-drawer_btt{border-top:1px solid #dcdfe6}.case__item{height:36px;line-height:36px;cursor:pointer;padding:0 16px}.case__item:hover{background-color:#f7f8f9}.article__aside .outline-chapters,.header,.outline-drawer__modal,.outline-drawer__overlay,.paper{background-color:#fff}.paper{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;margin:2em auto;max-width:1200px;padding:2em;box-sizing:border-box}.paper.flex{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin:0;width:100%;max-width:100%;height:100%;padding:0;overflow:hidden}.outline-chapters_fixed,.outline-chapters_sticky,.outline-drawer__modal,.paper.flex .article{-webkit-box-orient:vertical;-webkit-box-direction:normal}.paper.flex .article{-ms-flex-direction:column;flex-direction:column;width:100%;box-sizing:border-box}.paper.flex .article__main{height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.paper.flex .article__aside{border-right:1px solid #dcdfe6}.header{position:sticky;z-index:3;top:0;margin:0 auto;text-align:center;-webkit-transition-duration:.3s;transition-duration:.3s;overflow:hidden}.header_sticky{padding-left:260px}.article{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:2em 0;font-size:16px;line-height:150%}.hidden,.outline-heading__anchor{display:none}.article__main{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 2em;overflow:hidden}.article__main .section,.article__main .section__content,.article__main .section__footer,.article__main .section__header{overflow:visible}.article__main .section__content,.article__main .section__header{margin:0}.article__aside{-ms-flex-negative:0;flex-shrink:0;width:240px;border-left:1px solid #ddd;-webkit-transition-duration:.3s;transition-duration:.3s}.article__aside.ltr{border-right:1px solid #ddd;border-left:none}.outline-drawer_ltr,.utils-border-right{border-right:1px solid #dcdfe6}.section__pre,pre{padding:2em;font-family:"Courier New",Arial,sans-serif;background-color:#fafafa;overflow:auto}.section__code,code{font-family:"Courier New",Arial,sans-serif;font-size:16px}.footer{padding:3em 0;text-align:center}.footer a:hover,.footer a:link,.footer a:visited{text-decoration:none;color:#058942}.footer a:hover{text-decoration:underline}.outline-icon{position:relative;z-index:1;display:inline-block;vertical-align:middle;width:1em;height:1em;overflow:hidden}.outline-icon__svg{position:absolute;z-index:2;top:50%;left:50%;width:1em;height:1em;fill:currentcolor;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);overflow:hidden}:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-chapters-width:100%}.outline-drawer{position:relative;z-index:-1;top:0;left:0;margin:0;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;visibility:hidden;overflow:hidden}.outline-drawer__modal{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:absolute;z-index:21;height:100%;-webkit-transition-duration:.4s;transition-duration:.4s;overflow:hidden}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__footer,.outline-drawer__header{-ms-flex-negative:0;flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{position:relative;z-index:1;margin:0 auto;height:52px;line-height:52px;overflow:hidden}.outline-drawer__title{font-size:16px;font-weight:400;margin:0 16px;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #dcdfe6}.outline-drawer__close{position:absolute;z-index:2;top:50%;right:12px;width:20px;height:20px;line-height:20px;color:#999;font-size:20px;text-align:center;cursor:pointer;-webkit-transform:translateY(-50%);transform:translateY(-50%);overflow:hidden}.outline-drawer__close .outline-icon{position:absolute;z-index:2;top:0;left:0}.outline-drawer__close:hover{color:#666}.outline-drawer__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-drawer__footer{margin:0 auto;text-align:right;overflow:hidden}.outline-drawer__overlay{position:relative;z-index:1;top:0;left:0;width:100%;height:100%;opacity:.1;overflow:hidden}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{top:initial}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{width:calc(100% - 4em);left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0}.outline-heading{position:relative;z-index:1;overflow:hidden}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#1f8dd6}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{position:absolute;z-index:2;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:-1em}.outline-chapters{position:relative;z-index:1;margin:0;width:var(--outline-chapters-width);-webkit-transition-duration:.3s;transition-duration:.3s;overflow:auto}.outline-chapters__title{margin:0 16px;height:40px;line-height:40px;padding:0 16px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;overflow:hidden}.outline-chapters__main{position:relative;z-index:1;margin:0;overflow:hidden}.outline-chapters__item,.outline-chapters__list,.outline-chapters__subject{position:relative;z-index:2;margin:0;padding:0;list-style-type:none;overflow:hidden}.outline-chapters__list{padding:.5em 0}.outline-chapters__subject{padding-left:1em}.outline-chapters__item{margin:0;line-height:30px;font-size:13px;overflow:hidden}.outline-chapters__placeholder{position:absolute;z-index:1;top:0;left:0;width:100%;height:30px;background-color:#f7f8f9;border-left:2px solid #058942;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.outline-chapters__anchor{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;padding:0 1.5em}.outline-chapters__anchor:hover,.outline-chapters__anchor:link,.outline-chapters__anchor:visited{text-decoration:none;color:#555}.outline-chapters__anchor:hover{color:#058942}.outline-chapters__code{padding-right:.5em}.outline-chapters_active.outline-chapters__anchor:hover,.outline-chapters_active.outline-chapters__anchor:link,.outline-chapters_active.outline-chapters__anchor:visited{color:#058942;font-weight:400}.outline-chapters_fixed,.outline-chapters_sticky{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-direction:column;flex-direction:column;z-index:var(--outline-zIndex);top:0;overflow:hidden}.outline-chapters_hidden,.outline-toolbar__button.hide{display:none}.outline-chapters_fixed .outline-chapters__main,.outline-chapters_fixed .outline-chapters__title,.outline-chapters_sticky .outline-chapters__main,.outline-chapters_sticky .outline-chapters__title{-webkit-box-sizing:border-box;box-sizing:border-box}.outline-chapters_fixed .outline-chapters__title,.outline-chapters_sticky .outline-chapters__title{-ms-flex-negative:0;flex-shrink:0}.outline-chapters_fixed .outline-chapters__main,.outline-chapters_sticky .outline-chapters__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-chapters_sticky{position:sticky;max-height:var(--outline-sticky-height)}.outline-chapters_fixed{position:fixed;max-height:100%}.outline-chapters_folded{width:0}.outline-toolbar{position:fixed;z-index:99999;margin:0;-webkit-transition-duration:.3s;transition-duration:.3s;overflow:hidden}.outline-toolbar__button{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;position:relative;z-index:1;margin:10px;width:36px;height:36px;border:1px solid #dcdfe6;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;cursor:pointer;text-align:center;color:#555;overflow:hidden}.outline-toolbar__button:hover{color:#058942;border-color:#058942}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{position:absolute;z-index:2;top:50%;left:50%;width:20px;height:20px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{color:#fff;background-color:#058942;border-color:#058942}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited,.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{cursor:not-allowed;color:#999}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{-webkit-transform:translateY(-50%);transform:translateY(-50%);width:56px}.outline-toolbar_rtl{top:50%;right:12px}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{top:50%;left:12px}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJjc3MvZXhhbXBsZS5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzaGFkb3cubGVzcyAtIOmYtOW9seagt+W8j+iuvue9riBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4yMFxuICovXG4vKiA9PT09PT09PT09IGNvbG9ycy50aGVtZSAtIOWfuuehgOminOiJsuWPmOmHj+mbhuWQiCA9PT09PT09PT09ICovXG4vKiA9PT09PT0g6Zi05b2x5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xuLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgd2lkdGg6IDdweDtcbiAgaGVpZ2h0OiA3cHg7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZSB7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuLnNlY3Rpb24ge1xuICBtYXJnaW46IDFlbSAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2hlYWRlcixcbi5zZWN0aW9uX19jb250ZW50LFxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIG1hcmdpbjogMCAzZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fdGl0bGUge1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oMyB7XG4gIGNvbG9yOiAjMWY4ZGQ2O1xuICBmb250LXNpemU6IDEuMzVlbTtcbn1cbi5zZWN0aW9uX19oNCB7XG4gIGZvbnQtc2l6ZTogMS4xZW07XG4gIGNvbG9yOiAjNjY2O1xufVxuLnNlY3Rpb25fX2g1IHtcbiAgZm9udC1zaXplOiAxZW07XG4gIGNvbG9yOiAjOTk5O1xufVxuLnNlY3Rpb25fX2RsLFxuLnNlY3Rpb25fX2R0LFxuLnNlY3Rpb25fX2RkIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2RsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xufVxuLnNlY3Rpb25fX2R0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLnNlY3Rpb25fX2RkIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5zZWN0aW9uX19wcmUge1xuICBtYXJnaW46IDJlbSAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLnNlY3Rpb25fX2NvZGUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwIGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIG1hcmdpbi10b3A6IDNlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgY29sb3I6ICM5OTk7XG59XG4uY2FzZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgMWZyKTtcbiAgZ2FwOiA0MHB4O1xuICBwYWRkaW5nOiAxZW07XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlOmFmdGVyIHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiA1MCU7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDA7XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RkZDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19wcmUsXG4uY2FzZV9fdGV4dGFyZWEge1xuICBmb250LXNpemU6IDEzcHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xufVxuLmNhc2VfX3ByZSxcbi5jYXNlX19jb2RlLFxuLmNhc2VfX3RleHRhcmVhIHtcbiAgZm9udC1mYW1pbHk6IFwiQ291cmllciBOZXdcIiwgQ29uc29sYXMsIEdlb3JnaWEsIEFyaWFsLCBzYW5zLXNlcmlmO1xufVxuLmNhc2VfX3ByZSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMWVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX3Rvb2xiYXIge1xuICBtYXJnaW46IDAgYXV0bztcbiAgaGVpZ2h0OiAzNnB4O1xuICBsaW5lLWhlaWdodDogMzZweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBwYWRkaW5nOiAwIDE2cHg7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX2FjdGlvbixcbi5jYXNlX19yZW1vdmUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuLmNhc2VfX2FjdGlvbiB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuLmNhc2VfX2FjdGlvbjpmaXJzdC1jaGlsZCB7XG4gIHBhZGRpbmctbGVmdDogMDtcbn1cbi5jYXNlX19yZW1vdmUge1xuICBmbG9hdDogcmlnaHQ7XG59XG4uY2FzZV9fY29uc29sZSB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDE4MHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX3RleHRhcmVhIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgb3V0bGluZTogbm9uZTtcbiAgcGFkZGluZzogMWVtO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9fbGlzdCxcbi5jYXNlX19pdGVtIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fbGlzdCB7XG4gIGhlaWdodDogMzYwcHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX19pdGVtIHtcbiAgaGVpZ2h0OiAzNnB4O1xuICBsaW5lLWhlaWdodDogMzZweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAwIDE2cHg7XG59XG4uY2FzZV9faXRlbTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmN2Y4Zjk7XG59XG4ucGFwZXIge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgbWFyZ2luOiAyZW0gYXV0bztcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHBhZGRpbmc6IDJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4ucGFwZXIuZmxleCB7XG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiBob3Jpem9udGFsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgcGFkZGluZzogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5wYXBlci5mbGV4IC5hcnRpY2xlIHtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB3aWR0aDogMTAwJTtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4ucGFwZXIuZmxleCAuYXJ0aWNsZV9fbWFpbiB7XG4gIGhlaWdodDogMTAwJTtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLnBhcGVyLmZsZXggLmFydGljbGVfX2FzaWRlIHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5oZWFkZXIge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICB6LWluZGV4OiAzO1xuICB0b3A6IDA7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5oZWFkZXJfc3RpY2t5IHtcbiAgcGFkZGluZy1sZWZ0OiAyNjBweDtcbn1cbi5hcnRpY2xlIHtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtd2Via2l0LWJveC1vcmllbnQ6IGhvcml6b250YWw7XG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xuICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgLW1zLWZsZXgtd3JhcDogbm93cmFwO1xuICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBhZGRpbmc6IDJlbSAwO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xufVxuLmFydGljbGVfX21haW4ge1xuICAtd2Via2l0LWJveC1mbGV4OiAxO1xuICAgICAgLW1zLWZsZXg6IDE7XG4gICAgICAgICAgZmxleDogMTtcbiAgcGFkZGluZzogMCAyZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbiB7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuLmFydGljbGVfX21haW4gLnNlY3Rpb25fX2NvbnRlbnQsXG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9fZm9vdGVyLFxuLmFydGljbGVfX21haW4gLnNlY3Rpb25fX2hlYWRlciB7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuLmFydGljbGVfX21haW4gLnNlY3Rpb25fX2hlYWRlcixcbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uX19jb250ZW50IHtcbiAgbWFyZ2luOiAwO1xufVxuLmFydGljbGVfX2FzaWRlIHtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgd2lkdGg6IDI0MHB4O1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xufVxuLmFydGljbGVfX2FzaWRlLmx0ciB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1sZWZ0OiBub25lO1xufVxuLmFydGljbGVfX2FzaWRlIC5vdXRsaW5lLWNoYXB0ZXJzIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cbnByZSxcbi5zZWN0aW9uX19wcmUge1xuICBwYWRkaW5nOiAyZW07XG4gIGZvbnQtZmFtaWx5OiBcIkNvdXJpZXIgTmV3XCIsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbmNvZGUsXG4uc2VjdGlvbl9fY29kZSB7XG4gIGZvbnQtZmFtaWx5OiBcIkNvdXJpZXIgTmV3XCIsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE2cHg7XG59XG4uZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkY2RmZTY7XG4gIHBhZGRpbmc6IDNlbSAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4uZm9vdGVyIGE6bGluayxcbi5mb290ZXIgYTp2aXNpdGVkLFxuLmZvb3RlciBhOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5mb290ZXIgYTpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuLnV0aWxzLWJvcmRlci1yaWdodCB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4uaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qID09PT09PT09PT0gaWNvbi50aGVtZSAtIHN2ZyDlm77moIfnmoTmoLflvI8gPT09PT09PT09PSAqL1xuLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWljb25fX3N2ZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIGZpbGw6IGN1cnJlbnRjb2xvcjtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbjpyb290IHtcbiAgLS1vdXRsaW5lLXpJbmRleDogMjAwMDtcbiAgLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQ6IDEwMCU7XG4gIC0tb3V0bGluZS1jaGFwdGVycy13aWR0aDogMTAwJTtcbn1cbi5vdXRsaW5lLWRyYXdlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogLTE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19tb2RhbCB7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xuICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgLW1zLWZsZXgtd3JhcDogbm93cmFwO1xuICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjE7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjRzO1xuICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuNHM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX2hlYWRlcixcbi5vdXRsaW5lLWRyYXdlcl9fbWFpbixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgd2lkdGg6IDEwMCU7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIC1tcy1mbGV4LW5lZ2F0aXZlOiAwO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlLFxuLm91dGxpbmUtZHJhd2VyX19tYWluLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICBwYWRkaW5nOiAwIDE2cHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2hlYWRlcixcbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDUycHg7XG4gIGxpbmUtaGVpZ2h0OiA1MnB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX190aXRsZSB7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgbWFyZ2luOiAwIDE2cHg7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fY2xvc2Uge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTJweDtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIGNvbG9yOiAjOTk5O1xuICBmb250LXNpemU6IDIwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlIC5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fY2xvc2U6aG92ZXIge1xuICBjb2xvcjogIzY2Njtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fbWFpbiB7XG4gIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19vdmVybGF5IHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAwLjE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICB3aWR0aDogMjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21pbmkge1xuICB3aWR0aDogNDgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3NtYWxsLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9zbWFsbCB7XG4gIHdpZHRoOiA1NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIHdpZHRoOiA2ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICB3aWR0aDogNzIwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX2xhcmdlLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9sYXJnZSB7XG4gIHdpZHRoOiA5NjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTczMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTI5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC02OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yixcbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueSB7XG4gIGhlaWdodDogMjQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21pbmkge1xuICBoZWlnaHQ6IDMyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICBoZWlnaHQ6IDM2MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyIHtcbiAgaGVpZ2h0OiA0MDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICBoZWlnaHQ6IDQ0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICBoZWlnaHQ6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB0b3A6IGluaXRpYWw7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xuICB0b3A6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA0ZW0pO1xuICBsZWZ0OiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3J0bCB7XG4gIHJpZ2h0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBsZWZ0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl90dGIge1xuICB0b3A6IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIGJvdHRvbTogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfcnRsLFxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xufVxuLm91dGxpbmUtZHJhd2VyX2Z1bGwge1xuICBwYWRkaW5nOiAwO1xufVxuLm91dGxpbmUtaGVhZGluZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6bGluayxcbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMWY4ZGQ2O1xufVxuLm91dGxpbmUtaGVhZGluZzpob3ZlciAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ub3V0bGluZS1oZWFkaW5nX3N0YXJ0OmhvdmVyIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4ub3V0bGluZS1oZWFkaW5nX3N0YXJ0IC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgbGVmdDogLTFlbTtcbn1cbi8qKlxuICogZWxsaXBzaXMubGVzcyAtIOaWh+acrOecgeeVpSBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxuICovXG4vKiA9PT09PT0g5paH5pys55yB55Wl5Ye95pWwID09PT09PSAqL1xuLm91dGxpbmUtY2hhcHRlcnMge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IHZhcigtLW91dGxpbmUtY2hhcHRlcnMtd2lkdGgpO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4ub3V0bGluZS1jaGFwdGVyc19fdGl0bGUge1xuICBtYXJnaW46IDAgMTZweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBsaW5lLWhlaWdodDogNDBweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX21haW4ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX19saXN0LFxuLm91dGxpbmUtY2hhcHRlcnNfX3N1YmplY3QsXG4ub3V0bGluZS1jaGFwdGVyc19faXRlbSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMjtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1jaGFwdGVyc19fbGlzdCB7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG59XG4ub3V0bGluZS1jaGFwdGVyc19fc3ViamVjdCB7XG4gIHBhZGRpbmctbGVmdDogMWVtO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX2l0ZW0ge1xuICBtYXJnaW46IDA7XG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1jaGFwdGVyc19fcGxhY2Vob2xkZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDU4OTQyO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1jaGFwdGVyc19fYW5jaG9yIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAwIDEuNWVtO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICM1NTU7XG59XG4ub3V0bGluZS1jaGFwdGVyc19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS1jaGFwdGVyc19fY29kZSB7XG4gIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfYWN0aXZlLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtY2hhcHRlcnNfYWN0aXZlLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtY2hhcHRlcnNfYWN0aXZlLm91dGxpbmUtY2hhcHRlcnNfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBmb250LXdlaWdodDogNDAwO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfc3RpY2t5LFxuLm91dGxpbmUtY2hhcHRlcnNfZml4ZWQge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcbiAgdG9wOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfc3RpY2t5IC5vdXRsaW5lLWNoYXB0ZXJzX190aXRsZSxcbi5vdXRsaW5lLWNoYXB0ZXJzX2ZpeGVkIC5vdXRsaW5lLWNoYXB0ZXJzX190aXRsZSxcbi5vdXRsaW5lLWNoYXB0ZXJzX3N0aWNreSAub3V0bGluZS1jaGFwdGVyc19fbWFpbixcbi5vdXRsaW5lLWNoYXB0ZXJzX2ZpeGVkIC5vdXRsaW5lLWNoYXB0ZXJzX19tYWluIHtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4ub3V0bGluZS1jaGFwdGVyc19zdGlja3kgLm91dGxpbmUtY2hhcHRlcnNfX3RpdGxlLFxuLm91dGxpbmUtY2hhcHRlcnNfZml4ZWQgLm91dGxpbmUtY2hhcHRlcnNfX3RpdGxlIHtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX3N0aWNreSAub3V0bGluZS1jaGFwdGVyc19fbWFpbixcbi5vdXRsaW5lLWNoYXB0ZXJzX2ZpeGVkIC5vdXRsaW5lLWNoYXB0ZXJzX19tYWluIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfc3RpY2t5IHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgbWF4LWhlaWdodDogdmFyKC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0KTtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX2ZpeGVkIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xufVxuLm91dGxpbmUtY2hhcHRlcnNfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLWNoYXB0ZXJzX2ZvbGRlZCB7XG4gIHdpZHRoOiAwO1xufVxuLyogPT09PT09PT09PSBidXR0b25zLnRoZW1lIC0g5oyJ6ZKu5a+86Iiq5qC35byPID09PT09PT09PT0gKi9cbi5vdXRsaW5lLXRvb2xiYXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDk5OTk5O1xuICBtYXJnaW46IDA7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAxMHB4O1xuICB3aWR0aDogMzZweDtcbiAgaGVpZ2h0OiAzNnB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGNkZmU2O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICM1NTU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogIzA1ODk0MjtcbiAgYm9yZGVyLWNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLmhpZGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2ljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIGZpbGw6IGN1cnJlbnRjb2xvcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG4ub3V0bGluZS10b29sYmFyX3JvdW5kZWQub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBib3JkZXItcmFkaXVzOiAxOHB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICBjb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluazpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbms6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQ6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIsXG4ub3V0bGluZS10b29sYmFyX2J0dCB7XG4gIGxlZnQ6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9idHQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIge1xuICB0b3A6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX3R0Yi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgdG9wOiAtNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYnR0IHtcbiAgYm90dG9tOiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9idHQub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGJvdHRvbTogLTU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bCxcbi5vdXRsaW5lLXRvb2xiYXJfbHRyIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB3aWR0aDogNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsIHtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIHJpZ2h0OiAtODZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfbHRyIHtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX2x0ci5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgbGVmdDogLTg2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfcnRsIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9idHQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX2x0ciAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zjg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMenhwYm5CMWRDQmpjM01nTWo0aUxDSnpZM0p2Ykd4aVlYSXViR1Z6Y3lJc0luTmxZM1JwYjI0dWJHVnpjeUlzSW1OaGMyVXViR1Z6Y3lJc0luQmhaMlZ5TG14bGMzTWlMQ0l1TGk4dUxpOXpjbU12ZEdobGJXVXZjMmhoWkc5M0xteGxjM01pTENJdUxpOHVMaTl6Y21NdmRHaGxiV1V2YVdOdmJuTXViR1Z6Y3lJc0lpNHVMeTR1TDNOeVl5OTBhR1Z0WlM5MllYSnBZV0pzWlhNdWJHVnpjeUlzSWk0dUx5NHVMM055WXk5MGFHVnRaUzlrY21GM1pYSXViR1Z6Y3lJc0lpNHVMeTR1TDNOeVl5OTBhR1Z0WlM5aGJtTm9iM0p6TG14bGMzTWlMQ0l1TGk4dUxpOXpjbU12ZEdobGJXVXZZMmhoY0hSbGNuTXViR1Z6Y3lJc0lpNHVMeTR1TDNOeVl5OTBhR1Z0WlM5bGJHeHBjSE5wY3k1c1pYTnpJaXdpTGk0dkxpNHZjM0pqTDNSb1pXMWxMM1J2YjJ4aVlYSXViR1Z6Y3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFUczdPenM3UjBGTFJ6dEJRVU5JTEcxRVFVRnRSRHRCUVVOdVJDdzBRa0ZCTkVJN1FVRkROVUlzTWtKQlFUSkNPMEZEVUROQ08wVkJRMFVzVjBGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN3eVFrRkJRVHREUkZORU8wRkRUa1E3UlVGRFJTd3lRa0ZCUVR0RFJGRkVPMEZEVEVRN1JVRkRSU3h6UTBGQlFUdEZRVU5CTERKQ1FVRkJPME5FVDBRN1FVTktSRHRGUVVORkxITkRRVUZCTzBWQlEwRXNNa0pCUVVFN1EwUk5SRHRCUTBoRU8wVkJRMFVzYzBOQlFVRTdRMFJMUkR0QlEwWkVPMFZCUTBVc2MwTkJRVUU3UTBSSlJEdEJSVFZDUkR0RlFVTkZMR05CUVVFN1JVRkRRU3hwUWtGQlFUdERSamhDUkR0QlJUVkNRenM3TzBWQlIwVXNZMEZCUVR0RlFVTkJMR2xDUVVGQk8wTkdPRUpJTzBGRk0wSkRPMFZCUTBVc1dVRkJRVHREUmpaQ1NEdEJSVEZDUXp0RlFVTkZMR1ZCUVVFN1JVRkRRU3hyUWtGQlFUdERSalJDU0R0QlJYcENRenRGUVVORkxHbENRVUZCTzBWQlEwRXNXVUZCUVR0RFJqSkNTRHRCUlhoQ1F6dEZRVU5GTEdWQlFVRTdSVUZEUVN4WlFVRkJPME5HTUVKSU8wRkZka0pET3pzN1JVRkhSU3hWUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEdsQ1FVRkJPME5HZVVKSU8wRkZkRUpETzBWQlEwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wTkdkMEpJTzBGRmNrSkRPMFZCUTBVc2MwSkJRVUU3UTBaMVFrZzdRVVZ3UWtNN1JVRkRSU3h6UWtGQlFUdEZRVU5CTEdWQlFVRTdRMFp6UWtnN1FVVnVRa003UlVGRFJTeGpRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYTBKQlFVRTdSVUZEUVN4cFFrRkJRVHRGUVVOQkxEQkNRVUZCTzBWQlEwRXNkVUpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4bFFVRkJPME5HY1VKSU8wRkZiRUpETzBWQlEwVXNaVUZCUVR0RlFVTkJMR1ZCUVVFN1JVRkRRU3hwUWtGQlFUdERSbTlDU0R0QlJXcENRenRGUVVORkxESkNRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3d3UWtGQlFUdEZRVU5CTEZsQlFVRTdRMFp0UWtnN1FVYzVSa1E3UlVGRFJTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hqUVVGQk8wVkJRMEVzYzBOQlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxESkNRVUZCTzBWQlEwRXNPRUpCUVVFN1JVRkRRU3hwUWtGQlFUdERTR2RIUkR0QlJ6bEdRenRGUVVORkxGbEJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hQUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4VFFVRkJPMFZCUTBFc05FSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFNHZEhTRHRCUnpkR1F6czdSVUZGUlN4blFrRkJRVHRGUVVOQkxHdENRVUZCTzBOSUswWklPMEZITlVaRE96czdSVUZIUlN4cFJVRkJRVHREU0RoR1NEdEJSek5HUXp0RlFVTkZMRlZCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzTUVKQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wVkJRMEVzWlVGQlFUdERTRFpHU0R0QlJ6RkdRenRGUVVORkxHVkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFNEUkdTRHRCUjNwR1F6czdSVUZGUlN4blFrRkJRVHRGUVVOQkxHVkJRVUU3UlVGRFFTd3dRa0ZCUVR0TFFVRkJMSFZDUVVGQk8wMUJRVUVzYzBKQlFVRTdWVUZCUVN4clFrRkJRVHREU0RKR1NEdEJSM2hHUXp0RlFVTkZMR2RDUVVGQk8wVkJRMEVzYlVKQlFVRTdRMGd3UmtnN1FVZDRSa2M3UlVGRFJTeG5Ra0ZCUVR0RFNEQkdURHRCUjNSR1F6dEZRVU5GTEdGQlFVRTdRMGgzUmtnN1FVZHlSa003UlVGRFJTeGxRVUZCTzBWQlEwRXNZMEZCUVR0RlFVTkJMSFZDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMGgxUmtnN1FVZHdSa003UlVGRFJTeGxRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzWTBGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN3clFrRkJRVHRWUVVGQkxIVkNRVUZCTzBWQlEwRXNaVUZCUVR0RFNITkdTRHRCUjI1R1F6czdSVUZGUlN4VlFVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxITkNRVUZCTzBWQlEwRXNhVUpCUVVFN1EwaHhSa2c3UVVkc1JrTTdSVUZEUlN4alFVRkJPMFZCUTBFc01rSkJRVUU3UlVGRFFTdzRRa0ZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzWlVGQlFUdERTRzlHU0R0QlIycEdRenRGUVVORkxHRkJRVUU3UlVGRFFTeHJRa0ZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzWjBKQlFVRTdRMGh0UmtnN1FVZHFSa2M3UlVGRFJTd3dRa0ZCUVR0RFNHMUdURHRCU1hwTlJEdEZRMU4zUkN4M1EwRkJRVHRWUVVGQkxHZERRVUZCTzBWRVVIUkVMR2xDUVVGQk8wVkJRMEVzYTBKQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc2RVSkJRVUU3UlVGRFFTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wTktNazFFTzBGSmVrMURPMFZCUTBVc2NVSkJRVUU3UlVGQlFTeHhRa0ZCUVR0RlFVRkJMR05CUVVFN1JVRkRRU3dyUWtGQlFUdEZRVUZCTERoQ1FVRkJPMDFCUVVFc2QwSkJRVUU3VlVGQlFTeHZRa0ZCUVR0RlFVTkJMSE5DUVVGQk8wMUJRVUVzYTBKQlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hwUWtGQlFUdERTakpOU0R0QlNYQk9RenRGUVZsSkxEWkNRVUZCTzBWQlFVRXNPRUpCUVVFN1RVRkJRU3d5UWtGQlFUdFZRVUZCTEhWQ1FVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1Ewb3lUVXc3UVVsNlRVczdSVUZEUlN4aFFVRkJPMFZCUTBFc0swSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RlFVTkJMR1ZCUVVFN1Ewb3lUVkE3UVVsNFRVczdSVUZEUlN4blEwRkJRVHREU2pCTlVEdEJTWEJOUkR0RlFVTkZMR2xDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEU5QlFVRTdSVUZEUVN4bFFVRkJPMFZCUTBFc09FSkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzYTBOQlFVRTdWVUZCUVN3d1FrRkJRVHRGUVVOQkxHbENRVUZCTzBOS2MwMUVPMEZKY0UxRE8wVkJRMFVzYjBKQlFVRTdRMHB6VFVnN1FVbHNUVVE3UlVGRFJTeHhRa0ZCUVR0RlFVRkJMSEZDUVVGQk8wVkJRVUVzWTBGQlFUdEZRVU5CTEN0Q1FVRkJPMFZCUVVFc09FSkJRVUU3VFVGQlFTeDNRa0ZCUVR0VlFVRkJMRzlDUVVGQk8wVkJRMEVzYzBKQlFVRTdUVUZCUVN4clFrRkJRVHRGUVVOQkxHVkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR3RDUVVGQk8wTktiMDFFTzBGSmJFMURPMFZCUTBVc2IwSkJRVUU3VFVGQlFTeFpRVUZCTzFWQlFVRXNVVUZCUVR0RlFVTkJMR1ZCUVVFN1JVRkRRU3hwUWtGQlFUdERTbTlOU0R0QlNYWk5RenRGUVUxSkxHdENRVUZCTzBOS2IwMU1PMEZKYkUxTE96czdSVUZIUlN4clFrRkJRVHREU205TlVEdEJTV3BOU3pzN1JVRkZSU3hWUVVGQk8wTktiVTFRTzBGSk9VeERPMFZCUTBVc2NVSkJRVUU3VFVGQlFTeGxRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMRFJDUVVGQk8wVkJRMEVzYTBOQlFVRTdWVUZCUVN3d1FrRkJRVHREU21kTlNEdEJTVGxNUnp0RlFVTkZMRFpDUVVGQk8wVkJRMEVzYTBKQlFVRTdRMHBuVFV3N1FVbDRUVU03UlVGWlNTeDFRa0ZCUVR0RFNpdE1URHRCU1RGTVJEczdSVUZGUlN4aFFVRkJPMFZCUTBFc09FTkJRVUU3UlVGRFFTd3dRa0ZCUVR0RlFVTkJMR1ZCUVVFN1EwbzBURVE3UVVsNlRFUTdPMFZCUlVVc09FTkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RFNqSk1SRHRCU1hoTVJEdEZRVU5GTERoQ1FVRkJPMFZCUTBFc1pVRkJRVHRGUVVOQkxHMUNRVUZCTzBOS01FeEVPMEZKZGt4SE96czdSVUZIUlN4elFrRkJRVHRGUVVOQkxHVkJRVUU3UTBwNVRFdzdRVWwwVEVjN1JVRkRSU3d5UWtGQlFUdERTbmRNVER0QlNXNU1SRHRGUVVORkxHZERRVUZCTzBOS2NVeEVPMEZKYkV4RU8wVkJRMFVzWTBGQlFUdERTbTlNUkR0QlFVTkVMR3RFUVVGclJEdEJUVGRVYkVRN1JVRkRSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4elFrRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3hwUWtGQlFUdERUaXRVUkR0QlRUZFVRenRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRk5CUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4dFFrRkJRVHRGUVVOQkxIbERRVUZCTzFWQlFVRXNhVU5CUVVFN1JVRkRRU3hwUWtGQlFUdERUaXRVU0R0QlQyeFdSRHRGUVVORExIVkNRVUZCTzBWQlEwUXNPRUpCUVVFN1JVRkJhVU1zSzBKQlFVRTdRMUJ4Vm1oRE8wRlJibFpFTzBWQlEwVXNiVUpCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzVDBGQlFUdEZRVU5CTEZGQlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVW5GV1JEdEJVVzVXUXp0RlNGQnpSQ3gzUTBGQlFUdFZRVUZCTEdkRFFVRkJPMFZIVTNCRUxIRkNRVUZCTzBWQlFVRXNjVUpCUVVFN1JVRkJRU3hqUVVGQk8wVkJRMEVzTmtKQlFVRTdSVUZCUVN3NFFrRkJRVHROUVVGQkxESkNRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3h6UWtGQlFUdE5RVUZCTEd0Q1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMSFZDUVVGQk8wVkJRMEVzYTBOQlFVRTdWVUZCUVN3d1FrRkJRVHRGUVVOQkxHbENRVUZCTzBOU2NWWklPMEZSYkZaRE96czdSVUZIUlN4WlFVRkJPMFZCUTBFc0swSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RFVtOVdTRHRCVVdwV1F6czdSVUZGUlN4eFFrRkJRVHROUVVGQkxHVkJRVUU3UTFKdFZrZzdRVkZvVmtNN096dEZRVWRGTEdkQ1FVRkJPME5TYTFaSU8wRlJMMVZET3p0RlFVVkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEdWQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFVtbFdTRHRCVVRsVlF6dEZRVU5GTEdkQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UlVGRFFTeGxRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEdsRFFVRkJPME5TWjFaSU8wRlJOMVZETzBWQlEwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVTBGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHOURRVUZCTzFWQlFVRXNORUpCUVVFN1JVRkRRU3hwUWtGQlFUdERVaXRWU0R0QlVUVldRenRGUVdkQ1NTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hQUVVGQk8wVkJRMEVzVVVGQlFUdERVaXRWVER0QlVUVlZSenRGUVVORkxGbEJRVUU3UTFJNFZVdzdRVkV4VlVNN1JVRkRSU3h2UWtGQlFUdE5RVUZCTEZsQlFVRTdWVUZCUVN4UlFVRkJPMFZCUTBFc1pVRkJRVHREVWpSVlNEdEJVWHBWUXp0RlFVTkZMR1ZCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5TTWxWSU8wRlJlRlZETzBWQlEwVXNXVUZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEU5QlFVRTdSVUZEUVN4UlFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3hwUWtGQlFUdERVakJWU0R0QlVYQlZTenM3UlVGRFJTeGhRVUZCTzBOU2RWVlFPMEZSY0ZWTE96dEZRVU5GTEdGQlFVRTdRMUoxVlZBN1FWRndWVXM3TzBWQlEwVXNZVUZCUVR0RFVuVlZVRHRCVVhCVlN6czdSVUZEUlN4aFFVRkJPME5TZFZWUU8wRlJjRlZMT3p0RlFVTkZMR0ZCUVVFN1ExSjFWVkE3UVZGd1ZVczdPMFZCUTBVc1lVRkJRVHREVW5WVlVEdEJVV3hWUXp0RlFVTkZMQ3RDUVVGQk8wTlNiMVZJTzBGUmFGVlBPMFZCUTBVc1kwRkJRVHREVW10VlZEdEJVVGRVVHp0RlFVTkZMR05CUVVFN1ExSXJWRlE3UVZFeFZFODdSVUZEUlN4alFVRkJPME5TTkZSVU8wRlJkbFJQTzBWQlEwVXNZMEZCUVR0RFVubFVWRHRCVVhCVVR6dEZRVU5GTEdOQlFVRTdRMUp6VkZRN1FWRnFWRTg3UlVGRFJTeGpRVUZCTzBOU2JWUlVPMEZSTjFORE8wVkJRMFVzWjBOQlFVRTdRMUlyVTBnN1FWRXpVMDg3UlVGRFJTeGhRVUZCTzBOU05sTlVPMEZSZUZOUE8wVkJRMFVzWVVGQlFUdERVakJUVkR0QlVYSlRUenRGUVVORkxHRkJRVUU3UTFKMVUxUTdRVkZzVTA4N1JVRkRSU3hoUVVGQk8wTlNiMU5VTzBGUkwxSlBPMFZCUTBVc1lVRkJRVHREVW1sVFZEdEJVVFZTVHp0RlFVTkZMR0ZCUVVFN1ExSTRVbFE3UVZGNFVrTTdPMFZCUlVVc1VVRkJRVHRGUVVOQkxGbEJRVUU3UTFJd1VrZzdRVkYyVWtzN08wVkJRMFVzWTBGQlFUdERVakJTVUR0QlVYWlNTenM3UlVGRFJTeGpRVUZCTzBOU01GSlFPMEZSZGxKTE96dEZRVU5GTEdOQlFVRTdRMUl3VWxBN1FWRjJVa3M3TzBWQlEwVXNZMEZCUVR0RFVqQlNVRHRCVVhaU1N6czdSVUZEUlN4alFVRkJPME5TTUZKUU8wRlJkbEpMT3p0RlFVTkZMR05CUVVFN1ExSXdVbEE3UVZGeVVrTTdSVUZEUlN4cFEwRkJRVHREVW5WU1NEdEJVVzVTVHp0RlFVTkZMRmxCUVVFN1ExSnhVbFE3UVZGb1VrODdSVUZEUlN4WlFVRkJPME5TYTFKVU8wRlJOMUZQTzBWQlEwVXNXVUZCUVR0RFVpdFJWRHRCVVRGUlR6dEZRVU5GTEZsQlFVRTdRMUkwVVZRN1FWRjJVVTg3UlVGRFJTeFpRVUZCTzBOU2VWRlVPMEZSY0ZGUE8wVkJRMFVzV1VGQlFUdERVbk5SVkR0QlVXaFJRenRGUVVORkxHRkJRVUU3UlVGRFFTdzRRa0ZCUVR0RFVtdFJTRHRCVVRsUVR6dEZRVU5GTEdWQlFVRTdRMUpuVVZRN1FWRXpVRTg3UlVGRFJTeGxRVUZCTzBOU05sQlVPMEZSZUZCUE8wVkJRMFVzWlVGQlFUdERVakJRVkR0QlVYSlFUenRGUVVORkxHVkJRVUU3UTFKMVVGUTdRVkZzVUU4N1JVRkRSU3hsUVVGQk8wTlNiMUJVTzBGUkwwOVBPMFZCUTBVc1pVRkJRVHREVW1sUVZEdEJVVE5QUXp0RlFVTkZMRzlDUVVGQk8wVkJRMEVzSzBKQlFVRTdRMUkyVDBnN1FWRXpUMGM3UlVGRFJTeG5Ra0ZCUVR0RFVqWlBURHRCVVROUFN6dEZRVU5GTEZOQlFVRTdRMUkyVDFBN1FWRXhUMHM3UlVGRFJTeFJRVUZCTzBOU05FOVFPMEZSZWs5TE8wVkJRMFVzVDBGQlFUdERVakpQVUR0QlVYaFBTenRGUVVORkxGVkJRVUU3UTFJd1QxQTdRVkZ1VDBzN08wVkJSVVVzZVVKQlFVRTdSVUZEUVN4VFFVRkJPMFZCUTBFc2IwTkJRVUU3VlVGQlFTdzBRa0ZCUVR0RFVuRlBVRHRCVVd4UFN6czdSVUZGUlN4M1FrRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeHZRMEZCUVR0VlFVRkJMRFJDUVVGQk8wTlNiMDlRTzBGUkwwNVRPMFZCUTBVc1YwRkJRVHREVW1sUFdEdEJVVGxPVXp0RlFVTkZMRlZCUVVFN1ExSm5UMWc3UVZFM1RsTTdSVUZEUlN4VFFVRkJPME5TSzA1WU8wRlJOVTVUTzBWQlEwVXNXVUZCUVR0RFVqaE9XRHRCVVhKT1N6czdSVUZGUlN4aFFVRkJPMFZCUTBFc05rSkJRVUU3UTFKMVRsQTdRVkZzVGtNN1JVRkRSU3hYUVVGQk8wTlNiMDVJTzBGVGRHNUNSRHRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMR2xDUVVGQk8wTlVkMjVDUkR0QlUzUnVRa003UlVGRFJTeGpRVUZCTzBOVWQyNUNTRHRCVTNSdVFrYzdPenRGUVVkRkxGbEJRVUU3UlVGRFFTeHpRa0ZCUVR0RFZIZHVRa3c3UVZOeWJrSkhPMFZCUTBVc1pVRkJRVHREVkhWdVFrdzdRVk51YmtKRE8wVkJSVWtzYzBKQlFVRTdRMVJ2YmtKTU8wRlRMMjFDUnp0RlFVTkZMR3RDUVVGQk8wTlVhVzVDVER0QlUyNXVRa003UlVGTlNTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hUUVVGQk8wVkJRMEVzYjBOQlFVRTdWVUZCUVN3MFFrRkJRVHRGUVVOQkxGZEJRVUU3UTFSbmJrSk1PMEZCUTBRN096czdPMGRCUzBjN1FVRkRTQ3d3UWtGQk1FSTdRVlY2Y0VJeFFqdEZRVU5GTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeHhRMEZCUVR0RlFVTkJMR3REUVVGQk8xVkJRVUVzTUVKQlFVRTdSVUZEUVN4bFFVRkJPME5XTW5CQ1JEdEJWWHB3UWtNN1JVRkRSU3hsUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeHBRMEZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYVVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVmpKd1FrZzdRVlY0Y0VKRE8wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxHbENRVUZCTzBOV01IQkNTRHRCVlhad1FrTTdPenRGUVVkRkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRlZCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzYzBKQlFVRTdSVUZEUVN4cFFrRkJRVHREVm5sd1FrZzdRVlYwY0VKRE8wVkJRMFVzYVVKQlFVRTdRMVozY0VKSU8wRlZjbkJDUXp0RlFVTkZMR3RDUVVGQk8wTldkWEJDU0R0QlZYQndRa003UlVGRFJTeFZRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5XYzNCQ1NEdEJWVzV3UWtNN1JVRkRSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4UFFVRkJPMFZCUTBFc1VVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNNRUpCUVVFN1JVRkRRU3dyUWtGQlFUdEZRVU5CTEd0RFFVRkJPMVZCUVVFc01FSkJRVUU3UlVGRFFTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMVp4Y0VKSU8wRlZiSEJDUXp0RlF6ZEVRU3h2UWtGQlFUdEZRVU5CTEhkQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UlVRMlJFVXNaVUZCUVR0RlFVTkJMR2xDUVVGQk8wTldjM0JDU0R0QlZYQndRa2M3T3p0RlFVZEZMSE5DUVVGQk8wVkJRMEVzV1VGQlFUdERWbk53UWt3N1FWVnVjRUpITzBWQlEwVXNaVUZCUVR0RFZuRndRa3c3UVZWcWNFSkRPMFZCUTBVc2NVSkJRVUU3UTFadGNFSklPMEZWT1c5Q1N6czdPMFZCUjBVc1pVRkJRVHRGUVVOQkxHbENRVUZCTzBOV1ozQkNVRHRCVlROdlFrTTdPMFZCUlVVc2NVSkJRVUU3UlVGQlFTeHhRa0ZCUVR0RlFVRkJMR05CUVVFN1JVRkRRU3h6UWtGQlFUdE5RVUZCTEd0Q1FVRkJPMFZCUTBFc05rSkJRVUU3UlVGQlFTdzRRa0ZCUVR0TlFVRkJMREpDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN3clFrRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeHBRa0ZCUVR0RFZqWnZRa2c3UVZVeGIwSkxPenM3TzBWQlJVVXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdERWamh2UWxBN1FWVXpiMEpMT3p0RlFVTkZMSEZDUVVGQk8wMUJRVUVzWlVGQlFUdERWamh2UWxBN1FWVXpiMEpMT3p0RlFVTkZMRzlDUVVGQk8wMUJRVUVzV1VGQlFUdFZRVUZCTEZGQlFVRTdSVUZEUVN4bFFVRkJPME5XT0c5Q1VEdEJWWHB2UWtNN1JVRkRSU3hwUWtGQlFUdEZRVU5CTEhsRFFVRkJPME5XTW05Q1NEdEJWWGh2UWtNN1JVRkRSU3huUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5XTUc5Q1NEdEJWWFp2UWtNN1JVRkRSU3hqUVVGQk8wTldlVzlDU0R0QlZYUnZRa003UlVGRFJTeFRRVUZCTzBOV2QyOUNTRHRCUVVORUxHdEVRVUZyUkR0QldYQjRRbXhFTzBWQlEwVXNaMEpCUVVFN1JVRkRRU3hsUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEd0RFFVRkJPMVZCUVVFc01FSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFduTjRRa1E3UVZsd2VFSkRPMFZRUm5ORUxIZERRVUZCTzFWQlFVRXNaME5CUVVFN1JVOUpjRVFzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNNRUpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc2FVSkJRVUU3UTFwemVFSklPMEZaY0hoQ1J6dEZRVU5GTEdWQlFVRTdSVUZEUVN4elFrRkJRVHREV25ONFFrdzdRVmx1ZUVKSE8wVkJRMFVzWTBGQlFUdERXbkY0UWt3N1FWbG9lRUpIT3pzN1JVRkhSU3haUVVGQk8wVkJRMEVzYzBKQlFVRTdRMXByZUVKTU8wRlpMM2RDUnp0RlFVTkZMR1ZCUVVFN1ExcHBlRUpNTzBGWk4zZENRenRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRk5CUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4NVEwRkJRVHRWUVVGQkxHbERRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3hwUWtGQlFUdERXaXQzUWtnN1FWa3hkMEpMTzBWQlEwVXNXVUZCUVR0RlFVTkJMREJDUVVGQk8wVkJRMEVzYzBKQlFVRTdRMW8wZDBKUU8wRlpNWGRDVHp0RlFVTkZMRmxCUVVFN1ExbzBkMEpVTzBGWmRIZENTenM3TzBWQlIwVXNXVUZCUVR0RFduZDNRbEE3UVZsc2QwSkhPMFZCUTBVc2IwSkJRVUU3UTFwdmQwSk1PMEZaTjNaQ1N6czdPenM3T3pzN1JVRkpSU3h2UWtGQlFUdEZRVU5CTEZsQlFVRTdRMXB0ZDBKUU8wRlphbmRDVHpzN096czdPenM3UlVGRFJTeFpRVUZCTzBOYU1IZENWRHRCV1hSM1FrczdPMFZCUTBVc01FSkJRVUU3UTFwNWQwSlFPMEZaY0hkQ1F6czdSVUZGUlN4VlFVRkJPMFZCUTBFc2IwTkJRVUU3VlVGQlFTdzBRa0ZCUVR0RFduTjNRa2c3UVZsNmQwSkRPenRGUVUxSkxITkNRVUZCTzBOYWRYZENURHRCV1c1M1FrTTdSVUZEUlN4VlFVRkJPME5hY1hkQ1NEdEJXVzUzUWtjN1JVRkRSU3hYUVVGQk8wTmFjWGRDVER0QldXcDNRa003UlVGRFJTeGhRVUZCTzBOYWJYZENTRHRCV1dwM1FrYzdSVUZEUlN4alFVRkJPME5hYlhkQ1REdEJXUzkyUWtNN08wVkJSVVVzYjBOQlFVRTdWVUZCUVN3MFFrRkJRVHRGUVVOQkxGbEJRVUU3UTFwcGQwSklPMEZaT1haQ1F6dEZRVU5GTEZOQlFVRTdSVUZEUVN4WlFVRkJPME5hWjNkQ1NEdEJXVGwyUWtjN1JVRkRSU3hoUVVGQk8wTmFaM2RDVER0QldUVjJRa003UlVGRFJTeFRRVUZCTzBWQlEwRXNWMEZCUVR0RFdqaDJRa2c3UVZrMWRrSkhPMFZCUTBVc1dVRkJRVHREV2poMlFrdzdRVmx5ZGtKTE96czdPMFZCUTBVc1kwRkJRVHREV2pCMlFsQWlMQ0ptYVd4bElqb2laWGhoYlhCc1pTNWpjM01pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdktpcGNiaUFxSUhOb1lXUnZkeTVzWlhOeklDMGc2WmkwNWIyeDVxQzM1YnlQNks2KzU3MnVJRzFwZUdsdWVDRGxoNzNtbGJCY2JpQXFJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMWNiaUFxSUVOeVpXRjBaV1FnUW5rNklGbGhiMmhoYVhocFlXOWNiaUFxSUZWd1pHRjBaVG9nTWpBeU1pNHpMakl3WEc0Z0tpOWNiaThxSUQwOVBUMDlQVDA5UFQwZ1kyOXNiM0p6TG5Sb1pXMWxJQzBnNVorNjU2R0E2YUtjNklteTVZK1k2WWVQNlp1RzVaQ0lJRDA5UFQwOVBUMDlQVDBnS2k5Y2JpOHFJRDA5UFQwOVBTRHBtTFRsdmJIbW9MZmx2SS9vcnI3bnZhN2xoNzNtbGJBZ1BUMDlQVDA5SUNvdlhHNHZLaUE5UFQwOVBTQlRZM0p2Ykd4aVlYSWdQVDA5UFQwZ0tpOWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWElnZTF4dUlDQjNhV1IwYURvZ04zQjRPMXh1SUNCb1pXbG5hSFE2SURkd2VEdGNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEc1OVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlMWFJ5WVdOckxYQnBaV05sSUh0Y2JpQWdMWGRsWW10cGRDMWliM0prWlhJdGNtRmthWFZ6T2lBMWNIZzdYRzU5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUm9kVzFpT25abGNuUnBZMkZzSUh0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2djbWRpWVNnd0xDQXdMQ0F3TENBd0xqSTFLVHRjYmlBZ0xYZGxZbXRwZEMxaWIzSmtaWEl0Y21Ga2FYVnpPaUExY0hnN1hHNTlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlPbWh2Y21sNmIyNTBZV3dnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1qVXBPMXh1SUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2JuMWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEk2YUc5MlpYSWdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TVRVcE8xeHVmVnh1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2kxMGFIVnRZanBvYjNabGNpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR6TlNrN1hHNTlYRzR1YzJWamRHbHZiaUI3WEc0Z0lHMWhjbWRwYmpvZ01XVnRJREE3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YzJWamRHbHZibDlmYUdWaFpHVnlMRnh1TG5ObFkzUnBiMjVmWDJOdmJuUmxiblFzWEc0dWMyVmpkR2x2Ymw5ZlptOXZkR1Z5SUh0Y2JpQWdiV0Z5WjJsdU9pQXdJRE5sYlR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1elpXTjBhVzl1WDE5MGFYUnNaU0I3WEc0Z0lHTnZiRzl5T2lBak5qWTJPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgyZ3pJSHRjYmlBZ1kyOXNiM0k2SUNNeFpqaGtaRFk3WEc0Z0lHWnZiblF0YzJsNlpUb2dNUzR6TldWdE8xeHVmVnh1TG5ObFkzUnBiMjVmWDJnMElIdGNiaUFnWm05dWRDMXphWHBsT2lBeExqRmxiVHRjYmlBZ1kyOXNiM0k2SUNNMk5qWTdYRzU5WEc0dWMyVmpkR2x2Ymw5ZmFEVWdlMXh1SUNCbWIyNTBMWE5wZW1VNklERmxiVHRjYmlBZ1kyOXNiM0k2SUNNNU9UazdYRzU5WEc0dWMyVmpkR2x2Ymw5ZlpHd3NYRzR1YzJWamRHbHZibDlmWkhRc1hHNHVjMlZqZEdsdmJsOWZaR1FnZTF4dUlDQnRZWEpuYVc0NklEQTdYRzRnSUhCaFpHUnBibWM2SURBN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWMyVmpkR2x2Ymw5ZlpHd2dlMXh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hHNGdJSG90YVc1a1pYZzZJREU3WEc1OVhHNHVjMlZqZEdsdmJsOWZaSFFnZTF4dUlDQmthWE53YkdGNU9pQnBibXhwYm1VdFlteHZZMnM3WEc1OVhHNHVjMlZqZEdsdmJsOWZaR1FnZTF4dUlDQmthWE53YkdGNU9pQnBibXhwYm1VdFlteHZZMnM3WEc0Z0lHTnZiRzl5T2lBak1EVTRPVFF5TzF4dWZWeHVMbk5sWTNScGIyNWZYM0J5WlNCN1hHNGdJRzFoY21kcGJqb2dNbVZ0SURBN1hHNGdJSEJoWkdScGJtYzZJREZsYlR0Y2JpQWdabTl1ZEMxemFYcGxPaUF4TkhCNE8xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ01UVXdKVHRjYmlBZ2RHVjRkQzFoYkdsbmJqb2diR1ZtZER0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlpoWm1GbVlUdGNiaUFnWW05eVpHVnlPaUF4Y0hnZ2MyOXNhV1FnSTJSa1pEdGNiaUFnWW05eVpHVnlMWEpoWkdsMWN6b2dOSEI0TzF4dUlDQmpiMnh2Y2pvZ0l6WTJOanRjYmlBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEc1OVhHNHVjMlZqZEdsdmJsOWZZMjlrWlNCN1hHNGdJR1JwYzNCc1lYazZJR0pzYjJOck8xeHVJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXpaV04wYVc5dVgxOW1iMjkwWlhJZ2UxeHVJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYmlBZ2JXRnlaMmx1TFhSdmNEb2dNMlZ0TzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabUZtWVdaaE8xeHVJQ0JqYjJ4dmNqb2dJems1T1R0Y2JuMWNiaTVqWVhObElIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCa2FYTndiR0Y1T2lCbmNtbGtPMXh1SUNCbmNtbGtMWFJsYlhCc1lYUmxMV052YkhWdGJuTTZJSEpsY0dWaGRDZ3lMQ0F4Wm5JcE8xeHVJQ0JuWVhBNklEUXdjSGc3WEc0Z0lIQmhaR1JwYm1jNklERmxiVHRjYmlBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNGdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1OaGMyVTZZV1owWlhJZ2UxeHVJQ0JqYjI1MFpXNTBPaUFuSnp0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEQTdYRzRnSUd4bFpuUTZJRFV3SlR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQjNhV1IwYURvZ01EdGNiaUFnWW05eVpHVnlMV3hsWm5RNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1OaGMyVmZYM0J5WlN4Y2JpNWpZWE5sWDE5MFpYaDBZWEpsWVNCN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklERTFNQ1U3WEc1OVhHNHVZMkZ6WlY5ZmNISmxMRnh1TG1OaGMyVmZYMk52WkdVc1hHNHVZMkZ6WlY5ZmRHVjRkR0Z5WldFZ2UxeHVJQ0JtYjI1MExXWmhiV2xzZVRvZ1hDSkRiM1Z5YVdWeUlFNWxkMXdpTENCRGIyNXpiMnhoY3l3Z1IyVnZjbWRwWVN3Z1FYSnBZV3dzSUhOaGJuTXRjMlZ5YVdZN1hHNTlYRzR1WTJGelpWOWZjSEpsSUh0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCd1lXUmthVzVuT2lBeFpXMDdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVlXWmhabUU3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nTkhCNE8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNibjFjYmk1allYTmxYMTkwYjI5c1ltRnlJSHRjYmlBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEc0Z0lHaGxhV2RvZERvZ016WndlRHRjYmlBZ2JHbHVaUzFvWldsbmFIUTZJRE0yY0hnN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRSd2VEdGNiaUFnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh1SUNCMFpYaDBMV0ZzYVdkdU9pQnlhV2RvZER0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1allYTmxYMTloWTNScGIyNHNYRzR1WTJGelpWOWZjbVZ0YjNabElIdGNiaUFnWTNWeWMyOXlPaUJ3YjJsdWRHVnlPMXh1SUNCamIyeHZjam9nSXpBMU9EazBNanRjYmlBZ2RYTmxjaTF6Wld4bFkzUTZJRzV2Ym1VN1hHNTlYRzR1WTJGelpWOWZZV04wYVc5dUlIdGNiaUFnWm05dWRDMXphWHBsT2lBeE0zQjRPMXh1SUNCd1lXUmthVzVuTFd4bFpuUTZJREV3Y0hnN1hHNTlYRzR1WTJGelpWOWZZV04wYVc5dU9tWnBjbk4wTFdOb2FXeGtJSHRjYmlBZ2NHRmtaR2x1Wnkxc1pXWjBPaUF3TzF4dWZWeHVMbU5oYzJWZlgzSmxiVzkyWlNCN1hHNGdJR1pzYjJGME9pQnlhV2RvZER0Y2JuMWNiaTVqWVhObFgxOWpiMjV6YjJ4bElIdGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUdobGFXZG9kRG9nTVRnd2NIZzdYRzRnSUdKdmNtUmxjam9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHVZMkZ6WlY5ZmRHVjRkR0Z5WldFZ2UxeHVJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNiaUFnZDJsa2RHZzZJREV3TUNVN1hHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2JpQWdZbTl5WkdWeU9pQnViMjVsTzF4dUlDQnZkWFJzYVc1bE9pQnViMjVsTzF4dUlDQndZV1JrYVc1bk9pQXhaVzA3WEc0Z0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEc0Z0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4dWZWeHVMbU5oYzJWZlgyeHBjM1FzWEc0dVkyRnpaVjlmYVhSbGJTQjdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdjR0ZrWkdsdVp6b2dNRHRjYmlBZ2JHbHpkQzF6ZEhsc1pTMTBlWEJsT2lCdWIyNWxPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbU5oYzJWZlgyeHBjM1FnZTF4dUlDQm9aV2xuYUhRNklETTJNSEI0TzF4dUlDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnSTJSa1pEdGNiaUFnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNiaUFnYjNabGNtWnNiM2M2SUdGMWRHODdYRzU5WEc0dVkyRnpaVjlmYVhSbGJTQjdYRzRnSUdobGFXZG9kRG9nTXpad2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklETTJjSGc3WEc0Z0lHTjFjbk52Y2pvZ2NHOXBiblJsY2p0Y2JpQWdjR0ZrWkdsdVp6b2dNQ0F4Tm5CNE8xeHVmVnh1TG1OaGMyVmZYMmwwWlcwNmFHOTJaWElnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpaamRtT0dZNU8xeHVmVnh1TG5CaGNHVnlJSHRjYmlBZ1ltOTRMWE5vWVdSdmR6b2dNQ0F3SURad2VDQXhjSGdnSTJSalpHWmxOanRjYmlBZ2JXRnlaMmx1T2lBeVpXMGdZWFYwYnp0Y2JpQWdiV0Y0TFhkcFpIUm9PaUF4TWpBd2NIZzdYRzRnSUhCaFpHUnBibWM2SURKbGJUdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJabVpqdGNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNibjFjYmk1d1lYQmxjaTVtYkdWNElIdGNiaUFnWkdsemNHeGhlVG9nWm14bGVEdGNiaUFnWm14bGVDMWthWEpsWTNScGIyNDZJSEp2ZHp0Y2JpQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHMWhlQzEzYVdSMGFEb2dNVEF3SlR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQndZV1JrYVc1bk9pQXdPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbkJoY0dWeUxtWnNaWGdnTG1GeWRHbGpiR1VnZTF4dUlDQm1iR1Y0TFdScGNtVmpkR2x2YmpvZ1kyOXNkVzF1TzF4dUlDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjYm4xY2JpNXdZWEJsY2k1bWJHVjRJQzVoY25ScFkyeGxYMTl0WVdsdUlIdGNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNibjFjYmk1d1lYQmxjaTVtYkdWNElDNWhjblJwWTJ4bFgxOWhjMmxrWlNCN1hHNGdJR0p2Y21SbGNpMXlhV2RvZERvZ01YQjRJSE52Ykdsa0lDTmtZMlJtWlRZN1hHNTlYRzR1YUdWaFpHVnlJSHRjYmlBZ2NHOXphWFJwYjI0NklITjBhV05yZVR0Y2JpQWdlaTFwYm1SbGVEb2dNenRjYmlBZ2RHOXdPaUF3TzF4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2JpQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNiaUFnZEhKaGJuTnBkR2x2Ymkxa2RYSmhkR2x2YmpvZ01DNHpjenRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTVvWldGa1pYSmZjM1JwWTJ0NUlIdGNiaUFnY0dGa1pHbHVaeTFzWldaME9pQXlOakJ3ZUR0Y2JuMWNiaTVoY25ScFkyeGxJSHRjYmlBZ1pHbHpjR3hoZVRvZ1pteGxlRHRjYmlBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUhKdmR6dGNiaUFnWm14bGVDMTNjbUZ3T2lCdWIzZHlZWEE3WEc0Z0lIQmhaR1JwYm1jNklESmxiU0F3TzF4dUlDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBeE5UQWxPMXh1ZlZ4dUxtRnlkR2xqYkdWZlgyMWhhVzRnZTF4dUlDQm1iR1Y0T2lBeE8xeHVJQ0J3WVdSa2FXNW5PaUF3SURKbGJUdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNWhjblJwWTJ4bFgxOXRZV2x1SUM1elpXTjBhVzl1SUh0Y2JpQWdiM1psY21ac2IzYzZJSFpwYzJsaWJHVTdYRzU5WEc0dVlYSjBhV05zWlY5ZmJXRnBiaUF1YzJWamRHbHZibDlmWTI5dWRHVnVkQ3hjYmk1aGNuUnBZMnhsWDE5dFlXbHVJQzV6WldOMGFXOXVYMTltYjI5MFpYSXNYRzR1WVhKMGFXTnNaVjlmYldGcGJpQXVjMlZqZEdsdmJsOWZhR1ZoWkdWeUlIdGNiaUFnYjNabGNtWnNiM2M2SUhacGMybGliR1U3WEc1OVhHNHVZWEowYVdOc1pWOWZiV0ZwYmlBdWMyVmpkR2x2Ymw5ZmFHVmhaR1Z5TEZ4dUxtRnlkR2xqYkdWZlgyMWhhVzRnTG5ObFkzUnBiMjVmWDJOdmJuUmxiblFnZTF4dUlDQnRZWEpuYVc0NklEQTdYRzU5WEc0dVlYSjBhV05zWlY5ZllYTnBaR1VnZTF4dUlDQm1iR1Y0TFhOb2NtbHVhem9nTUR0Y2JpQWdkMmxrZEdnNklESTBNSEI0TzF4dUlDQmliM0prWlhJdGJHVm1kRG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUhSeVlXNXphWFJwYjI0dFpIVnlZWFJwYjI0NklEQXVNM003WEc1OVhHNHVZWEowYVdOc1pWOWZZWE5wWkdVdWJIUnlJSHRjYmlBZ1ltOXlaR1Z5TFhKcFoyaDBPaUF4Y0hnZ2MyOXNhV1FnSTJSa1pEdGNiaUFnWW05eVpHVnlMV3hsWm5RNklHNXZibVU3WEc1OVhHNHVZWEowYVdOc1pWOWZZWE5wWkdVZ0xtOTFkR3hwYm1VdFkyaGhjSFJsY25NZ2UxeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abU8xeHVmVnh1Y0hKbExGeHVMbk5sWTNScGIyNWZYM0J5WlNCN1hHNGdJSEJoWkdScGJtYzZJREpsYlR0Y2JpQWdabTl1ZEMxbVlXMXBiSGs2SUZ3aVEyOTFjbWxsY2lCT1pYZGNJaXdnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1ZV1poWm1FN1hHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHVmVnh1WTI5a1pTeGNiaTV6WldOMGFXOXVYMTlqYjJSbElIdGNiaUFnWm05dWRDMW1ZVzFwYkhrNklGd2lRMjkxY21sbGNpQk9aWGRjSWl3Z1FYSnBZV3dzSUhOaGJuTXRjMlZ5YVdZN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRad2VEdGNibjFjYmk1bWIyOTBaWElnZTF4dUlDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYmlBZ2NHRmtaR2x1WnpvZ00yVnRJREE3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNibjFjYmk1bWIyOTBaWElnWVRwc2FXNXJMRnh1TG1admIzUmxjaUJoT25acGMybDBaV1FzWEc0dVptOXZkR1Z5SUdFNmFHOTJaWElnZTF4dUlDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklHNXZibVU3WEc0Z0lHTnZiRzl5T2lBak1EVTRPVFF5TzF4dWZWeHVMbVp2YjNSbGNpQmhPbWh2ZG1WeUlIdGNiaUFnZEdWNGRDMWtaV052Y21GMGFXOXVPaUIxYm1SbGNteHBibVU3WEc1OVhHNHVkWFJwYkhNdFltOXlaR1Z5TFhKcFoyaDBJSHRjYmlBZ1ltOXlaR1Z5TFhKcFoyaDBPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYm4xY2JpNW9hV1JrWlc0Z2UxeHVJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHVmVnh1THlvZ1BUMDlQVDA5UFQwOVBTQnBZMjl1TG5Sb1pXMWxJQzBnYzNabklPV2J2dWFnaCtlYWhPYWd0K1c4anlBOVBUMDlQVDA5UFQwOUlDb3ZYRzR1YjNWMGJHbHVaUzFwWTI5dUlIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczdYRzRnSUhabGNuUnBZMkZzTFdGc2FXZHVPaUJ0YVdSa2JHVTdYRzRnSUhkcFpIUm9PaUF4WlcwN1hHNGdJR2hsYVdkb2REb2dNV1Z0TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0YVdOdmJsOWZjM1puSUh0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2JHVm1kRG9nTlRBbE8xeHVJQ0IzYVdSMGFEb2dNV1Z0TzF4dUlDQm9aV2xuYUhRNklERmxiVHRjYmlBZ1ptbHNiRG9nWTNWeWNtVnVkR052Ykc5eU8xeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlNndE5UQWxMQ0F0TlRBbEtUdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JqcHliMjkwSUh0Y2JpQWdMUzF2ZFhSc2FXNWxMWHBKYm1SbGVEb2dNakF3TUR0Y2JpQWdMUzF2ZFhSc2FXNWxMWE4wYVdOcmVTMW9aV2xuYUhRNklERXdNQ1U3WEc0Z0lDMHRiM1YwYkdsdVpTMWphR0Z3ZEdWeWN5MTNhV1IwYURvZ01UQXdKVHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2lCN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2VpMXBibVJsZURvZ0xURTdYRzRnSUhSdmNEb2dNRHRjYmlBZ2JHVm1kRG9nTUR0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0IyYVhOcFltbHNhWFI1T2lCb2FXUmtaVzQ3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMjF2WkdGc0lIdGNiaUFnWW05NExYTm9ZV1J2ZHpvZ01DQXdJRFp3ZUNBeGNIZ2dJMlJqWkdabE5qdGNiaUFnWkdsemNHeGhlVG9nWm14bGVEdGNiaUFnWm14bGVDMWthWEpsWTNScGIyNDZJR052YkhWdGJqdGNiaUFnWm14bGVDMTNjbUZ3T2lCdWIzZHlZWEE3WEc0Z0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNiaUFnZWkxcGJtUmxlRG9nTWpFN1hHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdkSEpoYm5OcGRHbHZiaTFrZFhKaGRHbHZiam9nTUM0MGN6dGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmFHVmhaR1Z5TEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5dFlXbHVMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTltYjI5MFpYSWdlMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmYUdWaFpHVnlMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTltYjI5MFpYSWdlMXh1SUNCbWJHVjRMWE5vY21sdWF6b2dNRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmRHbDBiR1VzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDIxaGFXNHNYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMlp2YjNSbGNpQjdYRzRnSUhCaFpHUnBibWM2SURBZ01UWndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmFHVmhaR1Z5TEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5MGFYUnNaU0I3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JpQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hHNGdJR2hsYVdkb2REb2dOVEp3ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURVeWNIZzdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgzUnBkR3hsSUh0Y2JpQWdabTl1ZEMxemFYcGxPaUF4Tm5CNE8xeHVJQ0JtYjI1MExYZGxhV2RvZERvZ05EQXdPMXh1SUNCdFlYSm5hVzQ2SURBZ01UWndlRHRjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjYmlBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUNOa1kyUm1aVFk3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyTnNiM05sSUh0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2NtbG5hSFE2SURFeWNIZzdYRzRnSUhkcFpIUm9PaUF5TUhCNE8xeHVJQ0JvWldsbmFIUTZJREl3Y0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBeU1IQjRPMXh1SUNCamIyeHZjam9nSXprNU9UdGNiaUFnWm05dWRDMXphWHBsT2lBeU1IQjRPMXh1SUNCMFpYaDBMV0ZzYVdkdU9pQmpaVzUwWlhJN1hHNGdJR04xY25OdmNqb2djRzlwYm5SbGNqdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWktDMDFNQ1VwTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTlqYkc5elpTQXViM1YwYkdsdVpTMXBZMjl1SUh0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEQTdYRzRnSUd4bFpuUTZJREE3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyTnNiM05sT21odmRtVnlJSHRjYmlBZ1kyOXNiM0k2SUNNMk5qWTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDIxaGFXNGdlMXh1SUNCbWJHVjRPaUF4TzF4dUlDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZabTl2ZEdWeUlIdGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUhSbGVIUXRZV3hwWjI0NklISnBaMmgwTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTl2ZG1WeWJHRjVJSHRjYmlBZ1kyOXVkR1Z1ZERvZ0p5YzdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2RHOXdPaUF3TzF4dUlDQnNaV1owT2lBd08xeHVJQ0IzYVdSMGFEb2dNVEF3SlR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptTzF4dUlDQnZjR0ZqYVhSNU9pQXdMakU3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYM1JwYm5rc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUnBibmtnZTF4dUlDQjNhV1IwYURvZ01qZ3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMXBibWtzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDIxcGJta2dlMXh1SUNCM2FXUjBhRG9nTkRnd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNOdFlXeHNMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDl6YldGc2JDQjdYRzRnSUhkcFpIUm9PaUExTkRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3dWIzVjBiR2x1WlMxa2NtRjNaWEpmY21WbmRXeGhjaXhjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmY21WbmRXeGhjaUI3WEc0Z0lIZHBaSFJvT2lBMk9EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZmJXVmthWFZ0TEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5dFpXUnBkVzBnZTF4dUlDQjNhV1IwYURvZ056SXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeGhjbWRsTEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5c1lYSm5aU0I3WEc0Z0lIZHBaSFJvT2lBNU5qQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd2dlMXh1SUNCaWIzSmtaWEl0YkdWbWREb2dNWEI0SUhOdmJHbGtJQ05rWTJSbVpUWTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNScGJua3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdjbWxuYUhRNklDMHlPVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZiV2x1YVM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCeWFXZG9kRG9nTFRRNU1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDNXZkWFJzYVc1bExXUnlZWGRsY2w5emJXRnNiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0J5YVdkb2REb2dMVFUxTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDl5WldkMWJHRnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSEpwWjJoME9pQXROamt3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYMjFsWkdsMWJTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnlhV2RvZERvZ0xUY3pNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCeWFXZG9kRG9nTFRrM01IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpQjdYRzRnSUdKdmNtUmxjaTF5YVdkb2REb2dNWEI0SUhOdmJHbGtJQ05rWTJSbVpUWTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNScGJua3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdiR1ZtZERvZ0xUSTVNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRhVzVwTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUd4bFpuUTZJQzAwT1RCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYzIxaGJHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdiR1ZtZERvZ0xUVTFNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlaV2QxYkdGeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lHeGxablE2SUMwMk9UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXVmthWFZ0TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUd4bFpuUTZJQzAzTXpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYkdGeVoyVXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdiR1ZtZERvZ0xUazNNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaXhjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRZ2UxeHVJQ0JzWldaME9pQXdPMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJdWIzVjBiR2x1WlMxa2NtRjNaWEpmZEdsdWVTeGNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZkR2x1ZVNCN1hHNGdJR2hsYVdkb2REb2dNalF3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZkSFJpTG05MWRHeHBibVV0WkhKaGQyVnlYMjFwYm1rc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMXBibWtnZTF4dUlDQm9aV2xuYUhRNklETXlNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXpiV0ZzYkN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUXViM1YwYkdsdVpTMWtjbUYzWlhKZmMyMWhiR3dnZTF4dUlDQm9aV2xuYUhRNklETTJNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlaV2QxYkdGeUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlaV2QxYkdGeUlIdGNiaUFnYUdWcFoyaDBPaUEwTURCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYldWa2FYVnRMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl0WldScGRXMGdlMXh1SUNCb1pXbG5hSFE2SURRME1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpNXZkWFJzYVc1bExXUnlZWGRsY2w5c1lYSm5aU3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmYkdGeVoyVWdlMXh1SUNCb1pXbG5hSFE2SURRNE1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpQjdYRzRnSUdKdmNtUmxjaTFpYjNSMGIyMDZJREZ3ZUNCemIyeHBaQ0FqWkdOa1ptVTJPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGFXNTVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSFJ2Y0RvZ0xUSTFNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRhVzVwTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhSdmNEb2dMVE16TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl6YldGc2JDNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQjBiM0E2SUMwek56QndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmNtVm5kV3hoY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCMGIzQTZJQzAwTVRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYldWa2FYVnRMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSFJ2Y0RvZ0xUUTFNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCMGIzQTZJQzAwT1RCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRZ2UxeHVJQ0IwYjNBNklHbHVhWFJwWVd3N1hHNGdJR0p2Y21SbGNpMTBiM0E2SURGd2VDQnpiMnhwWkNBalpHTmtabVUyTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBhVzU1TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUdKdmRIUnZiVG9nTFRJMU1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5dGFXNXBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR0p2ZEhSdmJUb2dMVE16TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl6YldGc2JDNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQmliM1IwYjIwNklDMHpOekJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZjbVZuZFd4aGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQmliM1IwYjIwNklDMDBNVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiV1ZrYVhWdExtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lHSnZkSFJ2YlRvZ0xUUTFNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCaWIzUjBiMjA2SUMwME9UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1FnZTF4dUlDQjJhWE5wWW1sc2FYUjVPaUIyYVhOcFlteGxPMXh1SUNCNkxXbHVaR1Y0T2lCMllYSW9MUzF2ZFhSc2FXNWxMWHBKYm1SbGVDazdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjNCbGJtVmtMbTkxZEd4cGJtVXRaSEpoZDJWeUlIdGNiaUFnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDI5d1pXNWxaQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3dnZTF4dUlDQnlhV2RvZERvZ01EdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Y0dWdVpXUXViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlJSHRjYmlBZ2JHVm1kRG9nTUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXZjR1Z1WldRdWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUlIdGNiaUFnZEc5d09pQXdPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDI5d1pXNWxaQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFFnZTF4dUlDQmliM1IwYjIwNklEQTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjJabWMyVjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQ3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Wm1aelpYUXViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlJSHRjYmlBZ2FHVnBaMmgwT2lCallXeGpLREV3TUNVZ0xTQTBaVzBwTzF4dUlDQjBiM0E2SURVd0pUdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWktDMDFNQ1VwTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOW1abk5sZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIyWm1jMlYwTG05MWRHeHBibVV0WkhKaGQyVnlYMkowZENCN1hHNGdJSGRwWkhSb09pQmpZV3hqS0RFd01DVWdMU0EwWlcwcE8xeHVJQ0JzWldaME9pQTFNQ1U3WEc0Z0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXQ2d0TlRBbEtUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Wm1aelpYUXViM1YwYkdsdVpTMWtjbUYzWlhKZmIzQmxibVZrTG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkNCN1hHNGdJSEpwWjJoME9pQXlaVzA3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIyWm1jMlYwTG05MWRHeHBibVV0WkhKaGQyVnlYMjl3Wlc1bFpDNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISWdlMXh1SUNCc1pXWjBPaUF5WlcwN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiMlptYzJWMExtOTFkR3hwYm1VdFpISmhkMlZ5WDI5d1pXNWxaQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0lnZTF4dUlDQjBiM0E2SURKbGJUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Wm1aelpYUXViM1YwYkdsdVpTMWtjbUYzWlhKZmIzQmxibVZrTG05MWRHeHBibVV0WkhKaGQyVnlYMkowZENCN1hHNGdJR0p2ZEhSdmJUb2dNbVZ0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyRjFkRzh1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJGMWRHOHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlJSHRjYmlBZ2FHVnBaMmgwT2lCaGRYUnZPMXh1SUNCdFlYZ3RhR1ZwWjJoME9pQmpZV3hqS0RFd01DVWdMU0EwWlcwcE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMloxYkd3Z2UxeHVJQ0J3WVdSa2FXNW5PaUF3TzF4dWZWeHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVp5QjdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNpQjdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYRzU5WEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuWDE5aGJtTm9iM0k2YkdsdWF5eGNiaTV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNqcDJhWE5wZEdWa0xGeHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVoxOWZZVzVqYUc5eU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTTVPVGs3WEc0Z0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjYm4xY2JpNXZkWFJzYVc1bExXaGxZV1JwYm1kZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak1XWTRaR1EyTzF4dWZWeHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVp6cG9iM1psY2lBdWIzVjBiR2x1WlMxb1pXRmthVzVuWDE5aGJtTm9iM0lnZTF4dUlDQmthWE53YkdGNU9pQnBibXhwYm1VdFlteHZZMnM3WEc1OVhHNHViM1YwYkdsdVpTMW9aV0ZrYVc1blgzTjBZWEowT21odmRtVnlJSHRjYmlBZ2IzWmxjbVpzYjNjNklIWnBjMmxpYkdVN1hHNTlYRzR1YjNWMGJHbHVaUzFvWldGa2FXNW5YM04wWVhKMElDNXZkWFJzYVc1bExXaGxZV1JwYm1kZlgyRnVZMmh2Y2lCN1hHNGdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnZEc5d09pQTFNQ1U3WEc0Z0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXU2d0TlRBbEtUdGNiaUFnYkdWbWREb2dMVEZsYlR0Y2JuMWNiaThxS2x4dUlDb2daV3hzYVhCemFYTXViR1Z6Y3lBdElPYVdoK2Fjck9lY2dlZVZwU0J0YVhocGJuZ2c1WWU5NXBXd1hHNGdLaUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYRzRnS2lCVmNHUmhkR1U2SURJd01qSXVNeTR4TVZ4dUlDb3ZYRzR2S2lBOVBUMDlQVDBnNXBhSDVweXM1NXlCNTVXbDVZZTk1cFd3SUQwOVBUMDlQU0FxTDF4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25NZ2UxeHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEc0Z0lIb3RhVzVrWlhnNklERTdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdkMmxrZEdnNklIWmhjaWd0TFc5MWRHeHBibVV0WTJoaGNIUmxjbk10ZDJsa2RHZ3BPMXh1SUNCMGNtRnVjMmwwYVc5dUxXUjFjbUYwYVc5dU9pQXdMak56TzF4dUlDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2JuMWNiaTV2ZFhSc2FXNWxMV05vWVhCMFpYSnpYMTkwYVhSc1pTQjdYRzRnSUcxaGNtZHBiam9nTUNBeE5uQjRPMXh1SUNCb1pXbG5hSFE2SURRd2NIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQTBNSEI0TzF4dUlDQndZV1JrYVc1bk9pQXdJREUyY0hnN1hHNGdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQWpaR05rWm1VMk8xeHVJQ0JtYjI1MExYTnBlbVU2SURFMmNIZzdYRzRnSUdadmJuUXRkMlZwWjJoME9pQTBNREE3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFqYUdGd2RHVnljMTlmYldGcGJpQjdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25OZlgyeHBjM1FzWEc0dWIzVjBiR2x1WlMxamFHRndkR1Z5YzE5ZmMzVmlhbVZqZEN4Y2JpNXZkWFJzYVc1bExXTm9ZWEIwWlhKelgxOXBkR1Z0SUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lIQmhaR1JwYm1jNklEQTdYRzRnSUd4cGMzUXRjM1I1YkdVdGRIbHdaVG9nYm05dVpUdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXTm9ZWEIwWlhKelgxOXNhWE4wSUh0Y2JpQWdjR0ZrWkdsdVp6b2dNQzQxWlcwZ01EdGNibjFjYmk1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDE5emRXSnFaV04wSUh0Y2JpQWdjR0ZrWkdsdVp5MXNaV1owT2lBeFpXMDdYRzU5WEc0dWIzVjBiR2x1WlMxamFHRndkR1Z5YzE5ZmFYUmxiU0I3WEc0Z0lHMWhjbWRwYmpvZ01EdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklETXdjSGc3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDE5d2JHRmpaV2h2YkdSbGNpQjdYRzRnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2RHOXdPaUF3TzF4dUlDQnNaV1owT2lBd08xeHVJQ0IzYVdSMGFEb2dNVEF3SlR0Y2JpQWdhR1ZwWjJoME9pQXpNSEI0TzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpaamRtT0dZNU8xeHVJQ0JpYjNKa1pYSXRiR1ZtZERvZ01uQjRJSE52Ykdsa0lDTXdOVGc1TkRJN1hHNGdJSFJ5WVc1emFYUnBiMjR0WkhWeVlYUnBiMjQ2SURBdU1uTTdYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMWphR0Z3ZEdWeWMxOWZZVzVqYUc5eUlIdGNiaUFnZDJocGRHVXRjM0JoWTJVNklHNXZkM0poY0R0Y2JpQWdkR1Y0ZEMxdmRtVnlabXh2ZHpvZ1pXeHNhWEJ6YVhNN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzRnSUdScGMzQnNZWGs2SUdKc2IyTnJPMXh1SUNCd1lXUmthVzVuT2lBd0lERXVOV1Z0TzF4dWZWeHVMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZYMkZ1WTJodmNqcHNhVzVyTEZ4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25OZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrTEZ4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25OZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjYmlBZ1kyOXNiM0k2SUNNMU5UVTdYRzU5WEc0dWIzVjBiR2x1WlMxamFHRndkR1Z5YzE5ZllXNWphRzl5T21odmRtVnlJSHRjYmlBZ1kyOXNiM0k2SUNNd05UZzVOREk3WEc1OVhHNHViM1YwYkdsdVpTMWphR0Z3ZEdWeWMxOWZZMjlrWlNCN1hHNGdJSEJoWkdScGJtY3RjbWxuYUhRNklEQXVOV1Z0TzF4dWZWeHVMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZZV04wYVhabExtOTFkR3hwYm1VdFkyaGhjSFJsY25OZlgyRnVZMmh2Y2pwc2FXNXJMRnh1TG05MWRHeHBibVV0WTJoaGNIUmxjbk5mWVdOMGFYWmxMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZYMkZ1WTJodmNqcDJhWE5wZEdWa0xGeHVMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZZV04wYVhabExtOTFkR3hwYm1VdFkyaGhjSFJsY25OZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak1EVTRPVFF5TzF4dUlDQm1iMjUwTFhkbGFXZG9kRG9nTkRBd08xeHVmVnh1TG05MWRHeHBibVV0WTJoaGNIUmxjbk5mYzNScFkydDVMRnh1TG05MWRHeHBibVV0WTJoaGNIUmxjbk5mWm1sNFpXUWdlMXh1SUNCa2FYTndiR0Y1T2lCbWJHVjRPMXh1SUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2JpQWdabXhsZUMxa2FYSmxZM1JwYjI0NklHTnZiSFZ0Ymp0Y2JpQWdlaTFwYm1SbGVEb2dkbUZ5S0MwdGIzVjBiR2x1WlMxNlNXNWtaWGdwTzF4dUlDQjBiM0E2SURBN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxamFHRndkR1Z5YzE5emRHbGphM2tnTG05MWRHeHBibVV0WTJoaGNIUmxjbk5mWDNScGRHeGxMRnh1TG05MWRHeHBibVV0WTJoaGNIUmxjbk5mWm1sNFpXUWdMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZYM1JwZEd4bExGeHVMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZjM1JwWTJ0NUlDNXZkWFJzYVc1bExXTm9ZWEIwWlhKelgxOXRZV2x1TEZ4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25OZlptbDRaV1FnTG05MWRHeHBibVV0WTJoaGNIUmxjbk5mWDIxaGFXNGdlMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25OZmMzUnBZMnQ1SUM1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDE5MGFYUnNaU3hjYmk1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDJacGVHVmtJQzV2ZFhSc2FXNWxMV05vWVhCMFpYSnpYMTkwYVhSc1pTQjdYRzRnSUdac1pYZ3RjMmh5YVc1ck9pQXdPMXh1ZlZ4dUxtOTFkR3hwYm1VdFkyaGhjSFJsY25OZmMzUnBZMnQ1SUM1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDE5dFlXbHVMRnh1TG05MWRHeHBibVV0WTJoaGNIUmxjbk5mWm1sNFpXUWdMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTmZYMjFoYVc0Z2UxeHVJQ0JtYkdWNE9pQXhPMXh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjYm4xY2JpNXZkWFJzYVc1bExXTm9ZWEIwWlhKelgzTjBhV05yZVNCN1hHNGdJSEJ2YzJsMGFXOXVPaUJ6ZEdsamEzazdYRzRnSUcxaGVDMW9aV2xuYUhRNklIWmhjaWd0TFc5MWRHeHBibVV0YzNScFkydDVMV2hsYVdkb2RDazdYRzU5WEc0dWIzVjBiR2x1WlMxamFHRndkR1Z5YzE5bWFYaGxaQ0I3WEc0Z0lIQnZjMmwwYVc5dU9pQm1hWGhsWkR0Y2JpQWdiV0Y0TFdobGFXZG9kRG9nTVRBd0pUdGNibjFjYmk1dmRYUnNhVzVsTFdOb1lYQjBaWEp6WDJocFpHUmxiaUI3WEc0Z0lHUnBjM0JzWVhrNklHNXZibVU3WEc1OVhHNHViM1YwYkdsdVpTMWphR0Z3ZEdWeWMxOW1iMnhrWldRZ2UxeHVJQ0IzYVdSMGFEb2dNRHRjYm4xY2JpOHFJRDA5UFQwOVBUMDlQVDBnWW5WMGRHOXVjeTUwYUdWdFpTQXRJT2FNaWVtU3J1V3Z2T2lJcXVhZ3QrVzhqeUE5UFQwOVBUMDlQVDA5SUNvdlhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeUlIdGNiaUFnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh1SUNCNkxXbHVaR1Y0T2lBNU9UazVPVHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0IwY21GdWMybDBhVzl1TFdSMWNtRjBhVzl1T2lBd0xqTnpPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNiaUFnWW05NExYTm9ZV1J2ZHpvZ01DQXdJRFp3ZUNBeGNIZ2dJMlJqWkdabE5qdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCdFlYSm5hVzQ2SURFd2NIZzdYRzRnSUhkcFpIUm9PaUF6Tm5CNE8xeHVJQ0JvWldsbmFIUTZJRE0yY0hnN1hHNGdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJQ05rWTJSbVpUWTdYRzRnSUdKdmNtUmxjaTF5WVdScGRYTTZJRE53ZUR0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdZM1Z5YzI5eU9pQndiMmx1ZEdWeU8xeHVJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEc0Z0lHTnZiRzl5T2lBak5UVTFPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTXdOVGc1TkRJN1hHNGdJR0p2Y21SbGNpMWpiMnh2Y2pvZ0l6QTFPRGswTWp0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpNW9hV1JsSUh0Y2JpQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcHNhVzVyTEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T25acGMybDBaV1FzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXprNU9UdGNiaUFnZEdWNGRDMWtaV052Y21GMGFXOXVPaUJ1YjI1bE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ013TlRnNU5ESTdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5cFkyOXVJSHRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQjBiM0E2SURVd0pUdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQjNhV1IwYURvZ01qQndlRHRjYmlBZ2FHVnBaMmgwT2lBeU1IQjRPMXh1SUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpTZ3ROVEFsTENBdE5UQWxLVHRjYmlBZ1ptbHNiRG9nWTNWeWNtVnVkR052Ykc5eU8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5aFkzUnBkbVV1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh1SUNCamIyeHZjam9nSTJabVpqdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSXpBMU9EazBNanRjYmlBZ1ltOXlaR1Z5TFdOdmJHOXlPaUFqTURVNE9UUXlPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5aFkzUnBkbVV1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNDZhRzkyWlhJZ2UxeHVJQ0JqYjJ4dmNqb2dJMlptWmp0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZZV04wYVhabElDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwc2FXNXJMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDloWTNScGRtVWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9uWnBjMmwwWldRc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyRmpkR2wyWlNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSTJabVpqdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmY205MWJtUmxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdKdmNtUmxjaTF5WVdScGRYTTZJREU0Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9teHBibXNzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBzYVc1ckxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrTEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2ZG1semFYUmxaQ3hjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZhRzkyWlhJc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0lDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNHNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdOMWNuTnZjam9nYm05MExXRnNiRzkzWldRN1hHNGdJR052Ykc5eU9pQWpPVGs1TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwc2FXNXJPbWh2ZG1WeUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmJHbHVhenBvYjNabGNpeGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZaR2x6WVdKc1pXUXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmRtbHphWFJsWkRwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPblpwYzJsMFpXUTZhRzkyWlhJc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T21odmRtVnlPbWh2ZG1WeUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmFHOTJaWEk2YUc5MlpYSXNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dU9taHZkbVZ5TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aWRYUjBiMjQ2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXprNU9UdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNHNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObU5XWTFaalU3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzUjBZaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWW5SMElIdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmdvTFRVd0pTazdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDNSMFlpQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0c1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgySjBkQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh1SUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDNSMFlpQjdYRzRnSUhSdmNEb2dNVEp3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZkSFJpTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh1SUNCMGIzQTZJQzAxTm5CNE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlpZEhRZ2UxeHVJQ0JpYjNSMGIyMDZJREV5Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMkowZEM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjYmlBZ1ltOTBkRzl0T2lBdE5UWndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmNuUnNMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlzZEhJZ2UxeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZrb0xUVXdKU2s3WEc0Z0lIZHBaSFJvT2lBMU5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5eWRHd2dlMXh1SUNCMGIzQTZJRFV3SlR0Y2JpQWdjbWxuYUhRNklERXljSGc3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzSjBiQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZhR2xrWkdWdUlIdGNiaUFnY21sbmFIUTZJQzA0Tm5CNE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlzZEhJZ2UxeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2JHVm1kRG9nTVRKd2VEdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYkhSeUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRnZTF4dUlDQnNaV1owT2lBdE9EWndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmRIUmlJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5eWRHd2dMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJKMGRDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYkhSeUlDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2Ymk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpSXNJaThxSUQwOVBUMDlJRk5qY205c2JHSmhjaUE5UFQwOVBTQXFMMXh5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUlIdGNjbHh1SUNCM2FXUjBhRG9nTjNCNE8xeHlYRzRnSUdobGFXZG9kRG9nTjNCNE8xeHlYRzRnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4eVhHNTlYSEpjYmx4eVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlMWFJ5WVdOckxYQnBaV05sSUh0Y2NseHVJQ0F0ZDJWaWEybDBMV0p2Y21SbGNpMXlZV1JwZFhNNklEVndlRHRjY2x4dWZWeHlYRzVjY2x4dU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNpMTBhSFZ0WWpwMlpYSjBhV05oYkNCN1hISmNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nY21kaVlTZ3dMQ0F3TENBd0xDQXdMakkxS1R0Y2NseHVJQ0F0ZDJWaWEybDBMV0p2Y21SbGNpMXlZV1JwZFhNNklEVndlRHRjY2x4dWZWeHlYRzVjY2x4dU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNpMTBhSFZ0WWpwb2IzSnBlbTl1ZEdGc0lIdGNjbHh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TWpVcE8xeHlYRzRnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4eVhHNTlYSEpjYmx4eVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlPbWh2ZG1WeUlIdGNjbHh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TVRVcE8xeHlYRzU5WEhKY2JseHlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlPbWh2ZG1WeUlIdGNjbHh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TXpVcE8xeHlYRzU5WEhKY2JpSXNJa0JwYlhCdmNuUWdKMk52Ykc5eWN5YzdYSEpjYmx4eVhHNHVjMlZqZEdsdmJpQjdYSEpjYmlBZ2JXRnlaMmx1T2lBeFpXMGdNRHRjY2x4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzVjY2x4dUlDQW1YMTlvWldGa1pYSXNYSEpjYmlBZ0psOWZZMjl1ZEdWdWRDeGNjbHh1SUNBbVgxOW1iMjkwWlhJZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lETmxiVHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTkwYVhSc1pTQjdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FIUm9hWEprWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW9NeUI3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSEJ5YVcxaGNubGZZMjlzYjNJN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERXVNelZsYlR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyZzBJSHRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVM0eFpXMDdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FIUm9hWEprWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW9OU0I3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURGbGJUdGNjbHh1SUNBZ0lHTnZiRzl5T2lCQVptOTFjblJvWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWtiQ3hjY2x4dUlDQW1YMTlrZEN4Y2NseHVJQ0FtWDE5a1pDQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMlJzSUh0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWtkQ0I3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPbWx1YkdsdVpTMWliRzlqYXp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyUmtJSHRjY2x4dUlDQWdJR1JwYzNCc1lYazZhVzVzYVc1bExXSnNiMk5yTzF4eVhHNGdJQ0FnWTI5c2IzSTZJRUJ6ZFdOalpYTnpYMk52Ykc5eU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZjSEpsSUh0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTW1WdElEQTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXhaVzA3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURFMGNIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTVRVd0pUdGNjbHh1SUNBZ0lIUmxlSFF0WVd4cFoyNDZJR3hsWm5RN1hISmNiaUFnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQVltZGZZMjlzYjNJN1hISmNiaUFnSUNCaWIzSmtaWEk2SURGd2VDQnpiMnhwWkNCQVltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lDQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ05IQjRPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQjBhR2x5WkY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5amIyUmxJSHRjY2x4dUlDQWdJR1JwYzNCc1lYazZJR0pzYjJOck8xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWm05dmRHVnlJSHRjY2x4dUlDQWdJR0p2Y21SbGNpMTBiM0E2SURGd2VDQnpiMnhwWkNCQVltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lDQWdiV0Z5WjJsdUxYUnZjRG9nTTJWdE8xeHlYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FHSm5YMk52Ykc5eU8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCbWIzVnlkR2hmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aVFHbHRjRzl5ZENBbkxpOWpiMnh2Y25Nbk8xeHlYRzVjY2x4dUxtTmhjMlVnZTF4eVhHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjY2x4dUlDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lHUnBjM0JzWVhrNklHZHlhV1E3WEhKY2JpQWdaM0pwWkMxMFpXMXdiR0YwWlMxamIyeDFiVzV6T2lCeVpYQmxZWFFvTWl3Z01XWnlLVHRjY2x4dUlDQm5ZWEE2SURRd2NIZzdYSEpjYmlBZ2NHRmtaR2x1WnpvZ01XVnRPMXh5WEc0Z0lHSnZjbVJsY2kxMGIzQTZNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnWW05eVpHVnlMV0p2ZEhSdmJUb3hjSGdnYzI5c2FXUWdRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc1Y2NseHVJQ0FtT21GbWRHVnlJSHRjY2x4dUlDQWdJR052Ym5SbGJuUTZJQ2NuTzF4eVhHNGdJQ0FnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4eVhHNGdJQ0FnZWkxcGJtUmxlRG9nTWp0Y2NseHVJQ0FnSUhSdmNEb2dNRHRjY2x4dUlDQWdJR3hsWm5RNklEVXdKVHRjY2x4dUlDQWdJR2hsYVdkb2REb2dNVEF3SlR0Y2NseHVJQ0FnSUhkcFpIUm9PaUF3TzF4eVhHNGdJQ0FnWW05eVpHVnlMV3hsWm5RNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNCeVpTeGNjbHh1SUNBbVgxOTBaWGgwWVhKbFlTQjdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREV6Y0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNVFV3SlR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgzQnlaU3hjY2x4dUlDQW1YMTlqYjJSbExGeHlYRzRnSUNaZlgzUmxlSFJoY21WaElIdGNjbHh1SUNBZ0lHWnZiblF0Wm1GdGFXeDVPaUJjSWtOdmRYSnBaWElnVG1WM1hDSXNJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JCY21saGJDd2djMkZ1Y3kxelpYSnBaanRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNCeVpTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXhaVzA3WEhKY2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBWW1kZlkyOXNiM0k3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnSUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUEwY0hnN1hISmNiaUFnSUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOTBiMjlzWW1GeUlIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01DQmhkWFJ2TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF6Tm5CNE8xeHlYRzRnSUNBZ2JHbHVaUzFvWldsbmFIUTZJRE0yY0hnN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERTBjSGc3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF3SURFMmNIZzdYSEpjYmlBZ0lDQjBaWGgwTFdGc2FXZHVPaUJ5YVdkb2REdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWhZM1JwYjI0c1hISmNiaUFnSmw5ZmNtVnRiM1psSUh0Y2NseHVJQ0FnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjY2x4dUlDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUhWelpYSXRjMlZzWldOME9pQnViMjVsTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZllXTjBhVzl1SUh0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01UTndlRHRjY2x4dUlDQWdJSEJoWkdScGJtY3RiR1ZtZERvZ01UQndlRHRjY2x4dVhISmNiaUFnSUNBbU9tWnBjbk4wTFdOb2FXeGtJSHRjY2x4dUlDQWdJQ0FnY0dGa1pHbHVaeTFzWldaME9pQXdPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmY21WdGIzWmxJSHRjY2x4dUlDQWdJR1pzYjJGME9pQnlhV2RvZER0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyTnZibk52YkdVZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREU0TUhCNE8xeHlYRzRnSUNBZ1ltOXlaR1Z5T2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTkwWlhoMFlYSmxZU0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lIZHBaSFJvT2lBeE1EQWxPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXhNREFsTzF4eVhHNGdJQ0FnWW05eVpHVnlPaUJ1YjI1bE8xeHlYRzRnSUNBZ2IzVjBiR2x1WlRvZ2JtOXVaVHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREZsYlR0Y2NseHVJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyeHBjM1FzWEhKY2JpQWdKbDlmYVhSbGJTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdPMXh5WEc0Z0lDQWdiR2x6ZEMxemRIbHNaUzEwZVhCbE9pQnViMjVsTzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJ4cGMzUWdlMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXpOakJ3ZUR0Y2NseHVJQ0FnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERXpjSGc3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmwwWlcwZ2UxeHlYRzRnSUNBZ2FHVnBaMmgwT2lBek5uQjRPMXh5WEc0Z0lDQWdiR2x1WlMxb1pXbG5hSFE2SURNMmNIZzdYSEpjYmlBZ0lDQmpkWEp6YjNJNklIQnZhVzUwWlhJN1hISmNiaUFnSUNCd1lXUmthVzVuT2lBd0lERTJjSGc3WEhKY2JseHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQm9iM1psY2w5aVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aUxuQmhjR1Z5SUh0Y2NseHVJQ0F1YzJoaFpHOTNYMnhwWjJoMFgzSmxaM1ZzWVhJb0tUdGNjbHh1SUNCdFlYSm5hVzQ2SURKbGJTQmhkWFJ2TzF4eVhHNGdJRzFoZUMxM2FXUjBhRG9nTVRJd01IQjRPMXh5WEc0Z0lIQmhaR1JwYm1jNklESmxiVHRjY2x4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFkMmhwZEdVN1hISmNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNjbHh1WEhKY2JpQWdKaTVtYkdWNElIdGNjbHh1SUNBZ0lHUnBjM0JzWVhrNklHWnNaWGc3WEhKY2JpQWdJQ0JtYkdWNExXUnBjbVZqZEdsdmJqb2djbTkzTzF4eVhHNGdJQ0FnWm14bGVDMTNjbUZ3T2lCdWIzZHlZWEE3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0FnSUcxaGVDMTNhV1IwYURvZ01UQXdKVHRjY2x4dUlDQWdJR2hsYVdkb2REb2dNVEF3SlR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBZ0lDNWhjblJwWTJ4bElIdGNjbHh1SUNBZ0lDQWdabXhsZUMxa2FYSmxZM1JwYjI0NklHTnZiSFZ0Ymp0Y2NseHVJQ0FnSUNBZ2QybGtkR2c2SURFd01DVTdYSEpjYmlBZ0lDQWdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hISmNibHh5WEc0Z0lDQWdJQ0FtWDE5dFlXbHVJSHRjY2x4dUlDQWdJQ0FnSUNCb1pXbG5hSFE2SURFd01DVTdYSEpjYmlBZ0lDQWdJQ0FnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNjbHh1SUNBZ0lDQWdJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOWZZWE5wWkdVZ2UxeHlYRzRnSUNBZ0lDQWdJR0p2Y21SbGNpMXlhV2RvZERvZ01YQjRJSE52Ykdsa0lFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dWZWeHlYRzVjY2x4dUxtaGxZV1JsY2lCN1hISmNiaUFnY0c5emFYUnBiMjQ2SUhOMGFXTnJlVHRjY2x4dUlDQjZMV2x1WkdWNE9pQXpPMXh5WEc0Z0lIUnZjRG9nTUR0Y2NseHVJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh5WEc0Z0lIUnlZVzV6YVhScGIyNHRaSFZ5WVhScGIyNDZJREF1TTNNN1hISmNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dVhISmNiaUFnSmw5emRHbGphM2tnZTF4eVhHNGdJQ0FnY0dGa1pHbHVaeTFzWldaME9pQXlOakJ3ZUR0Y2NseHVJQ0I5WEhKY2JuMWNjbHh1WEhKY2JpNWhjblJwWTJ4bElIdGNjbHh1SUNCa2FYTndiR0Y1T2lCbWJHVjRPMXh5WEc0Z0lHWnNaWGd0WkdseVpXTjBhVzl1T2lCeWIzYzdYSEpjYmlBZ1pteGxlQzEzY21Gd09pQnViM2R5WVhBN1hISmNiaUFnY0dGa1pHbHVaem9nTW1WdElEQTdYSEpjYmlBZ1ptOXVkQzF6YVhwbE9pQXhObkI0TzF4eVhHNGdJR3hwYm1VdGFHVnBaMmgwT2lBeE5UQWxPMXh5WEc1Y2NseHVJQ0FtWDE5dFlXbHVJSHRjY2x4dUlDQWdJR1pzWlhnNklERTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdJREpsYlR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNBZ0xuTmxZM1JwYjI0Z2UxeHlYRzRnSUNBZ0lDQnZkbVZ5Wm14dmR6b2dkbWx6YVdKc1pUdGNjbHh1WEhKY2JpQWdJQ0FnSUNaZlgyTnZiblJsYm5Rc1hISmNiaUFnSUNBZ0lDWmZYMlp2YjNSbGNpeGNjbHh1SUNBZ0lDQWdKbDlmYUdWaFpHVnlJSHRjY2x4dUlDQWdJQ0FnSUNCdmRtVnlabXh2ZHpvZ2RtbHphV0pzWlR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5ZmFHVmhaR1Z5TEZ4eVhHNGdJQ0FnSUNBbVgxOWpiMjUwWlc1MElIdGNjbHh1SUNBZ0lDQWdJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyRnphV1JsSUh0Y2NseHVJQ0FnSUdac1pYZ3RjMmh5YVc1ck9pQXdPMXh5WEc0Z0lDQWdkMmxrZEdnNklESTBNSEI0TzF4eVhHNGdJQ0FnWW05eVpHVnlMV3hsWm5RNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnZEhKaGJuTnBkR2x2Ymkxa2RYSmhkR2x2YmpvZ01DNHpjenRjY2x4dVhISmNiaUFnSUNBbUxteDBjaUI3WEhKY2JpQWdJQ0FnSUdKdmNtUmxjaTF5YVdkb2REb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNBZ0lHSnZjbVJsY2kxc1pXWjBPaUJ1YjI1bE8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMV05vWVhCMFpYSnpJSHRjY2x4dUlDQWdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhkb2FYUmxPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNWNjbHh1Y0hKbExGeHlYRzR1YzJWamRHbHZibDlmY0hKbElIdGNjbHh1SUNCd1lXUmthVzVuT2lBeVpXMDdYSEpjYmlBZ1ptOXVkQzFtWVcxcGJIazZJRndpUTI5MWNtbGxjaUJPWlhkY0lpd2dRWEpwWVd3c0lITmhibk10YzJWeWFXWTdYSEpjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FHSm5YMk52Ykc5eU8xeHlYRzRnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh5WEc1OVhISmNibHh5WEc1amIyUmxMRnh5WEc0dWMyVmpkR2x2Ymw5ZlkyOWtaU0I3WEhKY2JpQWdabTl1ZEMxbVlXMXBiSGs2SUZ3aVEyOTFjbWxsY2lCT1pYZGNJaXdnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEhKY2JpQWdabTl1ZEMxemFYcGxPaUF4Tm5CNE8xeHlYRzU5WEhKY2JseHlYRzR1Wm05dmRHVnlJSHRjY2x4dUlDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUhCaFpHUnBibWM2SURObGJTQXdPMXh5WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNjbHh1WEhKY2JpQWdZU0I3WEhKY2JpQWdJQ0FtT214cGJtc3NYSEpjYmlBZ0lDQW1PblpwYzJsMFpXUXNYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQnViMjVsTzF4eVhHNGdJQ0FnSUNCamIyeHZjam9nUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0FnSUhSbGVIUXRaR1ZqYjNKaGRHbHZiam9nZFc1a1pYSnNhVzVsTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dWZWeHlYRzVjY2x4dUxuVjBhV3h6TFdKdmNtUmxjaTF5YVdkb2RDQjdYSEpjYmlBZ1ltOXlaR1Z5TFhKcFoyaDBPaUF4Y0hnZ2MyOXNhV1FnUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eU8xeHlYRzU5WEhKY2JseHlYRzR1YUdsa1pHVnVJSHRjY2x4dUlDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNTlYSEpjYmlJc0lpOHFLbHh5WEc0Z0tpQnphR0ZrYjNjdWJHVnpjeUF0SU9tWXRPVzlzZWFndCtXOGoraXV2dWU5cmlCdGFYaHBibmdnNVllOTVwV3dYSEpjYmlBcUlEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2NseHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHlYRzRnS2lCVmNHUmhkR1U2SURJd01qSXVNeTR5TUZ4eVhHNGdLaTljY2x4dVFHbHRjRzl5ZENBbkxpOWpiMnh2Y25Nbk8xeHlYRzVjY2x4dUx5b2dQVDA5UFQwOUlPbVl0T1c5c2VhZ3QrVzhqK2l1dnVlOXJ1V0h2ZWFWc0NBOVBUMDlQVDBnS2k5Y2NseHVMbk5vWVdSdmR5aEFiMlptYzJWME9pQXdJREFnTm5CNElERndlQ3dnUUdOdmJHOXlPaUJBY0hKcGJXRnllVjlpYjNKa1pYSmZZMjlzYjNJcElIdGNjbHh1SUNCaWIzZ3RjMmhoWkc5M09pQkFiMlptYzJWMElFQmpiMnh2Y2p0Y2NseHVmVnh5WEc1Y2NseHVMbk5vWVdSdmQxOXlaV2QxYkdGeUtFQmpiMnh2Y2pvZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlLU0I3WEhKY2JpQWdMbk5vWVdSdmR5Z3dJREFnTm5CNElERndlQ3dnUUdOdmJHOXlLVHRjY2x4dWZWeHlYRzVjY2x4dUxuTm9ZV1J2ZDE5c1lYSm5aU2hBWTI5c2IzSTZJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2lrZ2UxeHlYRzRnSUM1emFHRmtiM2NvTUNBd0lERXljSGdnTVhCNExDQkFZMjlzYjNJcE8xeHlYRzU5WEhKY2JseHlYRzR1YzJoaFpHOTNYMnhwWjJoMFgzSmxaM1ZzWVhJb0tTQjdYSEpjYmlBZ0xuTm9ZV1J2ZDE5eVpXZDFiR0Z5S0NrN1hISmNibjFjY2x4dVhISmNiaTV6YUdGa2IzZGZiR2xuYUhSZmJHRnlaMlVvS1NCN1hISmNiaUFnTG5Ob1lXUnZkMTlzWVhKblpTZ3BPMXh5WEc1OVhISmNibHh5WEc0dWMyaGhaRzkzWDJSaGNtdGZjbVZuZFd4aGNpZ3BJSHRjY2x4dUlDQXVjMmhoWkc5M1gzSmxaM1ZzWVhJb1FITmxZMjl1WkdGeWVWOWliM0prWlhKZlkyOXNiM0lwTzF4eVhHNTlYSEpjYmx4eVhHNHVjMmhoWkc5M1gyUmhjbXRmYkdGeVoyVW9LU0I3WEhKY2JpQWdMbk5vWVdSdmQxOXNZWEpuWlNoQWMyVmpiMjVrWVhKNVgySnZjbVJsY2w5amIyeHZjaWs3WEhKY2JuMWNjbHh1SWl3aUx5b2dQVDA5UFQwOVBUMDlQU0JwWTI5dUxuUm9aVzFsSUMwZ2MzWm5JT1didnVhZ2grZWFoT2FndCtXOGp5QTlQVDA5UFQwOVBUMDlJQ292WEhKY2JpNXZkWFJzYVc1bExXbGpiMjRnZTF4eVhHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjY2x4dUlDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lHUnBjM0JzWVhrNklHbHViR2x1WlMxaWJHOWphenRjY2x4dUlDQjJaWEowYVdOaGJDMWhiR2xuYmpvZ2JXbGtaR3hsTzF4eVhHNGdJSGRwWkhSb09pQXhaVzA3WEhKY2JpQWdhR1ZwWjJoME9pQXhaVzA3WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdKbDlmYzNabklIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQjBiM0E2SURVd0pUdGNjbHh1SUNBZ0lHeGxablE2SURVd0pUdGNjbHh1SUNBZ0lIZHBaSFJvT2lBeFpXMDdYSEpjYmlBZ0lDQm9aV2xuYUhRNklERmxiVHRjY2x4dUlDQWdJR1pwYkd3NklHTjFjbkpsYm5SamIyeHZjanRjY2x4dUlDQWdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsS0MwMU1DVXNJQzAxTUNVcE8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aU9uSnZiM1FnZTF4eVhHNGdJQzB0YjNWMGJHbHVaUzE2U1c1a1pYZzZJREl3TURBN1hISmNiaUFnTFMxdmRYUnNhVzVsTFhOMGFXTnJlUzFvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnTFMxdmRYUnNhVzVsTFdOb1lYQjBaWEp6TFhkcFpIUm9PaUF4TURBbE8xeHlYRzU5WEhKY2JpSXNJa0JwYlhCdmNuUWdKeTR2ZG1GeWFXRmliR1Z6Snp0Y2NseHVRR2x0Y0c5eWRDQW5MaTlqYjJ4dmNuTW5PMXh5WEc1QWFXMXdiM0owSUNjdUwzTm9ZV1J2ZHljN1hISmNibHh5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWElnZTF4eVhHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjY2x4dUlDQjZMV2x1WkdWNE9pQXRNVHRjY2x4dUlDQjBiM0E2SURBN1hISmNiaUFnYkdWbWREb2dNRHRjY2x4dUlDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ2QybGtkR2c2SURFd01DVTdYSEpjYmlBZ2FHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEhKY2JpQWdkbWx6YVdKcGJHbDBlVG9nYUdsa1pHVnVPMXh5WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDWmZYMjF2WkdGc0lIdGNjbHh1SUNBZ0lDNXphR0ZrYjNkZmJHbG5hSFJmY21WbmRXeGhjaWdwTzF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nWm14bGVEdGNjbHh1SUNBZ0lHWnNaWGd0WkdseVpXTjBhVzl1T2lCamIyeDFiVzQ3WEhKY2JpQWdJQ0JtYkdWNExYZHlZWEE2SUc1dmQzSmhjRHRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjY2x4dUlDQWdJSG90YVc1a1pYZzZJREl4TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJQ0FnZEhKaGJuTnBkR2x2Ymkxa2RYSmhkR2x2YmpvZ01DNDBjenRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlvWldGa1pYSXNYSEpjYmlBZ0psOWZiV0ZwYml4Y2NseHVJQ0FtWDE5bWIyOTBaWElnZTF4eVhHNGdJQ0FnZDJsa2RHZzZJREV3TUNVN1hISmNiaUFnSUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYUdWaFpHVnlMRnh5WEc0Z0lDWmZYMlp2YjNSbGNpQjdYSEpjYmlBZ0lDQm1iR1Y0TFhOb2NtbHVhem9nTUR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgzUnBkR3hsTEZ4eVhHNGdJQ1pmWDIxaGFXNHNYSEpjYmlBZ0psOWZabTl2ZEdWeUlIdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyaGxZV1JsY2l4Y2NseHVJQ0FtWDE5MGFYUnNaU0I3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF4TzF4eVhHNGdJQ0FnYldGeVoybHVPaUF3SUdGMWRHODdYSEpjYmlBZ0lDQm9aV2xuYUhRNklEVXljSGc3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ05USndlRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTkwYVhSc1pTQjdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hISmNiaUFnSUNCbWIyNTBMWGRsYVdkb2REb2dOREF3TzF4eVhHNGdJQ0FnYldGeVoybHVPaUF3SURFMmNIZzdYSEpjYmlBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJQ0FnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyTnNiM05sSUh0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SURJN1hISmNiaUFnSUNCMGIzQTZJRFV3SlR0Y2NseHVJQ0FnSUhKcFoyaDBPaUF4TW5CNE8xeHlYRzRnSUNBZ2QybGtkR2c2SURJd2NIZzdYSEpjYmlBZ0lDQm9aV2xuYUhRNklESXdjSGc3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ01qQndlRHRjY2x4dUlDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREl3Y0hnN1hISmNiaUFnSUNCMFpYaDBMV0ZzYVdkdU9pQmpaVzUwWlhJN1hISmNiaUFnSUNCamRYSnpiM0k2SUhCdmFXNTBaWEk3WEhKY2JpQWdJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZrb0xUVXdKU2s3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc1Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFdsamIyNGdlMXh5WEc0Z0lDQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0FnSUhvdGFXNWtaWGc2SURJN1hISmNiaUFnSUNBZ0lIUnZjRG9nTUR0Y2NseHVJQ0FnSUNBZ2JHVm1kRG9nTUR0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZMjlzYjNJNklFQjBhR2x5WkY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZiV0ZwYmlCN1hISmNiaUFnSUNCbWJHVjRPaUF4TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdGMWRHODdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTltYjI5MFpYSWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hISmNiaUFnSUNCMFpYaDBMV0ZzYVdkdU9pQnlhV2RvZER0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5dmRtVnliR0Y1SUh0Y2NseHVJQ0FnSUdOdmJuUmxiblE2SUNjbk8xeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNBZ0lIUnZjRG9nTUR0Y2NseHVJQ0FnSUd4bFpuUTZJREE3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUc5d1lXTnBkSGs2SURBdU1UdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzSjBiQ3hjY2x4dUlDQW1YMngwY2lCN1hISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOTBhVzU1SUh0Y2NseHVJQ0FnSUNBZ0lDQjNhV1IwYURvZ01qZ3djSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldsdWFTQjdYSEpjYmlBZ0lDQWdJQ0FnZDJsa2RHZzZJRFE0TUhCNE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgzTnRZV3hzSUh0Y2NseHVJQ0FnSUNBZ0lDQjNhV1IwYURvZ05UUXdjSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmY21WbmRXeGhjaUI3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURZNE1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFsWkdsMWJTQjdYSEpjYmlBZ0lDQWdJQ0FnZDJsa2RHZzZJRGN5TUhCNE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyeGhjbWRsSUh0Y2NseHVJQ0FnSUNBZ0lDQjNhV1IwYURvZ09UWXdjSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmNuUnNJSHRjY2x4dUlDQWdJR0p2Y21SbGNpMXNaV1owT2lBeGNIZ2djMjlzYVdRZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlPMXh5WEc1Y2NseHVJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWElnZTF4eVhHNGdJQ0FnSUNBbVgzUnBibmtnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSEpwWjJoME9pQXRNamt3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFwYm1rZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhKcFoyaDBPaUF0TkRrd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNOdFlXeHNJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnlhV2RvZERvZ0xUVTFNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXlaV2QxYkdGeUlIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCeWFXZG9kRG9nTFRZNU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dFpXUnBkVzBnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSEpwWjJoME9pQXROek13Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMnhoY21kbElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCeWFXZG9kRG9nTFRrM01IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXNkSElnZTF4eVhHNGdJQ0FnWW05eVpHVnlMWEpwWjJoME9pQXhjSGdnYzI5c2FXUWdRSEJ5YVcxaGNubGZZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQW1YM1JwYm5rZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUd4bFpuUTZJQzB5T1RCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldsdWFTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2JHVm1kRG9nTFRRNU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5emJXRnNiQ0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdiR1ZtZERvZ0xUVTFNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXlaV2QxYkdGeUlIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCc1pXWjBPaUF0Tmprd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDIxbFpHbDFiU0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdiR1ZtZERvZ0xUY3pNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXNZWEpuWlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnYkdWbWREb2dMVGszTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5MGRHSXNYSEpjYmlBZ0psOWlkSFFnZTF4eVhHNGdJQ0FnYkdWbWREb2dNRHRjY2x4dUlDQWdJSGRwWkhSb09pQXhNREFsTzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQW1YM1JwYm5rZ2UxeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dNalF3Y0hnN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJXbHVhU0I3WEhKY2JpQWdJQ0FnSUNBZ2FHVnBaMmgwT2lBek1qQndlRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl6YldGc2JDQjdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUF6TmpCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXlaV2QxYkdGeUlIdGNjbHh1SUNBZ0lDQWdJQ0JvWldsbmFIUTZJRFF3TUhCNE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyMWxaR2wxYlNCN1hISmNiaUFnSUNBZ0lDQWdhR1ZwWjJoME9pQTBOREJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5c1lYSm5aU0I3WEhKY2JpQWdJQ0FnSUNBZ2FHVnBaMmgwT2lBME9EQndlRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5MGRHSWdlMXh5WEc0Z0lDQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjanRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOTBhVzU1SUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0IwYjNBNklDMHlOVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiV2x1YVNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXRNek13Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM050WVd4c0lIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCMGIzQTZJQzB6TnpCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmY21WbmRXeGhjaUI3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdkRzl3T2lBdE5ERXdjSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyMWxaR2wxYlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXRORFV3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMnhoY21kbElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCMGIzQTZJQzAwT1RCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlluUjBJSHRjY2x4dUlDQWdJSFJ2Y0RvZ2FXNXBkR2xoYkR0Y2NseHVJQ0FnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2lCN1hISmNiaUFnSUNBZ0lDWmZkR2x1ZVNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWW05MGRHOXRPaUF0TWpVd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDIxcGJta2dlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHSnZkSFJ2YlRvZ0xUTXpNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXpiV0ZzYkNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWW05MGRHOXRPaUF0TXpjd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNKbFozVnNZWElnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVFF4TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl0WldScGRXMGdlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHSnZkSFJ2YlRvZ0xUUTFNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXNZWEpuWlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWW05MGRHOXRPaUF0TkRrd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyOXdaVzVsWkNCN1hISmNiaUFnSUNCMmFYTnBZbWxzYVhSNU9pQjJhWE5wWW14bE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ2RtRnlLQzB0YjNWMGJHbHVaUzE2U1c1a1pYZ3BPMXh5WEc1Y2NseHVJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWElnZTF4eVhHNGdJQ0FnSUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEhKY2JseHlYRzRnSUNBZ0lDQW1YM0owYkNCN1hISmNiaUFnSUNBZ0lDQWdjbWxuYUhRNklEQTdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiSFJ5SUh0Y2NseHVJQ0FnSUNBZ0lDQnNaV1owT2lBd08xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgzUjBZaUI3WEhKY2JpQWdJQ0FnSUNBZ2RHOXdPaUF3TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDJKMGRDQjdYSEpjYmlBZ0lDQWdJQ0FnWW05MGRHOXRPaUF3TzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyOW1abk5sZENCN1hISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOXlkR3dzWEhKY2JpQWdJQ0FnSUNaZmJIUnlJSHRjY2x4dUlDQWdJQ0FnSUNCb1pXbG5hSFE2SUdOaGJHTW9NVEF3SlNBdElEUmxiU2s3WEhKY2JpQWdJQ0FnSUNBZ2RHOXdPaUExTUNVN1hISmNiaUFnSUNBZ0lDQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZaS0MwMU1DVXBPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM1IwWWl4Y2NseHVJQ0FnSUNBZ0psOWlkSFFnZTF4eVhHNGdJQ0FnSUNBZ0lIZHBaSFJvT2lCallXeGpLREV3TUNVZ0xTQTBaVzBwTzF4eVhHNGdJQ0FnSUNBZ0lHeGxablE2SURVd0pUdGNjbHh1SUNBZ0lDQWdJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZnb0xUVXdKU2s3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYjNCbGJtVmtJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ1pmY25Sc0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtbG5hSFE2SURKbGJUdGNjbHh1SUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBbVgyeDBjaUI3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR3hsWm5RNklESmxiVHRjY2x4dUlDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQW1YM1IwWWlCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSdmNEb2dNbVZ0TzF4eVhHNGdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ1pmWW5SMElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1ltOTBkRzl0T2lBeVpXMDdYSEpjYmlBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJGMWRHOGdlMXh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNpQjdYSEpjYmlBZ0lDQWdJQ1pmY25Sc0xGeHlYRzRnSUNBZ0lDQW1YMngwY2lCN1hISmNiaUFnSUNBZ0lDQWdhR1ZwWjJoME9pQmhkWFJ2TzF4eVhHNGdJQ0FnSUNBZ0lHMWhlQzFvWldsbmFIUTZJR05oYkdNb01UQXdKU0F0SURSbGJTazdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWm5Wc2JDQjdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0pBYVcxd2IzSjBJQ2N1TDJOdmJHOXljeWM3WEhKY2JseHlYRzR1YjNWMGJHbHVaUzFvWldGa2FXNW5JSHRjY2x4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYSEpjYmlBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBbVgxOWhibU5vYjNJZ2UxeHlYRzRnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjY2x4dVhISmNiaUFnSUNBbU9teHBibXNzWEhKY2JpQWdJQ0FtT25acGMybDBaV1FzWEhKY2JpQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnWTI5c2IzSTZJRUJtYjNWeWRHaGZkR1Y0ZEY5amIyeHZjanRjY2x4dUlDQWdJQ0FnZEdWNGRDMWtaV052Y21GMGFXOXVPaUJ1YjI1bE8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0JqYjJ4dmNqb2dRSEJ5YVcxaGNubGZZMjlzYjNJN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFdobFlXUnBibWRmWDJGdVkyaHZjaUI3WEhKY2JpQWdJQ0FnSUdScGMzQnNZWGs2SUdsdWJHbHVaUzFpYkc5amF6dGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZjM1JoY25RZ2UxeHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lHOTJaWEptYkc5M09pQjJhWE5wWW14bE8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNpQjdYSEpjYmlBZ0lDQWdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjY2x4dUlDQWdJQ0FnZWkxcGJtUmxlRG9nTWp0Y2NseHVJQ0FnSUNBZ2RHOXdPaUExTUNVN1hISmNiaUFnSUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXU2d0TlRBbEtUdGNjbHh1SUNBZ0lDQWdiR1ZtZERvZ0xURmxiVHRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYm4xY2NseHVJaXdpUUdsdGNHOXlkQ0FuTGk5MllYSnBZV0pzWlhNbk8xeHlYRzVBYVcxd2IzSjBJQ2N1TDJOdmJHOXljeWM3WEhKY2JrQnBiWEJ2Y25RZ0p5NHZaV3hzYVhCemFYTW5PMXh5WEc1Y2NseHVMbTkxZEd4cGJtVXRZMmhoY0hSbGNuTWdlMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0IzYVdSMGFEb2dkbUZ5S0MwdGIzVjBiR2x1WlMxamFHRndkR1Z5Y3kxM2FXUjBhQ2s3WEhKY2JpQWdkSEpoYm5OcGRHbHZiaTFrZFhKaGRHbHZiam9nTUM0emN6dGNjbHh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjY2x4dVhISmNiaUFnSmw5ZmRHbDBiR1VnZTF4eVhHNGdJQ0FnYldGeVoybHVPaUF3SURFMmNIZzdYSEpjYmlBZ0lDQm9aV2xuYUhRNklEUXdjSGc3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ05EQndlRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNjbHh1SUNBZ0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNCQWNISnBiV0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hISmNiaUFnSUNCbWIyNTBMWGRsYVdkb2REb2dOREF3TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDIxaGFXNGdlMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dNVHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlzYVhOMExGeHlYRzRnSUNaZlgzTjFZbXBsWTNRc1hISmNiaUFnSmw5ZmFYUmxiU0I3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF5TzF4eVhHNGdJQ0FnYldGeVoybHVPaUF3TzF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTUR0Y2NseHVJQ0FnSUd4cGMzUXRjM1I1YkdVdGRIbHdaVG9nYm05dVpUdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXNhWE4wSUh0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBdU5XVnRJREE3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5emRXSnFaV04wSUh0Y2NseHVJQ0FnSUhCaFpHUnBibWN0YkdWbWREb2dNV1Z0TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFYUmxiU0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ016QndlRHRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXdiR0ZqWldodmJHUmxjaUI3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF4TzF4eVhHNGdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdiR1ZtZERvZ01EdGNjbHh1SUNBZ0lIZHBaSFJvT2lBeE1EQWxPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXpNSEI0TzF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUdodmRtVnlYMkpuWDJOdmJHOXlPMXh5WEc0Z0lDQWdZbTl5WkdWeUxXeGxablE2SURKd2VDQnpiMnhwWkNCQWMzVmpZMlZ6YzE5amIyeHZjanRjY2x4dUlDQWdJSFJ5WVc1emFYUnBiMjR0WkhWeVlYUnBiMjQ2SURBdU1uTTdYSEpjYmlBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJGdVkyaHZjaUI3WEhKY2JpQWdJQ0F1Wld4c2FYQnphWE1vTVNrN1hISmNiaUFnSUNCa2FYTndiR0Y1T2lCaWJHOWphenRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREFnTVM0MVpXMDdYSEpjYmx4eVhHNGdJQ0FnSmpwc2FXNXJMRnh5WEc0Z0lDQWdKanAyYVhOcGRHVmtMRnh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCelpXTnZibVJoY25sZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnWTI5c2IzSTZJRUJ6ZFdOalpYTnpYMk52Ykc5eU8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZMjlrWlNCN1hISmNiaUFnSUNCd1lXUmthVzVuTFhKcFoyaDBPaUF3TGpWbGJUdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZZV04wYVhabElIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWphR0Z3ZEdWeWMxOWZZVzVqYUc5eUlIdGNjbHh1SUNBZ0lDQWdKanBzYVc1ckxGeHlYRzRnSUNBZ0lDQW1PblpwYzJsMFpXUXNYSEpjYmlBZ0lDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0FnSUdOdmJHOXlPaUJBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0JtYjI1MExYZGxhV2RvZERvZ05EQXdPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDNOMGFXTnJlU3hjY2x4dUlDQW1YMlpwZUdWa0lIdGNjbHh1SUNBZ0lHUnBjM0JzWVhrNklHWnNaWGc3WEhKY2JpQWdJQ0JtYkdWNExYZHlZWEE2SUc1dmQzSmhjRHRjY2x4dUlDQWdJR1pzWlhndFpHbHlaV04wYVc5dU9pQmpiMngxYlc0N1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lCMllYSW9MUzF2ZFhSc2FXNWxMWHBKYm1SbGVDazdYSEpjYmlBZ0lDQjBiM0E2SURBN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXTm9ZWEIwWlhKeklIdGNjbHh1SUNBZ0lDQWdKbDlmZEdsMGJHVXNYSEpjYmlBZ0lDQWdJQ1pmWDIxaGFXNGdlMXh5WEc0Z0lDQWdJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZYM1JwZEd4bElIdGNjbHh1SUNBZ0lDQWdJQ0JtYkdWNExYTm9jbWx1YXpvZ01EdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOWZiV0ZwYmlCN1hISmNiaUFnSUNBZ0lDQWdabXhsZURvZ01UdGNjbHh1SUNBZ0lDQWdJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDl6ZEdsamEza2dlMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJSE4wYVdOcmVUdGNjbHh1SUNBZ0lHMWhlQzFvWldsbmFIUTZJSFpoY2lndExXOTFkR3hwYm1VdGMzUnBZMnQ1TFdobGFXZG9kQ2s3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJacGVHVmtJSHRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJtYVhobFpEdGNjbHh1SUNBZ0lHMWhlQzFvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyaHBaR1JsYmlCN1hISmNiaUFnSUNCa2FYTndiR0Y1T2lCdWIyNWxPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDltYjJ4a1pXUWdlMXh5WEc0Z0lDQWdkMmxrZEdnNklEQTdYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JpSXNJaThxS2x4dUlDb2daV3hzYVhCemFYTXViR1Z6Y3lBdElPYVdoK2Fjck9lY2dlZVZwU0J0YVhocGJuZ2c1WWU5NXBXd1hHNGdLaUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYRzRnS2lCVmNHUmhkR1U2SURJd01qSXVNeTR4TVZ4dUlDb3ZYRzVjYmk4cUlEMDlQVDA5UFNEbWxvZm1uS3pubklIbmxhWGxoNzNtbGJBZ1BUMDlQVDA5SUNvdlhHNHVaV3hzYVhCemFYTWdLRUJzYVc1bGN5a2dkMmhsYmlBb1FHeHBibVZ6UFRFcElIdGNiaUFnZDJocGRHVXRjM0JoWTJVNklHNXZkM0poY0R0Y2JpQWdkR1Y0ZEMxdmRtVnlabXh2ZHpvZ1pXeHNhWEJ6YVhNN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc1Y2JpNWxiR3hwY0hOcGN5QW9RR3hwYm1WektTQjNhR1Z1SUNoQWJHbHVaWE0rUFRJcElIdGNiaUFnTFhkbFltdHBkQzFzYVc1bExXTnNZVzF3T2lCQWJHbHVaWE03WEc0Z0lHUnBjM0JzWVhrNklHSnZlRHRjYmlBZ0xYZGxZbXRwZEMxaWIzZ3RiM0pwWlc1ME9pQjJaWEowYVdOaGJEdGNiaUFnZEdWNGRDMXZkbVZ5Wm14dmR6b2daV3hzYVhCemFYTTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNGlMQ0l2S2lBOVBUMDlQVDA5UFQwOUlHSjFkSFJ2Ym5NdWRHaGxiV1VnTFNEbWpJbnBrcTdscjd6b2lLcm1vTGZsdkk4Z1BUMDlQVDA5UFQwOVBTQXFMMXh5WEc1QWFXMXdiM0owSUNjdUwyTnZiRzl5Y3ljN1hISmNia0JwYlhCdmNuUWdKeTR2YzJoaFpHOTNKenRjY2x4dVhISmNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSWdlMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQm1hWGhsWkR0Y2NseHVJQ0I2TFdsdVpHVjRPaUE1T1RrNU9UdGNjbHh1SUNCdFlYSm5hVzQ2SURBN1hISmNiaUFnZEhKaGJuTnBkR2x2Ymkxa2RYSmhkR2x2YmpvZ01DNHpjenRjY2x4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzVjY2x4dUlDQW1YMTlpZFhSMGIyNGdlMXh5WEc0Z0lDQWdMbk5vWVdSdmQxOXNhV2RvZEY5eVpXZDFiR0Z5S0NrN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBeE1IQjRPMXh5WEc0Z0lDQWdkMmxrZEdnNklETTJjSGc3WEhKY2JpQWdJQ0JvWldsbmFIUTZJRE0yY0hnN1hISmNiaUFnSUNCaWIzSmtaWEk2SURGd2VDQnpiMnhwWkNCQWNISnBiV0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ0lDQmliM0prWlhJdGNtRmthWFZ6T2lBemNIZzdYSEpjYmlBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhkb2FYUmxPMXh5WEc0Z0lDQWdZM1Z5YzI5eU9pQndiMmx1ZEdWeU8xeHlYRzRnSUNBZ2RHVjRkQzFoYkdsbmJqb2dZMlZ1ZEdWeU8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCelpXTnZibVJoY25sZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ1ltOXlaR1Z5TFdOdmJHOXlPaUJBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FtTG1ocFpHVWdlMXh5WEc0Z0lDQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZVzVqYUc5eUlIdGNjbHh1SUNBZ0lDWTZiR2x1YXl4Y2NseHVJQ0FnSUNZNmRtbHphWFJsWkN4Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUc1dmJtVTdYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0FnSUdOdmJHOXlPaUJBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmxqYjI0Z2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01qdGNjbHh1SUNBZ0lIUnZjRG9nTlRBbE8xeHlYRzRnSUNBZ2JHVm1kRG9nTlRBbE8xeHlYRzRnSUNBZ2QybGtkR2c2SURJd2NIZzdYSEpjYmlBZ0lDQm9aV2xuYUhRNklESXdjSGc3WEhKY2JpQWdJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlNndE5UQWxMQ0F0TlRBbEtUdGNjbHh1SUNBZ0lHWnBiR3c2SUdOMWNuSmxiblJqYjJ4dmNqdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyRmpkR2wyWlNCN1hISmNiaUFnSUNBbUxtOTFkR3hwYm1VdGRHOXZiR0poY2lCN1hISmNiaUFnSUNBZ0lDWmZYMkoxZEhSdmJpQjdYSEpjYmlBZ0lDQWdJQ0FnWTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0JpYjNKa1pYSXRZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlJSHRjY2x4dUlDQWdJQ0FnSmpwc2FXNXJMRnh5WEc0Z0lDQWdJQ0FtT25acGMybDBaV1FzWEhKY2JpQWdJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNBZ0lHTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmNtOTFibVJsWkNCN1hISmNiaUFnSUNBbUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZlluVjBkRzl1SUh0Y2NseHVJQ0FnSUNBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nTVRod2VEdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZaR2x6WVdKc1pXUWdlMXh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSXNYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMTBiMjlzWW1GeUlIdGNjbHh1SUNBZ0lDQWdKbDlmWVc1amFHOXlPbXhwYm1zc1hISmNiaUFnSUNBZ0lDWmZYMkZ1WTJodmNqcDJhWE5wZEdWa0xGeHlYRzRnSUNBZ0lDQW1YMTloYm1Ob2IzSTZhRzkyWlhJc1hISmNiaUFnSUNBZ0lDWmZYMkoxZEhSdmJpQjdYSEpjYmlBZ0lDQWdJQ0FnWTNWeWMyOXlPaUJ1YjNRdFlXeHNiM2RsWkR0Y2NseHVJQ0FnSUNBZ0lDQmpiMnh2Y2pvZ1FHWnZkWEowYUY5MFpYaDBYMk52Ykc5eU8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDE5aWRYUjBiMjRnZTF4eVhHNGdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQmthWE5oWW14bFpGOWlaMTlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDkwZEdJc1hISmNiaUFnSmw5aWRIUWdlMXh5WEc0Z0lDQWdiR1ZtZERvZ05UQWxPMXh5WEc0Z0lDQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZZS0MwMU1DVXBPMXh5WEc1Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZiaUI3WEhKY2JpQWdJQ0FnSUdScGMzQnNZWGs2SUdsdWJHbHVaUzFpYkc5amF6dGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZkSFJpSUh0Y2NseHVJQ0FnSUhSdmNEb2dNVEp3ZUR0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRkRzl2YkdKaGNsOW9hV1JrWlc0Z2UxeHlYRzRnSUNBZ0lDQjBiM0E2SUMwMU5uQjRPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlpZEhRZ2UxeHlYRzRnSUNBZ1ltOTBkRzl0T2lBeE1uQjRPMXh5WEc1Y2NseHVJQ0FnSUNZdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaUI3WEhKY2JpQWdJQ0FnSUdKdmRIUnZiVG9nTFRVMmNIZzdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YM0owYkN4Y2NseHVJQ0FtWDJ4MGNpQjdYSEpjYmlBZ0lDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmtvTFRVd0pTazdYSEpjYmlBZ0lDQjNhV1IwYURvZ05UWndlRHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmY25Sc0lIdGNjbHh1SUNBZ0lIUnZjRG9nTlRBbE8xeHlYRzRnSUNBZ2NtbG5hSFE2SURFeWNIZzdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjY2x4dUlDQWdJQ0FnY21sbmFIUTZJQzA0Tm5CNE8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXNkSElnZTF4eVhHNGdJQ0FnZEc5d09pQTFNQ1U3WEhKY2JpQWdJQ0JzWldaME9pQXhNbkI0TzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMTBiMjlzWW1GeVgyaHBaR1JsYmlCN1hISmNiaUFnSUNBZ0lHeGxablE2SUMwNE5uQjRPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDkwZEdJc1hISmNiaUFnSmw5eWRHd3NYSEpjYmlBZ0psOWlkSFFzWEhKY2JpQWdKbDlzZEhJZ2UxeHlYRzRnSUNBZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZlluVjBkRzl1SUh0Y2NseHVJQ0FnSUNBZ0ppNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1SUh0Y2NseHVJQ0FnSUNBZ0lDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNTlYSEpjYmlKZGZRPT0gKi9cbiJdLCJmaWxlIjoiY3NzL2V4YW1wbGUubWluLmNzcyJ9 */ diff --git a/docs/fixed.html b/docs/fixed.html index 7db856ff..03660e75 100644 --- a/docs/fixed.html +++ b/docs/fixed.html @@ -119,6 +119,37 @@ // 侧边栏的 Toolbar 会多出一个 issues 图标的按钮 outline.reload({ issues: 'https://github.com/yaohaixiao/outline.js/issues' +})

tools

Description

Type:
Array
Default:
[]

可选,自定义的按钮配置项。tools 中的按钮会排列显示在 homepage, git, tags, issues 等按钮之后。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+// 侧边栏的 Toolbar 会多出一个 git 图标的按钮
+outline.reload({
+  git: 'https://github.com/yaohaixiao/outline.js',
+  tools: [
+    {
+      name: 'clean',
+      // 图标
+      icon: clean,
+      size: 20,
+      color: '#f00'
+      // link 指定按钮点击后页面的跳转地址
+      link: 'https://github.com/yaohaixiao',
+      // link 和 action 只能二选一
+      // action 指定按钮的处理方式
+      action: {
+        type: 'click',
+        // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+        context: outline,
+        handler: function() {
+          // 回调函数的处理逻辑
+        }
+      }
+    }
+  ]
 })

customClass

Description

Type:
String
Default:
''

可选,(DIYer福利)设置自定义样式的 class 名称:

  • '' - 采用默认 outline.js 的 UI 界面(默认值);
  • 设置自定义样式 - 自己根据需求设置个性化的 UI 界面;
// Default UI
 new Outline(Outline.DEFAULTS)
 
@@ -243,7 +274,11 @@
 const outline = new Outline(Outline.DEFAULTS)
 
 // 查看全部配置信息
-outline.attrs

anchors

Description

Type:
Object

Anchors 模块:类似 AnchorJS 基础功能模块,自动分析段落层级。

// 仅展示 API 中对外公开的方法和属性
+outline.attrs

buttons

Description

Type:
Array

存储的是 Outline 对象当前工具栏的完整的按钮配置信息:

// 设置默认配置项
+const outline = new Outline(Outline.DEFAULTS)
+
+// 查看全部按钮配置信息
+outline.buttons

anchors

Description

Type:
Object

Anchors 模块:类似 AnchorJS 基础功能模块,自动分析段落层级。

// 仅展示 API 中对外公开的方法和属性
 class Anchors extends Base {
   constructor(options) {
     super()
@@ -774,7 +809,61 @@
 }]
 
 outline.count()
-// -> 1 就是 getChapters() 返回数据的数量

toTop([afterScroll])

Description

toTop() 方法会控制页面(scrollElement)滚动到顶部。

Parameters

afterScroll
Type:
Function

(可选)页面停止滚动后的回调函数。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline({
+// -> 1 就是 getChapters() 返回数据的数量

addButton(button)

Description

addButton() 方法添加自定义的工具栏按钮。

Parameters

button
Type:
Object|Array

(必须)单个按钮的配置信息或者多个按钮的配置信息。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+outline.addButton({
+  name: 'clean',
+  // 图标
+  icon: clean,
+  size: 20,
+  color: '#f00'
+  // link 指定按钮点击后页面的跳转地址
+  link: 'https://github.com/yaohaixiao',
+  // link 和 action 只能二选一
+  // action 指定按钮的处理方式
+  action: {
+    type: 'click',
+    // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+    context: outline,
+    handler: function() {
+      // 回调函数的处理逻辑
+    }
+  }
+})

removeButton(name)

Description

removeButton() 方法移除工具栏按钮。

Parameters

name
Type:
String

(必须)按钮名称。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+outline.addButton({
+  name: 'clean',
+  // 图标
+  icon: clean,
+  size: 20,
+  color: '#f00'
+  // link 指定按钮点击后页面的跳转地址
+  link: 'https://github.com/yaohaixiao',
+  // link 和 action 只能二选一
+  // action 指定按钮的处理方式
+  action: {
+    type: 'click',
+    // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+    context: outline,
+    handler: function() {
+      // 回调函数的处理逻辑
+    }
+  }
+})
+
+setTimeout(() => {
+  outline.addButton('clean')
+}, 5000)

toTop([afterScroll])

Description

toTop() 方法会控制页面(scrollElement)滚动到顶部。

Parameters

afterScroll
Type:
Function

(可选)页面停止滚动后的回调函数。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline({
    article: '#article',
    title: 'Outline v2.0.0'
 })
@@ -833,42 +922,42 @@
   showCode: false
 })

License

JavaScript Code Licensed under MIT License.

API Documentation Licensed under CC BY 3.0

\ No newline at end of file + outline = new Outline(Outline.DEFAULTS) \ No newline at end of file diff --git a/docs/flex.html b/docs/flex.html index 86db8b11..6fa59e78 100644 --- a/docs/flex.html +++ b/docs/flex.html @@ -125,6 +125,37 @@ // 侧边栏的 Toolbar 会多出一个 issues 图标的按钮 outline.reload({ issues: 'https://github.com/yaohaixiao/outline.js/issues' +})

tools

Description

Type:
Array
Default:
[]

可选,自定义的按钮配置项。tools 中的按钮会排列显示在 homepage, git, tags, issues 等按钮之后。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+// 侧边栏的 Toolbar 会多出一个 git 图标的按钮
+outline.reload({
+  git: 'https://github.com/yaohaixiao/outline.js',
+  tools: [
+    {
+      name: 'clean',
+      // 图标
+      icon: clean,
+      size: 20,
+      color: '#f00'
+      // link 指定按钮点击后页面的跳转地址
+      link: 'https://github.com/yaohaixiao',
+      // link 和 action 只能二选一
+      // action 指定按钮的处理方式
+      action: {
+        type: 'click',
+        // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+        context: outline,
+        handler: function() {
+          // 回调函数的处理逻辑
+        }
+      }
+    }
+  ]
 })

customClass

Description

Type:
String
Default:
''

可选,(DIYer福利)设置自定义样式的 class 名称:

  • '' - 采用默认 outline.js 的 UI 界面(默认值);
  • 设置自定义样式 - 自己根据需求设置个性化的 UI 界面;
// Default UI
 new Outline(Outline.DEFAULTS)
 
@@ -249,7 +280,11 @@
 const outline = new Outline(Outline.DEFAULTS)
 
 // 查看全部配置信息
-outline.attrs

anchors

Description

Type:
Object

Anchors 模块:类似 AnchorJS 基础功能模块,自动分析段落层级。

// 仅展示 API 中对外公开的方法和属性
+outline.attrs

buttons

Description

Type:
Array

存储的是 Outline 对象当前工具栏的完整的按钮配置信息:

// 设置默认配置项
+const outline = new Outline(Outline.DEFAULTS)
+
+// 查看全部按钮配置信息
+outline.buttons

anchors

Description

Type:
Object

Anchors 模块:类似 AnchorJS 基础功能模块,自动分析段落层级。

// 仅展示 API 中对外公开的方法和属性
 class Anchors extends Base {
   constructor(options) {
     super()
@@ -780,7 +815,61 @@
 }]
 
 outline.count()
-// -> 1 就是 getChapters() 返回数据的数量

toTop([afterScroll])

Description

toTop() 方法会控制页面(scrollElement)滚动到顶部。

Parameters

afterScroll
Type:
Function

(可选)页面停止滚动后的回调函数。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline({
+// -> 1 就是 getChapters() 返回数据的数量

addButton(button)

Description

addButton() 方法添加自定义的工具栏按钮。

Parameters

button
Type:
Object|Array

(必须)单个按钮的配置信息或者多个按钮的配置信息。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+outline.addButton({
+  name: 'clean',
+  // 图标
+  icon: clean,
+  size: 20,
+  color: '#f00'
+  // link 指定按钮点击后页面的跳转地址
+  link: 'https://github.com/yaohaixiao',
+  // link 和 action 只能二选一
+  // action 指定按钮的处理方式
+  action: {
+    type: 'click',
+    // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+    context: outline,
+    handler: function() {
+      // 回调函数的处理逻辑
+    }
+  }
+})

removeButton(name)

Description

removeButton() 方法移除工具栏按钮。

Parameters

name
Type:
String

(必须)按钮名称。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+outline.addButton({
+  name: 'clean',
+  // 图标
+  icon: clean,
+  size: 20,
+  color: '#f00'
+  // link 指定按钮点击后页面的跳转地址
+  link: 'https://github.com/yaohaixiao',
+  // link 和 action 只能二选一
+  // action 指定按钮的处理方式
+  action: {
+    type: 'click',
+    // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+    context: outline,
+    handler: function() {
+      // 回调函数的处理逻辑
+    }
+  }
+})
+
+setTimeout(() => {
+  outline.addButton('clean')
+}, 5000)

toTop([afterScroll])

Description

toTop() 方法会控制页面(scrollElement)滚动到顶部。

Parameters

afterScroll
Type:
Function

(可选)页面停止滚动后的回调函数。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline({
    article: '#article',
    title: 'Outline v2.0.0'
 })
diff --git a/docs/index.html b/docs/index.html
index c0a596c5..95c35946 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1,4 +1,4 @@
-outline.js | 自动生成文章导读(Table of Contents)导航的 JavaScript 工具。
<script src="https://cdn.jsdelivr.net/gh/yaohaixiao/outline.js/outline.min.js"></script>

Options

outline.js 有者丰富的配置选项,以便适应不同的展示方式。

articleElement

Description

Type:
String|HTMLElement
Default:
'#article'
String:
选择器字符串,默认值:html,body(即 window 窗口);
HTMLElement:
'DOM 元素;

可选,用来指定页面中显示文章正文的 DOM 节点或者选择器字符串。

// Default Selector
+outline.js | 自动生成文章导读(Table of Contents)导航的 JavaScript 工具。
<script src="https://cdn.jsdelivr.net/gh/yaohaixiao/outline.js/outline.min.js"></script>

Options

outline.js 有者丰富的配置选项,以便适应不同的展示方式。

articleElement

Description

Type:
String|HTMLElement
Default:
'#article'
String:
选择器字符串,默认值:html,body(即 window 窗口);
HTMLElement:
'DOM 元素;

可选,用来指定页面中显示文章正文的 DOM 节点或者选择器字符串。

// Default Selector
 const outline = new Outline(Outline.DEFAULTS)
 
 // Customize Selector
@@ -62,6 +62,37 @@
 // 侧边栏的 Toolbar 会多出一个 issues 图标的按钮
 outline.reload({
   issues: 'https://github.com/yaohaixiao/outline.js/issues'
+})

tools

Description

Type:
Array
Default:
[]

可选,自定义的按钮配置项。tools 中的按钮会排列显示在 homepage, git, tags, issues 等按钮之后。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+// 侧边栏的 Toolbar 会多出一个 git 图标的按钮
+outline.reload({
+  git: 'https://github.com/yaohaixiao/outline.js',
+  tools: [
+    {
+      name: 'clean',
+      // 图标
+      icon: clean,
+      size: 20,
+      color: '#f00'
+      // link 指定按钮点击后页面的跳转地址
+      link: 'https://github.com/yaohaixiao',
+      // link 和 action 只能二选一
+      // action 指定按钮的处理方式
+      action: {
+        type: 'click',
+        // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+        context: outline,
+        handler: function() {
+          // 回调函数的处理逻辑
+        }
+      }
+    }
+  ]
 })

customClass

Description

Type:
String
Default:
''

可选,(DIYer福利)设置自定义样式的 class 名称:

  • '' - 采用默认 outline.js 的 UI 界面(默认值);
  • 设置自定义样式 - 自己根据需求设置个性化的 UI 界面;
// Default UI
 new Outline(Outline.DEFAULTS)
 
@@ -186,7 +217,11 @@
 const outline = new Outline(Outline.DEFAULTS)
 
 // 查看全部配置信息
-outline.attrs

anchors

Description

Type:
Object

Anchors 模块:类似 AnchorJS 基础功能模块,自动分析段落层级。

// 仅展示 API 中对外公开的方法和属性
+outline.attrs

buttons

Description

Type:
Array

存储的是 Outline 对象当前工具栏的完整的按钮配置信息:

// 设置默认配置项
+const outline = new Outline(Outline.DEFAULTS)
+
+// 查看全部按钮配置信息
+outline.buttons

anchors

Description

Type:
Object

Anchors 模块:类似 AnchorJS 基础功能模块,自动分析段落层级。

// 仅展示 API 中对外公开的方法和属性
 class Anchors extends Base {
   constructor(options) {
     super()
@@ -717,7 +752,61 @@
 }]
 
 outline.count()
-// -> 1 就是 getChapters() 返回数据的数量

toTop([afterScroll])

Description

toTop() 方法会控制页面(scrollElement)滚动到顶部。

Parameters

afterScroll
Type:
Function

(可选)页面停止滚动后的回调函数。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline({
+// -> 1 就是 getChapters() 返回数据的数量

addButton(button)

Description

addButton() 方法添加自定义的工具栏按钮。

Parameters

button
Type:
Object|Array

(必须)单个按钮的配置信息或者多个按钮的配置信息。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+outline.addButton({
+  name: 'clean',
+  // 图标
+  icon: clean,
+  size: 20,
+  color: '#f00'
+  // link 指定按钮点击后页面的跳转地址
+  link: 'https://github.com/yaohaixiao',
+  // link 和 action 只能二选一
+  // action 指定按钮的处理方式
+  action: {
+    type: 'click',
+    // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+    context: outline,
+    handler: function() {
+      // 回调函数的处理逻辑
+    }
+  }
+})

removeButton(name)

Description

removeButton() 方法移除工具栏按钮。

Parameters

name
Type:
String

(必须)按钮名称。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+outline.addButton({
+  name: 'clean',
+  // 图标
+  icon: clean,
+  size: 20,
+  color: '#f00'
+  // link 指定按钮点击后页面的跳转地址
+  link: 'https://github.com/yaohaixiao',
+  // link 和 action 只能二选一
+  // action 指定按钮的处理方式
+  action: {
+    type: 'click',
+    // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+    context: outline,
+    handler: function() {
+      // 回调函数的处理逻辑
+    }
+  }
+})
+
+setTimeout(() => {
+  outline.addButton('clean')
+}, 5000)

toTop([afterScroll])

Description

toTop() 方法会控制页面(scrollElement)滚动到顶部。

Parameters

afterScroll
Type:
Function

(可选)页面停止滚动后的回调函数。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline({
    article: '#article',
    title: 'Outline v2.0.0'
 })
diff --git a/docs/js/outline.min.js b/docs/js/outline.min.js
index 984fb3f6..fe1617b5 100644
--- a/docs/js/outline.min.js
+++ b/docs/js/outline.min.js
@@ -1,2 +1,2 @@
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Outline=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(n=l,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(n[t]=o[t])})),this):0===arguments.length?l:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),h=t=>t*t,a=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):n(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},c=(t,e,s)=>{const r=a(t);let l=r.scrollTop,n=0;const o=e-l,c=r.scrollHeight,d=e-c<=0?e:c,u=t=>(i(s)&&s(t),!1),p=()=>{if(n+=1,o<0){if(l-=h(n),r.scrollTop=l,l<=e)return r.scrollTop=e,u(e)}else if(l+=h(n),r.scrollTop=l,l>=d)return r.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)},d=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=d(t.offsetParent)),e},u=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},p=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,m=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],f=(t,e,s)=>{const i=m.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},g=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);o.forEach((t=>{f(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{n(t)&&g(t,s,i)}))},y=(t,e,s)=>{if(!i(s))return g(t,e);f(t,e,s)},b=(t,e,s,i,r,l,n=!1)=>{const o=m.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||i&&t===r)return t;if(t===r)break}while(t=p(t))})(a,e,t);let d=l||t;o.delegateTarget=c,!0===l&&(d=r),c&&(!0===n&&y(t,s,h),i.call(d,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},$=function(t){t.stopPropagation(),t.preventDefault()},v={},_=t=>e(v,t)&&v[t].length>0,E=(t,e=!0)=>e?_(t):(t=>{let e=_(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=_(t);return e})(t),T=(t,e,i=!0)=>{const r=t=>{if(!_(t))return!1;v[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!E(t))return!1;i?setTimeout(l,10):l()},w=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),L=(t=[])=>{const e=['','','','','','','','',''],s=w(t)&&t.length>0?e.concat(t):e,i=document.body;let r=document.querySelector("#svg-sprites");r?r.innerHTML=s.join(""):(r=document.createElement("div"),r.innerHTML=``,i.insertBefore(r.firstChild,i.firstChild))},S=(t,e=0,s="",i="outline")=>{const r=i?`xlink:href="#${i}-icon-${t}"`:`xlink:href="#icon-${t}"`,l=w(e)?e[0]:e,n=w(e)?e[1]:e,o=e?`width:${l}px;height:${n}px;`:"",h=``,a=document.createElement("i");return a.className="outline-icon",a.innerHTML=h,a},x=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),C=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},z=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}},k=(s,i,l)=>{const n=document.createDocumentFragment(),o=document.createElement(s),h=e=>C(e)||t(e),a=e=>{let s;if(!h(e))return!1;C(e)?s=e:t(e)&&(s=document.createTextNode(e)),n.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&z(o,t,i[t])})):w(i)&&i.every((t=>h(t)))&&i.forEach((t=>{a(t)})),w(l)?l.forEach((t=>{a(t)})):a(l),o.appendChild(n),o},A=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!n(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},N=(t,e)=>{let s,i=t.className;if(!i||!A(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=x(i.replace(e,"")),t.className=i)},M=(e,s=!0,i=!0)=>{const r="outline-heading",l=e.innerHTML;let n;if(e.innerHTML=l.replace(/^\d+(?:(\.?\d*)*\s?)?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),N(e,r),!s)return!1;var o;n=e.querySelector(`.${r}__anchor`),i&&N(e,`${r}_start`),o=x(e.className),t(o)&&""===o&&e.removeAttribute("class"),e.removeChild(n)},O=(e,s=!0)=>{let i=1,r=0;const l=[];return e.forEach(((e,s)=>{const n=e.tagName.replace(/h/i,"");let o=parseInt(n,10),h=-1;var a;o>i?(r+=1,h=1===r?-1:s-1):o===i||or?1===o?(r=1,h=-1):h=l[s-1].pid:o<=r&&(1===o?r=1:(r-=i-o,r<=1&&(r=1)),h=1===r?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"")})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((s=>{e[s].forEach((e=>{t.filter((t=>t.pid===e.id)).forEach((t=>{t.code=e.code+"."+t.index}))}))})),t})(l):l};class D extends l{constructor(t){super(),this.attrs=D.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){let s,r,l,o,h;return this.attr(e),h=this.attr("articleElement"),r=this.attr("scrollElement"),l=this.attr("selector"),s=this.attr("created"),t(h)?o=document.querySelector(h):n(h)&&(o=h),o?(this.$articleElement=o,this.$scrollElement=a(r),this.$headings=[...o.querySelectorAll(l)],this.$headings.length<1||(this.chapters=O(this.$headings),i(s)&&s.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),s=this.attr("isAtStart"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.$headings,o=this.getChapters();return L(),n.forEach(((t,i)=>{const n=o[i].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,l=s.isAtStart||!0,n=s.showCode||!1,o=s.chapterCode||"",h=s.anchorURL||"",a=`heading-${e}`,c={id:a,className:l?`${i} ${i}_start`:i,"data-id":e},d=Object.keys(c),u=x(t.innerHTML);let p,m;if(d.forEach((e=>{z(t,e,c[e])})),n&&(t.innerHTML=o+" "+u),!r)return!1;m=S("hash"),p=k("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:h||`#${a}`,target:h?"_blank":"self","data-id":e},[m]),t.appendChild(p)})(t,i,{hasAnchor:e,isAtStart:s,showCode:r,chapterCode:n,anchorURL:l})})),i(t)&&t.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),s=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return i(s)&&s.call(this),this.removeListeners(),l.forEach((s=>{M(s,t,e)})),this.attr(D.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],i(r)&&r.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),s=this.attr("afterScroll"),r=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,n=d(l)-(r+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(n,(()=>{i(s)&&s.call(this,"anchor"),o((()=>{T("toolbar:update",{top:n,min:0,max:a})}))})),e||$(t),this}addListeners(){const t=this.$articleElement;return b(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return y(t,"click",this.onAnchorTrigger),this}}D.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null};const H=(t,e)=>{let s,i;if(A(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},j=(t,e)=>{document.documentElement.style.setProperty(t,e)};let F=2e3;const U=t=>(t?F=t:F+=1,j("--outline-zIndex",`${F}`),F);class I extends l{constructor(t){super(),this.attrs=I.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),i(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),a=this.attr("customClass"),c=document.createDocumentFragment();let d,u,p,m,f,g,y,b;return L(),this.zIndex=U(),m=k("h2",{className:"outline-drawer__title"},[this.title]),this.$title=m,r&&(f=k("div",{className:"outline-drawer__close"},[S("close",20)]),this.$close=f),p=k("header",{className:"outline-drawer__header"},[m,f]),this.$header=p,g=k("div",{className:"outline-drawer__main"},[""]),this.$main=g,o||H(g,"outline-drawer_full"),y=k("footer",{className:"outline-drawer__footer"},[""]),this.$footer=y,u=k("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[p,g,y]),this.$modal=u,n&&H(u,"outline-drawer_offset"),h&&H(u,"outline-drawer_auto"),a&&H(u,a),l&&(b=k("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=b),d=k("div",{className:"outline-drawer"},[u,b]),this.$el=d,c.appendChild(d),document.body.appendChild(c),i(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return H(this.$el,"outline-drawer_opened"),N(e,"outline-drawer_closed"),H(e,"outline-drawer_opened"),o((()=>{this.closed=!1,i(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return N(e,"outline-drawer_opened"),H(e,"outline-drawer_closed"),o((()=>{N(this.$el,"outline-drawer_opened"),this.closed=!0,i(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),i(t)&&o((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return i(e)&&e.call(this),this.removeListeners(),this.attrs=I.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,U(s),this.zIndex=0,i(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&b(s,".outline-drawer__close","click",this.onClose,this,!0),e&&b(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(y(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}I.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const q=(t,e,s,r,l,n=!1)=>{const o=m.indexOf(e)>-1,h=function(i){let o=l||t;!0===l&&(o=r),!0===n&&y(t,e,h),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:r,context:l,capture:o}),s._delegateListener=h,t.addEventListener(e,h,o)},B=(t,e)=>getComputedStyle(t)[e];class R extends l{constructor(t){super(),this.attrs=R.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,o;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?o=document.querySelector(r):n(r)&&(o=r),this.$parentElement=o,this.$scrollElement=a(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=this.attr("title"),e=this.attr("customClass"),s=this.$parentElement,i=[];let r,l,n,o,h=null;return s?(this.isInside()&&(h=k("h2",{className:"outline-chapters__title"},[t]),this.$title=h,i.push(h)),n=k("ul",{className:"outline-chapters__list outline-chapters_fixed outline-chapters_hidden"},[""]),this.$list=n,o=k("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=o,l=k("div",{className:"outline-chapters__main"},[n,o]),this.$main=l,i.push(l),r=k("nav",{id:"outline-chapters",className:"outline-chapters"},i),this.$el=r,this.isSticky()&&(this.calculateStickyHeight(),H(r,"outline-chapters_sticky")),e&&H(r,e),s.appendChild(r),this):this}render(){const t=this.attr("chapters"),e=this.attr("showCode"),s=this.attr("mounted");let r,l;return!this.$parentElement||t.length<1||(this._paintEdge(),l=this.$list,((t,e,s=!1)=>{const i=t=>document.getElementById(t);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=k("span",{className:"outline-chapters__text"},[e.text]),h=k("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},[o]);let a,c,d,u;s&&(a=k("span",{className:"outline-chapters__code","data-id":l},[e.code]),h.insertBefore(a,h.firstChild)),c=k("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[h]),-1===r?t.appendChild(c):(u=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(c):(d=k("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[c]),u.appendChild(d)))}))})(l,this.chapters,e),N(l,"outline-chapters_fixed"),N(l,"outline-chapters_hidden"),this.positionPlaceholder(this.active),r=this.$el,this.offsetTop=d(r),this.offsetWidth=r.offsetWidth,this.isFixed()&&(this.sticky(),j("--outline-chapters-width",`${this.offsetWidth}px`)),i(s)&&s.call(this),this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(B(e,"padding-top"),10),n=parseInt(B(e,"border-top-width"),10),o=parseInt(B(s,"padding-top"),10),h=parseInt(B(s,"margin-top"),10),a=parseInt(B(s,"border-top-width"),10);let c,d=r.offsetHeight,u=0;return l&&(u+=l),o&&(u+=o),h&&(u+=h),n&&(u+=n),a&&(u+=a),c=d*t,i.style.cssText=`transform: translateY(${u+c}px);height:${d}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&N(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,H(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?H(s,e):N(s,e),i(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return j("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(N(l,e),N(r,e),o((()=>{N(l,t),N(r,t)}),30)):N(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(H(l,t),H(r,t),o((()=>{H(l,e),H(r,e)}))):H(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&o((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(R.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),a=n(s)?s:document;return s&&(o.root=s),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=o((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],n=document.querySelector(`#${l}`),h=d(n)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),o((()=>{this.playing=!1,T("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),o((()=>{this.scrollTo(h,u),this.highlight(r)}),10)):(this.scrollTo(h,u),this.highlight(r)),$(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=o((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),T("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=o((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),b(t,".outline-chapters__anchor","click",this.onSelect,this,!0),q(i,"scroll",this.onScroll,this,!0),this.isSticky()&&q(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),y(e,"click",this.onSelect),y(r,"scroll",this.onScroll),this.isSticky()&&q(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}R.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const P=(t,e=!0)=>{const s=S(t.icon,t.size),i=k("a",{className:"outline-toolbar__anchor",href:t.link},[s]),r=k("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return H(s,"outline-toolbar__icon"),e&&H(r,"outline-toolbar_rounded"),t.disabled&&H(r,"outline-toolbar_disabled"),r},Q="outline-toolbar_disabled",W="outline-toolbar_hidden";class V extends l{constructor(t){super(),this.attrs=V.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,A(i,s)?N(i,s):H(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),r=this.attr("placement"),l=document.createDocumentFragment(),n=document.createDocumentFragment();return L(),e.forEach((t=>{const e=P(t,s);l.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=k("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},[l]),n.appendChild(this.$el),document.body.appendChild(n),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),l=t.action,n=document.createDocumentFragment();let o;return r(t)?(s.push(t),n.appendChild(P(t))):w(t)&&t.forEach((t=>{n.appendChild(P(t))})),e.appendChild(n),l&&i(l.handler)&&(o=l.type||"click",b(e,`.${t.name}`,o,l.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(N(h,Q),n&&o&&b(s,`.${t}`,n,o)):(H(h,Q),n&&o&&y(s,n,o)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(H(this.$el,Q),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,N(this.$el,Q),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),N(l,W)}else N(r,W),this.closed=!1,i(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),H(l,W)}else H(r,W),this.closed=!0,i(e)&&o((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(V.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(P(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const r=e.action;let l,n,o,h;if(this.disabled)return!1;r&&(n=r.handler,t(n)&&(h=n,r.handler=function(){T(h,e.name)},n=r.handler),l=r.type||"click",o=r.context),i(n)&&b(s,`.${e.name}`,l,n,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let r,l;if(this.disabled)return!1;s&&(l=s.handler,r=s.type||"click"),i(l)&&y(e,r,l)})),this}}V.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const J=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),Y=(t,e,s=null)=>{const r=J();let l="symbol"==typeof t?t.toString():t;return i(e)?(v[l]||(v[l]=[]),v[l].push({topic:l,callback:e,context:s,token:r}),r):""},G=t=>{if(!e(v,t))return!1;delete v[t]},K=(t,e)=>{if(!E(t))return!1;e?(t=>{const e=Object.keys(v);if(!t||e.length<1)return!1;e.forEach((e=>{const s=v[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&G(i)}))})(e):G(t)};class X extends l{constructor(t){super(),this.attrs=X.DEFAULTS,this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){return this._renderAnchors()._renderChapters()._renderToolbar(),this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll");return this.anchors=new D({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("position"),n=this.attr("placement"),o=this.attr("afterSticky"),h=this.attr("afterToggle"),a=this.attr("afterScroll"),c=this.count();let d,u=this.attr("parentElement");return c<1||(d={scrollElement:s,showCode:r,position:l,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:o,afterToggle:h,afterScroll:a},"relative"===l?(this.drawer=new I({placement:n,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),u=this.drawer.$main):d.customClass=i,d.parentElement=u,this.chapters=new R(d)),this}_renderToolbar(){const t=this.attr("placement"),e=this.attr("homepage"),s=this.attr("git"),i=this.attr("tags"),r=this.attr("issues"),l=this.count(),n={name:"homepage",icon:"homepage",size:20,link:e},o={name:"github",icon:"github",size:20,link:s},h={name:"tags",icon:"tags",size:20,link:i},a={name:"issues",icon:"issues",size:20,link:r},c={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},d=[];return d.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),e&&d.push(n),s&&d.push(o),i&&d.push(h),r&&d.push(a),l>0&&d.push(c),d.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.toolbar=new V({placement:t,buttons:d}),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,s=this.chapters,r=this.count();return r>0&&(s.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&(s.highlight(0),s.playing=!1),i(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=a(this.attr("scrollElement")),s=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return l>0&&(r.playing=!0),this.scrollTo(n,(()=>{s.hide("down"),s.show("up"),l>0&&(r.highlight(l-1),r.playing=!1),i(t)&&t.call(s,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return c(s,t,e),this}toggle(){const t=this.attr("position"),e=this.toolbar,s=this.drawer,i=this.chapters;return this.count()<1||("relative"!==t?(i.toggle(),e.highlight("menu")):(e.toggle(),o((()=>{i.isInside()?i.toggle():s.toggle()})))),this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar,r=!1;const l=this.count();return this.removeListeners(),l>0&&(r=e.isOutside(),e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(X.DEFAULTS),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(o=l,n=s,Object.keys(n).forEach((t=>{e(n,t)&&(o[t]=n[t])})),this):0===arguments.length?l:this;var o,n}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const o=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),n=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),h=t=>t*t,a=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):o(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},c=(t,e,s)=>{const r=a(t);let l=r.scrollTop,o=0;const n=e-l,c=r.scrollHeight,d=e-c<=0?e:c,u=t=>(i(s)&&s(t),!1),p=()=>{if(o+=1,n<0){if(l-=h(o),r.scrollTop=l,l<=e)return r.scrollTop=e,u(e)}else if(l+=h(o),r.scrollTop=l,l>=d)return r.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)},d=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=d(t.offsetParent)),e},u=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},p=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,m=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],f=(t,e,s)=>{const i=m.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},g=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,n=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);n.forEach((t=>{f(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{o(t)&&g(t,s,i)}))},b=(t,e,s)=>{if(!i(s))return g(t,e);f(t,e,s)},y=(t,e,s,i,r,l,o=!1)=>{const n=m.indexOf(s)>-1,h=function(n){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(n),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||i&&t===r)return t;if(t===r)break}while(t=p(t))})(a,e,t);let d=l||t;n.delegateTarget=c,!0===l&&(d=r),c&&(!0===o&&b(t,s,h),i.call(d,n,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:n}),i._delegateListener=h,t.addEventListener(s,h,n)},$=function(t){t.stopPropagation(),t.preventDefault()},v={},_=t=>e(v,t)&&v[t].length>0,E=(t,e=!0)=>e?_(t):(t=>{let e=_(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=_(t);return e})(t),w=(t,e,i=!0)=>{const r=t=>{if(!_(t))return!1;v[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!E(t))return!1;i?setTimeout(l,10):l()},T=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),S=['','','','','','','','',''],x=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return S.find((r=>{const l=s.exec(r)[1];return i.exec(l)[1]===e&&l===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):[...S],L=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),r=[];(e=>{if(!e)return!1;T(e)&&e.length>0?e.forEach((e=>{-1===S.indexOf(e)&&t(e)&&S.push(e)})):t(e)&&S.push(e)})(e),r=x(),i?i.innerHTML=r.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))},C=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),z=t=>{return!(!r(t)||!(o(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},k=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}},A=(s,i,l)=>{const o=document.createDocumentFragment(),n=document.createElement(s),h=e=>z(e)||t(e),a=e=>{let s;if(!h(e))return!1;z(e)?s=e:t(e)&&(s=document.createTextNode(e)),o.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&k(n,t,i[t])})):T(i)&&i.every((t=>h(t)))&&i.forEach((t=>{a(t)})),T(l)?l.forEach((t=>{a(t)})):a(l),n.appendChild(o),n},N=e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)},O=(e,s={})=>((e,s={})=>{const i=s.size||0,r=s.color||"",l=s.iconSet||"",o=T(i)?i[0]:i,n=T(i)?i[1]:i,h=i?`width:${o}px;height:${n}px;`:"",a=r?h+`color:${r}`:h,c=document.createElement("i");let d,u="",p="";return t(e)?(N(e)?p=e:(u=l&&"icon"!==l?`xlink:href="#${l}-icon-${e}"`:`xlink:href="#icon-${e}"`,p=``),c.className="outline-icon",c.innerHTML=p,N(e)&&(d=c.querySelector("svg"),d.setAttribute("aria-hidden","true"),d.setAttribute("xmlns","http://www.w3.org/2000/svg"),d.setAttribute("class","outline-icon__svg"),d.setAttribute("width","200"),d.setAttribute("height","200"),d.style=a),c):null})(e,s),M=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!o(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},D=(t,e)=>{let s,i=t.className;if(!i||!M(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=C(i.replace(e,"")),t.className=i)},H=(e,s=!0,i=!0)=>{const r="outline-heading",l=e.innerHTML;let o;if(e.innerHTML=l.replace(/^\d+(?:(\.?\d*)*\s?)?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),D(e,r),!s)return!1;var n;o=e.querySelector(`.${r}__anchor`),i&&D(e,`${r}_start`),n=C(e.className),t(n)&&""===n&&e.removeAttribute("class"),e.removeChild(o)},j=(e,s=!0)=>{let i=1,r=0;const l=[];return e.forEach(((e,s)=>{const o=e.tagName.replace(/h/i,"");let n=parseInt(o,10),h=-1;var a;n>i?(r+=1,h=1===r?-1:s-1):n===i||nr?1===n?(r=1,h=-1):h=l[s-1].pid:n<=r&&(1===n?r=1:(r-=i-n,r<=1&&(r=1)),h=1===r?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"")})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((s=>{e[s].forEach((e=>{t.filter((t=>t.pid===e.id)).forEach((t=>{t.code=e.code+"."+t.index}))}))})),t})(l):l};class F extends l{constructor(t){super(),this.attrs=F.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){let s,r,l,n,h;return this.attr(e),h=this.attr("articleElement"),r=this.attr("scrollElement"),l=this.attr("selector"),s=this.attr("created"),t(h)?n=document.querySelector(h):o(h)&&(n=h),n?(this.$articleElement=n,this.$scrollElement=a(r),this.$headings=[...n.querySelectorAll(l)],this.$headings.length<1||(this.chapters=j(this.$headings),i(s)&&s.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),s=this.attr("isAtStart"),r=this.attr("showCode"),l=this.attr("anchorURL"),o=this.$headings,n=this.getChapters();return L(),o.forEach(((t,i)=>{const o=n[i].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,l=s.isAtStart||!0,o=s.showCode||!1,n=s.chapterCode||"",h=s.anchorURL||"",a=`heading-${e}`,c={id:a,className:l?`${i} ${i}_start`:i,"data-id":e},d=Object.keys(c),u=C(t.innerHTML);let p,m;if(d.forEach((e=>{k(t,e,c[e])})),o&&(t.innerHTML=n+" "+u),!r)return!1;m=O("hash"),p=A("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:h||`#${a}`,target:h?"_blank":"self","data-id":e},[m]),t.appendChild(p)})(t,i,{hasAnchor:e,isAtStart:s,showCode:r,chapterCode:o,anchorURL:l})})),i(t)&&t.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),s=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return i(s)&&s.call(this),this.removeListeners(),l.forEach((s=>{H(s,t,e)})),this.attr(F.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],i(r)&&r.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),s=this.attr("afterScroll"),r=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,o=d(l)-(r+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(o,(()=>{i(s)&&s.call(this,"anchor"),n((()=>{w("toolbar:update",{top:o,min:0,max:a})}))})),e||$(t),this}addListeners(){const t=this.$articleElement;return y(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return b(t,"click",this.onAnchorTrigger),this}}F.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null};const U=(t,e)=>{let s,i;if(M(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},I=(t,e)=>{document.documentElement.style.setProperty(t,e)};let q=2e3;const B=t=>(t?q=t:q+=1,I("--outline-zIndex",`${q}`),q);class R extends l{constructor(t){super(),this.attrs=R.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),i(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),o=this.attr("hasOffset"),n=this.attr("hasPadding"),h=this.attr("autoHeight"),a=this.attr("customClass"),c=document.createDocumentFragment();let d,u,p,m,f,g,b,y;return L(),this.zIndex=B(),m=A("h2",{className:"outline-drawer__title"},[this.title]),this.$title=m,r&&(f=A("div",{className:"outline-drawer__close"},[O("close",{size:20})]),this.$close=f),p=A("header",{className:"outline-drawer__header"},[m,f]),this.$header=p,g=A("div",{className:"outline-drawer__main"},[""]),this.$main=g,n||U(g,"outline-drawer_full"),b=A("footer",{className:"outline-drawer__footer"},[""]),this.$footer=b,u=A("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[p,g,b]),this.$modal=u,o&&U(u,"outline-drawer_offset"),h&&U(u,"outline-drawer_auto"),a&&U(u,a),l&&(y=A("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=y),d=A("div",{className:"outline-drawer"},[u,y]),this.$el=d,c.appendChild(d),document.body.appendChild(c),i(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return U(this.$el,"outline-drawer_opened"),D(e,"outline-drawer_closed"),U(e,"outline-drawer_opened"),n((()=>{this.closed=!1,i(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return D(e,"outline-drawer_opened"),U(e,"outline-drawer_closed"),n((()=>{D(this.$el,"outline-drawer_opened"),this.closed=!0,i(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),i(t)&&n((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return i(e)&&e.call(this),this.removeListeners(),this.attrs=R.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,B(s),this.zIndex=0,i(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&y(s,".outline-drawer__close","click",this.onClose,this,!0),e&&y(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}R.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const P=(t,e,s,r,l,o=!1)=>{const n=m.indexOf(e)>-1,h=function(i){let n=l||t;!0===l&&(n=r),!0===o&&b(t,e,h),s.call(n,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:r,context:l,capture:n}),s._delegateListener=h,t.addEventListener(e,h,n)},Q=(t,e)=>getComputedStyle(t)[e];class W extends l{constructor(t){super(),this.attrs=W.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,n;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?n=document.querySelector(r):o(r)&&(n=r),this.$parentElement=n,this.$scrollElement=a(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=this.attr("title"),e=this.attr("customClass"),s=this.$parentElement,i=[];let r,l,o,n,h=null;return s?(this.isInside()&&(h=A("h2",{className:"outline-chapters__title"},[t]),this.$title=h,i.push(h)),o=A("ul",{className:"outline-chapters__list outline-chapters_fixed outline-chapters_hidden"},[""]),this.$list=o,n=A("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=n,l=A("div",{className:"outline-chapters__main"},[o,n]),this.$main=l,i.push(l),r=A("nav",{id:"outline-chapters",className:"outline-chapters"},i),this.$el=r,this.isSticky()&&(this.calculateStickyHeight(),U(r,"outline-chapters_sticky")),e&&U(r,e),s.appendChild(r),this):this}render(){const t=this.attr("chapters"),e=this.attr("showCode"),s=this.attr("mounted");let r,l;return!this.$parentElement||t.length<1||(this._paintEdge(),l=this.$list,((t,e,s=!1)=>{const i=t=>document.getElementById(t);e.forEach((e=>{const r=e.pid,l=e.id,o=e.rel,n=A("span",{className:"outline-chapters__text"},[e.text]),h=A("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+o,rel:o,"data-id":l},[n]);let a,c,d,u;s&&(a=A("span",{className:"outline-chapters__code","data-id":l},[e.code]),h.insertBefore(a,h.firstChild)),c=A("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[h]),-1===r?t.appendChild(c):(u=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(c):(d=A("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[c]),u.appendChild(d)))}))})(l,this.chapters,e),D(l,"outline-chapters_fixed"),D(l,"outline-chapters_hidden"),this.positionPlaceholder(this.active),r=this.$el,this.offsetTop=d(r),this.offsetWidth=r.offsetWidth,this.isFixed()&&(this.sticky(),I("--outline-chapters-width",`${this.offsetWidth}px`)),i(s)&&s.call(this),this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(Q(e,"padding-top"),10),o=parseInt(Q(e,"border-top-width"),10),n=parseInt(Q(s,"padding-top"),10),h=parseInt(Q(s,"margin-top"),10),a=parseInt(Q(s,"border-top-width"),10);let c,d=r.offsetHeight,u=0;return l&&(u+=l),n&&(u+=n),h&&(u+=h),o&&(u+=o),a&&(u+=a),c=d*t,i.style.cssText=`transform: translateY(${u+c}px);height:${d}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&D(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,U(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let o;return this.isFixed()?(o=l>=r,o?U(s,e):D(s,e),i(t)&&t.call(this,this.isClosed(),o),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return I("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(D(l,e),D(r,e),n((()=>{D(l,t),D(r,t)}),30)):D(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(U(l,t),U(r,t),n((()=>{U(l,e),U(r,e)}))):U(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&n((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(W.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,n={rootMargin:e.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),n),a=o(s)?s:document;return s&&(n.root=s),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=n((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],o=document.querySelector(`#${l}`),h=d(o)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),n((()=>{this.playing=!1,w("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),n((()=>{this.scrollTo(h,u),this.highlight(r)}),10)):(this.scrollTo(h,u),this.highlight(r)),$(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=n((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),w("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=n((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),y(t,".outline-chapters__anchor","click",this.onSelect,this,!0),P(i,"scroll",this.onScroll,this,!0),this.isSticky()&&P(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),b(e,"click",this.onSelect),b(r,"scroll",this.onScroll),this.isSticky()&&P(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}W.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const V=(t,e=!0)=>{const s=O(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=A("a",{className:"outline-toolbar__anchor",href:t.link},[s]),r=A("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return U(s,"outline-toolbar__icon"),e&&U(r,"outline-toolbar_rounded"),t.disabled&&U(r,"outline-toolbar_disabled"),r},J="outline-toolbar_disabled",Y="outline-toolbar_hidden";class G extends l{constructor(t){super(),this.attrs=G.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,M(i,s)?D(i,s):U(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),r=this.attr("placement"),l=document.createDocumentFragment(),o=document.createDocumentFragment();return L(),e.forEach((t=>{const e=V(t,s);l.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=A("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},[l]),o.appendChild(this.$el),document.body.appendChild(o),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),l=t.action,o=document.createDocumentFragment();let n;return r(t)?(s.push(t),o.appendChild(V(t))):T(t)&&t.forEach((t=>{o.appendChild(V(t))})),e.appendChild(o),l&&i(l.handler)&&(n=l.type||"click",y(e,`.${t.name}`,n,l.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,o,n,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(o=l.type||"click",n=l.handler),e?(D(h,J),o&&n&&y(s,`.${t}`,o,n)):(U(h,J),o&&n&&b(s,o,n)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(U(this.$el,J),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,D(this.$el,J),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),D(l,Y)}else D(r,Y),this.closed=!1,i(e)&&n((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),U(l,Y)}else U(r,Y),this.closed=!0,i(e)&&n((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(G.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(V(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const r=e.action;let l,o,n,h;if(this.disabled)return!1;r&&(o=r.handler,t(o)&&(h=o,r.handler=function(){w(h,e.name)},o=r.handler),l=r.type||"click",n=r.context),i(o)&&y(s,`.${e.name}`,l,o,n||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let r,l;if(this.disabled)return!1;s&&(l=s.handler,r=s.type||"click"),i(l)&&b(e,r,l)})),this}}G.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const K=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),X=(t,e,s=null)=>{const r=K();let l="symbol"==typeof t?t.toString():t;return i(e)?(v[l]||(v[l]=[]),v[l].push({topic:l,callback:e,context:s,token:r}),r):""},Z=t=>{if(!e(v,t))return!1;delete v[t]},tt=(t,e)=>{if(!E(t))return!1;e?(t=>{const e=Object.keys(v);if(!t||e.length<1)return!1;e.forEach((e=>{const s=v[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&Z(i)}))})(e):Z(t)};class et extends l{constructor(t){super(),this.attrs=et.DEFAULTS,this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,this.buttons=[],t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){return this._renderAnchors()._renderChapters()._renderToolbar(),this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),o=this.attr("afterScroll");return this.anchors=new F({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:o}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("position"),o=this.attr("placement"),n=this.attr("afterSticky"),h=this.attr("afterToggle"),a=this.attr("afterScroll"),c=this.count();let d,u=this.attr("parentElement");return c<1||(d={scrollElement:s,showCode:r,position:l,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:n,afterToggle:h,afterScroll:a},"relative"===l?(this.drawer=new R({placement:o,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),u=this.drawer.$main):d.customClass=i,d.parentElement=u,this.chapters=new W(d)),this}_renderToolbar(){const t=this.attr("placement"),e=this.attr("homepage"),s=this.attr("git"),i=this.attr("tags"),r=this.attr("issues"),l=this.attr("tools"),o=this.count(),n={name:"homepage",icon:"homepage",size:20,link:e},h={name:"github",icon:"github",size:20,link:s},a={name:"tags",icon:"tags",size:20,link:i},c={name:"issues",icon:"issues",size:20,link:r},d={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},u=[];return u.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),o>0&&u.push(d),e&&u.push(n),s&&u.push(h),i&&u.push(a),r&&u.push(c),l?.length>0&&u.push(...l),u.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.buttons=[...u],this.toolbar=new G({placement:t,buttons:u}),this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,s=this.chapters,r=this.count();return r>0&&(s.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&(s.highlight(0),s.playing=!1),i(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=a(this.attr("scrollElement")),s=this.toolbar,r=this.chapters,l=this.count(),o=Math.floor(e.scrollHeight-e.clientHeight);return l>0&&(r.playing=!0),this.scrollTo(o,(()=>{s.hide("down"),s.show("up"),l>0&&(r.highlight(l-1),r.playing=!1),i(t)&&t.call(s,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return c(s,t,e),this}toggle(){const t=this.attr("position"),e=this.toolbar,s=this.drawer,i=this.chapters;return this.count()<1||("relative"!==t?(i.toggle(),e.highlight("menu")):(e.toggle(),n((()=>{i.isInside()?i.toggle():s.toggle()})))),this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar,r=!1;const l=this.count();return this.removeListeners(),l>0&&(r=e.isOutside(),e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(et.DEFAULTS),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r {\r\n  return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n  const hasOwnProperty = Object.prototype.hasOwnProperty\r\n  return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n  return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n  return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from '../types/isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n  return (\r\n    (toString(o) === '[object Object]' ||\r\n      typeof o === 'object' ||\r\n      isFunction(o)) &&\r\n    o !== null\r\n  )\r\n}\r\n\r\nexport default isObject\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n  constructor(options) {\r\n    this.attrs = {}\r\n\r\n    if (options) {\r\n      this.initialize(options)\r\n    }\r\n  }\r\n\r\n  initialize(options) {\r\n    this.attr(options).render().addListeners()\r\n    return this\r\n  }\r\n\r\n  attr(prop, value) {\r\n    const attrs = this.attrs\r\n\r\n    if (isString(prop)) {\r\n      // 只能扩展 attrs 中已有的属性\r\n      if (value && hasOwn(attrs, prop)) {\r\n        // 更新单个配置信息\r\n        attrs[prop] = value\r\n        return this\r\n      }\r\n\r\n      // 只传递 prop 参数,则返回对应的属性值\r\n      return attrs[prop]\r\n    } else if (isObject(prop)) {\r\n      // 批量更新配置信息\r\n      extend(attrs, prop)\r\n\r\n      return this\r\n    } else if (arguments.length === 0) {\r\n      // 不传递参数,直接返回整个\r\n      return attrs\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  render() {\r\n    return this\r\n  }\r\n\r\n  destroy() {\r\n    this.removeListeners()\r\n    return this\r\n  }\r\n\r\n  reload(options) {\r\n    this.destroy().initialize(this.attr(options))\r\n    return this\r\n  }\r\n\r\n  addListeners() {\r\n    return this\r\n  }\r\n\r\n  removeListeners() {\r\n    return this\r\n  }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n  const keys = Object.keys(source)\r\n\r\n  keys.forEach((prop) => {\r\n    if (hasOwn(source, prop)) {\r\n      origin[prop] = source[prop]\r\n    }\r\n  })\r\n}\r\n\r\nexport default extend\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n  return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n  if (!isFunction(fn)) {\r\n    return false\r\n  }\r\n\r\n  return setTimeout(() => {\r\n    fn()\r\n  }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n  return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n  let $rootElements\r\n  let $scrollElement\r\n\r\n  if (!scrollElement) {\r\n    $rootElements = document.querySelectorAll('html,body')\r\n    $scrollElement =\r\n      $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n        ? $rootElements[0]\r\n        : $rootElements[1]\r\n  } else {\r\n    if (isString(scrollElement)) {\r\n      $scrollElement = document.querySelector(scrollElement)\r\n    } else if (isElement(scrollElement)) {\r\n      $scrollElement = scrollElement\r\n    }\r\n  }\r\n\r\n  return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n  const $scrollElement = _getScrollElement(scrollElement)\r\n  let scrollTop = $scrollElement.scrollTop\r\n  let step = 0\r\n  const distance = top - scrollTop\r\n  const MAX_HEIGHT = $scrollElement.scrollHeight\r\n  const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n  const stop = (top) => {\r\n    if (isFunction(afterStop)) {\r\n      afterStop(top)\r\n    }\r\n\r\n    return false\r\n  }\r\n  const play = () => {\r\n    step += 1\r\n\r\n    // 向上滚动\r\n    if (distance < 0) {\r\n      scrollTop -= easeInQuad(step)\r\n      $scrollElement.scrollTop = scrollTop\r\n\r\n      if (scrollTop <= top) {\r\n        $scrollElement.scrollTop = top\r\n        return stop(top)\r\n      }\r\n    } else {\r\n      scrollTop += easeInQuad(step)\r\n      $scrollElement.scrollTop = scrollTop\r\n\r\n      if (scrollTop >= MAX_TOP) {\r\n        $scrollElement.scrollTop = MAX_TOP\r\n        return stop(MAX_TOP)\r\n      }\r\n    }\r\n\r\n    requestAnimationFrame(play)\r\n  }\r\n\r\n  requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n  let top = el.offsetTop\r\n\r\n  if (el.offsetParent !== null) {\r\n    top += offsetTop(el.offsetParent)\r\n  }\r\n\r\n  return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n  const sel = selector.replace(/^>/i, '')\r\n\r\n  if (!selector || !sel || !el) {\r\n    return false\r\n  }\r\n\r\n  /* istanbul ignore else */\r\n  if (el.matches) {\r\n    return el.matches(sel)\r\n  } else if (el.msMatchesSelector) {\r\n    return el.msMatchesSelector(sel)\r\n  } else {\r\n    return false\r\n  }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n  return el.host && el !== document && el.host.nodeType\r\n    ? el.host\r\n    : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n  'focusout',\r\n  'blur',\r\n  'focusin',\r\n  'focus',\r\n  'load',\r\n  'unload',\r\n  'mouseenter',\r\n  'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n  /* istanbul ignore else */\r\n  if (fn._delegateListener) {\r\n    fn = fn._delegateListener\r\n    delete fn._delegateListener\r\n  }\r\n\r\n  // 移除缓存的 _listeners 数据\r\n  _delete(el, type, fn)\r\n\r\n  el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n  const listeners = el._listeners\r\n  let index = -1\r\n\r\n  if (listeners.length < 1) {\r\n    return false\r\n  }\r\n\r\n  // 移除缓存的 _listeners 数据\r\n  listeners.forEach((listener, i) => {\r\n    const handler = listener.fn\r\n\r\n    if (type === listener.type) {\r\n      index = i\r\n\r\n      if (handler === fn) {\r\n        index = i\r\n      }\r\n    }\r\n  })\r\n\r\n  /* istanbul ignore else */\r\n  if (index > -1) {\r\n    listeners.splice(index, 1)\r\n  }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n  const $element = isString(el) ? document.querySelector(el) : el\r\n  const $children = $element.childNodes\r\n  const listeners = getListeners($element, type)\r\n\r\n  listeners.forEach((listener) => {\r\n    _off($element, listener.type, listener.fn)\r\n  })\r\n\r\n  if (\r\n    (recurse || type === true || arguments.length === 1) &&\r\n    $element &&\r\n    $children\r\n  ) {\r\n    $children.forEach(($child) => {\r\n      if (isElement($child)) {\r\n        purgeElement($child, type, recurse)\r\n      }\r\n    })\r\n  }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n  let listeners = el._listeners || []\r\n\r\n  if (isString(type) && type) {\r\n    listeners = listeners.filter((listener) => {\r\n      return listener.type === type\r\n    })\r\n  }\r\n\r\n  return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n  // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n  if (!isFunction(fn)) {\r\n    return purgeElement(el, type)\r\n  }\r\n\r\n  _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n  // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n  const listener = function (evt) {\r\n    const target = getTarget(evt)\r\n    // 通过 Element.matches 方法获得点击的目标元素\r\n    const delegateTarget = closest(target, selector, el)\r\n    let overrideContext = context || el\r\n\r\n    evt.delegateTarget = delegateTarget\r\n\r\n    // 当设置为 true 时,则事件处理器回调函数的\r\n    // this 上下文指向为 data 对象\r\n    if (context === true) {\r\n      overrideContext = data\r\n    }\r\n\r\n    /* istanbul ignore else */\r\n    if (delegateTarget) {\r\n      // 仅触发一次\r\n      /* istanbul ignore else */\r\n      if (once === true) {\r\n        off(el, type, listener)\r\n      }\r\n\r\n      fn.call(overrideContext, evt, data)\r\n    }\r\n  }\r\n\r\n  if (!el._listeners) {\r\n    el._listeners = []\r\n  }\r\n\r\n  // 缓存 options 元素绑定的事件处理器\r\n  el._listeners.push({\r\n    el,\r\n    selector,\r\n    type,\r\n    fn: listener,\r\n    data,\r\n    context,\r\n    capture\r\n  })\r\n\r\n  // 缓存包装后的事件处理器\r\n  fn._delegateListener = listener\r\n\r\n  el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n  const target = evt.target\r\n\r\n  return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n  if (el && el.nodeType === 3) {\r\n    return el.parentNode\r\n  }\r\n\r\n  return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n  const context = ctx || document\r\n\r\n  if (!el) {\r\n    return null\r\n  }\r\n\r\n  do {\r\n    /* istanbul ignore else */\r\n    if (\r\n      (selector != null &&\r\n        (selector.startsWith('>')\r\n          ? el.parentNode === context && matches(el, selector)\r\n          : matches(el, selector))) ||\r\n      (includeCTX && el === context)\r\n    ) {\r\n      return el\r\n    }\r\n\r\n    /* istanbul ignore else */\r\n    if (el === context) {\r\n      break\r\n    }\r\n\r\n    /* jshint boss:true */\r\n  } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n * 
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} data - (必须)数据对象\r\n * @param {Boolean} async - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isArray from './types/isArray'\r\n\r\n/**\r\n * 绘制 SVG Sprites 图标集\r\n * ========================================================================\r\n * @method paintSvgSprites\r\n * @param {Array} [symbols] - (可选)symbols 图标数组\r\n * 传递 symbols - 绘制 symbols + SYMBOLS 的图标集\r\n * 不传递 symbols - 仅绘制默认 SYMBOLS 图标集\r\n */\r\nexport const paintSvgSprites = (symbols = []) => {\r\n const SYMBOLS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n ]\r\n const sprites =\r\n isArray(symbols) && symbols.length > 0 ? SYMBOLS.concat(symbols) : SYMBOLS\r\n const $body = document.body\r\n let $icons = document.querySelector('#svg-sprites')\r\n\r\n if ($icons) {\r\n $icons.innerHTML = sprites.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createSvgIcon\r\n * @param {String} name\r\n * @param {Number|String|Array} [size]\r\n * @param {String} [color]\r\n * @param {String} [iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nexport const createSvgIcon = (\r\n name,\r\n size = 0,\r\n color = '',\r\n iconSet = 'outline'\r\n) => {\r\n const binds = iconSet\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const svg =\r\n `` +\r\n `` +\r\n ``\r\n const $icon = document.createElement('i')\r\n\r\n $icon.className = 'outline-icon'\r\n $icon.innerHTML = svg\r\n\r\n return $icon\r\n}\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import hasOwn from '../lang/hasOwn'\r\nimport isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttribute from './setAttribute'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array} attrs - 属性对象或者子节点\r\n * @param {Array} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n Object.keys(attrs).forEach((attr) => {\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute($el, attr, attrs[attr])\r\n }\r\n })\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(/^\\d+(?:(\\.?\\d*)*\\s?)?/gi, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n $heading.removeChild($anchor)\r\n}\r\n\r\nexport default _resetHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\nconst getChapters = (headings, showCode = true) => {\r\n let previous = 1\r\n let level = 0\r\n const chapters = []\r\n\r\n headings.forEach((heading, i) => {\r\n const headingLevel = heading.tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text: stripTags(trim(heading.innerHTML))\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChapters\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","const _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = chapters.filter((b) => b.pid === c.id)\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import Base from './base'\r\n\r\n// 在文章的标题生成 anchor 链接\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport publish from './utils/observer/emit'\r\nimport { paintSvgSprites } from './utils/icons'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _resetHeading from './_resetHeading'\r\nimport getChapters from './getChapters'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Anchors.DEFAULTS\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n this.chapters = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let selector\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n selector = this.attr('selector')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = [...$articleElement.querySelectorAll(selector)]\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n this.chapters = getChapters(this.$headings)\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const chapters = this.chapters\r\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const $headings = this.$headings\r\n const chapters = this.getChapters()\r\n\r\n paintSvgSprites()\r\n\r\n $headings.forEach(($heading, i) => {\r\n const chapterCode = chapters[i].code\r\n _updateHeading($heading, i, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL\r\n })\r\n })\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n const $headings = this.$headings\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n $headings.forEach(($heading) => {\r\n _resetHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n this.attr(Anchors.DEFAULTS)\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n this.chapters = []\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n}\r\n\r\nexport default Anchors\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttribute from './utils/dom/setAttribute'\r\n\r\nimport { createSvgIcon } from './utils/icons'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const keys = Object.keys(attrs)\r\n const text = trim($heading.innerHTML)\r\n let $anchor\r\n let $icon\r\n\r\n keys.forEach((prop) => {\r\n setAttribute($heading, prop, attrs[prop])\r\n })\r\n\r\n if (showCode) {\r\n $heading.innerHTML = chapterCode + ' ' + text\r\n }\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $icon = createSvgIcon('hash')\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: anchorURL ? anchorURL : `#${headingId}`,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n [$icon]\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport isFunction from './utils/types/isFunction'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport { paintSvgSprites, createSvgIcon } from './utils/icons'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Drawer.DEFAULTS\r\n this.title = ''\r\n this.closed = true\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const customClass = this.attr('customClass')\r\n const $fragment = document.createDocumentFragment()\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paintSvgSprites()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n [this.title]\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n [createSvgIcon('close', 20)]\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__main'\r\n },\r\n ['']\r\n )\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement(\r\n 'footer',\r\n {\r\n className: 'outline-drawer__footer'\r\n },\r\n ['']\r\n )\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__overlay'\r\n },\r\n ['']\r\n )\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n $fragment.appendChild($el)\r\n document.body.appendChild($fragment)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n\r\n this.attrs = Drawer.DEFAULTS\r\n this.title = ''\r\n this.closed = false\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n}\r\n\r\nexport default Drawer\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import Base from './base'\r\n\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport publish from './utils/observer/emit'\r\n\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport _paintChapters from './_paintChapters'\r\n\r\nclass Chapters extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Chapters.DEFAULTS\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.chapters = []\r\n this.closed = false\r\n this.active = 0\r\n this.offsetTop = 0\r\n this.offsetWidth = 0\r\n this.$active = null\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.playing = false\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n _paintEdge() {\r\n const STICKY = 'outline-chapters_sticky'\r\n const FIXED = 'outline-chapters_fixed'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const title = this.attr('title')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-chapters__title'\r\n },\r\n [title]\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement(\r\n 'ul',\r\n {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-chapters__list ${FIXED} ${HIDDEN}`\r\n },\r\n ['']\r\n )\r\n this.$list = $list\r\n\r\n $placeholder = createElement(\r\n 'div',\r\n {\r\n className: 'outline-chapters__placeholder'\r\n },\r\n ['']\r\n )\r\n this.$placeholder = $placeholder\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-chapters__main'\r\n },\r\n [$list, $placeholder]\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-chapters',\r\n className: 'outline-chapters'\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n\r\n $parentElement.appendChild($el)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const FIXED = 'outline-chapters_fixed'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const chapters = this.attr('chapters')\r\n const showCode = this.attr('showCode')\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n let $el\r\n let $list\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this._paintEdge()\r\n\r\n $list = this.$list\r\n _paintChapters($list, this.chapters, showCode)\r\n removeClass($list, FIXED)\r\n removeClass($list, HIDDEN)\r\n this.positionPlaceholder(this.active)\r\n\r\n $el = this.$el\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n this.onObserver()\r\n\r\n return this\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-chapters__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n // top:calc(${offsetTop}px + ${top}px);\r\n $placeholder.style.cssText = `transform: translateY(${\r\n offsetTop + top\r\n }px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\r\n const HIGHLIGHT = 'outline-chapters_active'\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n this.$active = $anchor\r\n addClass(this.$active, HIGHLIGHT)\r\n\r\n this.positionPlaceholder(this.active)\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-chapters_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-chapters_folded'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const opened = this.attr('afterOpened')\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n removeClass($parent, HIDDEN)\r\n removeClass($el, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n removeClass($el, FOLDED)\r\n }, 30)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-chapters_folded'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const closed = this.attr('afterClosed')\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n addClass($parent, FOLDED)\r\n addClass($el, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n addClass($el, HIDDEN)\r\n })\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n this.$parentElement.removeChild(this.$el)\r\n\r\n this.attr(Chapters.DEFAULTS)\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetTop = 0\r\n this.$active = null\r\n this.closed = false\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n let timer = null\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (timer) {\r\n clearTimeout(timer)\r\n }\r\n\r\n timer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at($element, 'resize', this.onResize, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n\r\n if (this.isSticky()) {\r\n at($element, 'resize', this.onResize)\r\n }\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nChapters.DEFAULTS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n}\r\n\r\nexport default Chapters\r\n","import createElement from './utils/dom/createElement'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const byId = (id) => document.getElementById(id)\r\n\r\n chapters.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const rel = chapter.rel\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-chapters__text'\r\n },\r\n [chapter.text]\r\n )\r\n const $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-chapters__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id\r\n },\r\n [$text]\r\n )\r\n let $code\r\n let $li\r\n let $ul\r\n let $parent\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-chapters__code',\r\n 'data-id': id\r\n },\r\n [chapter.code]\r\n )\r\n\r\n $link.insertBefore($code, $link.firstChild)\r\n }\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-chapters__item',\r\n 'data-id': id\r\n },\r\n [$link]\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $parent = byId(`chapter-${pid}`)\r\n $ul = byId(`subject-${pid}`)\r\n\r\n if (!$ul) {\r\n $ul = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-chapters__subject'\r\n },\r\n [$li]\r\n )\r\n\r\n $parent.appendChild($ul)\r\n } else {\r\n $ul.appendChild($li)\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport default _paintChapters\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","import { createSvgIcon } from './utils/icons'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = createSvgIcon(button.icon, button.size)\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n [$icon]\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import Base from './base'\r\n\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport publish from './utils/observer/emit'\r\nimport { paintSvgSprites } from './utils/icons'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Toolbar.DEFAULTS\r\n this.$el = null\r\n this.disabled = false\r\n this.closed = false\r\n this.buttons = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n created = this.attr('created')\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isDisabled(name) {\r\n const buttons = this.attr('buttons')\r\n let button\r\n\r\n if (name) {\r\n button = buttons.find((option) => option.name === name)\r\n\r\n return button?.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n highlight(name) {\r\n const button = this.buttons.find((item) => item.name === name)\r\n const ACTIVE = 'outline-toolbar_active'\r\n let $button\r\n\r\n if ($button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const rounded = this.attr('rounded')\r\n const placement = this.attr('placement')\r\n const $buttons = document.createDocumentFragment()\r\n const $fragment = document.createDocumentFragment()\r\n\r\n paintSvgSprites()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n\r\n $buttons.appendChild($button)\r\n this.buttons.push({\r\n name: button.name,\r\n $el: $button\r\n })\r\n })\r\n\r\n this.$el = createElement(\r\n 'div',\r\n {\r\n id: 'outline-toolbar',\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n },\r\n [$buttons]\r\n )\r\n $fragment.appendChild(this.$el)\r\n document.body.appendChild($fragment)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const action = button.action\r\n const $fragment = document.createDocumentFragment()\r\n let type\r\n\r\n if (isObject(button)) {\r\n buttons.push(button)\r\n $fragment.appendChild(_createButton(button))\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n $fragment.appendChild(_createButton(item))\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n if (action && isFunction(action.handler)) {\r\n type = action.type || 'click'\r\n on($el, `.${button.name}`, type, action.handler)\r\n }\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const button = buttons.find((option) => option.name === name)\r\n let index = -1\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button, i) => {\r\n if (button.name === name) {\r\n index = i\r\n }\r\n })\r\n\r\n if (index > -1) {\r\n this.attr().buttons.splice(index, 1)\r\n }\r\n\r\n $button = $el.querySelector(`.${name}`)\r\n this.switch(name, false)\r\n $el.removeChild($button)\r\n\r\n return this\r\n }\r\n\r\n switch(name, enabled) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const button = buttons.find((option) => option.name === name)\r\n let action\r\n let type\r\n let listener\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n buttons.forEach((option) => {\r\n if (option.name === name) {\r\n button.disabled = !enabled\r\n }\r\n })\r\n\r\n action = button.action\r\n $button = $el.querySelector(`.${name}`)\r\n\r\n if (action) {\r\n type = action.type || 'click'\r\n listener = action.handler\r\n }\r\n\r\n if (enabled) {\r\n removeClass($button, DISABLED)\r\n\r\n if (type && listener) {\r\n on($el, `.${name}`, type, listener)\r\n }\r\n } else {\r\n addClass($button, DISABLED)\r\n\r\n if (type && listener) {\r\n off($el, type, listener)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this.switch(name, false)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this.switch(name, true)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.attr('buttons').find((option) => option.name === name)\r\n const $el = this.$el\r\n let $button\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = $el.querySelector(`.${name}`)\r\n removeClass($button, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.attr('buttons').find((option) => option.name === name)\r\n const $el = this.$el\r\n let $button\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n $button = $el.querySelector(`.${name}`)\r\n addClass($button, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n let $el = this.$el\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n document.body.removeChild($el)\r\n $el = null\r\n\r\n this.attr(Toolbar.DEFAULTS)\r\n this.disabled = false\r\n this.closed = false\r\n this.buttons = []\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons') || []\r\n\r\n this.removeListeners()\r\n $el.innerHTML = ''\r\n\r\n buttons.forEach((button) => {\r\n this.$el.appendChild(_createButton(button))\r\n })\r\n\r\n this.addListeners()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons')\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button) => {\r\n const action = button.action\r\n const disabled = this.disabled\r\n let type\r\n let listener\r\n let context\r\n let command\r\n\r\n if (disabled) {\r\n return false\r\n }\r\n\r\n if (action) {\r\n listener = action.handler\r\n if (isString(listener)) {\r\n command = listener\r\n action.handler = function () {\r\n publish(command, button.name)\r\n }\r\n listener = action.handler\r\n }\r\n\r\n type = action.type || 'click'\r\n context = action.context\r\n }\r\n\r\n if (isFunction(listener)) {\r\n on($el, `.${button.name}`, type, listener, context || this, true)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons')\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button) => {\r\n const action = button.action\r\n const disabled = this.disabled\r\n let type\r\n let listener\r\n\r\n if (disabled) {\r\n return false\r\n }\r\n\r\n if (action) {\r\n listener = action.handler\r\n type = action.type || 'click'\r\n }\r\n\r\n if (isFunction(listener)) {\r\n off($el, type, listener)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n}\r\n\r\nexport default Toolbar\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import Base from './base'\r\nimport Anchors from './anchors'\r\nimport Drawer from './drawer'\r\nimport Chapters from './chapters'\r\nimport Toolbar from './toolbar'\r\n\r\nimport later from './utils/lang/later'\r\nimport isFunction from './utils/types/isFunction'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Outline extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Outline.DEFAULTS\r\n this.anchors = null\r\n this.drawer = null\r\n this.chapters = null\r\n this.toolbar = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n return this.anchors.getChapters(isTreeStructured)\r\n }\r\n\r\n count() {\r\n return this.anchors.count()\r\n }\r\n\r\n render() {\r\n this._renderAnchors()._renderChapters()._renderToolbar()\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderChapters() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let CHAPTERS_OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n CHAPTERS_OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n } else {\r\n CHAPTERS_OPTIONS.customClass = customClass\r\n }\r\n\r\n CHAPTERS_OPTIONS.parentElement = parentElement\r\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n type: 'click',\r\n handler: 'toolbar:action:up'\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'menu',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n type: 'click',\r\n handler: 'toolbar:action:toggle'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n type: 'click',\r\n handler: 'toolbar:action:down'\r\n }\r\n }\r\n const buttons = []\r\n\r\n buttons.push(UP)\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n buttons.push(DOWN)\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons: buttons\r\n })\r\n\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const chapters = this.chapters\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n chapters.highlight(0)\r\n chapters.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n chapters.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\r\n const toolbar = this.toolbar\r\n const chapters = this.chapters\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n chapters.highlight(count - 1)\r\n chapters.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n chapters.playing = true\r\n }\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n const scrollElement = this.attr('scrollElement')\r\n scrollTo(scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n toggle() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const chapters = this.chapters\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n chapters.toggle()\r\n toolbar.highlight('menu')\r\n } else {\r\n toolbar.toggle()\r\n\r\n later(() => {\r\n if (chapters.isInside()) {\r\n chapters.toggle()\r\n } else {\r\n drawer.toggle()\r\n }\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n let anchors = this.anchors\r\n let chapters = this.chapters\r\n let drawer = this.drawer\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n const count = this.count()\r\n\r\n this.removeListeners()\r\n\r\n if (count > 0) {\r\n isOutside = chapters.isOutside()\r\n\r\n chapters.destroy()\r\n chapters = null\r\n\r\n if (isOutside) {\r\n drawer.destroy()\r\n drawer = null\r\n }\r\n }\r\n\r\n toolbar.destroy()\r\n toolbar = null\r\n\r\n anchors.destroy()\r\n anchors = null\r\n\r\n this.attr(Outline.DEFAULTS)\r\n\r\n return this\r\n }\r\n\r\n onToggle() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onScrollTop() {\r\n this.toTop()\r\n return this\r\n }\r\n\r\n onScrollBottom() {\r\n this.toBottom()\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n const toolbar = this.toolbar\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n } else if (current >= max) {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n } else if (current > min && current < max) {\r\n toolbar.show('up')\r\n toolbar.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n subscribe('toolbar:update', this.onToolbarUpdate, this)\r\n subscribe('toolbar:action:up', this.onScrollTop, this)\r\n subscribe('toolbar:action:toggle', this.onToggle, this)\r\n subscribe('toolbar:action:down', this.onScrollBottom, this)\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n unsubscribe('toolbar:update')\r\n unsubscribe('toolbar:action:up')\r\n unsubscribe('toolbar:action:toggle')\r\n unsubscribe('toolbar:action:down')\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n title: '目录',\r\n scrollElement: 'html,body',\r\n position: 'relative',\r\n parentElement: '#aside',\r\n placement: 'rtl',\r\n showCode: true,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null\r\n}\r\n\r\nif (window.jQuery) {\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n jQuery.extend(jQuery.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = jQuery(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n jQuery.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","stopPropagation","preventDefault","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","isArray","Array","paintSvgSprites","symbols","SYMBOLS","sprites","concat","$body","body","$icons","innerHTML","join","createElement","insertBefore","firstChild","createSvgIcon","name","size","color","iconSet","binds","width","height","defaultRules","svg","$icon","className","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","removeClass","remove","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","id","rel","groups","group","JSON","stringify","cb","code","String","c","b","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","anchorURL","chapterCode","headingId","href","_updateHeading","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","publish","min","addClass","add","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","$list","$placeholder","$parentElement","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","contents","calculateStickyHeight","byId","getElementById","chapter","$text","$link","$code","$li","$ul","_paintChapters","positionPlaceholder","sticky","onObserver","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","window","innerHeight","show","FOLDED","HIDDEN","hide","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","icon","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","find","option","ACTIVE","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","guid","uuid","prefix","token","subject","_removeSubscriber","execution","j","_removeSubscriberByToken","Outline","anchors","drawer","toolbar","_renderAnchors","_renderChapters","_renderToolbar","CHAPTERS_OPTIONS","homepage","git","tags","issues","HOME","GIT","TAGS","ISSUES","MENU","toTop","toBottom","floor","onToggle","onScrollTop","onScrollBottom","onToolbarUpdate","ceil","subscribe","unsubscribe","jQuery","extend","outline","$article"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"outline.min.js","sources":["../../src/utils/types/isString.js","../../src/utils/lang/hasOwn.js","../../src/utils/lang/toString.js","../../src/utils/types/isFunction.js","../../src/utils/types/isObject.js","../../src/base.js","../../src/utils/lang/extend.js","../../src/utils/types/isElement.js","../../src/utils/lang/later.js","../../src/utils/lang/easeInQuad.js","../../src/utils/dom/_getScrollElement.js","../../src/utils/dom/scrollTo.js","../../src/utils/dom/offsetTop.js","../../src/utils/dom/matches.js","../../src/utils/dom/getParentOrHost.js","../../src/utils/event/enum.js","../../src/utils/event/_off.js","../../src/utils/event/_delete.js","../../src/utils/event/purgeElement.js","../../src/utils/event/getListeners.js","../../src/utils/event/off.js","../../src/utils/event/on.js","../../src/utils/event/getTarget.js","../../src/utils/dom/resolveTextNode.js","../../src/utils/dom/closest.js","../../src/utils/event/stop.js","../../src/utils/observer/_subscribers.js","../../src/utils/observer/_hasDirectSubscribersFor.js","../../src/utils/observer/has.js","../../src/utils/observer/_hasSubscribers.js","../../src/utils/observer/emit.js","../../src/utils/types/isTypedArray.js","../../src/utils/types/isArray.js","../../src/utils/icons/symbols.js","../../src/utils/icons/defaults.js","../../src/utils/icons/getSymbols.js","../../src/utils/icons/getSymbol.js","../../src/utils/icons/paint.js","../../src/utils/icons/add.js","../../src/utils/lang/trim.js","../../src/utils/types/isDOM.js","../../src/utils/types/isHTMLCollection.js","../../src/utils/types/isFragment.js","../../src/utils/types/isTextNode.js","../../src/utils/dom/setAttribute.js","../../src/utils/dom/createElement.js","../../src/utils/types/isSVG.js","../../src/utils/icons/icon.js","../../src/utils/icons/createElement.js","../../src/utils/dom/hasClass.js","../../src/utils/dom/removeClass.js","../../src/_resetHeading.js","../../src/utils/types/isEmpty.js","../../src/getChapters.js","../../src/utils/lang/stripTags.js","../../src/_getChapterParentIdByDiffer.js","../../src/_getChaptersWithCode.js","../../src/anchors.js","../../src/utils/lang/toTree.js","../../src/_updateHeading.js","../../src/utils/dom/addClass.js","../../src/utils/dom/setProperty.js","../../src/zIndex.js","../../src/drawer.js","../../src/utils/event/at.js","../../src/utils/dom/getStyle.js","../../src/chapters.js","../../src/_paintChapters.js","../../src/utils/dom/intersection.js","../../src/_createButton.js","../../src/toolbar.js","../../src/utils/lang/guid.js","../../src/utils/observer/on.js","../../src/utils/observer/_removeSubscriber.js","../../src/utils/observer/off.js","../../src/utils/observer/_removeSubscriberByToken.js","../../src/outline.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from '../types/isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n requestAnimationFrame(play)\r\n }\r\n\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n return purgeElement(el, type)\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} data - (必须)数据对象\r\n * @param {Boolean} async - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import hasOwn from '../lang/hasOwn'\r\nimport isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttribute from './setAttribute'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array} attrs - 属性对象或者子节点\r\n * @param {Array} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n Object.keys(attrs).forEach((attr) => {\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute($el, attr, attrs[attr])\r\n }\r\n })\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg =\r\n `` +\r\n `` +\r\n ``\r\n }\r\n\r\n $icon.className = 'outline-icon'\r\n $icon.innerHTML = svg\r\n\r\n if (isSVG(name)) {\r\n $svg = $icon.querySelector('svg')\r\n $svg.setAttribute('aria-hidden', 'true')\r\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\r\n $svg.setAttribute('class', 'outline-icon__svg')\r\n $svg.setAttribute('width', '200')\r\n $svg.setAttribute('height', '200')\r\n $svg.style = cssRules\r\n }\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(/^\\d+(?:(\\.?\\d*)*\\s?)?/gi, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n $heading.removeChild($anchor)\r\n}\r\n\r\nexport default _resetHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\nconst getChapters = (headings, showCode = true) => {\r\n let previous = 1\r\n let level = 0\r\n const chapters = []\r\n\r\n headings.forEach((heading, i) => {\r\n const headingLevel = heading.tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text: stripTags(trim(heading.innerHTML))\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChapters\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","const _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = chapters.filter((b) => b.pid === c.id)\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import Base from './base'\r\n\r\n// 在文章的标题生成 anchor 链接\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport publish from './utils/observer/emit'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _resetHeading from './_resetHeading'\r\nimport getChapters from './getChapters'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Anchors.DEFAULTS\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n this.chapters = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let selector\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n selector = this.attr('selector')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = [...$articleElement.querySelectorAll(selector)]\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n this.chapters = getChapters(this.$headings)\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const chapters = this.chapters\r\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const $headings = this.$headings\r\n const chapters = this.getChapters()\r\n\r\n paint()\r\n\r\n $headings.forEach(($heading, i) => {\r\n const chapterCode = chapters[i].code\r\n _updateHeading($heading, i, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL\r\n })\r\n })\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n const $headings = this.$headings\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n $headings.forEach(($heading) => {\r\n _resetHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n this.attr(Anchors.DEFAULTS)\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n this.chapters = []\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n}\r\n\r\nexport default Anchors\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttribute from './utils/dom/setAttribute'\r\n\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const keys = Object.keys(attrs)\r\n const text = trim($heading.innerHTML)\r\n let $anchor\r\n let $icon\r\n\r\n keys.forEach((prop) => {\r\n setAttribute($heading, prop, attrs[prop])\r\n })\r\n\r\n if (showCode) {\r\n $heading.innerHTML = chapterCode + ' ' + text\r\n }\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $icon = icon('hash')\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: anchorURL ? anchorURL : `#${headingId}`,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n [$icon]\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport isFunction from './utils/types/isFunction'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport paint from './utils/icons/paint'\r\nimport icon from './utils/icons/icon'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Drawer.DEFAULTS\r\n this.title = ''\r\n this.closed = true\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const customClass = this.attr('customClass')\r\n const $fragment = document.createDocumentFragment()\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n [this.title]\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n [icon('close', { size: 20 })]\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__main'\r\n },\r\n ['']\r\n )\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement(\r\n 'footer',\r\n {\r\n className: 'outline-drawer__footer'\r\n },\r\n ['']\r\n )\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__overlay'\r\n },\r\n ['']\r\n )\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n $fragment.appendChild($el)\r\n document.body.appendChild($fragment)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n\r\n this.attrs = Drawer.DEFAULTS\r\n this.title = ''\r\n this.closed = false\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n}\r\n\r\nexport default Drawer\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import Base from './base'\r\n\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport publish from './utils/observer/emit'\r\n\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport _paintChapters from './_paintChapters'\r\n\r\nclass Chapters extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Chapters.DEFAULTS\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.chapters = []\r\n this.closed = false\r\n this.active = 0\r\n this.offsetTop = 0\r\n this.offsetWidth = 0\r\n this.$active = null\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.playing = false\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n _paintEdge() {\r\n const STICKY = 'outline-chapters_sticky'\r\n const FIXED = 'outline-chapters_fixed'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const title = this.attr('title')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-chapters__title'\r\n },\r\n [title]\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement(\r\n 'ul',\r\n {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-chapters__list ${FIXED} ${HIDDEN}`\r\n },\r\n ['']\r\n )\r\n this.$list = $list\r\n\r\n $placeholder = createElement(\r\n 'div',\r\n {\r\n className: 'outline-chapters__placeholder'\r\n },\r\n ['']\r\n )\r\n this.$placeholder = $placeholder\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-chapters__main'\r\n },\r\n [$list, $placeholder]\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-chapters',\r\n className: 'outline-chapters'\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n\r\n $parentElement.appendChild($el)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const FIXED = 'outline-chapters_fixed'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const chapters = this.attr('chapters')\r\n const showCode = this.attr('showCode')\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n let $el\r\n let $list\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this._paintEdge()\r\n\r\n $list = this.$list\r\n _paintChapters($list, this.chapters, showCode)\r\n removeClass($list, FIXED)\r\n removeClass($list, HIDDEN)\r\n this.positionPlaceholder(this.active)\r\n\r\n $el = this.$el\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n this.onObserver()\r\n\r\n return this\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-chapters__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n // top:calc(${offsetTop}px + ${top}px);\r\n $placeholder.style.cssText = `transform: translateY(${\r\n offsetTop + top\r\n }px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\r\n const HIGHLIGHT = 'outline-chapters_active'\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n this.$active = $anchor\r\n addClass(this.$active, HIGHLIGHT)\r\n\r\n this.positionPlaceholder(this.active)\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-chapters_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-chapters_folded'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const opened = this.attr('afterOpened')\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n removeClass($parent, HIDDEN)\r\n removeClass($el, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n removeClass($el, FOLDED)\r\n }, 30)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-chapters_folded'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const closed = this.attr('afterClosed')\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n addClass($parent, FOLDED)\r\n addClass($el, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n addClass($el, HIDDEN)\r\n })\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n this.$parentElement.removeChild(this.$el)\r\n\r\n this.attr(Chapters.DEFAULTS)\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetTop = 0\r\n this.$active = null\r\n this.closed = false\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n let timer = null\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (timer) {\r\n clearTimeout(timer)\r\n }\r\n\r\n timer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at($element, 'resize', this.onResize, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n\r\n if (this.isSticky()) {\r\n at($element, 'resize', this.onResize)\r\n }\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nChapters.DEFAULTS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n}\r\n\r\nexport default Chapters\r\n","import createElement from './utils/dom/createElement'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const byId = (id) => document.getElementById(id)\r\n\r\n chapters.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const rel = chapter.rel\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-chapters__text'\r\n },\r\n [chapter.text]\r\n )\r\n const $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-chapters__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id\r\n },\r\n [$text]\r\n )\r\n let $code\r\n let $li\r\n let $ul\r\n let $parent\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-chapters__code',\r\n 'data-id': id\r\n },\r\n [chapter.code]\r\n )\r\n\r\n $link.insertBefore($code, $link.firstChild)\r\n }\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-chapters__item',\r\n 'data-id': id\r\n },\r\n [$link]\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $parent = byId(`chapter-${pid}`)\r\n $ul = byId(`subject-${pid}`)\r\n\r\n if (!$ul) {\r\n $ul = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-chapters__subject'\r\n },\r\n [$li]\r\n )\r\n\r\n $parent.appendChild($ul)\r\n } else {\r\n $ul.appendChild($li)\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport default _paintChapters\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n [$icon]\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import Base from './base'\r\n\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport publish from './utils/observer/emit'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Toolbar.DEFAULTS\r\n this.$el = null\r\n this.disabled = false\r\n this.closed = false\r\n this.buttons = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n created = this.attr('created')\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isDisabled(name) {\r\n const buttons = this.attr('buttons')\r\n let button\r\n\r\n if (name) {\r\n button = buttons.find((option) => option.name === name)\r\n\r\n return button?.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n highlight(name) {\r\n const button = this.buttons.find((item) => item.name === name)\r\n const ACTIVE = 'outline-toolbar_active'\r\n let $button\r\n\r\n if ($button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const rounded = this.attr('rounded')\r\n const placement = this.attr('placement')\r\n const $buttons = document.createDocumentFragment()\r\n const $fragment = document.createDocumentFragment()\r\n\r\n paint()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n\r\n $buttons.appendChild($button)\r\n this.buttons.push({\r\n name: button.name,\r\n $el: $button\r\n })\r\n })\r\n\r\n this.$el = createElement(\r\n 'div',\r\n {\r\n id: 'outline-toolbar',\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n },\r\n [$buttons]\r\n )\r\n $fragment.appendChild(this.$el)\r\n document.body.appendChild($fragment)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const action = button.action\r\n const $fragment = document.createDocumentFragment()\r\n let type\r\n\r\n if (isObject(button)) {\r\n buttons.push(button)\r\n $fragment.appendChild(_createButton(button))\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n $fragment.appendChild(_createButton(item))\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n if (action && isFunction(action.handler)) {\r\n type = action.type || 'click'\r\n on($el, `.${button.name}`, type, action.handler)\r\n }\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const button = buttons.find((option) => option.name === name)\r\n let index = -1\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button, i) => {\r\n if (button.name === name) {\r\n index = i\r\n }\r\n })\r\n\r\n if (index > -1) {\r\n this.attr().buttons.splice(index, 1)\r\n }\r\n\r\n $button = $el.querySelector(`.${name}`)\r\n this.switch(name, false)\r\n $el.removeChild($button)\r\n\r\n return this\r\n }\r\n\r\n switch(name, enabled) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const button = buttons.find((option) => option.name === name)\r\n let action\r\n let type\r\n let listener\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n buttons.forEach((option) => {\r\n if (option.name === name) {\r\n button.disabled = !enabled\r\n }\r\n })\r\n\r\n action = button.action\r\n $button = $el.querySelector(`.${name}`)\r\n\r\n if (action) {\r\n type = action.type || 'click'\r\n listener = action.handler\r\n }\r\n\r\n if (enabled) {\r\n removeClass($button, DISABLED)\r\n\r\n if (type && listener) {\r\n on($el, `.${name}`, type, listener)\r\n }\r\n } else {\r\n addClass($button, DISABLED)\r\n\r\n if (type && listener) {\r\n off($el, type, listener)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this.switch(name, false)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this.switch(name, true)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.attr('buttons').find((option) => option.name === name)\r\n const $el = this.$el\r\n let $button\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = $el.querySelector(`.${name}`)\r\n removeClass($button, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.attr('buttons').find((option) => option.name === name)\r\n const $el = this.$el\r\n let $button\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n $button = $el.querySelector(`.${name}`)\r\n addClass($button, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n let $el = this.$el\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n document.body.removeChild($el)\r\n $el = null\r\n\r\n this.attr(Toolbar.DEFAULTS)\r\n this.disabled = false\r\n this.closed = false\r\n this.buttons = []\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons') || []\r\n\r\n this.removeListeners()\r\n $el.innerHTML = ''\r\n\r\n buttons.forEach((button) => {\r\n this.$el.appendChild(_createButton(button))\r\n })\r\n\r\n this.addListeners()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons')\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button) => {\r\n const action = button.action\r\n const disabled = this.disabled\r\n let type\r\n let listener\r\n let context\r\n let command\r\n\r\n if (disabled) {\r\n return false\r\n }\r\n\r\n if (action) {\r\n listener = action.handler\r\n if (isString(listener)) {\r\n command = listener\r\n action.handler = function () {\r\n publish(command, button.name)\r\n }\r\n listener = action.handler\r\n }\r\n\r\n type = action.type || 'click'\r\n context = action.context\r\n }\r\n\r\n if (isFunction(listener)) {\r\n on($el, `.${button.name}`, type, listener, context || this, true)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons')\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button) => {\r\n const action = button.action\r\n const disabled = this.disabled\r\n let type\r\n let listener\r\n\r\n if (disabled) {\r\n return false\r\n }\r\n\r\n if (action) {\r\n listener = action.handler\r\n type = action.type || 'click'\r\n }\r\n\r\n if (isFunction(listener)) {\r\n off($el, type, listener)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n}\r\n\r\nexport default Toolbar\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import Base from './base'\r\nimport Anchors from './anchors'\r\nimport Drawer from './drawer'\r\nimport Chapters from './chapters'\r\nimport Toolbar from './toolbar'\r\n\r\nimport later from './utils/lang/later'\r\nimport isFunction from './utils/types/isFunction'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Outline extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Outline.DEFAULTS\r\n this.anchors = null\r\n this.drawer = null\r\n this.chapters = null\r\n this.toolbar = null\r\n this.buttons = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n return this.anchors.getChapters(isTreeStructured)\r\n }\r\n\r\n count() {\r\n return this.anchors.count()\r\n }\r\n\r\n render() {\r\n this._renderAnchors()._renderChapters()._renderToolbar()\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderChapters() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let CHAPTERS_OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n CHAPTERS_OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n } else {\r\n CHAPTERS_OPTIONS.customClass = customClass\r\n }\r\n\r\n CHAPTERS_OPTIONS.parentElement = parentElement\r\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n type: 'click',\r\n handler: 'toolbar:action:up'\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'menu',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n type: 'click',\r\n handler: 'toolbar:action:toggle'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n type: 'click',\r\n handler: 'toolbar:action:down'\r\n }\r\n }\r\n const buttons = []\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n this.buttons = [...buttons]\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons: buttons\r\n })\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n const toolbar = this.toolbar\r\n const buttons = this.buttons\r\n buttons.splice(-1, 0, button)\r\n toolbar.attr({\r\n buttons\r\n })\r\n toolbar.refresh()\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.toolbar.remove(name)\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const chapters = this.chapters\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n chapters.highlight(0)\r\n chapters.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n chapters.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\r\n const toolbar = this.toolbar\r\n const chapters = this.chapters\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n chapters.highlight(count - 1)\r\n chapters.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n chapters.playing = true\r\n }\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n const scrollElement = this.attr('scrollElement')\r\n scrollTo(scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n toggle() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const chapters = this.chapters\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n chapters.toggle()\r\n toolbar.highlight('menu')\r\n } else {\r\n toolbar.toggle()\r\n\r\n later(() => {\r\n if (chapters.isInside()) {\r\n chapters.toggle()\r\n } else {\r\n drawer.toggle()\r\n }\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n let anchors = this.anchors\r\n let chapters = this.chapters\r\n let drawer = this.drawer\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n const count = this.count()\r\n\r\n this.removeListeners()\r\n\r\n if (count > 0) {\r\n isOutside = chapters.isOutside()\r\n\r\n chapters.destroy()\r\n chapters = null\r\n\r\n if (isOutside) {\r\n drawer.destroy()\r\n drawer = null\r\n }\r\n }\r\n\r\n toolbar.destroy()\r\n toolbar = null\r\n\r\n anchors.destroy()\r\n anchors = null\r\n\r\n this.attr(Outline.DEFAULTS)\r\n\r\n return this\r\n }\r\n\r\n onToggle() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onScrollTop() {\r\n this.toTop()\r\n return this\r\n }\r\n\r\n onScrollBottom() {\r\n this.toBottom()\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n const toolbar = this.toolbar\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n } else if (current >= max) {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n } else if (current > min && current < max) {\r\n toolbar.show('up')\r\n toolbar.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n subscribe('toolbar:update', this.onToolbarUpdate, this)\r\n subscribe('toolbar:action:up', this.onScrollTop, this)\r\n subscribe('toolbar:action:toggle', this.onToggle, this)\r\n subscribe('toolbar:action:down', this.onScrollBottom, this)\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n unsubscribe('toolbar:update')\r\n unsubscribe('toolbar:action:up')\r\n unsubscribe('toolbar:action:toggle')\r\n unsubscribe('toolbar:action:down')\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n title: '目录',\r\n scrollElement: 'html,body',\r\n position: 'relative',\r\n parentElement: '#aside',\r\n placement: 'rtl',\r\n showCode: true,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null\r\n}\r\n\r\nif (window.jQuery) {\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n jQuery.extend(jQuery.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = jQuery(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n jQuery.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","stopPropagation","preventDefault","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","isArray","Array","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","exec","iconName","getSymbol","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","className","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","isSVG","pattern","RegExp","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","hasClass","allClass","classList","contains","removeClass","remove","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","id","rel","groups","group","JSON","stringify","cb","code","String","c","b","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","anchorURL","chapterCode","headingId","href","_updateHeading","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","publish","min","addClass","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","$list","$placeholder","$parentElement","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","contents","calculateStickyHeight","byId","getElementById","chapter","$text","$link","$code","$li","$ul","_paintChapters","positionPlaceholder","sticky","onObserver","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","window","innerHeight","show","FOLDED","HIDDEN","hide","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","option","ACTIVE","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","guid","uuid","prefix","token","subject","_removeSubscriber","execution","j","_removeSubscriberByToken","Outline","anchors","drawer","toolbar","_renderAnchors","_renderChapters","_renderToolbar","CHAPTERS_OPTIONS","homepage","git","tags","issues","tools","HOME","GIT","TAGS","ISSUES","MENU","addButton","removeButton","toTop","toBottom","floor","onToggle","onScrollTop","onScrollBottom","onToolbarUpdate","ceil","subscribe","unsubscribe","jQuery","extend","outline","$article"],"mappings":"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"} \ No newline at end of file diff --git a/docs/relative.html b/docs/relative.html index 70303664..936542c4 100644 --- a/docs/relative.html +++ b/docs/relative.html @@ -119,6 +119,37 @@ // 侧边栏的 Toolbar 会多出一个 issues 图标的按钮 outline.reload({ issues: 'https://github.com/yaohaixiao/outline.js/issues' +})

tools

Description

Type:
Array
Default:
[]

可选,自定义的按钮配置项。tools 中的按钮会排列显示在 homepage, git, tags, issues 等按钮之后。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+// 侧边栏的 Toolbar 会多出一个 git 图标的按钮
+outline.reload({
+  git: 'https://github.com/yaohaixiao/outline.js',
+  tools: [
+    {
+      name: 'clean',
+      // 图标
+      icon: clean,
+      size: 20,
+      color: '#f00'
+      // link 指定按钮点击后页面的跳转地址
+      link: 'https://github.com/yaohaixiao',
+      // link 和 action 只能二选一
+      // action 指定按钮的处理方式
+      action: {
+        type: 'click',
+        // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+        context: outline,
+        handler: function() {
+          // 回调函数的处理逻辑
+        }
+      }
+    }
+  ]
 })

customClass

Description

Type:
String
Default:
''

可选,(DIYer福利)设置自定义样式的 class 名称:

  • '' - 采用默认 outline.js 的 UI 界面(默认值);
  • 设置自定义样式 - 自己根据需求设置个性化的 UI 界面;
// Default UI
 new Outline(Outline.DEFAULTS)
 
@@ -243,7 +274,11 @@
 const outline = new Outline(Outline.DEFAULTS)
 
 // 查看全部配置信息
-outline.attrs

anchors

Description

Type:
Object

Anchors 模块:类似 AnchorJS 基础功能模块,自动分析段落层级。

// 仅展示 API 中对外公开的方法和属性
+outline.attrs

buttons

Description

Type:
Array

存储的是 Outline 对象当前工具栏的完整的按钮配置信息:

// 设置默认配置项
+const outline = new Outline(Outline.DEFAULTS)
+
+// 查看全部按钮配置信息
+outline.buttons

anchors

Description

Type:
Object

Anchors 模块:类似 AnchorJS 基础功能模块,自动分析段落层级。

// 仅展示 API 中对外公开的方法和属性
 class Anchors extends Base {
   constructor(options) {
     super()
@@ -774,7 +809,61 @@
 }]
 
 outline.count()
-// -> 1 就是 getChapters() 返回数据的数量

toTop([afterScroll])

Description

toTop() 方法会控制页面(scrollElement)滚动到顶部。

Parameters

afterScroll
Type:
Function

(可选)页面停止滚动后的回调函数。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline({
+// -> 1 就是 getChapters() 返回数据的数量

addButton(button)

Description

addButton() 方法添加自定义的工具栏按钮。

Parameters

button
Type:
Object|Array

(必须)单个按钮的配置信息或者多个按钮的配置信息。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+outline.addButton({
+  name: 'clean',
+  // 图标
+  icon: clean,
+  size: 20,
+  color: '#f00'
+  // link 指定按钮点击后页面的跳转地址
+  link: 'https://github.com/yaohaixiao',
+  // link 和 action 只能二选一
+  // action 指定按钮的处理方式
+  action: {
+    type: 'click',
+    // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+    context: outline,
+    handler: function() {
+      // 回调函数的处理逻辑
+    }
+  }
+})

removeButton(name)

Description

removeButton() 方法移除工具栏按钮。

Parameters

name
Type:
String

(必须)按钮名称。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+outline.addButton({
+  name: 'clean',
+  // 图标
+  icon: clean,
+  size: 20,
+  color: '#f00'
+  // link 指定按钮点击后页面的跳转地址
+  link: 'https://github.com/yaohaixiao',
+  // link 和 action 只能二选一
+  // action 指定按钮的处理方式
+  action: {
+    type: 'click',
+    // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+    context: outline,
+    handler: function() {
+      // 回调函数的处理逻辑
+    }
+  }
+})
+
+setTimeout(() => {
+  outline.addButton('clean')
+}, 5000)

toTop([afterScroll])

Description

toTop() 方法会控制页面(scrollElement)滚动到顶部。

Parameters

afterScroll
Type:
Function

(可选)页面停止滚动后的回调函数。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline({
    article: '#article',
    title: 'Outline v2.0.0'
 })
diff --git a/docs/sticky.html b/docs/sticky.html
index 110ff05c..e4b244ce 100644
--- a/docs/sticky.html
+++ b/docs/sticky.html
@@ -119,6 +119,37 @@
 // 侧边栏的 Toolbar 会多出一个 issues 图标的按钮
 outline.reload({
   issues: 'https://github.com/yaohaixiao/outline.js/issues'
+})

tools

Description

Type:
Array
Default:
[]

可选,自定义的按钮配置项。tools 中的按钮会排列显示在 homepage, git, tags, issues 等按钮之后。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+// 侧边栏的 Toolbar 会多出一个 git 图标的按钮
+outline.reload({
+  git: 'https://github.com/yaohaixiao/outline.js',
+  tools: [
+    {
+      name: 'clean',
+      // 图标
+      icon: clean,
+      size: 20,
+      color: '#f00'
+      // link 指定按钮点击后页面的跳转地址
+      link: 'https://github.com/yaohaixiao',
+      // link 和 action 只能二选一
+      // action 指定按钮的处理方式
+      action: {
+        type: 'click',
+        // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+        context: outline,
+        handler: function() {
+          // 回调函数的处理逻辑
+        }
+      }
+    }
+  ]
 })

customClass

Description

Type:
String
Default:
''

可选,(DIYer福利)设置自定义样式的 class 名称:

  • '' - 采用默认 outline.js 的 UI 界面(默认值);
  • 设置自定义样式 - 自己根据需求设置个性化的 UI 界面;
// Default UI
 new Outline(Outline.DEFAULTS)
 
@@ -243,7 +274,11 @@
 const outline = new Outline(Outline.DEFAULTS)
 
 // 查看全部配置信息
-outline.attrs

anchors

Description

Type:
Object

Anchors 模块:类似 AnchorJS 基础功能模块,自动分析段落层级。

// 仅展示 API 中对外公开的方法和属性
+outline.attrs

buttons

Description

Type:
Array

存储的是 Outline 对象当前工具栏的完整的按钮配置信息:

// 设置默认配置项
+const outline = new Outline(Outline.DEFAULTS)
+
+// 查看全部按钮配置信息
+outline.buttons

anchors

Description

Type:
Object

Anchors 模块:类似 AnchorJS 基础功能模块,自动分析段落层级。

// 仅展示 API 中对外公开的方法和属性
 class Anchors extends Base {
   constructor(options) {
     super()
@@ -774,7 +809,61 @@
 }]
 
 outline.count()
-// -> 1 就是 getChapters() 返回数据的数量

toTop([afterScroll])

Description

toTop() 方法会控制页面(scrollElement)滚动到顶部。

Parameters

afterScroll
Type:
Function

(可选)页面停止滚动后的回调函数。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline({
+// -> 1 就是 getChapters() 返回数据的数量

addButton(button)

Description

addButton() 方法添加自定义的工具栏按钮。

Parameters

button
Type:
Object|Array

(必须)单个按钮的配置信息或者多个按钮的配置信息。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+outline.addButton({
+  name: 'clean',
+  // 图标
+  icon: clean,
+  size: 20,
+  color: '#f00'
+  // link 指定按钮点击后页面的跳转地址
+  link: 'https://github.com/yaohaixiao',
+  // link 和 action 只能二选一
+  // action 指定按钮的处理方式
+  action: {
+    type: 'click',
+    // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+    context: outline,
+    handler: function() {
+      // 回调函数的处理逻辑
+    }
+  }
+})

removeButton(name)

Description

removeButton() 方法移除工具栏按钮。

Parameters

name
Type:
String

(必须)按钮名称。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline(Outline.DEFAULTS)
+// 如果需要其它图标,可以到 https://github.com/yaohaixiao/icons.toolkit.vue 项目中选择需要的图标资源
+const clean = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 1024 1024">' +
+  '<path d="M704 32V320h288a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H32a32 32 0 0 1-32-32v-320A32 32 0 0 1 32 320H320V32a32 32 0 0 1 32-32h320a32 32 0 0 1 32 32zM576 128H448v320H128v128h768V448H576V128z"></path>' +
+  '<path d="M896 576v416a32 32 0 0 1-32 32h-704a32 32 0 0 1-32-32V576h768z m-128 128H256v192h512v-192z"></path>' +
+  '</svg>'
+
+outline.addButton({
+  name: 'clean',
+  // 图标
+  icon: clean,
+  size: 20,
+  color: '#f00'
+  // link 指定按钮点击后页面的跳转地址
+  link: 'https://github.com/yaohaixiao',
+  // link 和 action 只能二选一
+  // action 指定按钮的处理方式
+  action: {
+    type: 'click',
+    // 指定回调函数的 this 上下文,不设置 this 指向 toolbar 组件
+    context: outline,
+    handler: function() {
+      // 回调函数的处理逻辑
+    }
+  }
+})
+
+setTimeout(() => {
+  outline.addButton('clean')
+}, 5000)

toTop([afterScroll])

Description

toTop() 方法会控制页面(scrollElement)滚动到顶部。

Parameters

afterScroll
Type:
Function

(可选)页面停止滚动后的回调函数。

Returns

Type:
Outline

Outline 对象,便于链式方法调用。

const outline = new Outline({
    article: '#article',
    title: 'Outline v2.0.0'
 })
diff --git a/drawer.min.js b/drawer.min.js
index 1d8192a3..42073357 100644
--- a/drawer.min.js
+++ b/drawer.min.js
@@ -1,2 +1,2 @@
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Drawer=t()}(this,(function(){"use strict";const e=e=>"string"==typeof e,t=(e,t)=>{const s=Object.prototype.hasOwnProperty;return e&&s.call(e,t)},s=e=>Object.prototype.toString.apply(e),l=e=>"function"==typeof e||"[object Function]"===s(e),i=e=>("[object Object]"===s(e)||"object"==typeof e||l(e))&&null!==e;class r{constructor(e){this.attrs={},e&&this.initialize(e)}initialize(e){return this.attr(e).render().addListeners(),this}attr(s,l){const r=this.attrs;return e(s)?l&&t(r,s)?(r[s]=l,this):r[s]:i(s)?(o=r,n=s,Object.keys(n).forEach((e=>{t(n,e)&&(o[e]=n[e])})),this):0===arguments.length?r:this;var o,n}render(){return this}destroy(){return this.removeListeners(),this}reload(e){return this.destroy().initialize(this.attr(e)),this}addListeners(){return this}removeListeners(){return this}}const o=(e,t=300)=>!!l(e)&&setTimeout((()=>{e()}),t),n=e=>!!(i(e)&&e.nodeName&&e.tagName&&1===e.nodeType),a=(e,t)=>{const s=new RegExp("(\\s|^)"+t+"(\\s|$)");let l,i;return!!n(e)&&(l=e.className,!!l&&(i=e.classList,i?.contains?e.classList.contains(t):!!s.exec(l)))},c=(e,t)=>{let s,l;if(a(e,t))return!1;s=e.classList,s?.add?s.add(t):(l=e.className,l+=l.length>0?" "+t:t,e.className=l)},h=(t,s)=>{let l,i=t.className;if(!i||!a(t,s))return!1;var r;l=t.classList,l?.remove?l.remove(s):(r=i.replace(s,""),i=!!e(r)&&r.replace(/(^\s+)|(\s+$)/g,""),t.className=i)},d=e=>Array.isArray?Array.isArray(e):"[object Array]"===s(e),u=e=>{return!(!i(e)||!(n(e)||(e=>!(!i(e)||"[object NodeList]"!==s(e)))(e)||(t=e,i(t)&&"[object DocumentFragment]"===s(t))||(e=>!(!i(e)||!("[object Text]"===s(e)||e.tagName&&3===e.nodeType)))(e)));var t},m=(s,l,r)=>{const o=document.createDocumentFragment(),n=document.createElement(s),a=t=>u(t)||e(t),c=t=>{let s;if(!a(t))return!1;u(t)?s=t:e(t)&&(s=document.createTextNode(t)),o.appendChild(s)};return i(l)?Object.keys(l).forEach((e=>{t(l,e)&&((e,t,s)=>{let l=e.tagName.toLowerCase();switch(t){case"style":e.style.cssText=s;break;case"value":"input"===l||"textarea"===l?e.value=s:e.setAttribute(t,s);break;case"className":e.className=s;break;default:e.setAttribute(t,s)}})(n,e,l[e])})):d(l)&&l.every((e=>a(e)))&&l.forEach((e=>{c(e)})),d(r)?r.forEach((e=>{c(e)})):c(r),n.appendChild(o),n},p=(e,t="")=>{const s=t.replace(/^>/i,"");return!!(t&&s&&e)&&(e.matches?e.matches(s):!!e.msMatchesSelector&&e.msMatchesSelector(s))},f=e=>e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode,y=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],v=(e,t,s)=>{const l=y.indexOf(t)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(e,t,s){const l=e._listeners;let i=-1;if(l.length<1)return!1;l.forEach(((e,l)=>{const r=e.fn;t===e.type&&(i=l,r===s&&(i=l))})),i>-1&&l.splice(i,1)}(e,t,s),e.removeEventListener(t,s,l)},g=function(t,s,l=!1){const i=e(t)?document.querySelector(t):t,r=i.childNodes,o=((t,s)=>{let l=t._listeners||[];return e(s)&&s&&(l=l.filter((e=>e.type===s))),l})(i,s);o.forEach((e=>{v(i,e.type,e.fn)})),(l||!0===s||1===arguments.length)&&i&&r&&r.forEach((e=>{n(e)&&g(e,s,l)}))},b=(e,t,s)=>{if(!l(s))return g(e,t);v(e,t,s)},$=(e,t,s,l,i,r,o=!1)=>{const n=y.indexOf(s)>-1,a=function(n){const c=function(e){const t=e.target;return(s=t)&&3===s.nodeType?s.parentNode:s;var s}(n),h=((e,t,s,l)=>{const i=s||document;if(!e)return null;do{if(null!=t&&(t.startsWith(">")?e.parentNode===i&&p(e,t):p(e,t))||l&&e===i)return e;if(e===i)break}while(e=f(e))})(c,t,e);let d=r||e;n.delegateTarget=h,!0===r&&(d=i),h&&(!0===o&&b(e,s,a),l.call(d,n,i))};e._listeners||(e._listeners=[]),e._listeners.push({el:e,selector:t,type:s,fn:a,data:i,context:r,capture:n}),l._delegateListener=a,e.addEventListener(s,a,n)},w=(e,t=0,s="",l="outline")=>{const i=l?`xlink:href="#${l}-icon-${e}"`:`xlink:href="#icon-${e}"`,r=d(t)?t[0]:t,o=d(t)?t[1]:t,n=t?`width:${r}px;height:${o}px;`:"",a=``,c=document.createElement("i");return c.className="outline-icon",c.innerHTML=a,c};let _=2e3;const z=e=>{var t,s;return e?_=e:_+=1,t="--outline-zIndex",s=`${_}`,document.documentElement.style.setProperty(t,s),_};class L extends r{constructor(e){super(),this.attrs=L.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,e&&this.initialize(e)}initialize(e){let t;return this.attr(e),this.title=this.attr("title"),t=this.attr("created"),l(t)&&t.call(this),this.render().addListeners(),this}setTitle(e){return this.attr("title",e),this.title=e,this.$title.innerHTML=e,this}isClosed(){return this.closed}render(){const e=this.attr("mounted"),t=this.attr("size"),s=this.attr("placement"),i=this.attr("hasClose"),r=this.attr("hasOverlay"),o=this.attr("hasOffset"),n=this.attr("hasPadding"),a=this.attr("autoHeight"),h=this.attr("customClass"),u=document.createDocumentFragment();let p,f,y,v,g,b,$,_;return((e=[])=>{const t=['','','','','','','','',''],s=d(e)&&e.length>0?t.concat(e):t,l=document.body;let i=document.querySelector("#svg-sprites");i?i.innerHTML=s.join(""):(i=document.createElement("div"),i.innerHTML=``,l.insertBefore(i.firstChild,l.firstChild))})(),this.zIndex=z(),v=m("h2",{className:"outline-drawer__title"},[this.title]),this.$title=v,i&&(g=m("div",{className:"outline-drawer__close"},[w("close",20)]),this.$close=g),y=m("header",{className:"outline-drawer__header"},[v,g]),this.$header=y,b=m("div",{className:"outline-drawer__main"},[""]),this.$main=b,n||c(b,"outline-drawer_full"),$=m("footer",{className:"outline-drawer__footer"},[""]),this.$footer=$,f=m("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${t} outline-drawer_closed`},[y,b,$]),this.$modal=f,o&&c(f,"outline-drawer_offset"),a&&c(f,"outline-drawer_auto"),h&&c(f,h),r&&(_=m("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=_),p=m("div",{className:"outline-drawer"},[f,_]),this.$el=p,u.appendChild(p),document.body.appendChild(u),l(e)&&e.call(this),this}open(){const e=this.attr("afterOpened"),t=this.$modal;return c(this.$el,"outline-drawer_opened"),h(t,"outline-drawer_closed"),c(t,"outline-drawer_opened"),o((()=>{this.closed=!1,l(e)&&e.call(this)})),this}close(){const e=this.attr("afterClosed"),t=this.$modal;return h(t,"outline-drawer_opened"),c(t,"outline-drawer_closed"),o((()=>{h(this.$el,"outline-drawer_opened"),this.closed=!0,l(e)&&e.call(this)})),this}toggle(){const e=this.attr("afterToggle"),t=this.isClosed();return t?this.open():this.close(),l(e)&&o((()=>{e.call(this,t)})),this}destroy(){const e=this.attr("afterDestroy"),t=this.attr("beforeDestroy");let s=this.zIndex;return l(t)&&t.call(this),this.removeListeners(),this.attrs=L.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,z(s),this.zIndex=0,l(e)&&e.call(this),this}addListeners(){const e=this.attr("hasClose"),t=this.attr("hasOverlay"),s=this.$el;return e&&$(s,".outline-drawer__close","click",this.onClose,this,!0),t&&$(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const e=this.attr("hasClose"),t=this.attr("hasOverlay"),s=this.$el;return e||t?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}return L.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null},L}));
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Drawer=t()}(this,(function(){"use strict";const e=e=>"string"==typeof e,t=(e,t)=>{const s=Object.prototype.hasOwnProperty;return e&&s.call(e,t)},s=e=>Object.prototype.toString.apply(e),l=e=>"function"==typeof e||"[object Function]"===s(e),i=e=>("[object Object]"===s(e)||"object"==typeof e||l(e))&&null!==e;class r{constructor(e){this.attrs={},e&&this.initialize(e)}initialize(e){return this.attr(e).render().addListeners(),this}attr(s,l){const r=this.attrs;return e(s)?l&&t(r,s)?(r[s]=l,this):r[s]:i(s)?(n=r,o=s,Object.keys(o).forEach((e=>{t(o,e)&&(n[e]=o[e])})),this):0===arguments.length?r:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(e){return this.destroy().initialize(this.attr(e)),this}addListeners(){return this}removeListeners(){return this}}const n=(e,t=300)=>!!l(e)&&setTimeout((()=>{e()}),t),o=e=>!!(i(e)&&e.nodeName&&e.tagName&&1===e.nodeType),a=(e,t)=>{const s=new RegExp("(\\s|^)"+t+"(\\s|$)");let l,i;return!!o(e)&&(l=e.className,!!l&&(i=e.classList,i?.contains?e.classList.contains(t):!!s.exec(l)))},c=(e,t)=>{let s,l;if(a(e,t))return!1;s=e.classList,s?.add?s.add(t):(l=e.className,l+=l.length>0?" "+t:t,e.className=l)},h=(t,s)=>{let l,i=t.className;if(!i||!a(t,s))return!1;var r;l=t.classList,l?.remove?l.remove(s):(r=i.replace(s,""),i=!!e(r)&&r.replace(/(^\s+)|(\s+$)/g,""),t.className=i)},d=e=>Array.isArray?Array.isArray(e):"[object Array]"===s(e),u=e=>{return!(!i(e)||!(o(e)||(e=>!(!i(e)||"[object NodeList]"!==s(e)))(e)||(t=e,i(t)&&"[object DocumentFragment]"===s(t))||(e=>!(!i(e)||!("[object Text]"===s(e)||e.tagName&&3===e.nodeType)))(e)));var t},m=(s,l,r)=>{const n=document.createDocumentFragment(),o=document.createElement(s),a=t=>u(t)||e(t),c=t=>{let s;if(!a(t))return!1;u(t)?s=t:e(t)&&(s=document.createTextNode(t)),n.appendChild(s)};return i(l)?Object.keys(l).forEach((e=>{t(l,e)&&((e,t,s)=>{let l=e.tagName.toLowerCase();switch(t){case"style":e.style.cssText=s;break;case"value":"input"===l||"textarea"===l?e.value=s:e.setAttribute(t,s);break;case"className":e.className=s;break;default:e.setAttribute(t,s)}})(o,e,l[e])})):d(l)&&l.every((e=>a(e)))&&l.forEach((e=>{c(e)})),d(r)?r.forEach((e=>{c(e)})):c(r),o.appendChild(n),o},p=(e,t="")=>{const s=t.replace(/^>/i,"");return!!(t&&s&&e)&&(e.matches?e.matches(s):!!e.msMatchesSelector&&e.msMatchesSelector(s))},f=e=>e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode,y=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],v=(e,t,s)=>{const l=y.indexOf(t)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(e,t,s){const l=e._listeners;let i=-1;if(l.length<1)return!1;l.forEach(((e,l)=>{const r=e.fn;t===e.type&&(i=l,r===s&&(i=l))})),i>-1&&l.splice(i,1)}(e,t,s),e.removeEventListener(t,s,l)},g=function(t,s,l=!1){const i=e(t)?document.querySelector(t):t,r=i.childNodes,n=((t,s)=>{let l=t._listeners||[];return e(s)&&s&&(l=l.filter((e=>e.type===s))),l})(i,s);n.forEach((e=>{v(i,e.type,e.fn)})),(l||!0===s||1===arguments.length)&&i&&r&&r.forEach((e=>{o(e)&&g(e,s,l)}))},b=(e,t,s)=>{if(!l(s))return g(e,t);v(e,t,s)},$=(e,t,s,l,i,r,n=!1)=>{const o=y.indexOf(s)>-1,a=function(o){const c=function(e){const t=e.target;return(s=t)&&3===s.nodeType?s.parentNode:s;var s}(o),h=((e,t,s,l)=>{const i=s||document;if(!e)return null;do{if(null!=t&&(t.startsWith(">")?e.parentNode===i&&p(e,t):p(e,t))||l&&e===i)return e;if(e===i)break}while(e=f(e))})(c,t,e);let d=r||e;o.delegateTarget=h,!0===r&&(d=i),h&&(!0===n&&b(e,s,a),l.call(d,o,i))};e._listeners||(e._listeners=[]),e._listeners.push({el:e,selector:t,type:s,fn:a,data:i,context:r,capture:o}),l._delegateListener=a,e.addEventListener(s,a,o)},w=['','','','','','','','',''],_=(t,s="icon")=>e(t)?((e,t="icon")=>{const s=/id="(.*?)"/,l=/^(\w+)-/;return w.find((i=>{const r=s.exec(i)[1];return l.exec(r)[1]===t&&r===("icon"===t?`${t}-${e}`:`${t}-icon-${e}`)}))})(t,s):[...w],z=(t="")=>{const s=document.body;let l=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;d(t)&&t.length>0?t.forEach((t=>{-1===w.indexOf(t)&&e(t)&&w.push(t)})):e(t)&&w.push(t)})(t),i=_(),l?l.innerHTML=i.join(""):(l=document.createElement("div"),l.innerHTML=``,s.insertBefore(l.firstChild,s.firstChild))},x=t=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return e(t)&&s.test(t)},L=(t,s={})=>((t,s={})=>{const l=s.size||0,i=s.color||"",r=s.iconSet||"",n=d(l)?l[0]:l,o=d(l)?l[1]:l,a=l?`width:${n}px;height:${o}px;`:"",c=i?a+`color:${i}`:a,h=document.createElement("i");let u,m="",p="";return e(t)?(x(t)?p=t:(m=r&&"icon"!==r?`xlink:href="#${r}-icon-${t}"`:`xlink:href="#icon-${t}"`,p=``),h.className="outline-icon",h.innerHTML=p,x(t)&&(u=h.querySelector("svg"),u.setAttribute("aria-hidden","true"),u.setAttribute("xmlns","http://www.w3.org/2000/svg"),u.setAttribute("class","outline-icon__svg"),u.setAttribute("width","200"),u.setAttribute("height","200"),u.style=c),h):null})(t,s);let M=2e3;const N=e=>{var t,s;return e?M=e:M+=1,t="--outline-zIndex",s=`${M}`,document.documentElement.style.setProperty(t,s),M};class T extends r{constructor(e){super(),this.attrs=T.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,e&&this.initialize(e)}initialize(e){let t;return this.attr(e),this.title=this.attr("title"),t=this.attr("created"),l(t)&&t.call(this),this.render().addListeners(),this}setTitle(e){return this.attr("title",e),this.title=e,this.$title.innerHTML=e,this}isClosed(){return this.closed}render(){const e=this.attr("mounted"),t=this.attr("size"),s=this.attr("placement"),i=this.attr("hasClose"),r=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),a=this.attr("autoHeight"),h=this.attr("customClass"),d=document.createDocumentFragment();let u,p,f,y,v,g,b,$;return z(),this.zIndex=N(),y=m("h2",{className:"outline-drawer__title"},[this.title]),this.$title=y,i&&(v=m("div",{className:"outline-drawer__close"},[L("close",{size:20})]),this.$close=v),f=m("header",{className:"outline-drawer__header"},[y,v]),this.$header=f,g=m("div",{className:"outline-drawer__main"},[""]),this.$main=g,o||c(g,"outline-drawer_full"),b=m("footer",{className:"outline-drawer__footer"},[""]),this.$footer=b,p=m("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${t} outline-drawer_closed`},[f,g,b]),this.$modal=p,n&&c(p,"outline-drawer_offset"),a&&c(p,"outline-drawer_auto"),h&&c(p,h),r&&($=m("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=$),u=m("div",{className:"outline-drawer"},[p,$]),this.$el=u,d.appendChild(u),document.body.appendChild(d),l(e)&&e.call(this),this}open(){const e=this.attr("afterOpened"),t=this.$modal;return c(this.$el,"outline-drawer_opened"),h(t,"outline-drawer_closed"),c(t,"outline-drawer_opened"),n((()=>{this.closed=!1,l(e)&&e.call(this)})),this}close(){const e=this.attr("afterClosed"),t=this.$modal;return h(t,"outline-drawer_opened"),c(t,"outline-drawer_closed"),n((()=>{h(this.$el,"outline-drawer_opened"),this.closed=!0,l(e)&&e.call(this)})),this}toggle(){const e=this.attr("afterToggle"),t=this.isClosed();return t?this.open():this.close(),l(e)&&n((()=>{e.call(this,t)})),this}destroy(){const e=this.attr("afterDestroy"),t=this.attr("beforeDestroy");let s=this.zIndex;return l(t)&&t.call(this),this.removeListeners(),this.attrs=T.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,N(s),this.zIndex=0,l(e)&&e.call(this),this}addListeners(){const e=this.attr("hasClose"),t=this.attr("hasOverlay"),s=this.$el;return e&&$(s,".outline-drawer__close","click",this.onClose,this,!0),t&&$(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const e=this.attr("hasClose"),t=this.attr("hasOverlay"),s=this.$el;return e||t?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}return T.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null},T}));
 //# sourceMappingURL=drawer.min.js.map
diff --git a/drawer.min.js.map b/drawer.min.js.map
index 1e2be7d9..fefdde54 100644
--- a/drawer.min.js.map
+++ b/drawer.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"drawer.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/lang/later.js","src/utils/types/isElement.js","src/utils/dom/hasClass.js","src/utils/dom/addClass.js","src/utils/dom/removeClass.js","src/utils/lang/trim.js","src/utils/types/isArray.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/createElement.js","src/utils/dom/setAttribute.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/icons.js","src/zIndex.js","src/utils/dom/setProperty.js","src/drawer.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n  return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n  const hasOwnProperty = Object.prototype.hasOwnProperty\r\n  return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n  return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n  return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from '../types/isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n  return (\r\n    (toString(o) === '[object Object]' ||\r\n      typeof o === 'object' ||\r\n      isFunction(o)) &&\r\n    o !== null\r\n  )\r\n}\r\n\r\nexport default isObject\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n  constructor(options) {\r\n    this.attrs = {}\r\n\r\n    if (options) {\r\n      this.initialize(options)\r\n    }\r\n  }\r\n\r\n  initialize(options) {\r\n    this.attr(options).render().addListeners()\r\n    return this\r\n  }\r\n\r\n  attr(prop, value) {\r\n    const attrs = this.attrs\r\n\r\n    if (isString(prop)) {\r\n      // 只能扩展 attrs 中已有的属性\r\n      if (value && hasOwn(attrs, prop)) {\r\n        // 更新单个配置信息\r\n        attrs[prop] = value\r\n        return this\r\n      }\r\n\r\n      // 只传递 prop 参数,则返回对应的属性值\r\n      return attrs[prop]\r\n    } else if (isObject(prop)) {\r\n      // 批量更新配置信息\r\n      extend(attrs, prop)\r\n\r\n      return this\r\n    } else if (arguments.length === 0) {\r\n      // 不传递参数,直接返回整个\r\n      return attrs\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  render() {\r\n    return this\r\n  }\r\n\r\n  destroy() {\r\n    this.removeListeners()\r\n    return this\r\n  }\r\n\r\n  reload(options) {\r\n    this.destroy().initialize(this.attr(options))\r\n    return this\r\n  }\r\n\r\n  addListeners() {\r\n    return this\r\n  }\r\n\r\n  removeListeners() {\r\n    return this\r\n  }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n  const keys = Object.keys(source)\r\n\r\n  keys.forEach((prop) => {\r\n    if (hasOwn(source, prop)) {\r\n      origin[prop] = source[prop]\r\n    }\r\n  })\r\n}\r\n\r\nexport default extend\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n  if (!isFunction(fn)) {\r\n    return false\r\n  }\r\n\r\n  return setTimeout(() => {\r\n    fn()\r\n  }, delay)\r\n}\r\n\r\nexport default later\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n  return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n  const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n  let allClass\r\n  let classList\r\n\r\n  if (!isElement(el)) {\r\n    return false\r\n  }\r\n\r\n  allClass = el.className\r\n\r\n  if (!allClass) {\r\n    return false\r\n  }\r\n\r\n  classList = el.classList\r\n\r\n  if (classList?.contains) {\r\n    return el.classList.contains(className)\r\n  }\r\n\r\n  return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n  let classList\r\n  let allClass\r\n\r\n  if (hasClass(el, className)) {\r\n    return false\r\n  }\r\n\r\n  classList = el.classList\r\n\r\n  if (classList?.add) {\r\n    classList.add(className)\r\n  } else {\r\n    allClass = el.className\r\n    allClass += allClass.length > 0 ? ' ' + className : className\r\n    el.className = allClass\r\n  }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n  let allClass = el.className\r\n  let classList\r\n\r\n  if (!allClass || !hasClass(el, className)) {\r\n    return false\r\n  }\r\n\r\n  classList = el.classList\r\n\r\n  if (classList?.remove) {\r\n    classList.remove(className)\r\n  } else {\r\n    allClass = trim(allClass.replace(className, ''))\r\n    el.className = allClass\r\n  }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n  if (!isString(str)) {\r\n    return false\r\n  }\r\n  return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n  if (Array.isArray) {\r\n    return Array.isArray(o)\r\n  } else {\r\n    return toString(o) === '[object Array]'\r\n  }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n  return !!(\r\n    isObject(el) &&\r\n    (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n  )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n  return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n  return !!(\r\n    isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n  )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n  return !!(\r\n    isObject(el) &&\r\n    (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n  )\r\n}\r\n\r\nexport default isTextNode\r\n","import hasOwn from '../lang/hasOwn'\r\nimport isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttribute from './setAttribute'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array} attrs - 属性对象或者子节点\r\n * @param {Array} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n  const $fragment = document.createDocumentFragment()\r\n  const $el = document.createElement(tagName)\r\n  const isValidChild = (child) => {\r\n    return isDOM(child) || isString(child)\r\n  }\r\n  const append = (child) => {\r\n    let $child\r\n\r\n    if (!isValidChild(child)) {\r\n      return false\r\n    }\r\n\r\n    if (isDOM(child)) {\r\n      $child = child\r\n    } else if (isString(child)) {\r\n      $child = document.createTextNode(child)\r\n    }\r\n\r\n    $fragment.appendChild($child)\r\n  }\r\n\r\n  if (isObject(attrs)) {\r\n    Object.keys(attrs).forEach((attr) => {\r\n      if (hasOwn(attrs, attr)) {\r\n        setAttribute($el, attr, attrs[attr])\r\n      }\r\n    })\r\n  } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n    attrs.forEach((child) => {\r\n      append(child)\r\n    })\r\n  }\r\n\r\n  if (isArray(children)) {\r\n    children.forEach((child) => {\r\n      append(child)\r\n    })\r\n  } else {\r\n    append(children)\r\n  }\r\n\r\n  $el.appendChild($fragment)\r\n\r\n  return $el\r\n}\r\n\r\nexport default createElement\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n  let tagName = el.tagName.toLowerCase()\r\n\r\n  switch (attr) {\r\n    case 'style':\r\n      el.style.cssText = value\r\n      break\r\n    case 'value':\r\n      if (tagName === 'input' || tagName === 'textarea') {\r\n        el.value = value\r\n      } else {\r\n        el.setAttribute(attr, value)\r\n      }\r\n      break\r\n    case 'className':\r\n      el.className = value\r\n      break\r\n    default:\r\n      el.setAttribute(attr, value)\r\n      break\r\n  }\r\n}\r\n\r\nexport default setAttribute\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n  const sel = selector.replace(/^>/i, '')\r\n\r\n  if (!selector || !sel || !el) {\r\n    return false\r\n  }\r\n\r\n  /* istanbul ignore else */\r\n  if (el.matches) {\r\n    return el.matches(sel)\r\n  } else if (el.msMatchesSelector) {\r\n    return el.msMatchesSelector(sel)\r\n  } else {\r\n    return false\r\n  }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n  return el.host && el !== document && el.host.nodeType\r\n    ? el.host\r\n    : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n  'focusout',\r\n  'blur',\r\n  'focusin',\r\n  'focus',\r\n  'load',\r\n  'unload',\r\n  'mouseenter',\r\n  'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n  /* istanbul ignore else */\r\n  if (fn._delegateListener) {\r\n    fn = fn._delegateListener\r\n    delete fn._delegateListener\r\n  }\r\n\r\n  // 移除缓存的 _listeners 数据\r\n  _delete(el, type, fn)\r\n\r\n  el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n  const listeners = el._listeners\r\n  let index = -1\r\n\r\n  if (listeners.length < 1) {\r\n    return false\r\n  }\r\n\r\n  // 移除缓存的 _listeners 数据\r\n  listeners.forEach((listener, i) => {\r\n    const handler = listener.fn\r\n\r\n    if (type === listener.type) {\r\n      index = i\r\n\r\n      if (handler === fn) {\r\n        index = i\r\n      }\r\n    }\r\n  })\r\n\r\n  /* istanbul ignore else */\r\n  if (index > -1) {\r\n    listeners.splice(index, 1)\r\n  }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n  const $element = isString(el) ? document.querySelector(el) : el\r\n  const $children = $element.childNodes\r\n  const listeners = getListeners($element, type)\r\n\r\n  listeners.forEach((listener) => {\r\n    _off($element, listener.type, listener.fn)\r\n  })\r\n\r\n  if (\r\n    (recurse || type === true || arguments.length === 1) &&\r\n    $element &&\r\n    $children\r\n  ) {\r\n    $children.forEach(($child) => {\r\n      if (isElement($child)) {\r\n        purgeElement($child, type, recurse)\r\n      }\r\n    })\r\n  }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n  let listeners = el._listeners || []\r\n\r\n  if (isString(type) && type) {\r\n    listeners = listeners.filter((listener) => {\r\n      return listener.type === type\r\n    })\r\n  }\r\n\r\n  return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n  // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n  if (!isFunction(fn)) {\r\n    return purgeElement(el, type)\r\n  }\r\n\r\n  _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n  // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n  const listener = function (evt) {\r\n    const target = getTarget(evt)\r\n    // 通过 Element.matches 方法获得点击的目标元素\r\n    const delegateTarget = closest(target, selector, el)\r\n    let overrideContext = context || el\r\n\r\n    evt.delegateTarget = delegateTarget\r\n\r\n    // 当设置为 true 时,则事件处理器回调函数的\r\n    // this 上下文指向为 data 对象\r\n    if (context === true) {\r\n      overrideContext = data\r\n    }\r\n\r\n    /* istanbul ignore else */\r\n    if (delegateTarget) {\r\n      // 仅触发一次\r\n      /* istanbul ignore else */\r\n      if (once === true) {\r\n        off(el, type, listener)\r\n      }\r\n\r\n      fn.call(overrideContext, evt, data)\r\n    }\r\n  }\r\n\r\n  if (!el._listeners) {\r\n    el._listeners = []\r\n  }\r\n\r\n  // 缓存 options 元素绑定的事件处理器\r\n  el._listeners.push({\r\n    el,\r\n    selector,\r\n    type,\r\n    fn: listener,\r\n    data,\r\n    context,\r\n    capture\r\n  })\r\n\r\n  // 缓存包装后的事件处理器\r\n  fn._delegateListener = listener\r\n\r\n  el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n  const target = evt.target\r\n\r\n  return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n  if (el && el.nodeType === 3) {\r\n    return el.parentNode\r\n  }\r\n\r\n  return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n  const context = ctx || document\r\n\r\n  if (!el) {\r\n    return null\r\n  }\r\n\r\n  do {\r\n    /* istanbul ignore else */\r\n    if (\r\n      (selector != null &&\r\n        (selector.startsWith('>')\r\n          ? el.parentNode === context && matches(el, selector)\r\n          : matches(el, selector))) ||\r\n      (includeCTX && el === context)\r\n    ) {\r\n      return el\r\n    }\r\n\r\n    /* istanbul ignore else */\r\n    if (el === context) {\r\n      break\r\n    }\r\n\r\n    /* jshint boss:true */\r\n  } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import isArray from './types/isArray'\r\n\r\n/**\r\n * 绘制 SVG Sprites 图标集\r\n * ========================================================================\r\n * @method paintSvgSprites\r\n * @param {Array} [symbols] - (可选)symbols 图标数组\r\n *                             传递 symbols - 绘制 symbols + SYMBOLS 的图标集\r\n *                             不传递 symbols - 仅绘制默认 SYMBOLS 图标集\r\n */\r\nexport const paintSvgSprites = (symbols = []) => {\r\n  const SYMBOLS = [\r\n    '',\r\n    '',\r\n    '',\r\n    '',\r\n    '',\r\n    '',\r\n    '',\r\n    '',\r\n    ''\r\n  ]\r\n  const sprites =\r\n    isArray(symbols) && symbols.length > 0 ? SYMBOLS.concat(symbols) : SYMBOLS\r\n  const $body = document.body\r\n  let $icons = document.querySelector('#svg-sprites')\r\n\r\n  if ($icons) {\r\n    $icons.innerHTML = sprites.join('')\r\n  } else {\r\n    $icons = document.createElement('div')\r\n    $icons.innerHTML =\r\n      ``\r\n    $body.insertBefore($icons.firstChild, $body.firstChild)\r\n  }\r\n}\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createSvgIcon\r\n * @param {String} name\r\n * @param {Number|String|Array} [size]\r\n * @param {String} [color]\r\n * @param {String} [iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nexport const createSvgIcon = (\r\n  name,\r\n  size = 0,\r\n  color = '',\r\n  iconSet = 'outline'\r\n) => {\r\n  const binds = iconSet\r\n    ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n    : `xlink:href=\"#icon-${name}\"`\r\n  const width = isArray(size) ? size[0] : size\r\n  const height = isArray(size) ? size[1] : size\r\n  const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n  const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n  const svg =\r\n    `` +\r\n    `` +\r\n    ``\r\n  const $icon = document.createElement('i')\r\n\r\n  $icon.className = 'outline-icon'\r\n  $icon.innerHTML = svg\r\n\r\n  return $icon\r\n}\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n  if (idx) {\r\n    index = idx\r\n  } else {\r\n    index += 1\r\n  }\r\n\r\n  setProperty('--outline-zIndex', `${index}`)\r\n\r\n  return index\r\n}\r\n\r\nexport default zIndex\r\n","const setProperty = (prop, value) => {\r\n  const documentElement = document.documentElement\r\n  documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport isFunction from './utils/types/isFunction'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport { paintSvgSprites, createSvgIcon } from './utils/icons'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n  constructor(options) {\r\n    super()\r\n\r\n    this.attrs = Drawer.DEFAULTS\r\n    this.title = ''\r\n    this.closed = true\r\n    this.$el = null\r\n    this.$modal = null\r\n    this.$header = null\r\n    this.$title = null\r\n    this.$close = null\r\n    this.$main = null\r\n    this.$footer = null\r\n    this.$overlay = null\r\n    this.zIndex = 0\r\n\r\n    if (options) {\r\n      this.initialize(options)\r\n    }\r\n  }\r\n\r\n  initialize(options) {\r\n    let created\r\n\r\n    this.attr(options)\r\n\r\n    this.title = this.attr('title')\r\n    created = this.attr('created')\r\n\r\n    if (isFunction(created)) {\r\n      created.call(this)\r\n    }\r\n\r\n    this.render().addListeners()\r\n    return this\r\n  }\r\n\r\n  setTitle(title) {\r\n    this.attr('title', title)\r\n    this.title = title\r\n    this.$title.innerHTML = title\r\n\r\n    return this\r\n  }\r\n\r\n  isClosed() {\r\n    return this.closed\r\n  }\r\n\r\n  render() {\r\n    const mounted = this.attr('mounted')\r\n    const size = this.attr('size')\r\n    const placement = this.attr('placement')\r\n    const hasClose = this.attr('hasClose')\r\n    const hasOverlay = this.attr('hasOverlay')\r\n    const hasOffset = this.attr('hasOffset')\r\n    const hasPadding = this.attr('hasPadding')\r\n    const autoHeight = this.attr('autoHeight')\r\n    const customClass = this.attr('customClass')\r\n    const $fragment = document.createDocumentFragment()\r\n    let $el\r\n    let $modal\r\n    let $header\r\n    let $title\r\n    let $close\r\n    let $main\r\n    let $footer\r\n    let $overlay\r\n\r\n    paintSvgSprites()\r\n    this.zIndex = zIndex()\r\n\r\n    $title = createElement(\r\n      'h2',\r\n      {\r\n        className: 'outline-drawer__title'\r\n      },\r\n      [this.title]\r\n    )\r\n    this.$title = $title\r\n\r\n    if (hasClose) {\r\n      $close = createElement(\r\n        'div',\r\n        {\r\n          className: 'outline-drawer__close'\r\n        },\r\n        [createSvgIcon('close', 20)]\r\n      )\r\n      this.$close = $close\r\n    }\r\n\r\n    $header = createElement(\r\n      'header',\r\n      {\r\n        className: 'outline-drawer__header'\r\n      },\r\n      [$title, $close]\r\n    )\r\n    this.$header = $header\r\n\r\n    $main = createElement(\r\n      'div',\r\n      {\r\n        className: 'outline-drawer__main'\r\n      },\r\n      ['']\r\n    )\r\n    this.$main = $main\r\n\r\n    if (!hasPadding) {\r\n      addClass($main, 'outline-drawer_full')\r\n    }\r\n\r\n    $footer = createElement(\r\n      'footer',\r\n      {\r\n        className: 'outline-drawer__footer'\r\n      },\r\n      ['']\r\n    )\r\n    this.$footer = $footer\r\n\r\n    $modal = createElement(\r\n      'div',\r\n      {\r\n        className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n      },\r\n      [$header, $main, $footer]\r\n    )\r\n    this.$modal = $modal\r\n\r\n    if (hasOffset) {\r\n      addClass($modal, 'outline-drawer_offset')\r\n    }\r\n\r\n    if (autoHeight) {\r\n      addClass($modal, 'outline-drawer_auto')\r\n    }\r\n\r\n    if (customClass) {\r\n      addClass($modal, customClass)\r\n    }\r\n\r\n    if (hasOverlay) {\r\n      $overlay = createElement(\r\n        'div',\r\n        {\r\n          className: 'outline-drawer__overlay'\r\n        },\r\n        ['']\r\n      )\r\n      this.$overlay = $overlay\r\n    }\r\n\r\n    $el = createElement(\r\n      'div',\r\n      {\r\n        className: `outline-drawer`\r\n      },\r\n      [$modal, $overlay]\r\n    )\r\n    this.$el = $el\r\n    $fragment.appendChild($el)\r\n    document.body.appendChild($fragment)\r\n\r\n    if (isFunction(mounted)) {\r\n      mounted.call(this)\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  open() {\r\n    const opened = this.attr('afterOpened')\r\n    const $modal = this.$modal\r\n\r\n    addClass(this.$el, 'outline-drawer_opened')\r\n    removeClass($modal, 'outline-drawer_closed')\r\n    addClass($modal, 'outline-drawer_opened')\r\n\r\n    later(() => {\r\n      this.closed = false\r\n\r\n      if (isFunction(opened)) {\r\n        opened.call(this)\r\n      }\r\n    })\r\n\r\n    return this\r\n  }\r\n\r\n  close() {\r\n    const closed = this.attr('afterClosed')\r\n    const $modal = this.$modal\r\n\r\n    removeClass($modal, 'outline-drawer_opened')\r\n    addClass($modal, 'outline-drawer_closed')\r\n\r\n    later(() => {\r\n      removeClass(this.$el, 'outline-drawer_opened')\r\n      this.closed = true\r\n\r\n      if (isFunction(closed)) {\r\n        closed.call(this)\r\n      }\r\n    })\r\n\r\n    return this\r\n  }\r\n\r\n  toggle() {\r\n    const afterToggle = this.attr('afterToggle')\r\n    const closed = this.isClosed()\r\n\r\n    if (closed) {\r\n      this.open()\r\n    } else {\r\n      this.close()\r\n    }\r\n\r\n    if (isFunction(afterToggle)) {\r\n      later(() => {\r\n        afterToggle.call(this, closed)\r\n      })\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  destroy() {\r\n    const afterDestroy = this.attr('afterDestroy')\r\n    const beforeDestroy = this.attr('beforeDestroy')\r\n    let index = this.zIndex\r\n\r\n    if (isFunction(beforeDestroy)) {\r\n      beforeDestroy.call(this)\r\n    }\r\n\r\n    this.removeListeners()\r\n\r\n    this.attrs = Drawer.DEFAULTS\r\n    this.title = ''\r\n    this.closed = false\r\n    this.$el = null\r\n    this.$modal = null\r\n    this.$header = null\r\n    this.$title = null\r\n    this.$close = null\r\n    this.$main = null\r\n    this.$footer = null\r\n    this.$overlay = null\r\n\r\n    index -= 1\r\n    zIndex(index)\r\n    this.zIndex = 0\r\n\r\n    if (isFunction(afterDestroy)) {\r\n      afterDestroy.call(this)\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  addListeners() {\r\n    const hasClose = this.attr('hasClose')\r\n    const hasOverlay = this.attr('hasOverlay')\r\n    const $el = this.$el\r\n\r\n    if (hasClose) {\r\n      on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n    }\r\n\r\n    if (hasOverlay) {\r\n      on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  removeListeners() {\r\n    const hasClose = this.attr('hasClose')\r\n    const hasOverlay = this.attr('hasOverlay')\r\n    const $el = this.$el\r\n\r\n    if (!hasClose && !hasOverlay) {\r\n      return this\r\n    }\r\n\r\n    off($el, 'click', this.onClose)\r\n\r\n    return this\r\n  }\r\n\r\n  onClose() {\r\n    this.close()\r\n    return this\r\n  }\r\n}\r\n\r\nDrawer.DEFAULTS = {\r\n  placement: 'rtl',\r\n  title: '标题',\r\n  size: 'regular',\r\n  hasClose: true,\r\n  hasOverlay: true,\r\n  hasOffset: false,\r\n  hasPadding: true,\r\n  autoHeight: true,\r\n  created: null,\r\n  mounted: null,\r\n  afterClosed: null,\r\n  afterOpened: null,\r\n  afterScroll: null,\r\n  beforeDestroy: null,\r\n  afterDestroy: null,\r\n  afterToggle: null\r\n}\r\n\r\nexport default Drawer\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","later","fn","delay","setTimeout","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","replace","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","every","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","filter","getListeners","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","createSvgIcon","name","size","color","iconSet","binds","width","height","defaultRules","svg","$icon","innerHTML","zIndex","idx","documentElement","setProperty","Drawer","super","DEFAULTS","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","created","setTitle","isClosed","mounted","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","symbols","SYMBOLS","sprites","concat","$body","body","$icons","join","insertBefore","firstChild","paintSvgSprites","open","opened","close","toggle","afterToggle","afterDestroy","beforeDestroy","onClose","afterClosed","afterOpened","afterScroll"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"drawer.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/lang/later.js","src/utils/types/isElement.js","src/utils/dom/hasClass.js","src/utils/dom/addClass.js","src/utils/dom/removeClass.js","src/utils/lang/trim.js","src/utils/types/isArray.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/createElement.js","src/utils/dom/setAttribute.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/icons/symbols.js","src/utils/icons/defaults.js","src/utils/icons/getSymbols.js","src/utils/icons/getSymbol.js","src/utils/icons/paint.js","src/utils/icons/add.js","src/utils/types/isSVG.js","src/utils/icons/icon.js","src/utils/icons/createElement.js","src/zIndex.js","src/utils/dom/setProperty.js","src/drawer.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n  return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n  const hasOwnProperty = Object.prototype.hasOwnProperty\r\n  return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n  return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n  return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from '../types/isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n  return (\r\n    (toString(o) === '[object Object]' ||\r\n      typeof o === 'object' ||\r\n      isFunction(o)) &&\r\n    o !== null\r\n  )\r\n}\r\n\r\nexport default isObject\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n  constructor(options) {\r\n    this.attrs = {}\r\n\r\n    if (options) {\r\n      this.initialize(options)\r\n    }\r\n  }\r\n\r\n  initialize(options) {\r\n    this.attr(options).render().addListeners()\r\n    return this\r\n  }\r\n\r\n  attr(prop, value) {\r\n    const attrs = this.attrs\r\n\r\n    if (isString(prop)) {\r\n      // 只能扩展 attrs 中已有的属性\r\n      if (value && hasOwn(attrs, prop)) {\r\n        // 更新单个配置信息\r\n        attrs[prop] = value\r\n        return this\r\n      }\r\n\r\n      // 只传递 prop 参数,则返回对应的属性值\r\n      return attrs[prop]\r\n    } else if (isObject(prop)) {\r\n      // 批量更新配置信息\r\n      extend(attrs, prop)\r\n\r\n      return this\r\n    } else if (arguments.length === 0) {\r\n      // 不传递参数,直接返回整个\r\n      return attrs\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  render() {\r\n    return this\r\n  }\r\n\r\n  destroy() {\r\n    this.removeListeners()\r\n    return this\r\n  }\r\n\r\n  reload(options) {\r\n    this.destroy().initialize(this.attr(options))\r\n    return this\r\n  }\r\n\r\n  addListeners() {\r\n    return this\r\n  }\r\n\r\n  removeListeners() {\r\n    return this\r\n  }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n  const keys = Object.keys(source)\r\n\r\n  keys.forEach((prop) => {\r\n    if (hasOwn(source, prop)) {\r\n      origin[prop] = source[prop]\r\n    }\r\n  })\r\n}\r\n\r\nexport default extend\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n  if (!isFunction(fn)) {\r\n    return false\r\n  }\r\n\r\n  return setTimeout(() => {\r\n    fn()\r\n  }, delay)\r\n}\r\n\r\nexport default later\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n  return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n  const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n  let allClass\r\n  let classList\r\n\r\n  if (!isElement(el)) {\r\n    return false\r\n  }\r\n\r\n  allClass = el.className\r\n\r\n  if (!allClass) {\r\n    return false\r\n  }\r\n\r\n  classList = el.classList\r\n\r\n  if (classList?.contains) {\r\n    return el.classList.contains(className)\r\n  }\r\n\r\n  return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n  let classList\r\n  let allClass\r\n\r\n  if (hasClass(el, className)) {\r\n    return false\r\n  }\r\n\r\n  classList = el.classList\r\n\r\n  if (classList?.add) {\r\n    classList.add(className)\r\n  } else {\r\n    allClass = el.className\r\n    allClass += allClass.length > 0 ? ' ' + className : className\r\n    el.className = allClass\r\n  }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n  let allClass = el.className\r\n  let classList\r\n\r\n  if (!allClass || !hasClass(el, className)) {\r\n    return false\r\n  }\r\n\r\n  classList = el.classList\r\n\r\n  if (classList?.remove) {\r\n    classList.remove(className)\r\n  } else {\r\n    allClass = trim(allClass.replace(className, ''))\r\n    el.className = allClass\r\n  }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n  if (!isString(str)) {\r\n    return false\r\n  }\r\n  return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n  if (Array.isArray) {\r\n    return Array.isArray(o)\r\n  } else {\r\n    return toString(o) === '[object Array]'\r\n  }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n  return !!(\r\n    isObject(el) &&\r\n    (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n  )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n  return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n  return !!(\r\n    isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n  )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n  return !!(\r\n    isObject(el) &&\r\n    (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n  )\r\n}\r\n\r\nexport default isTextNode\r\n","import hasOwn from '../lang/hasOwn'\r\nimport isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttribute from './setAttribute'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array} attrs - 属性对象或者子节点\r\n * @param {Array} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n  const $fragment = document.createDocumentFragment()\r\n  const $el = document.createElement(tagName)\r\n  const isValidChild = (child) => {\r\n    return isDOM(child) || isString(child)\r\n  }\r\n  const append = (child) => {\r\n    let $child\r\n\r\n    if (!isValidChild(child)) {\r\n      return false\r\n    }\r\n\r\n    if (isDOM(child)) {\r\n      $child = child\r\n    } else if (isString(child)) {\r\n      $child = document.createTextNode(child)\r\n    }\r\n\r\n    $fragment.appendChild($child)\r\n  }\r\n\r\n  if (isObject(attrs)) {\r\n    Object.keys(attrs).forEach((attr) => {\r\n      if (hasOwn(attrs, attr)) {\r\n        setAttribute($el, attr, attrs[attr])\r\n      }\r\n    })\r\n  } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n    attrs.forEach((child) => {\r\n      append(child)\r\n    })\r\n  }\r\n\r\n  if (isArray(children)) {\r\n    children.forEach((child) => {\r\n      append(child)\r\n    })\r\n  } else {\r\n    append(children)\r\n  }\r\n\r\n  $el.appendChild($fragment)\r\n\r\n  return $el\r\n}\r\n\r\nexport default createElement\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n  let tagName = el.tagName.toLowerCase()\r\n\r\n  switch (attr) {\r\n    case 'style':\r\n      el.style.cssText = value\r\n      break\r\n    case 'value':\r\n      if (tagName === 'input' || tagName === 'textarea') {\r\n        el.value = value\r\n      } else {\r\n        el.setAttribute(attr, value)\r\n      }\r\n      break\r\n    case 'className':\r\n      el.className = value\r\n      break\r\n    default:\r\n      el.setAttribute(attr, value)\r\n      break\r\n  }\r\n}\r\n\r\nexport default setAttribute\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n  const sel = selector.replace(/^>/i, '')\r\n\r\n  if (!selector || !sel || !el) {\r\n    return false\r\n  }\r\n\r\n  /* istanbul ignore else */\r\n  if (el.matches) {\r\n    return el.matches(sel)\r\n  } else if (el.msMatchesSelector) {\r\n    return el.msMatchesSelector(sel)\r\n  } else {\r\n    return false\r\n  }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n  return el.host && el !== document && el.host.nodeType\r\n    ? el.host\r\n    : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n  'focusout',\r\n  'blur',\r\n  'focusin',\r\n  'focus',\r\n  'load',\r\n  'unload',\r\n  'mouseenter',\r\n  'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n  /* istanbul ignore else */\r\n  if (fn._delegateListener) {\r\n    fn = fn._delegateListener\r\n    delete fn._delegateListener\r\n  }\r\n\r\n  // 移除缓存的 _listeners 数据\r\n  _delete(el, type, fn)\r\n\r\n  el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n  const listeners = el._listeners\r\n  let index = -1\r\n\r\n  if (listeners.length < 1) {\r\n    return false\r\n  }\r\n\r\n  // 移除缓存的 _listeners 数据\r\n  listeners.forEach((listener, i) => {\r\n    const handler = listener.fn\r\n\r\n    if (type === listener.type) {\r\n      index = i\r\n\r\n      if (handler === fn) {\r\n        index = i\r\n      }\r\n    }\r\n  })\r\n\r\n  /* istanbul ignore else */\r\n  if (index > -1) {\r\n    listeners.splice(index, 1)\r\n  }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n  const $element = isString(el) ? document.querySelector(el) : el\r\n  const $children = $element.childNodes\r\n  const listeners = getListeners($element, type)\r\n\r\n  listeners.forEach((listener) => {\r\n    _off($element, listener.type, listener.fn)\r\n  })\r\n\r\n  if (\r\n    (recurse || type === true || arguments.length === 1) &&\r\n    $element &&\r\n    $children\r\n  ) {\r\n    $children.forEach(($child) => {\r\n      if (isElement($child)) {\r\n        purgeElement($child, type, recurse)\r\n      }\r\n    })\r\n  }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n  let listeners = el._listeners || []\r\n\r\n  if (isString(type) && type) {\r\n    listeners = listeners.filter((listener) => {\r\n      return listener.type === type\r\n    })\r\n  }\r\n\r\n  return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n  // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n  if (!isFunction(fn)) {\r\n    return purgeElement(el, type)\r\n  }\r\n\r\n  _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n  // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n  const listener = function (evt) {\r\n    const target = getTarget(evt)\r\n    // 通过 Element.matches 方法获得点击的目标元素\r\n    const delegateTarget = closest(target, selector, el)\r\n    let overrideContext = context || el\r\n\r\n    evt.delegateTarget = delegateTarget\r\n\r\n    // 当设置为 true 时,则事件处理器回调函数的\r\n    // this 上下文指向为 data 对象\r\n    if (context === true) {\r\n      overrideContext = data\r\n    }\r\n\r\n    /* istanbul ignore else */\r\n    if (delegateTarget) {\r\n      // 仅触发一次\r\n      /* istanbul ignore else */\r\n      if (once === true) {\r\n        off(el, type, listener)\r\n      }\r\n\r\n      fn.call(overrideContext, evt, data)\r\n    }\r\n  }\r\n\r\n  if (!el._listeners) {\r\n    el._listeners = []\r\n  }\r\n\r\n  // 缓存 options 元素绑定的事件处理器\r\n  el._listeners.push({\r\n    el,\r\n    selector,\r\n    type,\r\n    fn: listener,\r\n    data,\r\n    context,\r\n    capture\r\n  })\r\n\r\n  // 缓存包装后的事件处理器\r\n  fn._delegateListener = listener\r\n\r\n  el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n  const target = evt.target\r\n\r\n  return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n  if (el && el.nodeType === 3) {\r\n    return el.parentNode\r\n  }\r\n\r\n  return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n  const context = ctx || document\r\n\r\n  if (!el) {\r\n    return null\r\n  }\r\n\r\n  do {\r\n    /* istanbul ignore else */\r\n    if (\r\n      (selector != null &&\r\n        (selector.startsWith('>')\r\n          ? el.parentNode === context && matches(el, selector)\r\n          : matches(el, selector))) ||\r\n      (includeCTX && el === context)\r\n    ) {\r\n      return el\r\n    }\r\n\r\n    /* istanbul ignore else */\r\n    if (el === context) {\r\n      break\r\n    }\r\n\r\n    /* jshint boss:true */\r\n  } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n  '',\r\n  '',\r\n  '',\r\n  '',\r\n  '',\r\n  '',\r\n  '',\r\n  '',\r\n  ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n  if (isString(name)) {\r\n    return getSymbol(name, iconSet)\r\n  }\r\n\r\n  return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n  const patternName = /id=\"(.*?)\"/\r\n  const patternSet = /^(\\w+)-/\r\n  const symbols = SYMBOLS\r\n\r\n  return symbols.find((symbol) => {\r\n    const names = patternName.exec(symbol)\r\n    const fullName = names[1]\r\n    const sets = patternSet.exec(fullName)\r\n    const setName = sets[1]\r\n    const iconName =\r\n      iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n    return setName === iconSet && fullName === iconName\r\n  })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n  const $body = document.body\r\n  let $icons = document.querySelector('#outline-icons')\r\n  let symbols = []\r\n\r\n  add(symbol)\r\n  symbols = getSymbols()\r\n\r\n  if ($icons) {\r\n    $icons.innerHTML = symbols.join('')\r\n  } else {\r\n    $icons = document.createElement('div')\r\n    $icons.innerHTML =\r\n      ``\r\n    $body.insertBefore($icons.firstChild, $body.firstChild)\r\n  }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n  if (!symbols) {\r\n    return false\r\n  }\r\n\r\n  if (isArray(symbols) && symbols.length > 0) {\r\n    symbols.forEach((symbol) => {\r\n      /* istanbul ignore else */\r\n      if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n        SYMBOLS.push(symbol)\r\n      }\r\n    })\r\n  } else {\r\n    /* istanbul ignore else */\r\n    if (isString(symbols)) {\r\n      SYMBOLS.push(symbols)\r\n    }\r\n  }\r\n}\r\n\r\nexport default add\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n  const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n  const doctype =\r\n    '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n  const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n  const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n  const pattern = new RegExp(svg, 'i')\r\n\r\n  return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n  return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n  const size = options.size || 0\r\n  const color = options.color || ''\r\n  const iconSet = options.iconSet || ''\r\n  const width = isArray(size) ? size[0] : size\r\n  const height = isArray(size) ? size[1] : size\r\n  const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n  const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n  const $icon = document.createElement('i')\r\n  let binds = ''\r\n  let svg = ''\r\n  let $svg\r\n\r\n  if (!isString(name)) {\r\n    return null\r\n  }\r\n\r\n  if (isSVG(name)) {\r\n    svg = name\r\n  } else {\r\n    binds =\r\n      iconSet && iconSet !== 'icon'\r\n        ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n        : `xlink:href=\"#icon-${name}\"`\r\n    svg =\r\n      `` +\r\n      `` +\r\n      ``\r\n  }\r\n\r\n  $icon.className = 'outline-icon'\r\n  $icon.innerHTML = svg\r\n\r\n  if (isSVG(name)) {\r\n    $svg = $icon.querySelector('svg')\r\n    $svg.setAttribute('aria-hidden', 'true')\r\n    $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\r\n    $svg.setAttribute('class', 'outline-icon__svg')\r\n    $svg.setAttribute('width', '200')\r\n    $svg.setAttribute('height', '200')\r\n    $svg.style = cssRules\r\n  }\r\n\r\n  return $icon\r\n}\r\n\r\nexport default createElement\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n  if (idx) {\r\n    index = idx\r\n  } else {\r\n    index += 1\r\n  }\r\n\r\n  setProperty('--outline-zIndex', `${index}`)\r\n\r\n  return index\r\n}\r\n\r\nexport default zIndex\r\n","const setProperty = (prop, value) => {\r\n  const documentElement = document.documentElement\r\n  documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport isFunction from './utils/types/isFunction'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport paint from './utils/icons/paint'\r\nimport icon from './utils/icons/icon'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n  constructor(options) {\r\n    super()\r\n\r\n    this.attrs = Drawer.DEFAULTS\r\n    this.title = ''\r\n    this.closed = true\r\n    this.$el = null\r\n    this.$modal = null\r\n    this.$header = null\r\n    this.$title = null\r\n    this.$close = null\r\n    this.$main = null\r\n    this.$footer = null\r\n    this.$overlay = null\r\n    this.zIndex = 0\r\n\r\n    if (options) {\r\n      this.initialize(options)\r\n    }\r\n  }\r\n\r\n  initialize(options) {\r\n    let created\r\n\r\n    this.attr(options)\r\n\r\n    this.title = this.attr('title')\r\n    created = this.attr('created')\r\n\r\n    if (isFunction(created)) {\r\n      created.call(this)\r\n    }\r\n\r\n    this.render().addListeners()\r\n    return this\r\n  }\r\n\r\n  setTitle(title) {\r\n    this.attr('title', title)\r\n    this.title = title\r\n    this.$title.innerHTML = title\r\n\r\n    return this\r\n  }\r\n\r\n  isClosed() {\r\n    return this.closed\r\n  }\r\n\r\n  render() {\r\n    const mounted = this.attr('mounted')\r\n    const size = this.attr('size')\r\n    const placement = this.attr('placement')\r\n    const hasClose = this.attr('hasClose')\r\n    const hasOverlay = this.attr('hasOverlay')\r\n    const hasOffset = this.attr('hasOffset')\r\n    const hasPadding = this.attr('hasPadding')\r\n    const autoHeight = this.attr('autoHeight')\r\n    const customClass = this.attr('customClass')\r\n    const $fragment = document.createDocumentFragment()\r\n    let $el\r\n    let $modal\r\n    let $header\r\n    let $title\r\n    let $close\r\n    let $main\r\n    let $footer\r\n    let $overlay\r\n\r\n    paint()\r\n    this.zIndex = zIndex()\r\n\r\n    $title = createElement(\r\n      'h2',\r\n      {\r\n        className: 'outline-drawer__title'\r\n      },\r\n      [this.title]\r\n    )\r\n    this.$title = $title\r\n\r\n    if (hasClose) {\r\n      $close = createElement(\r\n        'div',\r\n        {\r\n          className: 'outline-drawer__close'\r\n        },\r\n        [icon('close', { size: 20 })]\r\n      )\r\n      this.$close = $close\r\n    }\r\n\r\n    $header = createElement(\r\n      'header',\r\n      {\r\n        className: 'outline-drawer__header'\r\n      },\r\n      [$title, $close]\r\n    )\r\n    this.$header = $header\r\n\r\n    $main = createElement(\r\n      'div',\r\n      {\r\n        className: 'outline-drawer__main'\r\n      },\r\n      ['']\r\n    )\r\n    this.$main = $main\r\n\r\n    if (!hasPadding) {\r\n      addClass($main, 'outline-drawer_full')\r\n    }\r\n\r\n    $footer = createElement(\r\n      'footer',\r\n      {\r\n        className: 'outline-drawer__footer'\r\n      },\r\n      ['']\r\n    )\r\n    this.$footer = $footer\r\n\r\n    $modal = createElement(\r\n      'div',\r\n      {\r\n        className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n      },\r\n      [$header, $main, $footer]\r\n    )\r\n    this.$modal = $modal\r\n\r\n    if (hasOffset) {\r\n      addClass($modal, 'outline-drawer_offset')\r\n    }\r\n\r\n    if (autoHeight) {\r\n      addClass($modal, 'outline-drawer_auto')\r\n    }\r\n\r\n    if (customClass) {\r\n      addClass($modal, customClass)\r\n    }\r\n\r\n    if (hasOverlay) {\r\n      $overlay = createElement(\r\n        'div',\r\n        {\r\n          className: 'outline-drawer__overlay'\r\n        },\r\n        ['']\r\n      )\r\n      this.$overlay = $overlay\r\n    }\r\n\r\n    $el = createElement(\r\n      'div',\r\n      {\r\n        className: `outline-drawer`\r\n      },\r\n      [$modal, $overlay]\r\n    )\r\n    this.$el = $el\r\n    $fragment.appendChild($el)\r\n    document.body.appendChild($fragment)\r\n\r\n    if (isFunction(mounted)) {\r\n      mounted.call(this)\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  open() {\r\n    const opened = this.attr('afterOpened')\r\n    const $modal = this.$modal\r\n\r\n    addClass(this.$el, 'outline-drawer_opened')\r\n    removeClass($modal, 'outline-drawer_closed')\r\n    addClass($modal, 'outline-drawer_opened')\r\n\r\n    later(() => {\r\n      this.closed = false\r\n\r\n      if (isFunction(opened)) {\r\n        opened.call(this)\r\n      }\r\n    })\r\n\r\n    return this\r\n  }\r\n\r\n  close() {\r\n    const closed = this.attr('afterClosed')\r\n    const $modal = this.$modal\r\n\r\n    removeClass($modal, 'outline-drawer_opened')\r\n    addClass($modal, 'outline-drawer_closed')\r\n\r\n    later(() => {\r\n      removeClass(this.$el, 'outline-drawer_opened')\r\n      this.closed = true\r\n\r\n      if (isFunction(closed)) {\r\n        closed.call(this)\r\n      }\r\n    })\r\n\r\n    return this\r\n  }\r\n\r\n  toggle() {\r\n    const afterToggle = this.attr('afterToggle')\r\n    const closed = this.isClosed()\r\n\r\n    if (closed) {\r\n      this.open()\r\n    } else {\r\n      this.close()\r\n    }\r\n\r\n    if (isFunction(afterToggle)) {\r\n      later(() => {\r\n        afterToggle.call(this, closed)\r\n      })\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  destroy() {\r\n    const afterDestroy = this.attr('afterDestroy')\r\n    const beforeDestroy = this.attr('beforeDestroy')\r\n    let index = this.zIndex\r\n\r\n    if (isFunction(beforeDestroy)) {\r\n      beforeDestroy.call(this)\r\n    }\r\n\r\n    this.removeListeners()\r\n\r\n    this.attrs = Drawer.DEFAULTS\r\n    this.title = ''\r\n    this.closed = false\r\n    this.$el = null\r\n    this.$modal = null\r\n    this.$header = null\r\n    this.$title = null\r\n    this.$close = null\r\n    this.$main = null\r\n    this.$footer = null\r\n    this.$overlay = null\r\n\r\n    index -= 1\r\n    zIndex(index)\r\n    this.zIndex = 0\r\n\r\n    if (isFunction(afterDestroy)) {\r\n      afterDestroy.call(this)\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  addListeners() {\r\n    const hasClose = this.attr('hasClose')\r\n    const hasOverlay = this.attr('hasOverlay')\r\n    const $el = this.$el\r\n\r\n    if (hasClose) {\r\n      on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n    }\r\n\r\n    if (hasOverlay) {\r\n      on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  removeListeners() {\r\n    const hasClose = this.attr('hasClose')\r\n    const hasOverlay = this.attr('hasOverlay')\r\n    const $el = this.$el\r\n\r\n    if (!hasClose && !hasOverlay) {\r\n      return this\r\n    }\r\n\r\n    off($el, 'click', this.onClose)\r\n\r\n    return this\r\n  }\r\n\r\n  onClose() {\r\n    this.close()\r\n    return this\r\n  }\r\n}\r\n\r\nDrawer.DEFAULTS = {\r\n  placement: 'rtl',\r\n  title: '标题',\r\n  size: 'regular',\r\n  hasClose: true,\r\n  hasOverlay: true,\r\n  hasOffset: false,\r\n  hasPadding: true,\r\n  autoHeight: true,\r\n  created: null,\r\n  mounted: null,\r\n  afterClosed: null,\r\n  afterOpened: null,\r\n  afterScroll: null,\r\n  beforeDestroy: null,\r\n  afterDestroy: null,\r\n  afterToggle: null\r\n}\r\n\r\nexport default Drawer\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","later","fn","delay","setTimeout","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","replace","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","every","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","filter","getListeners","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","paint","$body","body","$icons","symbols","innerHTML","join","insertBefore","firstChild","isSVG","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","zIndex","idx","documentElement","setProperty","Drawer","super","DEFAULTS","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","created","setTitle","isClosed","mounted","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","afterDestroy","beforeDestroy","onClose","afterClosed","afterOpened","afterScroll"],"mappings":"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"}
\ No newline at end of file
diff --git a/outline.min.js b/outline.min.js
index 984fb3f6..fe1617b5 100644
--- a/outline.min.js
+++ b/outline.min.js
@@ -1,2 +1,2 @@
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Outline=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(n=l,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(n[t]=o[t])})),this):0===arguments.length?l:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),h=t=>t*t,a=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):n(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},c=(t,e,s)=>{const r=a(t);let l=r.scrollTop,n=0;const o=e-l,c=r.scrollHeight,d=e-c<=0?e:c,u=t=>(i(s)&&s(t),!1),p=()=>{if(n+=1,o<0){if(l-=h(n),r.scrollTop=l,l<=e)return r.scrollTop=e,u(e)}else if(l+=h(n),r.scrollTop=l,l>=d)return r.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)},d=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=d(t.offsetParent)),e},u=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},p=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,m=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],f=(t,e,s)=>{const i=m.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},g=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);o.forEach((t=>{f(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{n(t)&&g(t,s,i)}))},y=(t,e,s)=>{if(!i(s))return g(t,e);f(t,e,s)},b=(t,e,s,i,r,l,n=!1)=>{const o=m.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||i&&t===r)return t;if(t===r)break}while(t=p(t))})(a,e,t);let d=l||t;o.delegateTarget=c,!0===l&&(d=r),c&&(!0===n&&y(t,s,h),i.call(d,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},$=function(t){t.stopPropagation(),t.preventDefault()},v={},_=t=>e(v,t)&&v[t].length>0,E=(t,e=!0)=>e?_(t):(t=>{let e=_(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=_(t);return e})(t),T=(t,e,i=!0)=>{const r=t=>{if(!_(t))return!1;v[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!E(t))return!1;i?setTimeout(l,10):l()},w=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),L=(t=[])=>{const e=['','','','','','','','',''],s=w(t)&&t.length>0?e.concat(t):e,i=document.body;let r=document.querySelector("#svg-sprites");r?r.innerHTML=s.join(""):(r=document.createElement("div"),r.innerHTML=``,i.insertBefore(r.firstChild,i.firstChild))},S=(t,e=0,s="",i="outline")=>{const r=i?`xlink:href="#${i}-icon-${t}"`:`xlink:href="#icon-${t}"`,l=w(e)?e[0]:e,n=w(e)?e[1]:e,o=e?`width:${l}px;height:${n}px;`:"",h=``,a=document.createElement("i");return a.className="outline-icon",a.innerHTML=h,a},x=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),C=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},z=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}},k=(s,i,l)=>{const n=document.createDocumentFragment(),o=document.createElement(s),h=e=>C(e)||t(e),a=e=>{let s;if(!h(e))return!1;C(e)?s=e:t(e)&&(s=document.createTextNode(e)),n.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&z(o,t,i[t])})):w(i)&&i.every((t=>h(t)))&&i.forEach((t=>{a(t)})),w(l)?l.forEach((t=>{a(t)})):a(l),o.appendChild(n),o},A=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!n(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},N=(t,e)=>{let s,i=t.className;if(!i||!A(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=x(i.replace(e,"")),t.className=i)},M=(e,s=!0,i=!0)=>{const r="outline-heading",l=e.innerHTML;let n;if(e.innerHTML=l.replace(/^\d+(?:(\.?\d*)*\s?)?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),N(e,r),!s)return!1;var o;n=e.querySelector(`.${r}__anchor`),i&&N(e,`${r}_start`),o=x(e.className),t(o)&&""===o&&e.removeAttribute("class"),e.removeChild(n)},O=(e,s=!0)=>{let i=1,r=0;const l=[];return e.forEach(((e,s)=>{const n=e.tagName.replace(/h/i,"");let o=parseInt(n,10),h=-1;var a;o>i?(r+=1,h=1===r?-1:s-1):o===i||or?1===o?(r=1,h=-1):h=l[s-1].pid:o<=r&&(1===o?r=1:(r-=i-o,r<=1&&(r=1)),h=1===r?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"")})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((s=>{e[s].forEach((e=>{t.filter((t=>t.pid===e.id)).forEach((t=>{t.code=e.code+"."+t.index}))}))})),t})(l):l};class D extends l{constructor(t){super(),this.attrs=D.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){let s,r,l,o,h;return this.attr(e),h=this.attr("articleElement"),r=this.attr("scrollElement"),l=this.attr("selector"),s=this.attr("created"),t(h)?o=document.querySelector(h):n(h)&&(o=h),o?(this.$articleElement=o,this.$scrollElement=a(r),this.$headings=[...o.querySelectorAll(l)],this.$headings.length<1||(this.chapters=O(this.$headings),i(s)&&s.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),s=this.attr("isAtStart"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.$headings,o=this.getChapters();return L(),n.forEach(((t,i)=>{const n=o[i].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,l=s.isAtStart||!0,n=s.showCode||!1,o=s.chapterCode||"",h=s.anchorURL||"",a=`heading-${e}`,c={id:a,className:l?`${i} ${i}_start`:i,"data-id":e},d=Object.keys(c),u=x(t.innerHTML);let p,m;if(d.forEach((e=>{z(t,e,c[e])})),n&&(t.innerHTML=o+" "+u),!r)return!1;m=S("hash"),p=k("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:h||`#${a}`,target:h?"_blank":"self","data-id":e},[m]),t.appendChild(p)})(t,i,{hasAnchor:e,isAtStart:s,showCode:r,chapterCode:n,anchorURL:l})})),i(t)&&t.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),s=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return i(s)&&s.call(this),this.removeListeners(),l.forEach((s=>{M(s,t,e)})),this.attr(D.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],i(r)&&r.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),s=this.attr("afterScroll"),r=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,n=d(l)-(r+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(n,(()=>{i(s)&&s.call(this,"anchor"),o((()=>{T("toolbar:update",{top:n,min:0,max:a})}))})),e||$(t),this}addListeners(){const t=this.$articleElement;return b(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return y(t,"click",this.onAnchorTrigger),this}}D.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null};const H=(t,e)=>{let s,i;if(A(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},j=(t,e)=>{document.documentElement.style.setProperty(t,e)};let F=2e3;const U=t=>(t?F=t:F+=1,j("--outline-zIndex",`${F}`),F);class I extends l{constructor(t){super(),this.attrs=I.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),i(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),a=this.attr("customClass"),c=document.createDocumentFragment();let d,u,p,m,f,g,y,b;return L(),this.zIndex=U(),m=k("h2",{className:"outline-drawer__title"},[this.title]),this.$title=m,r&&(f=k("div",{className:"outline-drawer__close"},[S("close",20)]),this.$close=f),p=k("header",{className:"outline-drawer__header"},[m,f]),this.$header=p,g=k("div",{className:"outline-drawer__main"},[""]),this.$main=g,o||H(g,"outline-drawer_full"),y=k("footer",{className:"outline-drawer__footer"},[""]),this.$footer=y,u=k("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[p,g,y]),this.$modal=u,n&&H(u,"outline-drawer_offset"),h&&H(u,"outline-drawer_auto"),a&&H(u,a),l&&(b=k("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=b),d=k("div",{className:"outline-drawer"},[u,b]),this.$el=d,c.appendChild(d),document.body.appendChild(c),i(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return H(this.$el,"outline-drawer_opened"),N(e,"outline-drawer_closed"),H(e,"outline-drawer_opened"),o((()=>{this.closed=!1,i(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return N(e,"outline-drawer_opened"),H(e,"outline-drawer_closed"),o((()=>{N(this.$el,"outline-drawer_opened"),this.closed=!0,i(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),i(t)&&o((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return i(e)&&e.call(this),this.removeListeners(),this.attrs=I.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,U(s),this.zIndex=0,i(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&b(s,".outline-drawer__close","click",this.onClose,this,!0),e&&b(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(y(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}I.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const q=(t,e,s,r,l,n=!1)=>{const o=m.indexOf(e)>-1,h=function(i){let o=l||t;!0===l&&(o=r),!0===n&&y(t,e,h),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:r,context:l,capture:o}),s._delegateListener=h,t.addEventListener(e,h,o)},B=(t,e)=>getComputedStyle(t)[e];class R extends l{constructor(t){super(),this.attrs=R.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,o;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?o=document.querySelector(r):n(r)&&(o=r),this.$parentElement=o,this.$scrollElement=a(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=this.attr("title"),e=this.attr("customClass"),s=this.$parentElement,i=[];let r,l,n,o,h=null;return s?(this.isInside()&&(h=k("h2",{className:"outline-chapters__title"},[t]),this.$title=h,i.push(h)),n=k("ul",{className:"outline-chapters__list outline-chapters_fixed outline-chapters_hidden"},[""]),this.$list=n,o=k("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=o,l=k("div",{className:"outline-chapters__main"},[n,o]),this.$main=l,i.push(l),r=k("nav",{id:"outline-chapters",className:"outline-chapters"},i),this.$el=r,this.isSticky()&&(this.calculateStickyHeight(),H(r,"outline-chapters_sticky")),e&&H(r,e),s.appendChild(r),this):this}render(){const t=this.attr("chapters"),e=this.attr("showCode"),s=this.attr("mounted");let r,l;return!this.$parentElement||t.length<1||(this._paintEdge(),l=this.$list,((t,e,s=!1)=>{const i=t=>document.getElementById(t);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=k("span",{className:"outline-chapters__text"},[e.text]),h=k("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},[o]);let a,c,d,u;s&&(a=k("span",{className:"outline-chapters__code","data-id":l},[e.code]),h.insertBefore(a,h.firstChild)),c=k("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[h]),-1===r?t.appendChild(c):(u=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(c):(d=k("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[c]),u.appendChild(d)))}))})(l,this.chapters,e),N(l,"outline-chapters_fixed"),N(l,"outline-chapters_hidden"),this.positionPlaceholder(this.active),r=this.$el,this.offsetTop=d(r),this.offsetWidth=r.offsetWidth,this.isFixed()&&(this.sticky(),j("--outline-chapters-width",`${this.offsetWidth}px`)),i(s)&&s.call(this),this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(B(e,"padding-top"),10),n=parseInt(B(e,"border-top-width"),10),o=parseInt(B(s,"padding-top"),10),h=parseInt(B(s,"margin-top"),10),a=parseInt(B(s,"border-top-width"),10);let c,d=r.offsetHeight,u=0;return l&&(u+=l),o&&(u+=o),h&&(u+=h),n&&(u+=n),a&&(u+=a),c=d*t,i.style.cssText=`transform: translateY(${u+c}px);height:${d}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&N(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,H(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?H(s,e):N(s,e),i(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return j("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(N(l,e),N(r,e),o((()=>{N(l,t),N(r,t)}),30)):N(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(H(l,t),H(r,t),o((()=>{H(l,e),H(r,e)}))):H(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&o((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(R.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),a=n(s)?s:document;return s&&(o.root=s),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=o((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],n=document.querySelector(`#${l}`),h=d(n)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),o((()=>{this.playing=!1,T("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),o((()=>{this.scrollTo(h,u),this.highlight(r)}),10)):(this.scrollTo(h,u),this.highlight(r)),$(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=o((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),T("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=o((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),b(t,".outline-chapters__anchor","click",this.onSelect,this,!0),q(i,"scroll",this.onScroll,this,!0),this.isSticky()&&q(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),y(e,"click",this.onSelect),y(r,"scroll",this.onScroll),this.isSticky()&&q(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}R.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const P=(t,e=!0)=>{const s=S(t.icon,t.size),i=k("a",{className:"outline-toolbar__anchor",href:t.link},[s]),r=k("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return H(s,"outline-toolbar__icon"),e&&H(r,"outline-toolbar_rounded"),t.disabled&&H(r,"outline-toolbar_disabled"),r},Q="outline-toolbar_disabled",W="outline-toolbar_hidden";class V extends l{constructor(t){super(),this.attrs=V.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,A(i,s)?N(i,s):H(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),r=this.attr("placement"),l=document.createDocumentFragment(),n=document.createDocumentFragment();return L(),e.forEach((t=>{const e=P(t,s);l.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=k("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},[l]),n.appendChild(this.$el),document.body.appendChild(n),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),l=t.action,n=document.createDocumentFragment();let o;return r(t)?(s.push(t),n.appendChild(P(t))):w(t)&&t.forEach((t=>{n.appendChild(P(t))})),e.appendChild(n),l&&i(l.handler)&&(o=l.type||"click",b(e,`.${t.name}`,o,l.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(N(h,Q),n&&o&&b(s,`.${t}`,n,o)):(H(h,Q),n&&o&&y(s,n,o)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(H(this.$el,Q),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,N(this.$el,Q),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),N(l,W)}else N(r,W),this.closed=!1,i(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),H(l,W)}else H(r,W),this.closed=!0,i(e)&&o((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(V.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(P(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const r=e.action;let l,n,o,h;if(this.disabled)return!1;r&&(n=r.handler,t(n)&&(h=n,r.handler=function(){T(h,e.name)},n=r.handler),l=r.type||"click",o=r.context),i(n)&&b(s,`.${e.name}`,l,n,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let r,l;if(this.disabled)return!1;s&&(l=s.handler,r=s.type||"click"),i(l)&&y(e,r,l)})),this}}V.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const J=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),Y=(t,e,s=null)=>{const r=J();let l="symbol"==typeof t?t.toString():t;return i(e)?(v[l]||(v[l]=[]),v[l].push({topic:l,callback:e,context:s,token:r}),r):""},G=t=>{if(!e(v,t))return!1;delete v[t]},K=(t,e)=>{if(!E(t))return!1;e?(t=>{const e=Object.keys(v);if(!t||e.length<1)return!1;e.forEach((e=>{const s=v[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&G(i)}))})(e):G(t)};class X extends l{constructor(t){super(),this.attrs=X.DEFAULTS,this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){return this._renderAnchors()._renderChapters()._renderToolbar(),this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll");return this.anchors=new D({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("position"),n=this.attr("placement"),o=this.attr("afterSticky"),h=this.attr("afterToggle"),a=this.attr("afterScroll"),c=this.count();let d,u=this.attr("parentElement");return c<1||(d={scrollElement:s,showCode:r,position:l,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:o,afterToggle:h,afterScroll:a},"relative"===l?(this.drawer=new I({placement:n,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),u=this.drawer.$main):d.customClass=i,d.parentElement=u,this.chapters=new R(d)),this}_renderToolbar(){const t=this.attr("placement"),e=this.attr("homepage"),s=this.attr("git"),i=this.attr("tags"),r=this.attr("issues"),l=this.count(),n={name:"homepage",icon:"homepage",size:20,link:e},o={name:"github",icon:"github",size:20,link:s},h={name:"tags",icon:"tags",size:20,link:i},a={name:"issues",icon:"issues",size:20,link:r},c={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},d=[];return d.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),e&&d.push(n),s&&d.push(o),i&&d.push(h),r&&d.push(a),l>0&&d.push(c),d.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.toolbar=new V({placement:t,buttons:d}),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,s=this.chapters,r=this.count();return r>0&&(s.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&(s.highlight(0),s.playing=!1),i(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=a(this.attr("scrollElement")),s=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return l>0&&(r.playing=!0),this.scrollTo(n,(()=>{s.hide("down"),s.show("up"),l>0&&(r.highlight(l-1),r.playing=!1),i(t)&&t.call(s,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return c(s,t,e),this}toggle(){const t=this.attr("position"),e=this.toolbar,s=this.drawer,i=this.chapters;return this.count()<1||("relative"!==t?(i.toggle(),e.highlight("menu")):(e.toggle(),o((()=>{i.isInside()?i.toggle():s.toggle()})))),this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar,r=!1;const l=this.count();return this.removeListeners(),l>0&&(r=e.isOutside(),e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(X.DEFAULTS),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(o=l,n=s,Object.keys(n).forEach((t=>{e(n,t)&&(o[t]=n[t])})),this):0===arguments.length?l:this;var o,n}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const o=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),n=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),h=t=>t*t,a=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):o(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},c=(t,e,s)=>{const r=a(t);let l=r.scrollTop,o=0;const n=e-l,c=r.scrollHeight,d=e-c<=0?e:c,u=t=>(i(s)&&s(t),!1),p=()=>{if(o+=1,n<0){if(l-=h(o),r.scrollTop=l,l<=e)return r.scrollTop=e,u(e)}else if(l+=h(o),r.scrollTop=l,l>=d)return r.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)},d=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=d(t.offsetParent)),e},u=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},p=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,m=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],f=(t,e,s)=>{const i=m.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},g=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,n=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);n.forEach((t=>{f(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{o(t)&&g(t,s,i)}))},b=(t,e,s)=>{if(!i(s))return g(t,e);f(t,e,s)},y=(t,e,s,i,r,l,o=!1)=>{const n=m.indexOf(s)>-1,h=function(n){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(n),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||i&&t===r)return t;if(t===r)break}while(t=p(t))})(a,e,t);let d=l||t;n.delegateTarget=c,!0===l&&(d=r),c&&(!0===o&&b(t,s,h),i.call(d,n,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:n}),i._delegateListener=h,t.addEventListener(s,h,n)},$=function(t){t.stopPropagation(),t.preventDefault()},v={},_=t=>e(v,t)&&v[t].length>0,E=(t,e=!0)=>e?_(t):(t=>{let e=_(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=_(t);return e})(t),w=(t,e,i=!0)=>{const r=t=>{if(!_(t))return!1;v[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!E(t))return!1;i?setTimeout(l,10):l()},T=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),S=['','','','','','','','',''],x=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return S.find((r=>{const l=s.exec(r)[1];return i.exec(l)[1]===e&&l===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):[...S],L=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),r=[];(e=>{if(!e)return!1;T(e)&&e.length>0?e.forEach((e=>{-1===S.indexOf(e)&&t(e)&&S.push(e)})):t(e)&&S.push(e)})(e),r=x(),i?i.innerHTML=r.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))},C=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),z=t=>{return!(!r(t)||!(o(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},k=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}},A=(s,i,l)=>{const o=document.createDocumentFragment(),n=document.createElement(s),h=e=>z(e)||t(e),a=e=>{let s;if(!h(e))return!1;z(e)?s=e:t(e)&&(s=document.createTextNode(e)),o.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&k(n,t,i[t])})):T(i)&&i.every((t=>h(t)))&&i.forEach((t=>{a(t)})),T(l)?l.forEach((t=>{a(t)})):a(l),n.appendChild(o),n},N=e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)},O=(e,s={})=>((e,s={})=>{const i=s.size||0,r=s.color||"",l=s.iconSet||"",o=T(i)?i[0]:i,n=T(i)?i[1]:i,h=i?`width:${o}px;height:${n}px;`:"",a=r?h+`color:${r}`:h,c=document.createElement("i");let d,u="",p="";return t(e)?(N(e)?p=e:(u=l&&"icon"!==l?`xlink:href="#${l}-icon-${e}"`:`xlink:href="#icon-${e}"`,p=``),c.className="outline-icon",c.innerHTML=p,N(e)&&(d=c.querySelector("svg"),d.setAttribute("aria-hidden","true"),d.setAttribute("xmlns","http://www.w3.org/2000/svg"),d.setAttribute("class","outline-icon__svg"),d.setAttribute("width","200"),d.setAttribute("height","200"),d.style=a),c):null})(e,s),M=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!o(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},D=(t,e)=>{let s,i=t.className;if(!i||!M(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=C(i.replace(e,"")),t.className=i)},H=(e,s=!0,i=!0)=>{const r="outline-heading",l=e.innerHTML;let o;if(e.innerHTML=l.replace(/^\d+(?:(\.?\d*)*\s?)?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),D(e,r),!s)return!1;var n;o=e.querySelector(`.${r}__anchor`),i&&D(e,`${r}_start`),n=C(e.className),t(n)&&""===n&&e.removeAttribute("class"),e.removeChild(o)},j=(e,s=!0)=>{let i=1,r=0;const l=[];return e.forEach(((e,s)=>{const o=e.tagName.replace(/h/i,"");let n=parseInt(o,10),h=-1;var a;n>i?(r+=1,h=1===r?-1:s-1):n===i||nr?1===n?(r=1,h=-1):h=l[s-1].pid:n<=r&&(1===n?r=1:(r-=i-n,r<=1&&(r=1)),h=1===r?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"")})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((s=>{e[s].forEach((e=>{t.filter((t=>t.pid===e.id)).forEach((t=>{t.code=e.code+"."+t.index}))}))})),t})(l):l};class F extends l{constructor(t){super(),this.attrs=F.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){let s,r,l,n,h;return this.attr(e),h=this.attr("articleElement"),r=this.attr("scrollElement"),l=this.attr("selector"),s=this.attr("created"),t(h)?n=document.querySelector(h):o(h)&&(n=h),n?(this.$articleElement=n,this.$scrollElement=a(r),this.$headings=[...n.querySelectorAll(l)],this.$headings.length<1||(this.chapters=j(this.$headings),i(s)&&s.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),s=this.attr("isAtStart"),r=this.attr("showCode"),l=this.attr("anchorURL"),o=this.$headings,n=this.getChapters();return L(),o.forEach(((t,i)=>{const o=n[i].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,l=s.isAtStart||!0,o=s.showCode||!1,n=s.chapterCode||"",h=s.anchorURL||"",a=`heading-${e}`,c={id:a,className:l?`${i} ${i}_start`:i,"data-id":e},d=Object.keys(c),u=C(t.innerHTML);let p,m;if(d.forEach((e=>{k(t,e,c[e])})),o&&(t.innerHTML=n+" "+u),!r)return!1;m=O("hash"),p=A("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:h||`#${a}`,target:h?"_blank":"self","data-id":e},[m]),t.appendChild(p)})(t,i,{hasAnchor:e,isAtStart:s,showCode:r,chapterCode:o,anchorURL:l})})),i(t)&&t.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),s=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return i(s)&&s.call(this),this.removeListeners(),l.forEach((s=>{H(s,t,e)})),this.attr(F.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],i(r)&&r.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),s=this.attr("afterScroll"),r=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,o=d(l)-(r+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(o,(()=>{i(s)&&s.call(this,"anchor"),n((()=>{w("toolbar:update",{top:o,min:0,max:a})}))})),e||$(t),this}addListeners(){const t=this.$articleElement;return y(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return b(t,"click",this.onAnchorTrigger),this}}F.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null};const U=(t,e)=>{let s,i;if(M(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},I=(t,e)=>{document.documentElement.style.setProperty(t,e)};let q=2e3;const B=t=>(t?q=t:q+=1,I("--outline-zIndex",`${q}`),q);class R extends l{constructor(t){super(),this.attrs=R.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),i(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),o=this.attr("hasOffset"),n=this.attr("hasPadding"),h=this.attr("autoHeight"),a=this.attr("customClass"),c=document.createDocumentFragment();let d,u,p,m,f,g,b,y;return L(),this.zIndex=B(),m=A("h2",{className:"outline-drawer__title"},[this.title]),this.$title=m,r&&(f=A("div",{className:"outline-drawer__close"},[O("close",{size:20})]),this.$close=f),p=A("header",{className:"outline-drawer__header"},[m,f]),this.$header=p,g=A("div",{className:"outline-drawer__main"},[""]),this.$main=g,n||U(g,"outline-drawer_full"),b=A("footer",{className:"outline-drawer__footer"},[""]),this.$footer=b,u=A("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[p,g,b]),this.$modal=u,o&&U(u,"outline-drawer_offset"),h&&U(u,"outline-drawer_auto"),a&&U(u,a),l&&(y=A("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=y),d=A("div",{className:"outline-drawer"},[u,y]),this.$el=d,c.appendChild(d),document.body.appendChild(c),i(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return U(this.$el,"outline-drawer_opened"),D(e,"outline-drawer_closed"),U(e,"outline-drawer_opened"),n((()=>{this.closed=!1,i(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return D(e,"outline-drawer_opened"),U(e,"outline-drawer_closed"),n((()=>{D(this.$el,"outline-drawer_opened"),this.closed=!0,i(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),i(t)&&n((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return i(e)&&e.call(this),this.removeListeners(),this.attrs=R.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,B(s),this.zIndex=0,i(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&y(s,".outline-drawer__close","click",this.onClose,this,!0),e&&y(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(b(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}R.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const P=(t,e,s,r,l,o=!1)=>{const n=m.indexOf(e)>-1,h=function(i){let n=l||t;!0===l&&(n=r),!0===o&&b(t,e,h),s.call(n,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:r,context:l,capture:n}),s._delegateListener=h,t.addEventListener(e,h,n)},Q=(t,e)=>getComputedStyle(t)[e];class W extends l{constructor(t){super(),this.attrs=W.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,n;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?n=document.querySelector(r):o(r)&&(n=r),this.$parentElement=n,this.$scrollElement=a(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=this.attr("title"),e=this.attr("customClass"),s=this.$parentElement,i=[];let r,l,o,n,h=null;return s?(this.isInside()&&(h=A("h2",{className:"outline-chapters__title"},[t]),this.$title=h,i.push(h)),o=A("ul",{className:"outline-chapters__list outline-chapters_fixed outline-chapters_hidden"},[""]),this.$list=o,n=A("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=n,l=A("div",{className:"outline-chapters__main"},[o,n]),this.$main=l,i.push(l),r=A("nav",{id:"outline-chapters",className:"outline-chapters"},i),this.$el=r,this.isSticky()&&(this.calculateStickyHeight(),U(r,"outline-chapters_sticky")),e&&U(r,e),s.appendChild(r),this):this}render(){const t=this.attr("chapters"),e=this.attr("showCode"),s=this.attr("mounted");let r,l;return!this.$parentElement||t.length<1||(this._paintEdge(),l=this.$list,((t,e,s=!1)=>{const i=t=>document.getElementById(t);e.forEach((e=>{const r=e.pid,l=e.id,o=e.rel,n=A("span",{className:"outline-chapters__text"},[e.text]),h=A("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+o,rel:o,"data-id":l},[n]);let a,c,d,u;s&&(a=A("span",{className:"outline-chapters__code","data-id":l},[e.code]),h.insertBefore(a,h.firstChild)),c=A("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[h]),-1===r?t.appendChild(c):(u=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(c):(d=A("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[c]),u.appendChild(d)))}))})(l,this.chapters,e),D(l,"outline-chapters_fixed"),D(l,"outline-chapters_hidden"),this.positionPlaceholder(this.active),r=this.$el,this.offsetTop=d(r),this.offsetWidth=r.offsetWidth,this.isFixed()&&(this.sticky(),I("--outline-chapters-width",`${this.offsetWidth}px`)),i(s)&&s.call(this),this.onObserver()),this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(Q(e,"padding-top"),10),o=parseInt(Q(e,"border-top-width"),10),n=parseInt(Q(s,"padding-top"),10),h=parseInt(Q(s,"margin-top"),10),a=parseInt(Q(s,"border-top-width"),10);let c,d=r.offsetHeight,u=0;return l&&(u+=l),n&&(u+=n),h&&(u+=h),o&&(u+=o),a&&(u+=a),c=d*t,i.style.cssText=`transform: translateY(${u+c}px);height:${d}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&D(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,U(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let o;return this.isFixed()?(o=l>=r,o?U(s,e):D(s,e),i(t)&&t.call(this,this.isClosed(),o),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return I("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(D(l,e),D(r,e),n((()=>{D(l,t),D(r,t)}),30)):D(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(U(l,t),U(r,t),n((()=>{U(l,e),U(r,e)}))):U(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&n((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(W.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,n={rootMargin:e.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),n),a=o(s)?s:document;return s&&(n.root=s),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=n((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],o=document.querySelector(`#${l}`),h=d(o)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),n((()=>{this.playing=!1,w("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),n((()=>{this.scrollTo(h,u),this.highlight(r)}),10)):(this.scrollTo(h,u),this.highlight(r)),$(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=n((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),w("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=n((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),y(t,".outline-chapters__anchor","click",this.onSelect,this,!0),P(i,"scroll",this.onScroll,this,!0),this.isSticky()&&P(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),b(e,"click",this.onSelect),b(r,"scroll",this.onScroll),this.isSticky()&&P(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}W.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const V=(t,e=!0)=>{const s=O(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=A("a",{className:"outline-toolbar__anchor",href:t.link},[s]),r=A("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return U(s,"outline-toolbar__icon"),e&&U(r,"outline-toolbar_rounded"),t.disabled&&U(r,"outline-toolbar_disabled"),r},J="outline-toolbar_disabled",Y="outline-toolbar_hidden";class G extends l{constructor(t){super(),this.attrs=G.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,M(i,s)?D(i,s):U(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),r=this.attr("placement"),l=document.createDocumentFragment(),o=document.createDocumentFragment();return L(),e.forEach((t=>{const e=V(t,s);l.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=A("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},[l]),o.appendChild(this.$el),document.body.appendChild(o),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),l=t.action,o=document.createDocumentFragment();let n;return r(t)?(s.push(t),o.appendChild(V(t))):T(t)&&t.forEach((t=>{o.appendChild(V(t))})),e.appendChild(o),l&&i(l.handler)&&(n=l.type||"click",y(e,`.${t.name}`,n,l.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,o,n,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(o=l.type||"click",n=l.handler),e?(D(h,J),o&&n&&y(s,`.${t}`,o,n)):(U(h,J),o&&n&&b(s,o,n)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(U(this.$el,J),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,D(this.$el,J),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),D(l,Y)}else D(r,Y),this.closed=!1,i(e)&&n((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),U(l,Y)}else U(r,Y),this.closed=!0,i(e)&&n((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(G.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(V(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const r=e.action;let l,o,n,h;if(this.disabled)return!1;r&&(o=r.handler,t(o)&&(h=o,r.handler=function(){w(h,e.name)},o=r.handler),l=r.type||"click",n=r.context),i(o)&&y(s,`.${e.name}`,l,o,n||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let r,l;if(this.disabled)return!1;s&&(l=s.handler,r=s.type||"click"),i(l)&&b(e,r,l)})),this}}G.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const K=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),X=(t,e,s=null)=>{const r=K();let l="symbol"==typeof t?t.toString():t;return i(e)?(v[l]||(v[l]=[]),v[l].push({topic:l,callback:e,context:s,token:r}),r):""},Z=t=>{if(!e(v,t))return!1;delete v[t]},tt=(t,e)=>{if(!E(t))return!1;e?(t=>{const e=Object.keys(v);if(!t||e.length<1)return!1;e.forEach((e=>{const s=v[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&Z(i)}))})(e):Z(t)};class et extends l{constructor(t){super(),this.attrs=et.DEFAULTS,this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,this.buttons=[],t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){return this._renderAnchors()._renderChapters()._renderToolbar(),this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),o=this.attr("afterScroll");return this.anchors=new F({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:o}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("position"),o=this.attr("placement"),n=this.attr("afterSticky"),h=this.attr("afterToggle"),a=this.attr("afterScroll"),c=this.count();let d,u=this.attr("parentElement");return c<1||(d={scrollElement:s,showCode:r,position:l,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:n,afterToggle:h,afterScroll:a},"relative"===l?(this.drawer=new R({placement:o,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),u=this.drawer.$main):d.customClass=i,d.parentElement=u,this.chapters=new W(d)),this}_renderToolbar(){const t=this.attr("placement"),e=this.attr("homepage"),s=this.attr("git"),i=this.attr("tags"),r=this.attr("issues"),l=this.attr("tools"),o=this.count(),n={name:"homepage",icon:"homepage",size:20,link:e},h={name:"github",icon:"github",size:20,link:s},a={name:"tags",icon:"tags",size:20,link:i},c={name:"issues",icon:"issues",size:20,link:r},d={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},u=[];return u.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),o>0&&u.push(d),e&&u.push(n),s&&u.push(h),i&&u.push(a),r&&u.push(c),l?.length>0&&u.push(...l),u.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.buttons=[...u],this.toolbar=new G({placement:t,buttons:u}),this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,s=this.chapters,r=this.count();return r>0&&(s.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&(s.highlight(0),s.playing=!1),i(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=a(this.attr("scrollElement")),s=this.toolbar,r=this.chapters,l=this.count(),o=Math.floor(e.scrollHeight-e.clientHeight);return l>0&&(r.playing=!0),this.scrollTo(o,(()=>{s.hide("down"),s.show("up"),l>0&&(r.highlight(l-1),r.playing=!1),i(t)&&t.call(s,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return c(s,t,e),this}toggle(){const t=this.attr("position"),e=this.toolbar,s=this.drawer,i=this.chapters;return this.count()<1||("relative"!==t?(i.toggle(),e.highlight("menu")):(e.toggle(),n((()=>{i.isInside()?i.toggle():s.toggle()})))),this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar,r=!1;const l=this.count();return this.removeListeners(),l>0&&(r=e.isOutside(),e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(et.DEFAULTS),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r {\r\n  return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n  const hasOwnProperty = Object.prototype.hasOwnProperty\r\n  return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n  return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n  return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from '../types/isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n  return (\r\n    (toString(o) === '[object Object]' ||\r\n      typeof o === 'object' ||\r\n      isFunction(o)) &&\r\n    o !== null\r\n  )\r\n}\r\n\r\nexport default isObject\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n  constructor(options) {\r\n    this.attrs = {}\r\n\r\n    if (options) {\r\n      this.initialize(options)\r\n    }\r\n  }\r\n\r\n  initialize(options) {\r\n    this.attr(options).render().addListeners()\r\n    return this\r\n  }\r\n\r\n  attr(prop, value) {\r\n    const attrs = this.attrs\r\n\r\n    if (isString(prop)) {\r\n      // 只能扩展 attrs 中已有的属性\r\n      if (value && hasOwn(attrs, prop)) {\r\n        // 更新单个配置信息\r\n        attrs[prop] = value\r\n        return this\r\n      }\r\n\r\n      // 只传递 prop 参数,则返回对应的属性值\r\n      return attrs[prop]\r\n    } else if (isObject(prop)) {\r\n      // 批量更新配置信息\r\n      extend(attrs, prop)\r\n\r\n      return this\r\n    } else if (arguments.length === 0) {\r\n      // 不传递参数,直接返回整个\r\n      return attrs\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  render() {\r\n    return this\r\n  }\r\n\r\n  destroy() {\r\n    this.removeListeners()\r\n    return this\r\n  }\r\n\r\n  reload(options) {\r\n    this.destroy().initialize(this.attr(options))\r\n    return this\r\n  }\r\n\r\n  addListeners() {\r\n    return this\r\n  }\r\n\r\n  removeListeners() {\r\n    return this\r\n  }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n  const keys = Object.keys(source)\r\n\r\n  keys.forEach((prop) => {\r\n    if (hasOwn(source, prop)) {\r\n      origin[prop] = source[prop]\r\n    }\r\n  })\r\n}\r\n\r\nexport default extend\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n  return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n  if (!isFunction(fn)) {\r\n    return false\r\n  }\r\n\r\n  return setTimeout(() => {\r\n    fn()\r\n  }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n  return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n  let $rootElements\r\n  let $scrollElement\r\n\r\n  if (!scrollElement) {\r\n    $rootElements = document.querySelectorAll('html,body')\r\n    $scrollElement =\r\n      $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n        ? $rootElements[0]\r\n        : $rootElements[1]\r\n  } else {\r\n    if (isString(scrollElement)) {\r\n      $scrollElement = document.querySelector(scrollElement)\r\n    } else if (isElement(scrollElement)) {\r\n      $scrollElement = scrollElement\r\n    }\r\n  }\r\n\r\n  return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n  const $scrollElement = _getScrollElement(scrollElement)\r\n  let scrollTop = $scrollElement.scrollTop\r\n  let step = 0\r\n  const distance = top - scrollTop\r\n  const MAX_HEIGHT = $scrollElement.scrollHeight\r\n  const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n  const stop = (top) => {\r\n    if (isFunction(afterStop)) {\r\n      afterStop(top)\r\n    }\r\n\r\n    return false\r\n  }\r\n  const play = () => {\r\n    step += 1\r\n\r\n    // 向上滚动\r\n    if (distance < 0) {\r\n      scrollTop -= easeInQuad(step)\r\n      $scrollElement.scrollTop = scrollTop\r\n\r\n      if (scrollTop <= top) {\r\n        $scrollElement.scrollTop = top\r\n        return stop(top)\r\n      }\r\n    } else {\r\n      scrollTop += easeInQuad(step)\r\n      $scrollElement.scrollTop = scrollTop\r\n\r\n      if (scrollTop >= MAX_TOP) {\r\n        $scrollElement.scrollTop = MAX_TOP\r\n        return stop(MAX_TOP)\r\n      }\r\n    }\r\n\r\n    requestAnimationFrame(play)\r\n  }\r\n\r\n  requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n  let top = el.offsetTop\r\n\r\n  if (el.offsetParent !== null) {\r\n    top += offsetTop(el.offsetParent)\r\n  }\r\n\r\n  return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n  const sel = selector.replace(/^>/i, '')\r\n\r\n  if (!selector || !sel || !el) {\r\n    return false\r\n  }\r\n\r\n  /* istanbul ignore else */\r\n  if (el.matches) {\r\n    return el.matches(sel)\r\n  } else if (el.msMatchesSelector) {\r\n    return el.msMatchesSelector(sel)\r\n  } else {\r\n    return false\r\n  }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n  return el.host && el !== document && el.host.nodeType\r\n    ? el.host\r\n    : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n  'focusout',\r\n  'blur',\r\n  'focusin',\r\n  'focus',\r\n  'load',\r\n  'unload',\r\n  'mouseenter',\r\n  'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n  /* istanbul ignore else */\r\n  if (fn._delegateListener) {\r\n    fn = fn._delegateListener\r\n    delete fn._delegateListener\r\n  }\r\n\r\n  // 移除缓存的 _listeners 数据\r\n  _delete(el, type, fn)\r\n\r\n  el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n  const listeners = el._listeners\r\n  let index = -1\r\n\r\n  if (listeners.length < 1) {\r\n    return false\r\n  }\r\n\r\n  // 移除缓存的 _listeners 数据\r\n  listeners.forEach((listener, i) => {\r\n    const handler = listener.fn\r\n\r\n    if (type === listener.type) {\r\n      index = i\r\n\r\n      if (handler === fn) {\r\n        index = i\r\n      }\r\n    }\r\n  })\r\n\r\n  /* istanbul ignore else */\r\n  if (index > -1) {\r\n    listeners.splice(index, 1)\r\n  }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n  const $element = isString(el) ? document.querySelector(el) : el\r\n  const $children = $element.childNodes\r\n  const listeners = getListeners($element, type)\r\n\r\n  listeners.forEach((listener) => {\r\n    _off($element, listener.type, listener.fn)\r\n  })\r\n\r\n  if (\r\n    (recurse || type === true || arguments.length === 1) &&\r\n    $element &&\r\n    $children\r\n  ) {\r\n    $children.forEach(($child) => {\r\n      if (isElement($child)) {\r\n        purgeElement($child, type, recurse)\r\n      }\r\n    })\r\n  }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n  let listeners = el._listeners || []\r\n\r\n  if (isString(type) && type) {\r\n    listeners = listeners.filter((listener) => {\r\n      return listener.type === type\r\n    })\r\n  }\r\n\r\n  return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n  // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n  if (!isFunction(fn)) {\r\n    return purgeElement(el, type)\r\n  }\r\n\r\n  _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n  // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n  const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n  const listener = function (evt) {\r\n    const target = getTarget(evt)\r\n    // 通过 Element.matches 方法获得点击的目标元素\r\n    const delegateTarget = closest(target, selector, el)\r\n    let overrideContext = context || el\r\n\r\n    evt.delegateTarget = delegateTarget\r\n\r\n    // 当设置为 true 时,则事件处理器回调函数的\r\n    // this 上下文指向为 data 对象\r\n    if (context === true) {\r\n      overrideContext = data\r\n    }\r\n\r\n    /* istanbul ignore else */\r\n    if (delegateTarget) {\r\n      // 仅触发一次\r\n      /* istanbul ignore else */\r\n      if (once === true) {\r\n        off(el, type, listener)\r\n      }\r\n\r\n      fn.call(overrideContext, evt, data)\r\n    }\r\n  }\r\n\r\n  if (!el._listeners) {\r\n    el._listeners = []\r\n  }\r\n\r\n  // 缓存 options 元素绑定的事件处理器\r\n  el._listeners.push({\r\n    el,\r\n    selector,\r\n    type,\r\n    fn: listener,\r\n    data,\r\n    context,\r\n    capture\r\n  })\r\n\r\n  // 缓存包装后的事件处理器\r\n  fn._delegateListener = listener\r\n\r\n  el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n  const target = evt.target\r\n\r\n  return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n  if (el && el.nodeType === 3) {\r\n    return el.parentNode\r\n  }\r\n\r\n  return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n  const context = ctx || document\r\n\r\n  if (!el) {\r\n    return null\r\n  }\r\n\r\n  do {\r\n    /* istanbul ignore else */\r\n    if (\r\n      (selector != null &&\r\n        (selector.startsWith('>')\r\n          ? el.parentNode === context && matches(el, selector)\r\n          : matches(el, selector))) ||\r\n      (includeCTX && el === context)\r\n    ) {\r\n      return el\r\n    }\r\n\r\n    /* istanbul ignore else */\r\n    if (el === context) {\r\n      break\r\n    }\r\n\r\n    /* jshint boss:true */\r\n  } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n * 
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} data - (必须)数据对象\r\n * @param {Boolean} async - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isArray from './types/isArray'\r\n\r\n/**\r\n * 绘制 SVG Sprites 图标集\r\n * ========================================================================\r\n * @method paintSvgSprites\r\n * @param {Array} [symbols] - (可选)symbols 图标数组\r\n * 传递 symbols - 绘制 symbols + SYMBOLS 的图标集\r\n * 不传递 symbols - 仅绘制默认 SYMBOLS 图标集\r\n */\r\nexport const paintSvgSprites = (symbols = []) => {\r\n const SYMBOLS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n ]\r\n const sprites =\r\n isArray(symbols) && symbols.length > 0 ? SYMBOLS.concat(symbols) : SYMBOLS\r\n const $body = document.body\r\n let $icons = document.querySelector('#svg-sprites')\r\n\r\n if ($icons) {\r\n $icons.innerHTML = sprites.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createSvgIcon\r\n * @param {String} name\r\n * @param {Number|String|Array} [size]\r\n * @param {String} [color]\r\n * @param {String} [iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nexport const createSvgIcon = (\r\n name,\r\n size = 0,\r\n color = '',\r\n iconSet = 'outline'\r\n) => {\r\n const binds = iconSet\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const svg =\r\n `` +\r\n `` +\r\n ``\r\n const $icon = document.createElement('i')\r\n\r\n $icon.className = 'outline-icon'\r\n $icon.innerHTML = svg\r\n\r\n return $icon\r\n}\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import hasOwn from '../lang/hasOwn'\r\nimport isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttribute from './setAttribute'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array} attrs - 属性对象或者子节点\r\n * @param {Array} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n Object.keys(attrs).forEach((attr) => {\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute($el, attr, attrs[attr])\r\n }\r\n })\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(/^\\d+(?:(\\.?\\d*)*\\s?)?/gi, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n $heading.removeChild($anchor)\r\n}\r\n\r\nexport default _resetHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\nconst getChapters = (headings, showCode = true) => {\r\n let previous = 1\r\n let level = 0\r\n const chapters = []\r\n\r\n headings.forEach((heading, i) => {\r\n const headingLevel = heading.tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text: stripTags(trim(heading.innerHTML))\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChapters\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","const _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = chapters.filter((b) => b.pid === c.id)\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import Base from './base'\r\n\r\n// 在文章的标题生成 anchor 链接\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport publish from './utils/observer/emit'\r\nimport { paintSvgSprites } from './utils/icons'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _resetHeading from './_resetHeading'\r\nimport getChapters from './getChapters'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Anchors.DEFAULTS\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n this.chapters = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let selector\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n selector = this.attr('selector')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = [...$articleElement.querySelectorAll(selector)]\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n this.chapters = getChapters(this.$headings)\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const chapters = this.chapters\r\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const $headings = this.$headings\r\n const chapters = this.getChapters()\r\n\r\n paintSvgSprites()\r\n\r\n $headings.forEach(($heading, i) => {\r\n const chapterCode = chapters[i].code\r\n _updateHeading($heading, i, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL\r\n })\r\n })\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n const $headings = this.$headings\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n $headings.forEach(($heading) => {\r\n _resetHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n this.attr(Anchors.DEFAULTS)\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n this.chapters = []\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n}\r\n\r\nexport default Anchors\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttribute from './utils/dom/setAttribute'\r\n\r\nimport { createSvgIcon } from './utils/icons'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const keys = Object.keys(attrs)\r\n const text = trim($heading.innerHTML)\r\n let $anchor\r\n let $icon\r\n\r\n keys.forEach((prop) => {\r\n setAttribute($heading, prop, attrs[prop])\r\n })\r\n\r\n if (showCode) {\r\n $heading.innerHTML = chapterCode + ' ' + text\r\n }\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $icon = createSvgIcon('hash')\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: anchorURL ? anchorURL : `#${headingId}`,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n [$icon]\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport isFunction from './utils/types/isFunction'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport { paintSvgSprites, createSvgIcon } from './utils/icons'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Drawer.DEFAULTS\r\n this.title = ''\r\n this.closed = true\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const customClass = this.attr('customClass')\r\n const $fragment = document.createDocumentFragment()\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paintSvgSprites()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n [this.title]\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n [createSvgIcon('close', 20)]\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__main'\r\n },\r\n ['']\r\n )\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement(\r\n 'footer',\r\n {\r\n className: 'outline-drawer__footer'\r\n },\r\n ['']\r\n )\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__overlay'\r\n },\r\n ['']\r\n )\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n $fragment.appendChild($el)\r\n document.body.appendChild($fragment)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n\r\n this.attrs = Drawer.DEFAULTS\r\n this.title = ''\r\n this.closed = false\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n}\r\n\r\nexport default Drawer\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import Base from './base'\r\n\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport publish from './utils/observer/emit'\r\n\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport _paintChapters from './_paintChapters'\r\n\r\nclass Chapters extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Chapters.DEFAULTS\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.chapters = []\r\n this.closed = false\r\n this.active = 0\r\n this.offsetTop = 0\r\n this.offsetWidth = 0\r\n this.$active = null\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.playing = false\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n _paintEdge() {\r\n const STICKY = 'outline-chapters_sticky'\r\n const FIXED = 'outline-chapters_fixed'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const title = this.attr('title')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-chapters__title'\r\n },\r\n [title]\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement(\r\n 'ul',\r\n {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-chapters__list ${FIXED} ${HIDDEN}`\r\n },\r\n ['']\r\n )\r\n this.$list = $list\r\n\r\n $placeholder = createElement(\r\n 'div',\r\n {\r\n className: 'outline-chapters__placeholder'\r\n },\r\n ['']\r\n )\r\n this.$placeholder = $placeholder\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-chapters__main'\r\n },\r\n [$list, $placeholder]\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-chapters',\r\n className: 'outline-chapters'\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n\r\n $parentElement.appendChild($el)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const FIXED = 'outline-chapters_fixed'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const chapters = this.attr('chapters')\r\n const showCode = this.attr('showCode')\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n let $el\r\n let $list\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this._paintEdge()\r\n\r\n $list = this.$list\r\n _paintChapters($list, this.chapters, showCode)\r\n removeClass($list, FIXED)\r\n removeClass($list, HIDDEN)\r\n this.positionPlaceholder(this.active)\r\n\r\n $el = this.$el\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n this.onObserver()\r\n\r\n return this\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-chapters__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n // top:calc(${offsetTop}px + ${top}px);\r\n $placeholder.style.cssText = `transform: translateY(${\r\n offsetTop + top\r\n }px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\r\n const HIGHLIGHT = 'outline-chapters_active'\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n this.$active = $anchor\r\n addClass(this.$active, HIGHLIGHT)\r\n\r\n this.positionPlaceholder(this.active)\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-chapters_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-chapters_folded'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const opened = this.attr('afterOpened')\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n removeClass($parent, HIDDEN)\r\n removeClass($el, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n removeClass($el, FOLDED)\r\n }, 30)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-chapters_folded'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const closed = this.attr('afterClosed')\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n addClass($parent, FOLDED)\r\n addClass($el, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n addClass($el, HIDDEN)\r\n })\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n this.$parentElement.removeChild(this.$el)\r\n\r\n this.attr(Chapters.DEFAULTS)\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetTop = 0\r\n this.$active = null\r\n this.closed = false\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n let timer = null\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (timer) {\r\n clearTimeout(timer)\r\n }\r\n\r\n timer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at($element, 'resize', this.onResize, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n\r\n if (this.isSticky()) {\r\n at($element, 'resize', this.onResize)\r\n }\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nChapters.DEFAULTS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n}\r\n\r\nexport default Chapters\r\n","import createElement from './utils/dom/createElement'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const byId = (id) => document.getElementById(id)\r\n\r\n chapters.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const rel = chapter.rel\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-chapters__text'\r\n },\r\n [chapter.text]\r\n )\r\n const $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-chapters__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id\r\n },\r\n [$text]\r\n )\r\n let $code\r\n let $li\r\n let $ul\r\n let $parent\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-chapters__code',\r\n 'data-id': id\r\n },\r\n [chapter.code]\r\n )\r\n\r\n $link.insertBefore($code, $link.firstChild)\r\n }\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-chapters__item',\r\n 'data-id': id\r\n },\r\n [$link]\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $parent = byId(`chapter-${pid}`)\r\n $ul = byId(`subject-${pid}`)\r\n\r\n if (!$ul) {\r\n $ul = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-chapters__subject'\r\n },\r\n [$li]\r\n )\r\n\r\n $parent.appendChild($ul)\r\n } else {\r\n $ul.appendChild($li)\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport default _paintChapters\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","import { createSvgIcon } from './utils/icons'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = createSvgIcon(button.icon, button.size)\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n [$icon]\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import Base from './base'\r\n\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport publish from './utils/observer/emit'\r\nimport { paintSvgSprites } from './utils/icons'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Toolbar.DEFAULTS\r\n this.$el = null\r\n this.disabled = false\r\n this.closed = false\r\n this.buttons = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n created = this.attr('created')\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isDisabled(name) {\r\n const buttons = this.attr('buttons')\r\n let button\r\n\r\n if (name) {\r\n button = buttons.find((option) => option.name === name)\r\n\r\n return button?.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n highlight(name) {\r\n const button = this.buttons.find((item) => item.name === name)\r\n const ACTIVE = 'outline-toolbar_active'\r\n let $button\r\n\r\n if ($button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const rounded = this.attr('rounded')\r\n const placement = this.attr('placement')\r\n const $buttons = document.createDocumentFragment()\r\n const $fragment = document.createDocumentFragment()\r\n\r\n paintSvgSprites()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n\r\n $buttons.appendChild($button)\r\n this.buttons.push({\r\n name: button.name,\r\n $el: $button\r\n })\r\n })\r\n\r\n this.$el = createElement(\r\n 'div',\r\n {\r\n id: 'outline-toolbar',\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n },\r\n [$buttons]\r\n )\r\n $fragment.appendChild(this.$el)\r\n document.body.appendChild($fragment)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const action = button.action\r\n const $fragment = document.createDocumentFragment()\r\n let type\r\n\r\n if (isObject(button)) {\r\n buttons.push(button)\r\n $fragment.appendChild(_createButton(button))\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n $fragment.appendChild(_createButton(item))\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n if (action && isFunction(action.handler)) {\r\n type = action.type || 'click'\r\n on($el, `.${button.name}`, type, action.handler)\r\n }\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const button = buttons.find((option) => option.name === name)\r\n let index = -1\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button, i) => {\r\n if (button.name === name) {\r\n index = i\r\n }\r\n })\r\n\r\n if (index > -1) {\r\n this.attr().buttons.splice(index, 1)\r\n }\r\n\r\n $button = $el.querySelector(`.${name}`)\r\n this.switch(name, false)\r\n $el.removeChild($button)\r\n\r\n return this\r\n }\r\n\r\n switch(name, enabled) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const button = buttons.find((option) => option.name === name)\r\n let action\r\n let type\r\n let listener\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n buttons.forEach((option) => {\r\n if (option.name === name) {\r\n button.disabled = !enabled\r\n }\r\n })\r\n\r\n action = button.action\r\n $button = $el.querySelector(`.${name}`)\r\n\r\n if (action) {\r\n type = action.type || 'click'\r\n listener = action.handler\r\n }\r\n\r\n if (enabled) {\r\n removeClass($button, DISABLED)\r\n\r\n if (type && listener) {\r\n on($el, `.${name}`, type, listener)\r\n }\r\n } else {\r\n addClass($button, DISABLED)\r\n\r\n if (type && listener) {\r\n off($el, type, listener)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this.switch(name, false)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this.switch(name, true)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.attr('buttons').find((option) => option.name === name)\r\n const $el = this.$el\r\n let $button\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = $el.querySelector(`.${name}`)\r\n removeClass($button, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.attr('buttons').find((option) => option.name === name)\r\n const $el = this.$el\r\n let $button\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n $button = $el.querySelector(`.${name}`)\r\n addClass($button, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n let $el = this.$el\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n document.body.removeChild($el)\r\n $el = null\r\n\r\n this.attr(Toolbar.DEFAULTS)\r\n this.disabled = false\r\n this.closed = false\r\n this.buttons = []\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons') || []\r\n\r\n this.removeListeners()\r\n $el.innerHTML = ''\r\n\r\n buttons.forEach((button) => {\r\n this.$el.appendChild(_createButton(button))\r\n })\r\n\r\n this.addListeners()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons')\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button) => {\r\n const action = button.action\r\n const disabled = this.disabled\r\n let type\r\n let listener\r\n let context\r\n let command\r\n\r\n if (disabled) {\r\n return false\r\n }\r\n\r\n if (action) {\r\n listener = action.handler\r\n if (isString(listener)) {\r\n command = listener\r\n action.handler = function () {\r\n publish(command, button.name)\r\n }\r\n listener = action.handler\r\n }\r\n\r\n type = action.type || 'click'\r\n context = action.context\r\n }\r\n\r\n if (isFunction(listener)) {\r\n on($el, `.${button.name}`, type, listener, context || this, true)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons')\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button) => {\r\n const action = button.action\r\n const disabled = this.disabled\r\n let type\r\n let listener\r\n\r\n if (disabled) {\r\n return false\r\n }\r\n\r\n if (action) {\r\n listener = action.handler\r\n type = action.type || 'click'\r\n }\r\n\r\n if (isFunction(listener)) {\r\n off($el, type, listener)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n}\r\n\r\nexport default Toolbar\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import Base from './base'\r\nimport Anchors from './anchors'\r\nimport Drawer from './drawer'\r\nimport Chapters from './chapters'\r\nimport Toolbar from './toolbar'\r\n\r\nimport later from './utils/lang/later'\r\nimport isFunction from './utils/types/isFunction'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Outline extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Outline.DEFAULTS\r\n this.anchors = null\r\n this.drawer = null\r\n this.chapters = null\r\n this.toolbar = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n return this.anchors.getChapters(isTreeStructured)\r\n }\r\n\r\n count() {\r\n return this.anchors.count()\r\n }\r\n\r\n render() {\r\n this._renderAnchors()._renderChapters()._renderToolbar()\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderChapters() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let CHAPTERS_OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n CHAPTERS_OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n } else {\r\n CHAPTERS_OPTIONS.customClass = customClass\r\n }\r\n\r\n CHAPTERS_OPTIONS.parentElement = parentElement\r\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n type: 'click',\r\n handler: 'toolbar:action:up'\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'menu',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n type: 'click',\r\n handler: 'toolbar:action:toggle'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n type: 'click',\r\n handler: 'toolbar:action:down'\r\n }\r\n }\r\n const buttons = []\r\n\r\n buttons.push(UP)\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n buttons.push(DOWN)\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons: buttons\r\n })\r\n\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const chapters = this.chapters\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n chapters.highlight(0)\r\n chapters.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n chapters.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\r\n const toolbar = this.toolbar\r\n const chapters = this.chapters\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n chapters.highlight(count - 1)\r\n chapters.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n chapters.playing = true\r\n }\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n const scrollElement = this.attr('scrollElement')\r\n scrollTo(scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n toggle() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const chapters = this.chapters\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n chapters.toggle()\r\n toolbar.highlight('menu')\r\n } else {\r\n toolbar.toggle()\r\n\r\n later(() => {\r\n if (chapters.isInside()) {\r\n chapters.toggle()\r\n } else {\r\n drawer.toggle()\r\n }\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n let anchors = this.anchors\r\n let chapters = this.chapters\r\n let drawer = this.drawer\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n const count = this.count()\r\n\r\n this.removeListeners()\r\n\r\n if (count > 0) {\r\n isOutside = chapters.isOutside()\r\n\r\n chapters.destroy()\r\n chapters = null\r\n\r\n if (isOutside) {\r\n drawer.destroy()\r\n drawer = null\r\n }\r\n }\r\n\r\n toolbar.destroy()\r\n toolbar = null\r\n\r\n anchors.destroy()\r\n anchors = null\r\n\r\n this.attr(Outline.DEFAULTS)\r\n\r\n return this\r\n }\r\n\r\n onToggle() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onScrollTop() {\r\n this.toTop()\r\n return this\r\n }\r\n\r\n onScrollBottom() {\r\n this.toBottom()\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n const toolbar = this.toolbar\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n } else if (current >= max) {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n } else if (current > min && current < max) {\r\n toolbar.show('up')\r\n toolbar.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n subscribe('toolbar:update', this.onToolbarUpdate, this)\r\n subscribe('toolbar:action:up', this.onScrollTop, this)\r\n subscribe('toolbar:action:toggle', this.onToggle, this)\r\n subscribe('toolbar:action:down', this.onScrollBottom, this)\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n unsubscribe('toolbar:update')\r\n unsubscribe('toolbar:action:up')\r\n unsubscribe('toolbar:action:toggle')\r\n unsubscribe('toolbar:action:down')\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n title: '目录',\r\n scrollElement: 'html,body',\r\n position: 'relative',\r\n parentElement: '#aside',\r\n placement: 'rtl',\r\n showCode: true,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null\r\n}\r\n\r\nif (window.jQuery) {\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n jQuery.extend(jQuery.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = jQuery(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n jQuery.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","stopPropagation","preventDefault","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","isArray","Array","paintSvgSprites","symbols","SYMBOLS","sprites","concat","$body","body","$icons","innerHTML","join","createElement","insertBefore","firstChild","createSvgIcon","name","size","color","iconSet","binds","width","height","defaultRules","svg","$icon","className","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","removeClass","remove","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","id","rel","groups","group","JSON","stringify","cb","code","String","c","b","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","anchorURL","chapterCode","headingId","href","_updateHeading","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","publish","min","addClass","add","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","$list","$placeholder","$parentElement","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","contents","calculateStickyHeight","byId","getElementById","chapter","$text","$link","$code","$li","$ul","_paintChapters","positionPlaceholder","sticky","onObserver","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","window","innerHeight","show","FOLDED","HIDDEN","hide","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","icon","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","find","option","ACTIVE","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","guid","uuid","prefix","token","subject","_removeSubscriber","execution","j","_removeSubscriberByToken","Outline","anchors","drawer","toolbar","_renderAnchors","_renderChapters","_renderToolbar","CHAPTERS_OPTIONS","homepage","git","tags","issues","HOME","GIT","TAGS","ISSUES","MENU","toTop","toBottom","floor","onToggle","onScrollTop","onScrollBottom","onToolbarUpdate","ceil","subscribe","unsubscribe","jQuery","extend","outline","$article"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"outline.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isElement.js","src/utils/lang/later.js","src/utils/lang/easeInQuad.js","src/utils/dom/_getScrollElement.js","src/utils/dom/scrollTo.js","src/utils/dom/offsetTop.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/event/stop.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/utils/types/isArray.js","src/utils/icons/symbols.js","src/utils/icons/defaults.js","src/utils/icons/getSymbols.js","src/utils/icons/getSymbol.js","src/utils/icons/paint.js","src/utils/icons/add.js","src/utils/lang/trim.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/setAttribute.js","src/utils/dom/createElement.js","src/utils/types/isSVG.js","src/utils/icons/icon.js","src/utils/icons/createElement.js","src/utils/dom/hasClass.js","src/utils/dom/removeClass.js","src/_resetHeading.js","src/utils/types/isEmpty.js","src/getChapters.js","src/utils/lang/stripTags.js","src/_getChapterParentIdByDiffer.js","src/_getChaptersWithCode.js","src/anchors.js","src/utils/lang/toTree.js","src/_updateHeading.js","src/utils/dom/addClass.js","src/utils/dom/setProperty.js","src/zIndex.js","src/drawer.js","src/utils/event/at.js","src/utils/dom/getStyle.js","src/chapters.js","src/_paintChapters.js","src/utils/dom/intersection.js","src/_createButton.js","src/toolbar.js","src/utils/lang/guid.js","src/utils/observer/on.js","src/utils/observer/_removeSubscriber.js","src/utils/observer/off.js","src/utils/observer/_removeSubscriberByToken.js","src/outline.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from '../types/isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n requestAnimationFrame(play)\r\n }\r\n\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n return purgeElement(el, type)\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} data - (必须)数据对象\r\n * @param {Boolean} async - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import hasOwn from '../lang/hasOwn'\r\nimport isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttribute from './setAttribute'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array} attrs - 属性对象或者子节点\r\n * @param {Array} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n Object.keys(attrs).forEach((attr) => {\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute($el, attr, attrs[attr])\r\n }\r\n })\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg =\r\n `` +\r\n `` +\r\n ``\r\n }\r\n\r\n $icon.className = 'outline-icon'\r\n $icon.innerHTML = svg\r\n\r\n if (isSVG(name)) {\r\n $svg = $icon.querySelector('svg')\r\n $svg.setAttribute('aria-hidden', 'true')\r\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\r\n $svg.setAttribute('class', 'outline-icon__svg')\r\n $svg.setAttribute('width', '200')\r\n $svg.setAttribute('height', '200')\r\n $svg.style = cssRules\r\n }\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(/^\\d+(?:(\\.?\\d*)*\\s?)?/gi, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n $heading.removeChild($anchor)\r\n}\r\n\r\nexport default _resetHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\nconst getChapters = (headings, showCode = true) => {\r\n let previous = 1\r\n let level = 0\r\n const chapters = []\r\n\r\n headings.forEach((heading, i) => {\r\n const headingLevel = heading.tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text: stripTags(trim(heading.innerHTML))\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChapters\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","const _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = chapters.filter((b) => b.pid === c.id)\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import Base from './base'\r\n\r\n// 在文章的标题生成 anchor 链接\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport publish from './utils/observer/emit'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _resetHeading from './_resetHeading'\r\nimport getChapters from './getChapters'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Anchors.DEFAULTS\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n this.chapters = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let selector\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n selector = this.attr('selector')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = [...$articleElement.querySelectorAll(selector)]\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n this.chapters = getChapters(this.$headings)\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const chapters = this.chapters\r\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const $headings = this.$headings\r\n const chapters = this.getChapters()\r\n\r\n paint()\r\n\r\n $headings.forEach(($heading, i) => {\r\n const chapterCode = chapters[i].code\r\n _updateHeading($heading, i, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL\r\n })\r\n })\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n const $headings = this.$headings\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n $headings.forEach(($heading) => {\r\n _resetHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n this.attr(Anchors.DEFAULTS)\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n this.chapters = []\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n}\r\n\r\nexport default Anchors\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","import trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttribute from './utils/dom/setAttribute'\r\n\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const keys = Object.keys(attrs)\r\n const text = trim($heading.innerHTML)\r\n let $anchor\r\n let $icon\r\n\r\n keys.forEach((prop) => {\r\n setAttribute($heading, prop, attrs[prop])\r\n })\r\n\r\n if (showCode) {\r\n $heading.innerHTML = chapterCode + ' ' + text\r\n }\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $icon = icon('hash')\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: anchorURL ? anchorURL : `#${headingId}`,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n [$icon]\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport isFunction from './utils/types/isFunction'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport paint from './utils/icons/paint'\r\nimport icon from './utils/icons/icon'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Drawer.DEFAULTS\r\n this.title = ''\r\n this.closed = true\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const customClass = this.attr('customClass')\r\n const $fragment = document.createDocumentFragment()\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n [this.title]\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n [icon('close', { size: 20 })]\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__main'\r\n },\r\n ['']\r\n )\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement(\r\n 'footer',\r\n {\r\n className: 'outline-drawer__footer'\r\n },\r\n ['']\r\n )\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__overlay'\r\n },\r\n ['']\r\n )\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n $fragment.appendChild($el)\r\n document.body.appendChild($fragment)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n\r\n this.attrs = Drawer.DEFAULTS\r\n this.title = ''\r\n this.closed = false\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n}\r\n\r\nexport default Drawer\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import Base from './base'\r\n\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport publish from './utils/observer/emit'\r\n\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport _paintChapters from './_paintChapters'\r\n\r\nclass Chapters extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Chapters.DEFAULTS\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.chapters = []\r\n this.closed = false\r\n this.active = 0\r\n this.offsetTop = 0\r\n this.offsetWidth = 0\r\n this.$active = null\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.playing = false\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n _paintEdge() {\r\n const STICKY = 'outline-chapters_sticky'\r\n const FIXED = 'outline-chapters_fixed'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const title = this.attr('title')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-chapters__title'\r\n },\r\n [title]\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement(\r\n 'ul',\r\n {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-chapters__list ${FIXED} ${HIDDEN}`\r\n },\r\n ['']\r\n )\r\n this.$list = $list\r\n\r\n $placeholder = createElement(\r\n 'div',\r\n {\r\n className: 'outline-chapters__placeholder'\r\n },\r\n ['']\r\n )\r\n this.$placeholder = $placeholder\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-chapters__main'\r\n },\r\n [$list, $placeholder]\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-chapters',\r\n className: 'outline-chapters'\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n\r\n $parentElement.appendChild($el)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const FIXED = 'outline-chapters_fixed'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const chapters = this.attr('chapters')\r\n const showCode = this.attr('showCode')\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n let $el\r\n let $list\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this._paintEdge()\r\n\r\n $list = this.$list\r\n _paintChapters($list, this.chapters, showCode)\r\n removeClass($list, FIXED)\r\n removeClass($list, HIDDEN)\r\n this.positionPlaceholder(this.active)\r\n\r\n $el = this.$el\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n this.onObserver()\r\n\r\n return this\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-chapters__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n // top:calc(${offsetTop}px + ${top}px);\r\n $placeholder.style.cssText = `transform: translateY(${\r\n offsetTop + top\r\n }px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\r\n const HIGHLIGHT = 'outline-chapters_active'\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n this.$active = $anchor\r\n addClass(this.$active, HIGHLIGHT)\r\n\r\n this.positionPlaceholder(this.active)\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-chapters_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-chapters_folded'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const opened = this.attr('afterOpened')\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n removeClass($parent, HIDDEN)\r\n removeClass($el, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n removeClass($el, FOLDED)\r\n }, 30)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-chapters_folded'\r\n const HIDDEN = 'outline-chapters_hidden'\r\n const closed = this.attr('afterClosed')\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n addClass($parent, FOLDED)\r\n addClass($el, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n addClass($el, HIDDEN)\r\n })\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n this.$parentElement.removeChild(this.$el)\r\n\r\n this.attr(Chapters.DEFAULTS)\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetTop = 0\r\n this.$active = null\r\n this.closed = false\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n let timer = null\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (timer) {\r\n clearTimeout(timer)\r\n }\r\n\r\n timer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n publish('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at($element, 'resize', this.onResize, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n\r\n if (this.isSticky()) {\r\n at($element, 'resize', this.onResize)\r\n }\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nChapters.DEFAULTS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n}\r\n\r\nexport default Chapters\r\n","import createElement from './utils/dom/createElement'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const byId = (id) => document.getElementById(id)\r\n\r\n chapters.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const rel = chapter.rel\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-chapters__text'\r\n },\r\n [chapter.text]\r\n )\r\n const $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-chapters__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id\r\n },\r\n [$text]\r\n )\r\n let $code\r\n let $li\r\n let $ul\r\n let $parent\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-chapters__code',\r\n 'data-id': id\r\n },\r\n [chapter.code]\r\n )\r\n\r\n $link.insertBefore($code, $link.firstChild)\r\n }\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-chapters__item',\r\n 'data-id': id\r\n },\r\n [$link]\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $parent = byId(`chapter-${pid}`)\r\n $ul = byId(`subject-${pid}`)\r\n\r\n if (!$ul) {\r\n $ul = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-chapters__subject'\r\n },\r\n [$li]\r\n )\r\n\r\n $parent.appendChild($ul)\r\n } else {\r\n $ul.appendChild($li)\r\n }\r\n }\r\n })\r\n}\r\n\r\nexport default _paintChapters\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n [$icon]\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import Base from './base'\r\n\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport publish from './utils/observer/emit'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Toolbar.DEFAULTS\r\n this.$el = null\r\n this.disabled = false\r\n this.closed = false\r\n this.buttons = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n created = this.attr('created')\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isDisabled(name) {\r\n const buttons = this.attr('buttons')\r\n let button\r\n\r\n if (name) {\r\n button = buttons.find((option) => option.name === name)\r\n\r\n return button?.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n highlight(name) {\r\n const button = this.buttons.find((item) => item.name === name)\r\n const ACTIVE = 'outline-toolbar_active'\r\n let $button\r\n\r\n if ($button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const rounded = this.attr('rounded')\r\n const placement = this.attr('placement')\r\n const $buttons = document.createDocumentFragment()\r\n const $fragment = document.createDocumentFragment()\r\n\r\n paint()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n\r\n $buttons.appendChild($button)\r\n this.buttons.push({\r\n name: button.name,\r\n $el: $button\r\n })\r\n })\r\n\r\n this.$el = createElement(\r\n 'div',\r\n {\r\n id: 'outline-toolbar',\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n },\r\n [$buttons]\r\n )\r\n $fragment.appendChild(this.$el)\r\n document.body.appendChild($fragment)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const action = button.action\r\n const $fragment = document.createDocumentFragment()\r\n let type\r\n\r\n if (isObject(button)) {\r\n buttons.push(button)\r\n $fragment.appendChild(_createButton(button))\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n $fragment.appendChild(_createButton(item))\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n if (action && isFunction(action.handler)) {\r\n type = action.type || 'click'\r\n on($el, `.${button.name}`, type, action.handler)\r\n }\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const button = buttons.find((option) => option.name === name)\r\n let index = -1\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button, i) => {\r\n if (button.name === name) {\r\n index = i\r\n }\r\n })\r\n\r\n if (index > -1) {\r\n this.attr().buttons.splice(index, 1)\r\n }\r\n\r\n $button = $el.querySelector(`.${name}`)\r\n this.switch(name, false)\r\n $el.removeChild($button)\r\n\r\n return this\r\n }\r\n\r\n switch(name, enabled) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const button = buttons.find((option) => option.name === name)\r\n let action\r\n let type\r\n let listener\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n buttons.forEach((option) => {\r\n if (option.name === name) {\r\n button.disabled = !enabled\r\n }\r\n })\r\n\r\n action = button.action\r\n $button = $el.querySelector(`.${name}`)\r\n\r\n if (action) {\r\n type = action.type || 'click'\r\n listener = action.handler\r\n }\r\n\r\n if (enabled) {\r\n removeClass($button, DISABLED)\r\n\r\n if (type && listener) {\r\n on($el, `.${name}`, type, listener)\r\n }\r\n } else {\r\n addClass($button, DISABLED)\r\n\r\n if (type && listener) {\r\n off($el, type, listener)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this.switch(name, false)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this.switch(name, true)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.attr('buttons').find((option) => option.name === name)\r\n const $el = this.$el\r\n let $button\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = $el.querySelector(`.${name}`)\r\n removeClass($button, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.attr('buttons').find((option) => option.name === name)\r\n const $el = this.$el\r\n let $button\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n $button = $el.querySelector(`.${name}`)\r\n addClass($button, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n let $el = this.$el\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n document.body.removeChild($el)\r\n $el = null\r\n\r\n this.attr(Toolbar.DEFAULTS)\r\n this.disabled = false\r\n this.closed = false\r\n this.buttons = []\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons') || []\r\n\r\n this.removeListeners()\r\n $el.innerHTML = ''\r\n\r\n buttons.forEach((button) => {\r\n this.$el.appendChild(_createButton(button))\r\n })\r\n\r\n this.addListeners()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons')\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button) => {\r\n const action = button.action\r\n const disabled = this.disabled\r\n let type\r\n let listener\r\n let context\r\n let command\r\n\r\n if (disabled) {\r\n return false\r\n }\r\n\r\n if (action) {\r\n listener = action.handler\r\n if (isString(listener)) {\r\n command = listener\r\n action.handler = function () {\r\n publish(command, button.name)\r\n }\r\n listener = action.handler\r\n }\r\n\r\n type = action.type || 'click'\r\n context = action.context\r\n }\r\n\r\n if (isFunction(listener)) {\r\n on($el, `.${button.name}`, type, listener, context || this, true)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons')\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button) => {\r\n const action = button.action\r\n const disabled = this.disabled\r\n let type\r\n let listener\r\n\r\n if (disabled) {\r\n return false\r\n }\r\n\r\n if (action) {\r\n listener = action.handler\r\n type = action.type || 'click'\r\n }\r\n\r\n if (isFunction(listener)) {\r\n off($el, type, listener)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n}\r\n\r\nexport default Toolbar\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import Base from './base'\r\nimport Anchors from './anchors'\r\nimport Drawer from './drawer'\r\nimport Chapters from './chapters'\r\nimport Toolbar from './toolbar'\r\n\r\nimport later from './utils/lang/later'\r\nimport isFunction from './utils/types/isFunction'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Outline extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Outline.DEFAULTS\r\n this.anchors = null\r\n this.drawer = null\r\n this.chapters = null\r\n this.toolbar = null\r\n this.buttons = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n return this.anchors.getChapters(isTreeStructured)\r\n }\r\n\r\n count() {\r\n return this.anchors.count()\r\n }\r\n\r\n render() {\r\n this._renderAnchors()._renderChapters()._renderToolbar()\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderChapters() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let CHAPTERS_OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n CHAPTERS_OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n } else {\r\n CHAPTERS_OPTIONS.customClass = customClass\r\n }\r\n\r\n CHAPTERS_OPTIONS.parentElement = parentElement\r\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n type: 'click',\r\n handler: 'toolbar:action:up'\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'menu',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n type: 'click',\r\n handler: 'toolbar:action:toggle'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n type: 'click',\r\n handler: 'toolbar:action:down'\r\n }\r\n }\r\n const buttons = []\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n this.buttons = [...buttons]\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons: buttons\r\n })\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n const toolbar = this.toolbar\r\n const buttons = this.buttons\r\n buttons.splice(-1, 0, button)\r\n toolbar.attr({\r\n buttons\r\n })\r\n toolbar.refresh()\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.toolbar.remove(name)\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const chapters = this.chapters\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n chapters.highlight(0)\r\n chapters.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n chapters.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\r\n const toolbar = this.toolbar\r\n const chapters = this.chapters\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n chapters.highlight(count - 1)\r\n chapters.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n chapters.playing = true\r\n }\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n const scrollElement = this.attr('scrollElement')\r\n scrollTo(scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n toggle() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const chapters = this.chapters\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n chapters.toggle()\r\n toolbar.highlight('menu')\r\n } else {\r\n toolbar.toggle()\r\n\r\n later(() => {\r\n if (chapters.isInside()) {\r\n chapters.toggle()\r\n } else {\r\n drawer.toggle()\r\n }\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n let anchors = this.anchors\r\n let chapters = this.chapters\r\n let drawer = this.drawer\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n const count = this.count()\r\n\r\n this.removeListeners()\r\n\r\n if (count > 0) {\r\n isOutside = chapters.isOutside()\r\n\r\n chapters.destroy()\r\n chapters = null\r\n\r\n if (isOutside) {\r\n drawer.destroy()\r\n drawer = null\r\n }\r\n }\r\n\r\n toolbar.destroy()\r\n toolbar = null\r\n\r\n anchors.destroy()\r\n anchors = null\r\n\r\n this.attr(Outline.DEFAULTS)\r\n\r\n return this\r\n }\r\n\r\n onToggle() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onScrollTop() {\r\n this.toTop()\r\n return this\r\n }\r\n\r\n onScrollBottom() {\r\n this.toBottom()\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n const toolbar = this.toolbar\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n } else if (current >= max) {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n } else if (current > min && current < max) {\r\n toolbar.show('up')\r\n toolbar.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n subscribe('toolbar:update', this.onToolbarUpdate, this)\r\n subscribe('toolbar:action:up', this.onScrollTop, this)\r\n subscribe('toolbar:action:toggle', this.onToggle, this)\r\n subscribe('toolbar:action:down', this.onScrollBottom, this)\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n unsubscribe('toolbar:update')\r\n unsubscribe('toolbar:action:up')\r\n unsubscribe('toolbar:action:toggle')\r\n unsubscribe('toolbar:action:down')\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n title: '目录',\r\n scrollElement: 'html,body',\r\n position: 'relative',\r\n parentElement: '#aside',\r\n placement: 'rtl',\r\n showCode: true,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null\r\n}\r\n\r\nif (window.jQuery) {\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n jQuery.extend(jQuery.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = jQuery(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n jQuery.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","stopPropagation","preventDefault","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","isArray","Array","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","exec","iconName","getSymbol","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","className","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","isSVG","pattern","RegExp","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","hasClass","allClass","classList","contains","removeClass","remove","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","id","rel","groups","group","JSON","stringify","cb","code","String","c","b","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","anchorURL","chapterCode","headingId","href","_updateHeading","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","publish","min","addClass","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","$list","$placeholder","$parentElement","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","contents","calculateStickyHeight","byId","getElementById","chapter","$text","$link","$code","$li","$ul","_paintChapters","positionPlaceholder","sticky","onObserver","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","window","innerHeight","show","FOLDED","HIDDEN","hide","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","option","ACTIVE","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","guid","uuid","prefix","token","subject","_removeSubscriber","execution","j","_removeSubscriberByToken","Outline","anchors","drawer","toolbar","_renderAnchors","_renderChapters","_renderToolbar","CHAPTERS_OPTIONS","homepage","git","tags","issues","tools","HOME","GIT","TAGS","ISSUES","MENU","addButton","removeButton","toTop","toBottom","floor","onToggle","onScrollTop","onScrollBottom","onToolbarUpdate","ceil","subscribe","unsubscribe","jQuery","extend","outline","$article"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 62f07e82..6bca1082 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@yaohaixiao/outline.js", - "version": "3.12.3", + "version": "3.13.0", "description": "outline.js - 自动生成文章导读(Table of Contents)导航的 JavaScript 工具。", "main": "outline.min.js", "files": [ diff --git a/src/_createButton.js b/src/_createButton.js index f394bd58..c5135407 100644 --- a/src/_createButton.js +++ b/src/_createButton.js @@ -1,9 +1,13 @@ -import { createSvgIcon } from './utils/icons' +import icon from './utils/icons/icon' import createElement from './utils/dom/createElement' import addClass from './utils/dom/addClass' const _createButton = (button, rounded = true) => { - const $icon = createSvgIcon(button.icon, button.size) + const $icon = icon(button.icon, { + iconSet: button.iconSet || 'outline', + color: button.color || '', + size: button.size + }) const $anchor = createElement( 'a', { diff --git a/src/_updateHeading.js b/src/_updateHeading.js index bd8235e7..37b87b93 100644 --- a/src/_updateHeading.js +++ b/src/_updateHeading.js @@ -2,7 +2,7 @@ import trim from './utils/lang/trim' import createElement from './utils/dom/createElement' import setAttribute from './utils/dom/setAttribute' -import { createSvgIcon } from './utils/icons' +import icon from './utils/icons/icon' const _updateHeading = ($heading, i, options) => { const CLS_HEADING = 'outline-heading' @@ -34,7 +34,7 @@ const _updateHeading = ($heading, i, options) => { return false } - $icon = createSvgIcon('hash') + $icon = icon('hash') $anchor = createElement( 'a', { diff --git a/src/anchors.js b/src/anchors.js index 6901b29e..0ade2b56 100644 --- a/src/anchors.js +++ b/src/anchors.js @@ -13,7 +13,7 @@ import on from './utils/event/on' import off from './utils/event/off' import stop from './utils/event/stop' import publish from './utils/observer/emit' -import { paintSvgSprites } from './utils/icons' +import paint from './utils/icons/paint' import _updateHeading from './_updateHeading' import _resetHeading from './_resetHeading' @@ -95,7 +95,7 @@ class Anchors extends Base { const $headings = this.$headings const chapters = this.getChapters() - paintSvgSprites() + paint() $headings.forEach(($heading, i) => { const chapterCode = chapters[i].code diff --git a/src/drawer.js b/src/drawer.js index e7d41c4c..c6457ff6 100644 --- a/src/drawer.js +++ b/src/drawer.js @@ -8,7 +8,8 @@ import createElement from './utils/dom/createElement' import on from './utils/event/on' import off from './utils/event/off' -import { paintSvgSprites, createSvgIcon } from './utils/icons' +import paint from './utils/icons/paint' +import icon from './utils/icons/icon' import zIndex from './zIndex' class Drawer extends Base { @@ -81,7 +82,7 @@ class Drawer extends Base { let $footer let $overlay - paintSvgSprites() + paint() this.zIndex = zIndex() $title = createElement( @@ -99,7 +100,7 @@ class Drawer extends Base { { className: 'outline-drawer__close' }, - [createSvgIcon('close', 20)] + [icon('close', { size: 20 })] ) this.$close = $close } diff --git a/src/outline.js b/src/outline.js index c2224482..59ef8107 100644 --- a/src/outline.js +++ b/src/outline.js @@ -20,6 +20,7 @@ class Outline extends Base { this.drawer = null this.chapters = null this.toolbar = null + this.buttons = [] if (options) { this.initialize(options) @@ -128,6 +129,7 @@ class Outline extends Base { const git = this.attr('git') const tags = this.attr('tags') const issues = this.attr('issues') + const tools = this.attr('tools') const count = this.count() const UP = { name: 'up', @@ -183,6 +185,9 @@ class Outline extends Base { const buttons = [] buttons.push(UP) + if (count > 0) { + buttons.push(MENU) + } if (homepage) { buttons.push(HOME) } @@ -195,10 +200,11 @@ class Outline extends Base { if (issues) { buttons.push(ISSUES) } - if (count > 0) { - buttons.push(MENU) + if (tools?.length > 0) { + buttons.push(...tools) } buttons.push(DOWN) + this.buttons = [...buttons] this.toolbar = new Toolbar({ placement, @@ -208,6 +214,22 @@ class Outline extends Base { return this } + addButton(button) { + const toolbar = this.toolbar + const buttons = this.buttons + buttons.splice(-1, 0, button) + toolbar.attr({ + buttons + }) + toolbar.refresh() + return this + } + + removeButton(name) { + this.toolbar.remove(name) + return this + } + toTop() { const afterScroll = this.attr('afterScroll') const toolbar = this.toolbar @@ -399,6 +421,7 @@ Outline.DEFAULTS = { git: '', tags: '', issues: '', + tools: [], customClass: '', afterSticky: null, afterToggle: null, diff --git a/src/toolbar.js b/src/toolbar.js index 9f15e387..d54aa30a 100644 --- a/src/toolbar.js +++ b/src/toolbar.js @@ -12,7 +12,7 @@ import removeClass from './utils/dom/removeClass' import on from './utils/event/on' import off from './utils/event/off' import publish from './utils/observer/emit' -import { paintSvgSprites } from './utils/icons' +import paint from './utils/icons/paint' import _createButton from './_createButton' @@ -96,7 +96,7 @@ class Toolbar extends Base { const $buttons = document.createDocumentFragment() const $fragment = document.createDocumentFragment() - paintSvgSprites() + paint() buttons.forEach((button) => { const $button = _createButton(button, rounded) diff --git a/src/utils/icons.js b/src/utils/icons.js deleted file mode 100644 index c3a67acb..00000000 --- a/src/utils/icons.js +++ /dev/null @@ -1,73 +0,0 @@ -import isArray from './types/isArray' - -/** - * 绘制 SVG Sprites 图标集 - * ======================================================================== - * @method paintSvgSprites - * @param {Array} [symbols] - (可选)symbols 图标数组 - * 传递 symbols - 绘制 symbols + SYMBOLS 的图标集 - * 不传递 symbols - 仅绘制默认 SYMBOLS 图标集 - */ -export const paintSvgSprites = (symbols = []) => { - const SYMBOLS = [ - '', - '', - '', - '', - '', - '', - '', - '', - '' - ] - const sprites = - isArray(symbols) && symbols.length > 0 ? SYMBOLS.concat(symbols) : SYMBOLS - const $body = document.body - let $icons = document.querySelector('#svg-sprites') - - if ($icons) { - $icons.innerHTML = sprites.join('') - } else { - $icons = document.createElement('div') - $icons.innerHTML = - `` - $body.insertBefore($icons.firstChild, $body.firstChild) - } -} - -/** - * 创建 SVG 图标 DOM 元素 - * ======================================================================== - * @method createSvgIcon - * @param {String} name - * @param {Number|String|Array} [size] - * @param {String} [color] - * @param {String} [iconSet] - * @returns {HTMLElement} - */ -export const createSvgIcon = ( - name, - size = 0, - color = '', - iconSet = 'outline' -) => { - const binds = iconSet - ? `xlink:href="#${iconSet}-icon-${name}"` - : `xlink:href="#icon-${name}"` - const width = isArray(size) ? size[0] : size - const height = isArray(size) ? size[1] : size - const defaultRules = size ? `width:${width}px;height:${height}px;` : '' - const cssRules = color ? defaultRules + `color:${color}` : defaultRules - const svg = - `` - const $icon = document.createElement('i') - - $icon.className = 'outline-icon' - $icon.innerHTML = svg - - return $icon -} diff --git a/src/utils/icons/add.js b/src/utils/icons/add.js new file mode 100644 index 00000000..dd760e8e --- /dev/null +++ b/src/utils/icons/add.js @@ -0,0 +1,30 @@ +import isArray from '../types/isArray' +import isString from '../types/isString' +import SYMBOLS from './symbols' + +/** + * @method add + * @param {Array|String} symbols + * @return {Boolean} + */ +const add = (symbols) => { + if (!symbols) { + return false + } + + if (isArray(symbols) && symbols.length > 0) { + symbols.forEach((symbol) => { + /* istanbul ignore else */ + if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) { + SYMBOLS.push(symbol) + } + }) + } else { + /* istanbul ignore else */ + if (isString(symbols)) { + SYMBOLS.push(symbols) + } + } +} + +export default add diff --git a/src/utils/icons/createElement.js b/src/utils/icons/createElement.js new file mode 100644 index 00000000..86dc1872 --- /dev/null +++ b/src/utils/icons/createElement.js @@ -0,0 +1,62 @@ +import isArray from '../types/isArray' +import isString from '../types/isString' +import isSVG from '../types/isSVG' + +/** + * 创建 SVG 图标 DOM 元素 + * ======================================================================== + * @method createElement + * @param {String} name + * @param {Object} [options] + * @param {Number|Array} [options.size] + * @param {String} [options.color] + * @param {String} [options.iconSet] + * @returns {HTMLElement} + */ +const createElement = (name, options = {}) => { + const size = options.size || 0 + const color = options.color || '' + const iconSet = options.iconSet || '' + const width = isArray(size) ? size[0] : size + const height = isArray(size) ? size[1] : size + const defaultRules = size ? `width:${width}px;height:${height}px;` : '' + const cssRules = color ? defaultRules + `color:${color}` : defaultRules + const $icon = document.createElement('i') + let binds = '' + let svg = '' + let $svg + + if (!isString(name)) { + return null + } + + if (isSVG(name)) { + svg = name + } else { + binds = + iconSet && iconSet !== 'icon' + ? `xlink:href="#${iconSet}-icon-${name}"` + : `xlink:href="#icon-${name}"` + svg = + `` + } + + $icon.className = 'outline-icon' + $icon.innerHTML = svg + + if (isSVG(name)) { + $svg = $icon.querySelector('svg') + $svg.setAttribute('aria-hidden', 'true') + $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg') + $svg.setAttribute('class', 'outline-icon__svg') + $svg.setAttribute('width', '200') + $svg.setAttribute('height', '200') + $svg.style = cssRules + } + + return $icon +} + +export default createElement diff --git a/src/utils/icons/defaults.js b/src/utils/icons/defaults.js new file mode 100644 index 00000000..bfe37f00 --- /dev/null +++ b/src/utils/icons/defaults.js @@ -0,0 +1,13 @@ +const DEFAULTS = [ + '', + '', + '', + '', + '', + '', + '', + '', + '' +] + +export default DEFAULTS diff --git a/src/utils/icons/getSymbol.js b/src/utils/icons/getSymbol.js new file mode 100644 index 00000000..d433b3b9 --- /dev/null +++ b/src/utils/icons/getSymbol.js @@ -0,0 +1,26 @@ +import SYMBOLS from './symbols' + +/** + * @method getSymbol + * @param {String} name + * @param {String} [iconSet] + * @returns {String} + */ +const getSymbol = (name, iconSet = 'icon') => { + const patternName = /id="(.*?)"/ + const patternSet = /^(\w+)-/ + const symbols = SYMBOLS + + return symbols.find((symbol) => { + const names = patternName.exec(symbol) + const fullName = names[1] + const sets = patternSet.exec(fullName) + const setName = sets[1] + const iconName = + iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}` + + return setName === iconSet && fullName === iconName + }) +} + +export default getSymbol diff --git a/src/utils/icons/getSymbols.js b/src/utils/icons/getSymbols.js new file mode 100644 index 00000000..b2b81dde --- /dev/null +++ b/src/utils/icons/getSymbols.js @@ -0,0 +1,20 @@ +import isString from '../types/isString' +import getSymbol from './getSymbol' +import SYMBOLS from './symbols' + +/** + * + * @method getSymbols + * @param {String} [name] + * @param {String} [iconSet] + * @returns {string[]|*} + */ +const getSymbols = (name, iconSet = 'icon') => { + if (isString(name)) { + return getSymbol(name, iconSet) + } + + return [...SYMBOLS] +} + +export default getSymbols diff --git a/src/utils/icons/icon.js b/src/utils/icons/icon.js new file mode 100644 index 00000000..5a5ad15a --- /dev/null +++ b/src/utils/icons/icon.js @@ -0,0 +1,20 @@ +import createElement from './createElement' + +/** + * 创建 SVG 图标 DOM 元素 + * ======================================================================== + * @method icon + * @alias createElement + * @see createElement + * @param {String} name + * @param {Object} [options] + * @param {Number|Array} [options.size] + * @param {String} [options.color] + * @param {String} [options.iconSet] + * @returns {HTMLElement} + */ +const icon = (name, options = {}) => { + return createElement(name, options) +} + +export default icon diff --git a/src/utils/icons/index.js b/src/utils/icons/index.js new file mode 100644 index 00000000..76fbe729 --- /dev/null +++ b/src/utils/icons/index.js @@ -0,0 +1,17 @@ +import add from './add' +import createElement from './createElement' +import getSymbol from './getSymbol' +import getSymbols from './getSymbols' +import icon from './icon' +import paint from './paint' +import remove from './remove' + +export default { + add, + createElement, + getSymbol, + getSymbols, + icon, + paint, + remove +} diff --git a/src/utils/icons/paint.js b/src/utils/icons/paint.js new file mode 100644 index 00000000..b16507c3 --- /dev/null +++ b/src/utils/icons/paint.js @@ -0,0 +1,30 @@ +import add from './add' +import getSymbols from './getSymbols' + +/** + * 绘制 SVG 图标集 + * ======================================================================== + * @method paint + * @param {String|Array} symbol + */ +const paint = (symbol = '') => { + const $body = document.body + let $icons = document.querySelector('#outline-icons') + let symbols = [] + + add(symbol) + symbols = getSymbols() + + if ($icons) { + $icons.innerHTML = symbols.join('') + } else { + $icons = document.createElement('div') + $icons.innerHTML = + `` + $body.insertBefore($icons.firstChild, $body.firstChild) + } +} + +export default paint diff --git a/src/utils/icons/remove.js b/src/utils/icons/remove.js new file mode 100644 index 00000000..75061dfe --- /dev/null +++ b/src/utils/icons/remove.js @@ -0,0 +1,32 @@ +import isString from '../types/isString' +import getSymbol from './getSymbol' +import getSymbols from './getSymbols' +import SYMBOLS from './symbols' + +const remove = (name, iconSet = 'icon') => { + const $icons = document.querySelector('#outline-icons') + const symbols = getSymbols() + const target = getSymbol(name, iconSet) + let index = -1 + let $symbol + let selector + + if (!isString(name)) { + return false + } + + index = symbols.indexOf(target) + + /* istanbul ignore else */ + if (index > -1) { + SYMBOLS.splice(index, 1) + } + + if ($icons) { + selector = `#${iconSet === 'icon' ? 'icon' : iconSet + '-icon'}-${name}` + $symbol = $icons.querySelector(selector) + $icons.removeChild($symbol) + } +} + +export default remove diff --git a/src/utils/icons/symbols.js b/src/utils/icons/symbols.js new file mode 100644 index 00000000..bb5c2efc --- /dev/null +++ b/src/utils/icons/symbols.js @@ -0,0 +1,5 @@ +import DEFAULTS from './defaults' + +const SYMBOLS = [...DEFAULTS] + +export default SYMBOLS diff --git a/src/utils/types/index.js b/src/utils/types/index.js index 912e0b5d..22f1e19d 100644 --- a/src/utils/types/index.js +++ b/src/utils/types/index.js @@ -8,6 +8,7 @@ import isHTMLCollection from './isHTMLCollection' import isNumber from './isNumber' import isObject from './isObject' import isString from './isString' +import isSVG from './isSVG' import isTextNode from './isTextNode' import isTypedArray from './isTypedArray' @@ -22,6 +23,7 @@ export default { isNumber, isObject, isString, + isSVG, isTextNode, isTypedArray } diff --git a/src/utils/types/isSVG.js b/src/utils/types/isSVG.js new file mode 100644 index 00000000..49689fe5 --- /dev/null +++ b/src/utils/types/isSVG.js @@ -0,0 +1,14 @@ +import isString from './isString' + +const isSVG = (str) => { + const declaration = '(?:<\\?xml[^>]*>\\s*)?' + const doctype = + '(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?' + const content = ']*>[^]*<\\/svg>\\s*$' + const svg = `^\\s*${declaration}${doctype}${content}\\s*$` + const pattern = new RegExp(svg, 'i') + + return isString(str) && pattern.test(str) +} + +export default isSVG diff --git a/toolbar.min.js b/toolbar.min.js index 13a264eb..b62ff205 100644 --- a/toolbar.min.js +++ b/toolbar.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Toolbar=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),n=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class r{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const r=this.attrs;return t(s)?i&&e(r,s)?(r[s]=i,this):r[s]:n(s)?(l=r,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(l[t]=o[t])})),this):0===arguments.length?r:this;var l,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const l=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),a=t=>!!(n(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>{return!(!n(t)||!(a(t)||(t=>!(!n(t)||"[object NodeList]"!==s(t)))(t)||(e=t,n(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!n(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},h=(s,i,r)=>{const o=document.createDocumentFragment(),a=document.createElement(s),h=e=>c(e)||t(e),d=e=>{let s;if(!h(e))return!1;c(e)?s=e:t(e)&&(s=document.createTextNode(e)),o.appendChild(s)};return n(i)?Object.keys(i).forEach((t=>{e(i,t)&&((t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}})(a,t,i[t])})):l(i)&&i.every((t=>h(t)))&&i.forEach((t=>{d(t)})),l(r)?r.forEach((t=>{d(t)})):d(r),a.appendChild(o),a},d=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,n;return!!a(t)&&(i=t.className,!!i&&(n=t.classList,n?.contains?t.classList.contains(e):!!s.exec(i)))},u=(t,e)=>{let s,i;if(d(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},b=(e,s)=>{let i,n=e.className;if(!n||!d(e,s))return!1;var r;i=e.classList,i?.remove?i.remove(s):(r=n.replace(s,""),n=!!t(r)&&r.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},m=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},f=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,p=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],y=(t,e,s)=>{const i=p.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let n=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const r=t.fn;e===t.type&&(n=i,r===s&&(n=i))})),n>-1&&i.splice(n,1)}(t,e,s),t.removeEventListener(e,s,i)},v=function(e,s,i=!1){const n=t(e)?document.querySelector(e):e,r=n.childNodes,l=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(n,s);l.forEach((t=>{y(n,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&n&&r&&r.forEach((t=>{a(t)&&v(t,s,i)}))},g=(t,e,s)=>{if(!i(s))return v(t,e);y(t,e,s)},L=(t,e,s,i,n,r,l=!1)=>{const o=p.indexOf(s)>-1,a=function(o){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),h=((t,e,s,i)=>{const n=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&m(t,e):m(t,e))||i&&t===n)return t;if(t===n)break}while(t=f(t))})(c,e,t);let d=r||t;o.delegateTarget=h,!0===r&&(d=n),h&&(!0===l&&g(t,s,a),i.call(d,o,n))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:n,context:r,capture:o}),i._delegateListener=a,t.addEventListener(s,a,o)},$={},x=t=>e($,t)&&$[t].length>0,z=(t,e=!0)=>e?x(t):(t=>{let e=x(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=x(t);return e})(t),M=(t,e,i=!0)=>{const n=t=>{if(!x(t))return!1;$[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},r=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),n(e);n(t),n("*")};if(!z(t))return!1;i?setTimeout(r,10):r()},j=(t,e=!0)=>{const s=((t,e=0,s="",i="outline")=>{const n=i?`xlink:href="#${i}-icon-${t}"`:`xlink:href="#icon-${t}"`,r=l(e)?e[0]:e,o=l(e)?e[1]:e,a=e?`width:${r}px;height:${o}px;`:"",c=``,h=document.createElement("i");return h.className="outline-icon",h.innerHTML=c,h})(t.icon,t.size),i=h("a",{className:"outline-toolbar__anchor",href:t.link},[s]),n=h("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return u(s,"outline-toolbar__icon"),e&&u(n,"outline-toolbar_rounded"),t.disabled&&u(n,"outline-toolbar_disabled"),n},E="outline-toolbar_disabled",w="outline-toolbar_hidden";class _ extends r{constructor(t){super(),this.attrs=_.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,d(i,s)?b(i,s):u(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),n=this.attr("placement"),r=document.createDocumentFragment(),o=document.createDocumentFragment();return((t=[])=>{const e=['','','','','','','','',''],s=l(t)&&t.length>0?e.concat(t):e,i=document.body;let n=document.querySelector("#svg-sprites");n?n.innerHTML=s.join(""):(n=document.createElement("div"),n.innerHTML=``,i.insertBefore(n.firstChild,i.firstChild))})(),e.forEach((t=>{const e=j(t,s);r.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=h("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${n}`},[r]),o.appendChild(this.$el),document.body.appendChild(o),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),r=t.action,o=document.createDocumentFragment();let a;return n(t)?(s.push(t),o.appendChild(j(t))):l(t)&&t.forEach((t=>{o.appendChild(j(t))})),e.appendChild(o),r&&i(r.handler)&&(a=r.type||"click",L(e,`.${t.name}`,a,r.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let n,r=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(r=s)})),r>-1&&this.attr().buttons.splice(r,1),n=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(n),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),n=i.find((e=>e.name===t));let r,l,o,a;return n?(i.forEach((s=>{s.name===t&&(n.disabled=!e)})),r=n.action,a=s.querySelector(`.${t}`),r&&(l=r.type||"click",o=r.handler),e?(b(a,E),l&&o&&L(s,`.${t}`,l,o)):(u(a,E),l&&o&&g(s,l,o)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(u(this.$el,E),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,b(this.$el,E),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),n=this.$el;let r;if(t){if(!s)return this;r=n.querySelector(`.${t}`),b(r,w)}else b(n,w),this.closed=!1,i(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),n=this.$el;let r;if(t){if(!s)return this;r=n.querySelector(`.${t}`),u(r,w)}else u(n,w),this.closed=!0,i(e)&&o((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(_.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(j(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const n=e.action;let r,l,o,a;if(this.disabled)return!1;n&&(l=n.handler,t(l)&&(a=l,n.handler=function(){M(a,e.name)},l=n.handler),r=n.type||"click",o=n.context),i(l)&&L(s,`.${e.name}`,r,l,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let n,r;if(this.disabled)return!1;s&&(r=s.handler,n=s.type||"click"),i(r)&&g(e,n,r)})),this}}return _.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null},_})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Toolbar=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),n=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class r{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const r=this.attrs;return t(s)?i&&e(r,s)?(r[s]=i,this):r[s]:n(s)?(o=r,l=s,Object.keys(l).forEach((t=>{e(l,t)&&(o[t]=l[t])})),this):0===arguments.length?r:this;var o,l}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const o=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),l=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),a=t=>!!(n(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>{return!(!n(t)||!(a(t)||(t=>!(!n(t)||"[object NodeList]"!==s(t)))(t)||(e=t,n(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!n(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},h=(s,i,r)=>{const l=document.createDocumentFragment(),a=document.createElement(s),h=e=>c(e)||t(e),d=e=>{let s;if(!h(e))return!1;c(e)?s=e:t(e)&&(s=document.createTextNode(e)),l.appendChild(s)};return n(i)?Object.keys(i).forEach((t=>{e(i,t)&&((t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}})(a,t,i[t])})):o(i)&&i.every((t=>h(t)))&&i.forEach((t=>{d(t)})),o(r)?r.forEach((t=>{d(t)})):d(r),a.appendChild(l),a},d=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,n;return!!a(t)&&(i=t.className,!!i&&(n=t.classList,n?.contains?t.classList.contains(e):!!s.exec(i)))},u=(t,e)=>{let s,i;if(d(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},b=(e,s)=>{let i,n=e.className;if(!n||!d(e,s))return!1;var r;i=e.classList,i?.remove?i.remove(s):(r=n.replace(s,""),n=!!t(r)&&r.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},m=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},f=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,p=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],y=(t,e,s)=>{const i=p.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let n=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const r=t.fn;e===t.type&&(n=i,r===s&&(n=i))})),n>-1&&i.splice(n,1)}(t,e,s),t.removeEventListener(e,s,i)},v=function(e,s,i=!1){const n=t(e)?document.querySelector(e):e,r=n.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(n,s);o.forEach((t=>{y(n,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&n&&r&&r.forEach((t=>{a(t)&&v(t,s,i)}))},g=(t,e,s)=>{if(!i(s))return v(t,e);y(t,e,s)},$=(t,e,s,i,n,r,o=!1)=>{const l=p.indexOf(s)>-1,a=function(l){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(l),h=((t,e,s,i)=>{const n=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&m(t,e):m(t,e))||i&&t===n)return t;if(t===n)break}while(t=f(t))})(c,e,t);let d=r||t;l.delegateTarget=h,!0===r&&(d=n),h&&(!0===o&&g(t,s,a),i.call(d,l,n))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:n,context:r,capture:l}),i._delegateListener=a,t.addEventListener(s,a,l)},x={},L=t=>e(x,t)&&x[t].length>0,z=(t,e=!0)=>e?L(t):(t=>{let e=L(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=L(t);return e})(t),M=(t,e,i=!0)=>{const n=t=>{if(!L(t))return!1;x[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},r=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),n(e);n(t),n("*")};if(!z(t))return!1;i?setTimeout(r,10):r()},w=['','','','','','','','',''],E=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return w.find((n=>{const r=s.exec(n)[1];return i.exec(r)[1]===e&&r===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):[...w],j=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),n=[];(e=>{if(!e)return!1;o(e)&&e.length>0?e.forEach((e=>{-1===w.indexOf(e)&&t(e)&&w.push(e)})):t(e)&&w.push(e)})(e),n=E(),i?i.innerHTML=n.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))},A=e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)},_=(e,s={})=>((e,s={})=>{const i=s.size||0,n=s.color||"",r=s.iconSet||"",l=o(i)?i[0]:i,a=o(i)?i[1]:i,c=i?`width:${l}px;height:${a}px;`:"",h=n?c+`color:${n}`:c,d=document.createElement("i");let u,b="",m="";return t(e)?(A(e)?m=e:(b=r&&"icon"!==r?`xlink:href="#${r}-icon-${e}"`:`xlink:href="#icon-${e}"`,m=``),d.className="outline-icon",d.innerHTML=m,A(e)&&(u=d.querySelector("svg"),u.setAttribute("aria-hidden","true"),u.setAttribute("xmlns","http://www.w3.org/2000/svg"),u.setAttribute("class","outline-icon__svg"),u.setAttribute("width","200"),u.setAttribute("height","200"),u.style=h),d):null})(e,s),N=(t,e=!0)=>{const s=_(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=h("a",{className:"outline-toolbar__anchor",href:t.link},[s]),n=h("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return u(s,"outline-toolbar__icon"),e&&u(n,"outline-toolbar_rounded"),t.disabled&&u(n,"outline-toolbar_disabled"),n},T="outline-toolbar_disabled",C="outline-toolbar_hidden";class S extends r{constructor(t){super(),this.attrs=S.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,d(i,s)?b(i,s):u(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),n=this.attr("placement"),r=document.createDocumentFragment(),o=document.createDocumentFragment();return j(),e.forEach((t=>{const e=N(t,s);r.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=h("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${n}`},[r]),o.appendChild(this.$el),document.body.appendChild(o),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),r=t.action,l=document.createDocumentFragment();let a;return n(t)?(s.push(t),l.appendChild(N(t))):o(t)&&t.forEach((t=>{l.appendChild(N(t))})),e.appendChild(l),r&&i(r.handler)&&(a=r.type||"click",$(e,`.${t.name}`,a,r.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let n,r=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(r=s)})),r>-1&&this.attr().buttons.splice(r,1),n=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(n),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),n=i.find((e=>e.name===t));let r,o,l,a;return n?(i.forEach((s=>{s.name===t&&(n.disabled=!e)})),r=n.action,a=s.querySelector(`.${t}`),r&&(o=r.type||"click",l=r.handler),e?(b(a,T),o&&l&&$(s,`.${t}`,o,l)):(u(a,T),o&&l&&g(s,o,l)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(u(this.$el,T),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,b(this.$el,T),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),n=this.$el;let r;if(t){if(!s)return this;r=n.querySelector(`.${t}`),b(r,C)}else b(n,C),this.closed=!1,i(e)&&l((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),n=this.$el;let r;if(t){if(!s)return this;r=n.querySelector(`.${t}`),u(r,C)}else u(n,C),this.closed=!0,i(e)&&l((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(S.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(N(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const n=e.action;let r,o,l,a;if(this.disabled)return!1;n&&(o=n.handler,t(o)&&(a=o,n.handler=function(){M(a,e.name)},o=n.handler),r=n.type||"click",l=n.context),i(o)&&$(s,`.${e.name}`,r,o,l||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let n,r;if(this.disabled)return!1;s&&(r=s.handler,n=s.type||"click"),i(r)&&g(e,n,r)})),this}}return S.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null},S})); //# sourceMappingURL=toolbar.min.js.map diff --git a/toolbar.min.js.map b/toolbar.min.js.map index a376c71c..a1ac6564 100644 --- a/toolbar.min.js.map +++ b/toolbar.min.js.map @@ -1 +1 @@ -{"version":3,"file":"toolbar.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isArray.js","src/utils/lang/later.js","src/utils/types/isElement.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/createElement.js","src/utils/dom/setAttribute.js","src/utils/dom/hasClass.js","src/utils/dom/addClass.js","src/utils/dom/removeClass.js","src/utils/lang/trim.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/_createButton.js","src/utils/icons.js","src/toolbar.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from '../types/isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import hasOwn from '../lang/hasOwn'\r\nimport isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttribute from './setAttribute'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array} attrs - 属性对象或者子节点\r\n * @param {Array} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n Object.keys(attrs).forEach((attr) => {\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute($el, attr, attrs[attr])\r\n }\r\n })\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n return purgeElement(el, type)\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} data - (必须)数据对象\r\n * @param {Boolean} async - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import { createSvgIcon } from './utils/icons'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = createSvgIcon(button.icon, button.size)\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n [$icon]\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isArray from './types/isArray'\r\n\r\n/**\r\n * 绘制 SVG Sprites 图标集\r\n * ========================================================================\r\n * @method paintSvgSprites\r\n * @param {Array} [symbols] - (可选)symbols 图标数组\r\n * 传递 symbols - 绘制 symbols + SYMBOLS 的图标集\r\n * 不传递 symbols - 仅绘制默认 SYMBOLS 图标集\r\n */\r\nexport const paintSvgSprites = (symbols = []) => {\r\n const SYMBOLS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n ]\r\n const sprites =\r\n isArray(symbols) && symbols.length > 0 ? SYMBOLS.concat(symbols) : SYMBOLS\r\n const $body = document.body\r\n let $icons = document.querySelector('#svg-sprites')\r\n\r\n if ($icons) {\r\n $icons.innerHTML = sprites.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createSvgIcon\r\n * @param {String} name\r\n * @param {Number|String|Array} [size]\r\n * @param {String} [color]\r\n * @param {String} [iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nexport const createSvgIcon = (\r\n name,\r\n size = 0,\r\n color = '',\r\n iconSet = 'outline'\r\n) => {\r\n const binds = iconSet\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const svg =\r\n `` +\r\n `` +\r\n ``\r\n const $icon = document.createElement('i')\r\n\r\n $icon.className = 'outline-icon'\r\n $icon.innerHTML = svg\r\n\r\n return $icon\r\n}\r\n","import Base from './base'\r\n\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport publish from './utils/observer/emit'\r\nimport { paintSvgSprites } from './utils/icons'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Toolbar.DEFAULTS\r\n this.$el = null\r\n this.disabled = false\r\n this.closed = false\r\n this.buttons = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n created = this.attr('created')\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isDisabled(name) {\r\n const buttons = this.attr('buttons')\r\n let button\r\n\r\n if (name) {\r\n button = buttons.find((option) => option.name === name)\r\n\r\n return button?.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n highlight(name) {\r\n const button = this.buttons.find((item) => item.name === name)\r\n const ACTIVE = 'outline-toolbar_active'\r\n let $button\r\n\r\n if ($button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const rounded = this.attr('rounded')\r\n const placement = this.attr('placement')\r\n const $buttons = document.createDocumentFragment()\r\n const $fragment = document.createDocumentFragment()\r\n\r\n paintSvgSprites()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n\r\n $buttons.appendChild($button)\r\n this.buttons.push({\r\n name: button.name,\r\n $el: $button\r\n })\r\n })\r\n\r\n this.$el = createElement(\r\n 'div',\r\n {\r\n id: 'outline-toolbar',\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n },\r\n [$buttons]\r\n )\r\n $fragment.appendChild(this.$el)\r\n document.body.appendChild($fragment)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const action = button.action\r\n const $fragment = document.createDocumentFragment()\r\n let type\r\n\r\n if (isObject(button)) {\r\n buttons.push(button)\r\n $fragment.appendChild(_createButton(button))\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n $fragment.appendChild(_createButton(item))\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n if (action && isFunction(action.handler)) {\r\n type = action.type || 'click'\r\n on($el, `.${button.name}`, type, action.handler)\r\n }\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const button = buttons.find((option) => option.name === name)\r\n let index = -1\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button, i) => {\r\n if (button.name === name) {\r\n index = i\r\n }\r\n })\r\n\r\n if (index > -1) {\r\n this.attr().buttons.splice(index, 1)\r\n }\r\n\r\n $button = $el.querySelector(`.${name}`)\r\n this.switch(name, false)\r\n $el.removeChild($button)\r\n\r\n return this\r\n }\r\n\r\n switch(name, enabled) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const button = buttons.find((option) => option.name === name)\r\n let action\r\n let type\r\n let listener\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n buttons.forEach((option) => {\r\n if (option.name === name) {\r\n button.disabled = !enabled\r\n }\r\n })\r\n\r\n action = button.action\r\n $button = $el.querySelector(`.${name}`)\r\n\r\n if (action) {\r\n type = action.type || 'click'\r\n listener = action.handler\r\n }\r\n\r\n if (enabled) {\r\n removeClass($button, DISABLED)\r\n\r\n if (type && listener) {\r\n on($el, `.${name}`, type, listener)\r\n }\r\n } else {\r\n addClass($button, DISABLED)\r\n\r\n if (type && listener) {\r\n off($el, type, listener)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this.switch(name, false)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this.switch(name, true)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.attr('buttons').find((option) => option.name === name)\r\n const $el = this.$el\r\n let $button\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = $el.querySelector(`.${name}`)\r\n removeClass($button, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.attr('buttons').find((option) => option.name === name)\r\n const $el = this.$el\r\n let $button\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n $button = $el.querySelector(`.${name}`)\r\n addClass($button, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n let $el = this.$el\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n document.body.removeChild($el)\r\n $el = null\r\n\r\n this.attr(Toolbar.DEFAULTS)\r\n this.disabled = false\r\n this.closed = false\r\n this.buttons = []\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons') || []\r\n\r\n this.removeListeners()\r\n $el.innerHTML = ''\r\n\r\n buttons.forEach((button) => {\r\n this.$el.appendChild(_createButton(button))\r\n })\r\n\r\n this.addListeners()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons')\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button) => {\r\n const action = button.action\r\n const disabled = this.disabled\r\n let type\r\n let listener\r\n let context\r\n let command\r\n\r\n if (disabled) {\r\n return false\r\n }\r\n\r\n if (action) {\r\n listener = action.handler\r\n if (isString(listener)) {\r\n command = listener\r\n action.handler = function () {\r\n publish(command, button.name)\r\n }\r\n listener = action.handler\r\n }\r\n\r\n type = action.type || 'click'\r\n context = action.context\r\n }\r\n\r\n if (isFunction(listener)) {\r\n on($el, `.${button.name}`, type, listener, context || this, true)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons')\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button) => {\r\n const action = button.action\r\n const disabled = this.disabled\r\n let type\r\n let listener\r\n\r\n if (disabled) {\r\n return false\r\n }\r\n\r\n if (action) {\r\n listener = action.handler\r\n type = action.type || 'click'\r\n }\r\n\r\n if (isFunction(listener)) {\r\n off($el, type, listener)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n}\r\n\r\nexport default Toolbar\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isArray","Array","later","fn","delay","setTimeout","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","className","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","replace","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","filter","getListeners","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","_createButton","button","rounded","$icon","name","size","color","iconSet","binds","width","height","defaultRules","svg","innerHTML","createSvgIcon","icon","$anchor","href","link","$button","disabled","DISABLED","HIDDEN","Toolbar","super","DEFAULTS","closed","buttons","created","isDisabled","find","option","isClosed","highlight","item","ACTIVE","mounted","placement","$buttons","symbols","SYMBOLS","sprites","concat","$body","body","$icons","join","insertBefore","firstChild","paintSvgSprites","id","hide","disable","action","switch","removeChild","enabled","enable","show","opened","toggle","beforeDestroy","afterDestroy","refresh","command","publish","afterClosed","afterOpened","afterDisabled","afterEnabled"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"toolbar.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isArray.js","src/utils/lang/later.js","src/utils/types/isElement.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/createElement.js","src/utils/dom/setAttribute.js","src/utils/dom/hasClass.js","src/utils/dom/addClass.js","src/utils/dom/removeClass.js","src/utils/lang/trim.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/utils/icons/symbols.js","src/utils/icons/defaults.js","src/utils/icons/getSymbols.js","src/utils/icons/getSymbol.js","src/utils/icons/paint.js","src/utils/icons/add.js","src/utils/types/isSVG.js","src/utils/icons/icon.js","src/utils/icons/createElement.js","src/_createButton.js","src/toolbar.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from '../types/isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import hasOwn from '../lang/hasOwn'\r\nimport isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttribute from './setAttribute'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array} attrs - 属性对象或者子节点\r\n * @param {Array} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n Object.keys(attrs).forEach((attr) => {\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute($el, attr, attrs[attr])\r\n }\r\n })\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n return purgeElement(el, type)\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} data - (必须)数据对象\r\n * @param {Boolean} async - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg =\r\n `` +\r\n `` +\r\n ``\r\n }\r\n\r\n $icon.className = 'outline-icon'\r\n $icon.innerHTML = svg\r\n\r\n if (isSVG(name)) {\r\n $svg = $icon.querySelector('svg')\r\n $svg.setAttribute('aria-hidden', 'true')\r\n $svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\r\n $svg.setAttribute('class', 'outline-icon__svg')\r\n $svg.setAttribute('width', '200')\r\n $svg.setAttribute('height', '200')\r\n $svg.style = cssRules\r\n }\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n [$icon]\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import Base from './base'\r\n\r\nimport isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport publish from './utils/observer/emit'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.attrs = Toolbar.DEFAULTS\r\n this.$el = null\r\n this.disabled = false\r\n this.closed = false\r\n this.buttons = []\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n created = this.attr('created')\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isDisabled(name) {\r\n const buttons = this.attr('buttons')\r\n let button\r\n\r\n if (name) {\r\n button = buttons.find((option) => option.name === name)\r\n\r\n return button?.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n highlight(name) {\r\n const button = this.buttons.find((item) => item.name === name)\r\n const ACTIVE = 'outline-toolbar_active'\r\n let $button\r\n\r\n if ($button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const rounded = this.attr('rounded')\r\n const placement = this.attr('placement')\r\n const $buttons = document.createDocumentFragment()\r\n const $fragment = document.createDocumentFragment()\r\n\r\n paint()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n\r\n $buttons.appendChild($button)\r\n this.buttons.push({\r\n name: button.name,\r\n $el: $button\r\n })\r\n })\r\n\r\n this.$el = createElement(\r\n 'div',\r\n {\r\n id: 'outline-toolbar',\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n },\r\n [$buttons]\r\n )\r\n $fragment.appendChild(this.$el)\r\n document.body.appendChild($fragment)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const action = button.action\r\n const $fragment = document.createDocumentFragment()\r\n let type\r\n\r\n if (isObject(button)) {\r\n buttons.push(button)\r\n $fragment.appendChild(_createButton(button))\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n $fragment.appendChild(_createButton(item))\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n if (action && isFunction(action.handler)) {\r\n type = action.type || 'click'\r\n on($el, `.${button.name}`, type, action.handler)\r\n }\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const button = buttons.find((option) => option.name === name)\r\n let index = -1\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button, i) => {\r\n if (button.name === name) {\r\n index = i\r\n }\r\n })\r\n\r\n if (index > -1) {\r\n this.attr().buttons.splice(index, 1)\r\n }\r\n\r\n $button = $el.querySelector(`.${name}`)\r\n this.switch(name, false)\r\n $el.removeChild($button)\r\n\r\n return this\r\n }\r\n\r\n switch(name, enabled) {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons')\r\n const button = buttons.find((option) => option.name === name)\r\n let action\r\n let type\r\n let listener\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n buttons.forEach((option) => {\r\n if (option.name === name) {\r\n button.disabled = !enabled\r\n }\r\n })\r\n\r\n action = button.action\r\n $button = $el.querySelector(`.${name}`)\r\n\r\n if (action) {\r\n type = action.type || 'click'\r\n listener = action.handler\r\n }\r\n\r\n if (enabled) {\r\n removeClass($button, DISABLED)\r\n\r\n if (type && listener) {\r\n on($el, `.${name}`, type, listener)\r\n }\r\n } else {\r\n addClass($button, DISABLED)\r\n\r\n if (type && listener) {\r\n off($el, type, listener)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this.switch(name, false)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this.switch(name, true)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.attr('buttons').find((option) => option.name === name)\r\n const $el = this.$el\r\n let $button\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = $el.querySelector(`.${name}`)\r\n removeClass($button, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.attr('buttons').find((option) => option.name === name)\r\n const $el = this.$el\r\n let $button\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n $button = $el.querySelector(`.${name}`)\r\n addClass($button, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n let $el = this.$el\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()\r\n document.body.removeChild($el)\r\n $el = null\r\n\r\n this.attr(Toolbar.DEFAULTS)\r\n this.disabled = false\r\n this.closed = false\r\n this.buttons = []\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const $el = this.$el\r\n const buttons = this.attr('buttons') || []\r\n\r\n this.removeListeners()\r\n $el.innerHTML = ''\r\n\r\n buttons.forEach((button) => {\r\n this.$el.appendChild(_createButton(button))\r\n })\r\n\r\n this.addListeners()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons')\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button) => {\r\n const action = button.action\r\n const disabled = this.disabled\r\n let type\r\n let listener\r\n let context\r\n let command\r\n\r\n if (disabled) {\r\n return false\r\n }\r\n\r\n if (action) {\r\n listener = action.handler\r\n if (isString(listener)) {\r\n command = listener\r\n action.handler = function () {\r\n publish(command, button.name)\r\n }\r\n listener = action.handler\r\n }\r\n\r\n type = action.type || 'click'\r\n context = action.context\r\n }\r\n\r\n if (isFunction(listener)) {\r\n on($el, `.${button.name}`, type, listener, context || this, true)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons')\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n buttons.forEach((button) => {\r\n const action = button.action\r\n const disabled = this.disabled\r\n let type\r\n let listener\r\n\r\n if (disabled) {\r\n return false\r\n }\r\n\r\n if (action) {\r\n listener = action.handler\r\n type = action.type || 'click'\r\n }\r\n\r\n if (isFunction(listener)) {\r\n off($el, type, listener)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n}\r\n\r\nexport default Toolbar\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isArray","Array","later","fn","delay","setTimeout","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","toLowerCase","style","cssText","setAttribute","className","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","add","removeClass","remove","replace","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","filter","getListeners","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","iconName","getSymbol","paint","$body","body","$icons","symbols","innerHTML","join","insertBefore","firstChild","isSVG","test","icon","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","_createButton","button","rounded","$anchor","href","link","$button","disabled","DISABLED","HIDDEN","Toolbar","super","DEFAULTS","closed","buttons","created","isDisabled","option","isClosed","highlight","item","ACTIVE","mounted","placement","$buttons","id","hide","disable","action","switch","removeChild","enabled","enable","show","opened","toggle","beforeDestroy","afterDestroy","refresh","command","publish","afterClosed","afterOpened","afterDisabled","afterEnabled"],"mappings":"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"} \ No newline at end of file