(()=>{var Ni=Object.create,mt=Object.defineProperty,zi=Object.getPrototypeOf,Zt=Object.prototype.hasOwnProperty,qi=Object.getOwnPropertyNames,Qi=Object.getOwnPropertyDescriptor,dt=Object.getOwnPropertySymbols,Rr=Object.prototype.propertyIsEnumerable;var Pr=(e,t,r)=>t in e?mt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,V=(e,t)=>{for(var r in t||(t={}))Zt.call(t,r)&&Pr(e,r,t[r]);if(dt)for(var r of dt(t))Rr.call(t,r)&&Pr(e,r,t[r]);return e},Ki=e=>mt(e,"__esModule",{value:!0});var $r=(e,t)=>{var r={};for(var o in e)Zt.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&dt)for(var o of dt(e))t.indexOf(o)<0&&Rr.call(e,o)&&(r[o]=e[o]);return r};var ht=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Bi=(e,t,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of qi(t))!Zt.call(e,o)&&o!=="default"&&mt(e,o,{get:()=>t[o],enumerable:!(r=Qi(t,o))||r.enumerable});return e},Ze=e=>Bi(Ki(mt(e!=null?Ni(zi(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var Wr=ht((er,Vr)=>{(function(e,t){typeof er=="object"&&typeof Vr!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(_){return!!(_&&_!==document&&_.nodeName!=="HTML"&&_.nodeName!=="BODY"&&"classList"in _&&"contains"in _.classList)}function c(_){var ut=_.type,pt=_.tagName;return!!(pt==="INPUT"&&a[ut]&&!_.readOnly||pt==="TEXTAREA"&&!_.readOnly||_.isContentEditable)}function l(_){_.classList.contains("focus-visible")||(_.classList.add("focus-visible"),_.setAttribute("data-focus-visible-added",""))}function u(_){!_.hasAttribute("data-focus-visible-added")||(_.classList.remove("focus-visible"),_.removeAttribute("data-focus-visible-added"))}function m(_){_.metaKey||_.altKey||_.ctrlKey||(s(r.activeElement)&&l(r.activeElement),o=!0)}function p(_){o=!1}function h(_){!s(_.target)||(o||c(_.target))&&l(_.target)}function g(_){!s(_.target)||(_.target.classList.contains("focus-visible")||_.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),u(_.target))}function b(_){document.visibilityState==="hidden"&&(n&&(o=!0),q())}function q(){document.addEventListener("mousemove",H),document.addEventListener("mousedown",H),document.addEventListener("mouseup",H),document.addEventListener("pointermove",H),document.addEventListener("pointerdown",H),document.addEventListener("pointerup",H),document.addEventListener("touchmove",H),document.addEventListener("touchstart",H),document.addEventListener("touchend",H)}function $(){document.removeEventListener("mousemove",H),document.removeEventListener("mousedown",H),document.removeEventListener("mouseup",H),document.removeEventListener("pointermove",H),document.removeEventListener("pointerdown",H),document.removeEventListener("pointerup",H),document.removeEventListener("touchmove",H),document.removeEventListener("touchstart",H),document.removeEventListener("touchend",H)}function H(_){_.target.nodeName&&_.target.nodeName.toLowerCase()==="html"||(o=!1,$())}document.addEventListener("keydown",m,!0),document.addEventListener("mousedown",p,!0),document.addEventListener("pointerdown",p,!0),document.addEventListener("touchstart",p,!0),document.addEventListener("visibilitychange",b,!0),q(),r.addEventListener("focus",h,!0),r.addEventListener("blur",g,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var so=ht((Ga,bt)=>{var Ur,Dr,Nr,zr,qr,Qr,Kr,Br,Jr,vt,tr,Yr,Gr,Xr,$e,Zr,eo,to,ro,oo,no,io,ao,xt;(function(e){var t=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(o){e(r(t,r(o)))}):typeof bt=="object"&&typeof bt.exports=="object"?e(r(t,r(bt.exports))):e(r(t));function r(o,n){return o!==t&&(typeof Object.create=="function"?Object.defineProperty(o,"__esModule",{value:!0}):o.__esModule=!0),function(i,a){return o[i]=n?n(i,a):a}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(o,n){o.__proto__=n}||function(o,n){for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(o[i]=n[i])};Ur=function(o,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(o,n);function i(){this.constructor=o}o.prototype=n===null?Object.create(n):(i.prototype=n.prototype,new i)},Dr=Object.assign||function(o){for(var n,i=1,a=arguments.length;i<a;i++){n=arguments[i];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(o[s]=n[s])}return o},Nr=function(o,n){var i={};for(var a in o)Object.prototype.hasOwnProperty.call(o,a)&&n.indexOf(a)<0&&(i[a]=o[a]);if(o!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,a=Object.getOwnPropertySymbols(o);s<a.length;s++)n.indexOf(a[s])<0&&Object.prototype.propertyIsEnumerable.call(o,a[s])&&(i[a[s]]=o[a[s]]);return i},zr=function(o,n,i,a){var s=arguments.length,c=s<3?n:a===null?a=Object.getOwnPropertyDescriptor(n,i):a,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")c=Reflect.decorate(o,n,i,a);else for(var u=o.length-1;u>=0;u--)(l=o[u])&&(c=(s<3?l(c):s>3?l(n,i,c):l(n,i))||c);return s>3&&c&&Object.defineProperty(n,i,c),c},qr=function(o,n){return function(i,a){n(i,a,o)}},Qr=function(o,n){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,n)},Kr=function(o,n,i,a){function s(c){return c instanceof i?c:new i(function(l){l(c)})}return new(i||(i=Promise))(function(c,l){function u(h){try{p(a.next(h))}catch(g){l(g)}}function m(h){try{p(a.throw(h))}catch(g){l(g)}}function p(h){h.done?c(h.value):s(h.value).then(u,m)}p((a=a.apply(o,n||[])).next())})},Br=function(o,n){var i={label:0,sent:function(){if(c[0]&1)throw c[1];return c[1]},trys:[],ops:[]},a,s,c,l;return l={next:u(0),throw:u(1),return:u(2)},typeof Symbol=="function"&&(l[Symbol.iterator]=function(){return this}),l;function u(p){return function(h){return m([p,h])}}function m(p){if(a)throw new TypeError("Generator is already executing.");for(;i;)try{if(a=1,s&&(c=p[0]&2?s.return:p[0]?s.throw||((c=s.return)&&c.call(s),0):s.next)&&!(c=c.call(s,p[1])).done)return c;switch(s=0,c&&(p=[p[0]&2,c.value]),p[0]){case 0:case 1:c=p;break;case 4:return i.label++,{value:p[1],done:!1};case 5:i.label++,s=p[1],p=[0];continue;case 7:p=i.ops.pop(),i.trys.pop();continue;default:if(c=i.trys,!(c=c.length>0&&c[c.length-1])&&(p[0]===6||p[0]===2)){i=0;continue}if(p[0]===3&&(!c||p[1]>c[0]&&p[1]<c[3])){i.label=p[1];break}if(p[0]===6&&i.label<c[1]){i.label=c[1],c=p;break}if(c&&i.label<c[2]){i.label=c[2],i.ops.push(p);break}c[2]&&i.ops.pop(),i.trys.pop();continue}p=n.call(o,i)}catch(h){p=[6,h],s=0}finally{a=c=0}if(p[0]&5)throw p[1];return{value:p[0]?p[1]:void 0,done:!0}}},Jr=function(o,n){for(var i in o)i!=="default"&&!Object.prototype.hasOwnProperty.call(n,i)&&xt(n,o,i)},xt=Object.create?function(o,n,i,a){a===void 0&&(a=i),Object.defineProperty(o,a,{enumerable:!0,get:function(){return n[i]}})}:function(o,n,i,a){a===void 0&&(a=i),o[a]=n[i]},vt=function(o){var n=typeof Symbol=="function"&&Symbol.iterator,i=n&&o[n],a=0;if(i)return i.call(o);if(o&&typeof o.length=="number")return{next:function(){return o&&a>=o.length&&(o=void 0),{value:o&&o[a++],done:!o}}};throw new TypeError(n?"Object is not iterable.":"Symbol.iterator is not defined.")},tr=function(o,n){var i=typeof Symbol=="function"&&o[Symbol.iterator];if(!i)return o;var a=i.call(o),s,c=[],l;try{for(;(n===void 0||n-- >0)&&!(s=a.next()).done;)c.push(s.value)}catch(u){l={error:u}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(l)throw l.error}}return c},Yr=function(){for(var o=[],n=0;n<arguments.length;n++)o=o.concat(tr(arguments[n]));return o},Gr=function(){for(var o=0,n=0,i=arguments.length;n<i;n++)o+=arguments[n].length;for(var a=Array(o),s=0,n=0;n<i;n++)for(var c=arguments[n],l=0,u=c.length;l<u;l++,s++)a[s]=c[l];return a},Xr=function(o,n){for(var i=0,a=n.length,s=o.length;i<a;i++,s++)o[s]=n[i];return o},$e=function(o){return this instanceof $e?(this.v=o,this):new $e(o)},Zr=function(o,n,i){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var a=i.apply(o,n||[]),s,c=[];return s={},l("next"),l("throw"),l("return"),s[Symbol.asyncIterator]=function(){return this},s;function l(b){a[b]&&(s[b]=function(q){return new Promise(function($,H){c.push([b,q,$,H])>1||u(b,q)})})}function u(b,q){try{m(a[b](q))}catch($){g(c[0][3],$)}}function m(b){b.value instanceof $e?Promise.resolve(b.value.v).then(p,h):g(c[0][2],b)}function p(b){u("next",b)}function h(b){u("throw",b)}function g(b,q){b(q),c.shift(),c.length&&u(c[0][0],c[0][1])}},eo=function(o){var n,i;return n={},a("next"),a("throw",function(s){throw s}),a("return"),n[Symbol.iterator]=function(){return this},n;function a(s,c){n[s]=o[s]?function(l){return(i=!i)?{value:$e(o[s](l)),done:s==="return"}:c?c(l):l}:c}},to=function(o){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=o[Symbol.asyncIterator],i;return n?n.call(o):(o=typeof vt=="function"?vt(o):o[Symbol.iterator](),i={},a("next"),a("throw"),a("return"),i[Symbol.asyncIterator]=function(){return this},i);function a(c){i[c]=o[c]&&function(l){return new Promise(function(u,m){l=o[c](l),s(u,m,l.done,l.value)})}}function s(c,l,u,m){Promise.resolve(m).then(function(p){c({value:p,done:u})},l)}},ro=function(o,n){return Object.defineProperty?Object.defineProperty(o,"raw",{value:n}):o.raw=n,o};var r=Object.create?function(o,n){Object.defineProperty(o,"default",{enumerable:!0,value:n})}:function(o,n){o.default=n};oo=function(o){if(o&&o.__esModule)return o;var n={};if(o!=null)for(var i in o)i!=="default"&&Object.prototype.hasOwnProperty.call(o,i)&&xt(n,o,i);return r(n,o),n},no=function(o){return o&&o.__esModule?o:{default:o}},io=function(o,n){if(!n.has(o))throw new TypeError("attempted to get private field on non-instance");return n.get(o)},ao=function(o,n,i){if(!n.has(o))throw new TypeError("attempted to set private field on non-instance");return n.set(o,i),i},e("__extends",Ur),e("__assign",Dr),e("__rest",Nr),e("__decorate",zr),e("__param",qr),e("__metadata",Qr),e("__awaiter",Kr),e("__generator",Br),e("__exportStar",Jr),e("__createBinding",xt),e("__values",vt),e("__read",tr),e("__spread",Yr),e("__spreadArrays",Gr),e("__spreadArray",Xr),e("__await",$e),e("__asyncGenerator",Zr),e("__asyncDelegator",eo),e("__asyncValues",to),e("__makeTemplateObject",ro),e("__importStar",oo),e("__importDefault",no),e("__classPrivateFieldGet",io),e("__classPrivateFieldSet",ao)})});var _r=ht((lt,Tr)=>{(function(t,r){typeof lt=="object"&&typeof Tr=="object"?Tr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof lt=="object"?lt.ClipboardJS=r():t.ClipboardJS=r()})(lt,function(){return function(){var e={134:function(o,n,i){"use strict";i.d(n,{default:function(){return Ui}});var a=i(279),s=i.n(a),c=i(370),l=i.n(c),u=i(817),m=i.n(u);function p(E){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?p=function(d){return typeof d}:p=function(d){return d&&typeof Symbol=="function"&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":typeof d},p(E)}function h(E,v){if(!(E instanceof v))throw new TypeError("Cannot call a class as a function")}function g(E,v){for(var d=0;d<v.length;d++){var A=v[d];A.enumerable=A.enumerable||!1,A.configurable=!0,"value"in A&&(A.writable=!0),Object.defineProperty(E,A.key,A)}}function b(E,v,d){return v&&g(E.prototype,v),d&&g(E,d),E}var q=function(){function E(v){h(this,E),this.resolveOptions(v),this.initSelection()}return b(E,[{key:"resolveOptions",value:function(){var d=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=d.action,this.container=d.container,this.emitter=d.emitter,this.target=d.target,this.text=d.text,this.trigger=d.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"createFakeElement",value:function(){var d=document.documentElement.getAttribute("dir")==="rtl";this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[d?"right":"left"]="-9999px";var A=window.pageYOffset||document.documentElement.scrollTop;return this.fakeElem.style.top="".concat(A,"px"),this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.fakeElem}},{key:"selectFake",value:function(){var d=this,A=this.createFakeElement();this.fakeHandlerCallback=function(){return d.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.container.appendChild(A),this.selectedText=m()(A),this.copyText(),this.removeFake()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=m()(this.target),this.copyText()}},{key:"copyText",value:function(){var d;try{d=document.execCommand(this.action)}catch(A){d=!1}this.handleResult(d)}},{key:"handleResult",value:function(d){this.emitter.emit(d?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var d=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"copy";if(this._action=d,this._action!=="copy"&&this._action!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(d){if(d!==void 0)if(d&&p(d)==="object"&&d.nodeType===1){if(this.action==="copy"&&d.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(this.action==="cut"&&(d.hasAttribute("readonly")||d.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`);this._target=d}else throw new Error('Invalid "target" value, use a valid Element')},get:function(){return this._target}}]),E}(),$=q;function H(E){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(d){return typeof d}:H=function(d){return d&&typeof Symbol=="function"&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":typeof d},H(E)}function _(E,v){if(!(E instanceof v))throw new TypeError("Cannot call a class as a function")}function ut(E,v){for(var d=0;d<v.length;d++){var A=v[d];A.enumerable=A.enumerable||!1,A.configurable=!0,"value"in A&&(A.writable=!0),Object.defineProperty(E,A.key,A)}}function pt(E,v,d){return v&&ut(E.prototype,v),d&&ut(E,d),E}function Ii(E,v){if(typeof v!="function"&&v!==null)throw new TypeError("Super expression must either be null or a function");E.prototype=Object.create(v&&v.prototype,{constructor:{value:E,writable:!0,configurable:!0}}),v&&Gt(E,v)}function Gt(E,v){return Gt=Object.setPrototypeOf||function(A,I){return A.__proto__=I,A},Gt(E,v)}function Ri(E){var v=Vi();return function(){var A=ft(E),I;if(v){var X=ft(this).constructor;I=Reflect.construct(A,arguments,X)}else I=A.apply(this,arguments);return Pi(this,I)}}function Pi(E,v){return v&&(H(v)==="object"||typeof v=="function")?v:$i(E)}function $i(E){if(E===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return E}function Vi(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(E){return!1}}function ft(E){return ft=Object.setPrototypeOf?Object.getPrototypeOf:function(d){return d.__proto__||Object.getPrototypeOf(d)},ft(E)}function Xt(E,v){var d="data-clipboard-".concat(E);if(!!v.hasAttribute(d))return v.getAttribute(d)}var Wi=function(E){Ii(d,E);var v=Ri(d);function d(A,I){var X;return _(this,d),X=v.call(this),X.resolveOptions(I),X.listenClick(A),X}return pt(d,[{key:"resolveOptions",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=H(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var X=this;this.listener=l()(I,"click",function(Xe){return X.onClick(Xe)})}},{key:"onClick",value:function(I){var X=I.delegateTarget||I.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new $({action:this.action(X),target:this.target(X),text:this.text(X),container:this.container,trigger:X,emitter:this})}},{key:"defaultAction",value:function(I){return Xt("action",I)}},{key:"defaultTarget",value:function(I){var X=Xt("target",I);if(X)return document.querySelector(X)}},{key:"defaultText",value:function(I){return Xt("text",I)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],X=typeof I=="string"?[I]:I,Xe=!!document.queryCommandSupported;return X.forEach(function(Di){Xe=Xe&&!!document.queryCommandSupported(Di)}),Xe}}]),d}(s()),Ui=Wi},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,c){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(c))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(u,m,p,h,g){var b=l.apply(this,arguments);return u.addEventListener(p,b,g),{destroy:function(){u.removeEventListener(p,b,g)}}}function c(u,m,p,h,g){return typeof u.addEventListener=="function"?s.apply(null,arguments):typeof p=="function"?s.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(b){return s(b,m,p,h,g)}))}function l(u,m,p,h){return function(g){g.delegateTarget=a(g.target,m),g.delegateTarget&&h.call(u,g)}}o.exports=c},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function c(p,h,g){if(!p&&!h&&!g)throw new Error("Missing required arguments");if(!a.string(h))throw new TypeError("Second argument must be a String");if(!a.fn(g))throw new TypeError("Third argument must be a Function");if(a.node(p))return l(p,h,g);if(a.nodeList(p))return u(p,h,g);if(a.string(p))return m(p,h,g);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function l(p,h,g){return p.addEventListener(h,g),{destroy:function(){p.removeEventListener(h,g)}}}function u(p,h,g){return Array.prototype.forEach.call(p,function(b){b.addEventListener(h,g)}),{destroy:function(){Array.prototype.forEach.call(p,function(b){b.removeEventListener(h,g)})}}}function m(p,h,g){return s(document.body,p,h,g)}o.exports=c},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),l=document.createRange();l.selectNodeContents(i),c.removeAllRanges(),c.addRange(l),a=c.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var c=this;function l(){c.off(i,l),a.apply(s,arguments)}return l._=a,this.on(i,l,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),c=0,l=s.length;for(c;c<l;c++)s[c].fn.apply(s[c].ctx,a);return this},off:function(i,a){var s=this.e||(this.e={}),c=s[i],l=[];if(c&&a)for(var u=0,m=c.length;u<m;u++)c[u].fn!==a&&c[u].fn._!==a&&l.push(c[u]);return l.length?s[i]=l:delete s[i],this}},o.exports=n,o.exports.TinyEmitter=n}},t={};function r(o){if(t[o])return t[o].exports;var n=t[o]={exports:{}};return e[o](n,n.exports,r),n.exports}return function(){r.n=function(o){var n=o&&o.__esModule?function(){return o.default}:function(){return o};return r.d(n,{a:n}),n}}(),function(){r.d=function(o,n){for(var i in n)r.o(n,i)&&!r.o(o,i)&&Object.defineProperty(o,i,{enumerable:!0,get:n[i]})}}(),function(){r.o=function(o,n){return Object.prototype.hasOwnProperty.call(o,n)}}(),r(134)}().default})});var pi=ht((Hg,ui)=>{"use strict";var Ia=/["'&<>]/;ui.exports=Ra;function Ra(e){var t=""+e,r=Ia.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i<t.length;i++){switch(t.charCodeAt(i)){case 34:o="&quot;";break;case 38:o="&amp;";break;case 39:o="&#39;";break;case 60:o="&lt;";break;case 62:o="&gt;";break;default:continue}a!==i&&(n+=t.substring(a,i)),a=i+1,n+=o}return a!==i?n+t.substring(a,i):n}});var Qw=Ze(Wr());var co=Ze(so()),{__extends:K,__assign:Za,__rest:es,__decorate:ts,__param:rs,__metadata:os,__awaiter:lo,__generator:gt,__exportStar:ns,__createBinding:is,__values:ce,__read:k,__spread:as,__spreadArrays:ss,__spreadArray:F,__await:yt,__asyncGenerator:uo,__asyncDelegator:cs,__asyncValues:po,__makeTemplateObject:ls,__importStar:us,__importDefault:ps,__classPrivateFieldGet:fs,__classPrivateFieldSet:ms}=co.default;function S(e){return typeof e=="function"}function St(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var wt=St(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription:
`+r.map(function(o,n){return n+1+") "+o.toString()}).join(`
  `):"",this.name="UnsubscriptionError",this.errors=r}});function ye(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._teardowns=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(Array.isArray(a))try{for(var s=ce(a),c=s.next();!c.done;c=s.next()){var l=c.value;l.remove(this)}}catch(b){t={error:b}}finally{try{c&&!c.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a==null||a.remove(this);var u=this.initialTeardown;if(S(u))try{u()}catch(b){i=b instanceof wt?b.errors:[b]}var m=this._teardowns;if(m){this._teardowns=null;try{for(var p=ce(m),h=p.next();!h.done;h=p.next()){var g=h.value;try{fo(g)}catch(b){i=i!=null?i:[],b instanceof wt?i=F(F([],k(i)),k(b.errors)):i.push(b)}}}catch(b){o={error:b}}finally{try{h&&!h.done&&(n=p.return)&&n.call(p)}finally{if(o)throw o.error}}}if(i)throw new wt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)fo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._teardowns=(r=this._teardowns)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&ye(r,t)},e.prototype.remove=function(t){var r=this._teardowns;r&&ye(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var rr=ie.EMPTY;function Et(e){return e instanceof ie||e&&"closed"in e&&S(e.remove)&&S(e.add)&&S(e.unsubscribe)}function fo(e){S(e)?e():e.unsubscribe()}var Se={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var Ve={setTimeout:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=Ve.delegate;return((r==null?void 0:r.setTimeout)||setTimeout).apply(void 0,F([],k(e)))},clearTimeout:function(e){var t=Ve.delegate;return((t==null?void 0:t.clearTimeout)||clearTimeout)(e)},delegate:void 0};function Ot(e){Ve.setTimeout(function(){var t=Se.onUnhandledError;if(t)t(e);else throw e})}function ee(){}var mo=function(){return or("C",void 0,void 0)}();function ho(e){return or("E",void 0,e)}function bo(e){return or("N",e,void 0)}function or(e,t,r){return{kind:e,value:t,error:r}}var tt=function(e){K(t,e);function t(r){var o=e.call(this)||this;return o.isStopped=!1,r?(o.destination=r,Et(r)&&r.add(o)):o.destination=Ji,o}return t.create=function(r,o,n){return new et(r,o,n)},t.prototype.next=function(r){this.isStopped?nr(bo(r),this):this._next(r)},t.prototype.error=function(r){this.isStopped?nr(ho(r),this):(this.isStopped=!0,this._error(r))},t.prototype.complete=function(){this.isStopped?nr(mo,this):(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,e.prototype.unsubscribe.call(this),this.destination=null)},t.prototype._next=function(r){this.destination.next(r)},t.prototype._error=function(r){try{this.destination.error(r)}finally{this.unsubscribe()}},t.prototype._complete=function(){try{this.destination.complete()}finally{this.unsubscribe()}},t}(ie);var et=function(e){K(t,e);function t(r,o,n){var i=e.call(this)||this,a;if(S(r))a=r;else if(r){a=r.next,o=r.error,n=r.complete;var s;i&&Se.useDeprecatedNextContext?(s=Object.create(r),s.unsubscribe=function(){return i.unsubscribe()}):s=r,a=a==null?void 0:a.bind(s),o=o==null?void 0:o.bind(s),n=n==null?void 0:n.bind(s)}return i.destination={next:a?ir(a,i):ee,error:ir(o!=null?o:vo,i),complete:n?ir(n,i):ee},i}return t}(tt);function ir(e,t){return function(){for(var r=[],o=0;o<arguments.length;o++)r[o]=arguments[o];try{e.apply(void 0,F([],k(r)))}catch(n){if(Se.useDeprecatedSynchronousErrorHandling)if(t._syncErrorHack_isSubscribing)t.__syncError=n;else throw n;else Ot(n)}}}function vo(e){throw e}function nr(e,t){var r=Se.onStoppedNotification;r&&Ve.setTimeout(function(){return r(e,t)})}var Ji={closed:!0,next:ee,error:vo,complete:ee};var Te=function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"}();function le(e){return e}function xo(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return ar(e)}function ar(e){return e.length===0?le:e.length===1?e[0]:function(r){return e.reduce(function(o,n){return n(o)},r)}}var T=function(){function e(t){t&&(this._subscribe=t)}return e.prototype.lift=function(t){var r=new e;return r.source=this,r.operator=t,r},e.prototype.subscribe=function(t,r,o){var n=Yi(t)?t:new et(t,r,o);if(Se.useDeprecatedSynchronousErrorHandling)this._deprecatedSyncErrorSubscribe(n);else{var i=this,a=i.operator,s=i.source;n.add(a?a.call(n,s):s?this._subscribe(n):this._trySubscribe(n))}return n},e.prototype._deprecatedSyncErrorSubscribe=function(t){var r=t;r._syncErrorHack_isSubscribing=!0;var o=this.operator;if(o)t.add(o.call(t,this.source));else try{this._subscribe(t)}catch(i){r.__syncError=i}for(var n=r;n;){if("__syncError"in n)try{throw n.__syncError}finally{t.unsubscribe()}n=n.destination}r._syncErrorHack_isSubscribing=!1},e.prototype._trySubscribe=function(t){try{return this._subscribe(t)}catch(r){t.error(r)}},e.prototype.forEach=function(t,r){var o=this;return r=go(r),new r(function(n,i){var a;a=o.subscribe(function(s){try{t(s)}catch(c){i(c),a==null||a.unsubscribe()}},i,n)})},e.prototype._subscribe=function(t){var r;return(r=this.source)===null||r===void 0?void 0:r.subscribe(t)},e.prototype[Te]=function(){return this},e.prototype.pipe=function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return t.length?ar(t)(this):this},e.prototype.toPromise=function(t){var r=this;return t=go(t),new t(function(o,n){var i;r.subscribe(function(a){return i=a},function(a){return n(a)},function(){return o(i)})})},e.create=function(t){return new e(t)},e}();function go(e){var t;return(t=e!=null?e:Se.Promise)!==null&&t!==void 0?t:Promise}function Gi(e){return e&&S(e.next)&&S(e.error)&&S(e.complete)}function Yi(e){return e&&e instanceof tt||Gi(e)&&Et(e)}function Xi(e){return S(e==null?void 0:e.lift)}function x(e){return function(t){if(Xi(t))return t.lift(function(r){try{return e(r,this)}catch(o){this.error(o)}});throw new TypeError("Unable to lift unknown Observable type")}}var y=function(e){K(t,e);function t(r,o,n,i,a){var s=e.call(this,r)||this;return s.onFinalize=a,s._next=o?function(c){try{o(c)}catch(l){r.error(l)}}:e.prototype._next,s._error=i?function(c){try{i(c)}catch(l){r.error(l)}finally{this.unsubscribe()}}:e.prototype._error,s._complete=n?function(){try{n()}catch(c){r.error(c)}finally{this.unsubscribe()}}:e.prototype._complete,s}return t.prototype.unsubscribe=function(){var r,o=this.closed;e.prototype.unsubscribe.call(this),!o&&((r=this.onFinalize)===null||r===void 0||r.call(this))},t}(tt);var We={schedule:function(e){var t=requestAnimationFrame,r=cancelAnimationFrame,o=We.delegate;o&&(t=o.requestAnimationFrame,r=o.cancelAnimationFrame);var n=t(function(i){r=void 0,e(i)});return new ie(function(){return r==null?void 0:r(n)})},requestAnimationFrame:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=We.delegate;return((r==null?void 0:r.requestAnimationFrame)||requestAnimationFrame).apply(void 0,F([],k(e)))},cancelAnimationFrame:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=We.delegate;return((r==null?void 0:r.cancelAnimationFrame)||cancelAnimationFrame).apply(void 0,F([],k(e)))},delegate:void 0};var yo=St(function(e){return function(){e(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"}});var M=function(e){K(t,e);function t(){var r=e.call(this)||this;return r.closed=!1,r.observers=[],r.isStopped=!1,r.hasError=!1,r.thrownError=null,r}return t.prototype.lift=function(r){var o=new So(this,this);return o.operator=r,o},t.prototype._throwIfClosed=function(){if(this.closed)throw new yo},t.prototype.next=function(r){var o,n;if(this._throwIfClosed(),!this.isStopped){var i=this.observers.slice();try{for(var a=ce(i),s=a.next();!s.done;s=a.next()){var c=s.value;c.next(r)}}catch(l){o={error:l}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}}},t.prototype.error=function(r){if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=r;for(var o=this.observers;o.length;)o.shift().error(r)}},t.prototype.complete=function(){if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;for(var r=this.observers;r.length;)r.shift().complete()}},t.prototype.unsubscribe=function(){this.isStopped=this.closed=!0,this.observers=null},t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=o.hasError,i=o.isStopped,a=o.observers;return n||i?rr:(a.push(r),new ie(function(){return ye(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new T;return r.source=this,r},t.create=function(r,o){return new So(r,o)},t}(T);var So=function(e){K(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:rr},t}(M);var rt={now:function(){return(rt.delegate||Date).now()},delegate:void 0};var ot=function(e){K(t,e);function t(r,o,n){r===void 0&&(r=Infinity),o===void 0&&(o=Infinity),n===void 0&&(n=rt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===Infinity,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,c=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),c=0;c<s.length&&!r.closed;c+=i?1:2)r.next(s[c]);return this._checkFinalizedStatuses(r),o},t.prototype._trimBuffer=function(){var r=this,o=r._bufferSize,n=r._timestampProvider,i=r._buffer,a=r._infiniteTimeWindow,s=(a?1:2)*o;if(o<Infinity&&s<i.length&&i.splice(0,i.length-s),!a){for(var c=n.now(),l=0,u=1;u<i.length&&i[u]<=c;u+=2)l=u;l&&i.splice(0,l+1)}},t}(M);var wo=function(e){K(t,e);function t(r,o){return e.call(this)||this}return t.prototype.schedule=function(r,o){return o===void 0&&(o=0),this},t}(ie);var nt={setInterval:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=nt.delegate;return((r==null?void 0:r.setInterval)||setInterval).apply(void 0,F([],k(e)))},clearInterval:function(e){var t=nt.delegate;return((t==null?void 0:t.clearInterval)||clearInterval)(e)},delegate:void 0};var Tt=function(e){K(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n.pending=!1,n}return t.prototype.schedule=function(r,o){if(o===void 0&&(o=0),this.closed)return this;this.state=r;var n=this.id,i=this.scheduler;return n!=null&&(this.id=this.recycleAsyncId(i,n,o)),this.pending=!0,this.delay=o,this.id=this.id||this.requestAsyncId(i,this.id,o),this},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),nt.setInterval(r.flush.bind(r,this),n)},t.prototype.recycleAsyncId=function(r,o,n){if(n===void 0&&(n=0),n!=null&&this.delay===n&&this.pending===!1)return o;nt.clearInterval(o)},t.prototype.execute=function(r,o){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var n=this._execute(r,o);if(n)return n;this.pending===!1&&this.id!=null&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(r,o){var n=!1,i;try{this.work(r)}catch(a){n=!0,i=!!a&&a||new Error(a)}if(n)return this.unsubscribe(),i},t.prototype.unsubscribe=function(){if(!this.closed){var r=this,o=r.id,n=r.scheduler,i=n.actions;this.work=this.state=this.scheduler=null,this.pending=!1,ye(i,this),o!=null&&(this.id=this.recycleAsyncId(n,o,null)),this.delay=null,e.prototype.unsubscribe.call(this)}},t}(wo);var sr=function(){function e(t,r){r===void 0&&(r=e.now),this.schedulerActionCtor=t,this.now=r}return e.prototype.schedule=function(t,r,o){return r===void 0&&(r=0),new this.schedulerActionCtor(this,t).schedule(o,r)},e.now=rt.now,e}();var _t=function(e){K(t,e);function t(r,o){o===void 0&&(o=sr.now);var n=e.call(this,r,o)||this;return n.actions=[],n._active=!1,n._scheduled=void 0,n}return t.prototype.flush=function(r){var o=this.actions;if(this._active){o.push(r);return}var n;this._active=!0;do if(n=r.execute(r.state,r.delay))break;while(r=o.shift());if(this._active=!1,n){for(;r=o.shift();)r.unsubscribe();throw n}},t}(sr);var it=new _t(Tt),Eo=it;var Oo=function(e){K(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=We.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){if(n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);r.actions.length===0&&(We.cancelAnimationFrame(o),r._scheduled=void 0)},t}(Tt);var To=function(e){K(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0,this._scheduled=void 0;var o=this.actions,n,i=-1;r=r||o.shift();var a=o.length;do if(n=r.execute(r.state,r.delay))break;while(++i<a&&(r=o.shift()));if(this._active=!1,n){for(;++i<a&&(r=o.shift());)r.unsubscribe();throw n}},t}(_t);var B=new To(Oo);var de=new T(function(e){return e.complete()});function Ue(e,t){return new T(function(r){var o=0;return t.schedule(function(){o===e.length?r.complete():(r.next(e[o++]),r.closed||this.schedule())})})}var De=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Mt(e){return S(e==null?void 0:e.then)}function _o(e,t){return new T(function(r){var o=new ie;return o.add(t.schedule(function(){var n=e[Te]();o.add(n.subscribe({next:function(i){o.add(t.schedule(function(){return r.next(i)}))},error:function(i){o.add(t.schedule(function(){return r.error(i)}))},complete:function(){o.add(t.schedule(function(){return r.complete()}))}}))})),o})}function Mo(e,t){return new T(function(r){return t.schedule(function(){return e.then(function(o){r.add(t.schedule(function(){r.next(o),r.add(t.schedule(function(){return r.complete()}))}))},function(o){r.add(t.schedule(function(){return r.error(o)}))})})})}function Zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var At=Zi();function Ao(e,t,r,o){o===void 0&&(o=0);var n=t.schedule(function(){try{r.call(this)}catch(i){e.error(i)}},o);return e.add(n),n}function Lo(e,t){return new T(function(r){var o;return r.add(t.schedule(function(){o=e[At](),Ao(r,t,function(){var n=o.next(),i=n.value,a=n.done;a?r.complete():(r.next(i),this.schedule())})})),function(){return S(o==null?void 0:o.return)&&o.return()}})}function Lt(e,t){if(!e)throw new Error("Iterable cannot be null");return new T(function(r){var o=new ie;return o.add(t.schedule(function(){var n=e[Symbol.asyncIterator]();o.add(t.schedule(function(){var i=this;n.next().then(function(a){a.done?r.complete():(r.next(a.value),i.schedule())})}))})),o})}function kt(e){return S(e[Te])}function Ct(e){return S(e==null?void 0:e[At])}function Ht(e){return Symbol.asyncIterator&&S(e==null?void 0:e[Symbol.asyncIterator])}function jt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Ft(e){return uo(this,arguments,function(){var r,o,n,i;return gt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,yt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,yt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,yt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function It(e){return S(e==null?void 0:e.getReader)}function ko(e,t){return Lt(Ft(e),t)}function Co(e,t){if(e!=null){if(kt(e))return _o(e,t);if(De(e))return Ue(e,t);if(Mt(e))return Mo(e,t);if(Ht(e))return Lt(e,t);if(Ct(e))return Lo(e,t);if(It(e))return ko(e,t)}throw jt(e)}function ve(e,t){return t?Co(e,t):N(e)}function N(e){if(e instanceof T)return e;if(e!=null){if(kt(e))return ea(e);if(De(e))return cr(e);if(Mt(e))return ta(e);if(Ht(e))return Ho(e);if(Ct(e))return ra(e);if(It(e))return oa(e)}throw jt(e)}function ea(e){return new T(function(t){var r=e[Te]();if(S(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function cr(e){return new T(function(t){for(var r=0;r<e.length&&!t.closed;r++)t.next(e[r]);t.complete()})}function ta(e){return new T(function(t){e.then(function(r){t.closed||(t.next(r),t.complete())},function(r){return t.error(r)}).then(null,Ot)})}function ra(e){return new T(function(t){var r,o;try{for(var n=ce(e),i=n.next();!i.done;i=n.next()){var a=i.value;if(t.next(a),t.closed)return}}catch(s){r={error:s}}finally{try{i&&!i.done&&(o=n.return)&&o.call(n)}finally{if(r)throw r.error}}t.complete()})}function Ho(e){return new T(function(t){na(e,t).catch(function(r){return t.error(r)})})}function oa(e){return Ho(Ft(e))}function na(e,t){var r,o,n,i;return lo(this,void 0,void 0,function(){var a,s;return gt(this,function(c){switch(c.label){case 0:c.trys.push([0,5,6,11]),r=po(e),c.label=1;case 1:return[4,r.next()];case 2:if(o=c.sent(),!!o.done)return[3,4];if(a=o.value,t.next(a),t.closed)return[2];c.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return s=c.sent(),n={error:s},[3,11];case 6:return c.trys.push([6,,9,10]),o&&!o.done&&(i=r.return)?[4,i.call(r)]:[3,8];case 7:c.sent(),c.label=8;case 8:return[3,10];case 9:if(n)throw n.error;return[7];case 10:return[7];case 11:return t.complete(),[2]}})})}function xe(e,t){return t?Ue(e,t):cr(e)}function Rt(e){return e&&S(e.schedule)}function lr(e){return e[e.length-1]}function _e(e){return S(lr(e))?e.pop():void 0}function pe(e){return Rt(lr(e))?e.pop():void 0}function Pt(e,t){return typeof lr(e)=="number"?e.pop():t}function j(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=pe(e);return r?Ue(e,r):xe(e)}function jo(e){return e instanceof Date&&!isNaN(e)}function f(e,t){return x(function(r,o){var n=0;r.subscribe(new y(o,function(i){o.next(e.call(t,i,n++))}))})}var ia=Array.isArray;function aa(e,t){return ia(t)?e.apply(void 0,F([],k(t))):e(t)}function Me(e){return f(function(t){return aa(e,t)})}function J(e,t){return t===void 0&&(t=0),x(function(r,o){r.subscribe(new y(o,function(n){return o.add(e.schedule(function(){return o.next(n)},t))},function(){return o.add(e.schedule(function(){return o.complete()},t))},function(n){return o.add(e.schedule(function(){return o.error(n)},t))}))})}var sa=Array.isArray,ca=Object.getPrototypeOf,la=Object.prototype,ua=Object.keys;function Fo(e){if(e.length===1){var t=e[0];if(sa(t))return{args:t,keys:null};if(pa(t)){var r=ua(t);return{args:r.map(function(o){return t[o]}),keys:r}}}return{args:e,keys:null}}function pa(e){return e&&typeof e=="object"&&ca(e)===la}function Io(e,t){return e.reduce(function(r,o,n){return r[o]=t[n],r},{})}function Y(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=pe(e),o=_e(e),n=Fo(e),i=n.args,a=n.keys;if(i.length===0)return ve([],r);var s=new T(ur(i,r,a?function(c){return Io(a,c)}:le));return o?s.pipe(Me(o)):s}function ur(e,t,r){return r===void 0&&(r=le),function(o){Ro(t,function(){for(var n=e.length,i=new Array(n),a=n,s=n,c=function(u){Ro(t,function(){var m=ve(e[u],t),p=!1;m.subscribe(new y(o,function(h){i[u]=h,p||(p=!0,s--),s||o.next(r(i.slice()))},function(){--a||o.complete()}))},o)},l=0;l<n;l++)c(l)},o)}}function Ro(e,t,r){e?r.add(e.schedule(t)):t()}function Po(e,t,r,o,n,i,a,s){var c=[],l=0,u=0,m=!1,p=function(){m&&!c.length&&!l&&t.complete()},h=function(b){return l<o?g(b):c.push(b)},g=function(b){i&&t.next(b),l++;var q=!1;N(r(b,u++)).subscribe(new y(t,function($){n==null||n($),i?h($):t.next($)},function(){q=!0},void 0,function(){if(q)try{l--;for(var $=function(){var H=c.shift();a?t.add(a.schedule(function(){return g(H)})):g(H)};c.length&&l<o;)$();p()}catch(H){t.error(H)}}))};return e.subscribe(new y(t,h,function(){m=!0,p()})),function(){s==null||s()}}function te(e,t,r){return r===void 0&&(r=Infinity),S(t)?te(function(o,n){return f(function(i,a){return t(o,i,n,a)})(N(e(o,n)))},r):(typeof t=="number"&&(r=t),x(function(o,n){return Po(o,n,e,r)}))}function Ne(e){return e===void 0&&(e=Infinity),te(le,e)}function $o(){return Ne(1)}function at(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return $o()(xe(e,pe(e)))}function we(e){return new T(function(t){N(e()).subscribe(t)})}var fa=["addListener","removeListener"],ma=["addEventListener","removeEventListener"],da=["on","off"];function O(e,t,r,o){if(S(r)&&(o=r,r=void 0),o)return O(e,t,r).pipe(Me(o));var n=k(va(e)?ma.map(function(s){return function(c){return e[s](t,c,r)}}):ha(e)?fa.map(Vo(e,t)):ba(e)?da.map(Vo(e,t)):[],2),i=n[0],a=n[1];if(!i&&De(e))return te(function(s){return O(s,t,r)})(xe(e));if(!i)throw new TypeError("Invalid event target");return new T(function(s){var c=function(){for(var l=[],u=0;u<arguments.length;u++)l[u]=arguments[u];return s.next(1<l.length?l:l[0])};return i(c),function(){return a(c)}})}function Vo(e,t){return function(r){return function(o){return e[r](t,o)}}}function ha(e){return S(e.addListener)&&S(e.removeListener)}function ba(e){return S(e.on)&&S(e.off)}function va(e){return S(e.addEventListener)&&S(e.removeEventListener)}function $t(e,t,r){return r?$t(e,t).pipe(Me(r)):new T(function(o){var n=function(){for(var a=[],s=0;s<arguments.length;s++)a[s]=arguments[s];return o.next(a.length===1?a[0]:a)},i=e(n);return S(t)?function(){return t(n,i)}:void 0})}function Wo(e,t,r){e===void 0&&(e=0),r===void 0&&(r=Eo);var o=-1;return t!=null&&(Rt(t)?r=t:o=t),new T(function(n){var i=jo(e)?+e-r.now():e;i<0&&(i=0);var a=0;return r.schedule(function(){n.closed||(n.next(a++),0<=o?this.schedule(void 0,o):n.complete())},i)})}function R(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=pe(e),o=Pt(e,Infinity),n=e;return n.length?n.length===1?N(n[0]):Ne(o)(xe(n,r)):de}var Z=new T(ee);var xa=Array.isArray;function ze(e){return e.length===1&&xa(e[0])?e[0]:e}function L(e,t){return x(function(r,o){var n=0;r.subscribe(new y(o,function(i){return e.call(t,i,n++)&&o.next(i)}))})}function st(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=_e(e),o=ze(e);return o.length?new T(function(n){var i=o.map(function(){return[]}),a=o.map(function(){return!1});n.add(function(){i=a=null});for(var s=function(l){N(o[l]).subscribe(new y(n,function(u){if(i[l].push(u),i.every(function(p){return p.length})){var m=i.map(function(p){return p.shift()});n.next(r?r.apply(void 0,F([],k(m))):m),i.some(function(p,h){return!p.length&&a[h]})&&n.complete()}},function(){a[l]=!0,!i[l].length&&n.complete()}))},c=0;!n.closed&&c<o.length;c++)s(c);return function(){i=a=null}}):de}function he(e,t){return t===void 0&&(t=null),t=t!=null?t:e,x(function(r,o){var n=[],i=0;r.subscribe(new y(o,function(a){var s,c,l,u,m=null;i++%t==0&&n.push([]);try{for(var p=ce(n),h=p.next();!h.done;h=p.next()){var g=h.value;g.push(a),e<=g.length&&(m=m!=null?m:[],m.push(g))}}catch($){s={error:$}}finally{try{h&&!h.done&&(c=p.return)&&c.call(p)}finally{if(s)throw s.error}}if(m)try{for(var b=ce(m),q=b.next();!q.done;q=b.next()){var g=q.value;ye(n,g),o.next(g)}}catch($){l={error:$}}finally{try{q&&!q.done&&(u=b.return)&&u.call(b)}finally{if(l)throw l.error}}},function(){var a,s;try{for(var c=ce(n),l=c.next();!l.done;l=c.next()){var u=l.value;o.next(u)}}catch(m){a={error:m}}finally{try{l&&!l.done&&(s=c.return)&&s.call(c)}finally{if(a)throw a.error}}o.complete()},void 0,function(){n=null}))})}function qe(e){return x(function(t,r){var o=null,n=!1,i;o=t.subscribe(new y(r,void 0,void 0,function(a){i=N(e(a,qe(e)(t))),o?(o.unsubscribe(),o=null,i.subscribe(r)):n=!0})),n&&(o.unsubscribe(),o=null,i.subscribe(r))})}function Uo(e,t,r,o,n){return function(i,a){var s=r,c=t,l=0;i.subscribe(new y(a,function(u){var m=l++;c=s?e(c,u,m):(s=!0,u),o&&a.next(c)},n&&function(){s&&a.next(c),a.complete()}))}}function pr(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=_e(e);return r?xo(pr.apply(void 0,F([],k(e))),Me(r)):x(function(o,n){ur(F([o],k(ze(e))))(n)})}function Vt(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return pr.apply(void 0,F([],k(e)))}function fr(e,t){return S(t)?te(e,t,1):te(e,1)}function mr(e,t){return t===void 0&&(t=it),x(function(r,o){var n=null,i=null,a=null,s=function(){if(n){n.unsubscribe(),n=null;var l=i;i=null,o.next(l)}};function c(){var l=a+e,u=t.now();if(u<l){n=this.schedule(void 0,l-u);return}s()}r.subscribe(new y(o,function(l){i=l,a=t.now(),n||(n=t.schedule(c,e))},function(){s(),o.complete()},void 0,function(){i=n=null}))})}function He(e){return x(function(t,r){var o=!1;t.subscribe(new y(r,function(n){o=!0,r.next(n)},function(){o||r.next(e),r.complete()}))})}function Qe(e){return e<=0?function(){return de}:x(function(t,r){var o=0;t.subscribe(new y(r,function(n){++o<=e&&(r.next(n),e<=o&&r.complete())}))})}function Do(){return x(function(e,t){e.subscribe(new y(t,ee))})}function oe(e){return x(function(t,r){t.subscribe(new y(r,function(){return r.next(e)}))})}function dr(e,t){return t?function(r){return at(t.pipe(Qe(1),Do()),r.pipe(dr(e)))}:te(function(r,o){return e(r,o).pipe(Qe(1),oe(r))})}function Ee(e,t){t===void 0&&(t=it);var r=Wo(e,t);return dr(function(){return r})}function z(e,t){return t===void 0&&(t=le),e=e!=null?e:ga,x(function(r,o){var n,i=!0;r.subscribe(new y(o,function(a){var s=t(a);(i||!e(n,s))&&(i=!1,n=s,o.next(a))}))})}function ga(e,t){return e===t}function U(e,t){return z(function(r,o){return t?t(r[e],o[e]):r[e]===o[e]})}function P(e){return x(function(t,r){try{t.subscribe(r)}finally{r.add(e)}})}function hr(e){return e<=0?function(){return de}:x(function(t,r){var o=[];t.subscribe(new y(r,function(n){o.push(n),e<o.length&&o.shift()},function(){var n,i;try{for(var a=ce(o),s=a.next();!s.done;s=a.next()){var c=s.value;r.next(c)}}catch(l){n={error:l}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(n)throw n.error}}r.complete()},void 0,function(){o=null}))})}function No(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=pe(e),o=Pt(e,Infinity);return e=ze(e),x(function(n,i){Ne(o)(xe(F([n],k(e)),r)).subscribe(i)})}function ct(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return No.apply(void 0,F([],k(e)))}function Ke(e){return x(function(t,r){var o=!1,n=null;t.subscribe(new y(r,function(a){o=!0,n=a}));var i=function(){if(o){o=!1;var a=n;n=null,r.next(a)}};e.subscribe(new y(r,i,ee))})}function br(e,t){return x(Uo(e,t,arguments.length>=2,!0))}function ne(e){e=e||{};var t=e.connector,r=t===void 0?function(){return new M}:t,o=e.resetOnComplete,n=o===void 0?!0:o,i=e.resetOnError,a=i===void 0?!0:i,s=e.resetOnRefCountZero,c=s===void 0?!0:s,l=null,u=null,m=0,p=!1,h=!1,g=function(){l=u=null,p=h=!1};return x(function(b,q){return m++,u=u!=null?u:r(),u.subscribe(q),l||(l=new et({next:function($){return u.next($)},error:function($){h=!0;var H=u;a&&g(),H.error($)},complete:function(){p=!0;var $=u;n&&g(),$.complete()}}),ve(b).subscribe(l)),function(){if(m--,c&&!m&&!h&&!p){var $=l;g(),$==null||$.unsubscribe()}}})}function re(e,t,r){var o,n,i,a=!1;return e&&typeof e=="object"?(i=(o=e.bufferSize)!==null&&o!==void 0?o:Infinity,t=(n=e.windowTime)!==null&&n!==void 0?n:Infinity,a=!!e.refCount,r=e.scheduler):i=e!=null?e:Infinity,ne({connector:function(){return new ot(i,t,r)},resetOnError:!0,resetOnComplete:!1,resetOnRefCountZero:a})}function Wt(e){return L(function(t,r){return e<=r})}function vr(e){return x(function(t,r){var o=!1,n=new y(r,function(){n==null||n.unsubscribe(),o=!0},ee);N(e).subscribe(n),t.subscribe(new y(r,function(i){return o&&r.next(i)}))})}function W(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=pe(e);return x(function(o,n){(r?at(e,o,r):at(e,o)).subscribe(n)})}function w(e,t){return x(function(r,o){var n=null,i=0,a=!1,s=function(){return a&&!n&&o.complete()};r.subscribe(new y(o,function(c){n==null||n.unsubscribe();var l=0,u=i++;N(e(c,u)).subscribe(n=new y(o,function(m){return o.next(t?t(c,m,u,l++):m)},function(){n=null,s()}))},function(){a=!0,s()}))})}function xr(e,t){return S(t)?w(function(){return e},t):w(function(){return e})}function gr(e){return x(function(t,r){N(e).subscribe(new y(r,function(){return r.complete()},ee)),!r.closed&&t.subscribe(r)})}function yr(e,t){return t===void 0&&(t=!1),x(function(r,o){var n=0;r.subscribe(new y(o,function(i){var a=e(i,n++);(a||t)&&o.next(i),!a&&o.complete()}))})}function C(e,t,r){var o=S(e)||t||r?{next:e,error:t,complete:r}:e;return o?x(function(n,i){n.subscribe(new y(i,function(a){var s;(s=o.next)===null||s===void 0||s.call(o,a),i.next(a)},function(){var a;(a=o.complete)===null||a===void 0||a.call(o),i.complete()},function(a){var s;(s=o.error)===null||s===void 0||s.call(o,a),i.error(a)}))}):le}var ya={leading:!0,trailing:!1};function Sr(e,t){var r=t===void 0?ya:t,o=r.leading,n=r.trailing;return x(function(i,a){var s=!1,c=null,l=null,u=!1,m=function(){l==null||l.unsubscribe(),l=null,n&&(g(),u&&a.complete())},p=function(){l=null,u&&a.complete()},h=function(b){return l=N(e(b)).subscribe(new y(a,m,p))},g=function(){if(s){s=!1;var b=c;c=null,a.next(b),!u&&h(b)}};i.subscribe(new y(a,function(b){s=!0,c=b,!(l&&!l.closed)&&(o?g():h(b))},function(){u=!0,!(n&&s&&l&&!l.closed)&&a.complete()}))})}function be(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=_e(e);return x(function(o,n){for(var i=e.length,a=new Array(i),s=e.map(function(){return!1}),c=!1,l=function(m){N(e[m]).subscribe(new y(n,function(p){a[m]=p,!c&&!s[m]&&(s[m]=!0,(c=s.every(le))&&(s=null))},ee))},u=0;u<i;u++)l(u);o.subscribe(new y(n,function(m){if(c){var p=F([m],k(a));n.next(r?r.apply(void 0,F([],k(p))):p)}}))})}function zo(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return x(function(r,o){st.apply(void 0,F([r],k(e))).subscribe(o)})}function wr(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return zo.apply(void 0,F([],k(e)))}function qo(){let e=new ot;return O(document,"DOMContentLoaded").pipe(oe(document)).subscribe(e),e}function ae(e,t=document){return t.querySelector(e)||void 0}function fe(e,t=document){let r=ae(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function je(){return document.activeElement instanceof HTMLElement?document.activeElement:void 0}function Q(e,t=document){return Array.from(t.querySelectorAll(e))}function Be(e){return document.createElement(e)}function Fe(e,...t){e.replaceWith(...t)}function Ae(e,t=!0){t?e.focus():e.blur()}function Qo(e){return R(O(e,"focus"),O(e,"blur")).pipe(f(({type:t})=>t==="focus"),W(e===je()))}var Ko=new M,Sa=we(()=>j(new ResizeObserver(e=>{for(let t of e)Ko.next(t)}))).pipe(w(e=>Z.pipe(W(e)).pipe(P(()=>e.disconnect()))),re(1));function Le(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Ut(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ke(e){return Sa.pipe(C(t=>t.observe(e)),w(t=>Ko.pipe(L(({target:r})=>r===e),P(()=>t.unobserve(e)),f(()=>Le(e)))),W(Le(e)))}function Bo(e){return{x:e.scrollLeft,y:e.scrollTop}}function wa(e){return R(O(e,"scroll"),O(window,"resize")).pipe(f(()=>Bo(e)),W(Bo(e)))}function Jo(e,t=16){return wa(e).pipe(f(({y:r})=>{let o=Le(e),n=Ut(e);return r>=n.height-o.height-t}),z())}function Yo(e){if(e instanceof HTMLInputElement)e.select();else throw new Error("Not implemented")}var Dt={drawer:fe("[data-md-toggle=drawer]"),search:fe("[data-md-toggle=search]")};function Go(e){return Dt[e].checked}function Ie(e,t){Dt[e].checked!==t&&Dt[e].click()}function Nt(e){let t=Dt[e];return O(t,"change").pipe(f(()=>t.checked),W(t.checked))}function Ea(e){switch(e.tagName){case"INPUT":case"SELECT":case"TEXTAREA":return!0;default:return e.isContentEditable}}function Xo(){return O(window,"keydown").pipe(L(e=>!(e.metaKey||e.ctrlKey)),f(e=>({mode:Go("search")?"search":"global",type:e.key,claim(){e.preventDefault(),e.stopPropagation()}})),L(({mode:e})=>{if(e==="global"){let t=je();if(typeof t!="undefined")return!Ea(t)}return!0}),ne())}function Zo(){return new URL(location.href)}function en(e){location.href=e.href}function tn(){return new M}function rn(){return location.hash.substring(1)}function on(e){let t=Be("a");t.href=e,t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Oa(){return O(window,"hashchange").pipe(f(rn),W(rn()),L(e=>e.length>0),ne())}function nn(){return Oa().pipe(w(e=>j(ae(`[id="${e}"]`))))}function Je(e){let t=matchMedia(e);return $t(r=>t.addListener(()=>r(t.matches))).pipe(W(t.matches))}function an(){return R(Je("print").pipe(L(Boolean)),O(window,"beforeprint")).pipe(oe(void 0))}function Er(e,t){return e.pipe(w(r=>r?t():Z))}function zt(e,t={credentials:"same-origin"}){return ve(fetch(`${e}`,t)).pipe(L(r=>r.status===200))}function ge(e,t){return zt(e,t).pipe(w(r=>r.json()),re(1))}function sn(e,t){let r=new DOMParser;return zt(e,t).pipe(w(o=>o.text()),f(o=>r.parseFromString(o,"text/xml")),re(1))}function cn(){return{x:Math.max(0,pageXOffset),y:Math.max(0,pageYOffset)}}function Or({x:e,y:t}){window.scrollTo(e||0,t||0)}function ln(){return R(O(window,"scroll",{passive:!0}),O(window,"resize",{passive:!0})).pipe(f(cn),W(cn()))}function un(){return{width:innerWidth,height:innerHeight}}function pn(){return O(window,"resize",{passive:!0}).pipe(f(un),W(un()))}function fn(){return Y([ln(),pn()]).pipe(f(([e,t])=>({offset:e,size:t})),re(1))}function qt(e,{viewport$:t,header$:r}){let o=t.pipe(U("size")),n=Y([o,r]).pipe(f(()=>({x:e.offsetLeft,y:e.offsetTop})));return Y([r,t,n]).pipe(f(([{height:i},{offset:a,size:s},{x:c,y:l}])=>({offset:{x:a.x-c,y:a.y-l+i},size:s})))}function mn(e,{tx$:t}){let r=O(e,"message").pipe(f(({data:o})=>o));return t.pipe(Sr(()=>r,{leading:!0,trailing:!0}),C(o=>e.postMessage(o)),xr(r),ne())}var Ta=fe("#__config"),Ye=JSON.parse(Ta.textContent);Ye.base=new URL(Ye.base,Zo()).toString().replace(/\/$/,"");function se(){return Ye}function Qt(e){return Ye.features.includes(e)}function G(e,t){return typeof t!="undefined"?Ye.translations[e].replace("#",t.toString()):Ye.translations[e]}function Ce(e,t=document){return fe(`[data-md-component=${e}]`,t)}function me(e,t=document){return Q(`[data-md-component=${e}]`,t)}var Yn=Ze(_r());function dn(e,t=0){e.setAttribute("tabindex",t.toString())}function hn(e){e.removeAttribute("tabindex")}function bn(e,t){e.setAttribute("data-md-state","lock"),e.style.top=`-${t}px`}function vn(e){let t=-1*parseInt(e.style.top,10);e.removeAttribute("data-md-state"),e.style.top="",t&&window.scrollTo(0,t)}function xn(e,t){e.setAttribute("data-md-state",t)}function gn(e){e.removeAttribute("data-md-state")}function yn(e,t){e.classList.toggle("md-nav__link--active",t)}function Sn(e){e.classList.remove("md-nav__link--active")}function wn(e,t){e.firstElementChild.innerHTML=t}function En(e,t){e.setAttribute("data-md-state",t)}function On(e){e.removeAttribute("data-md-state")}function Tn(e,t){e.setAttribute("data-md-state",t)}function _n(e){e.removeAttribute("data-md-state")}function Mn(e,t){e.setAttribute("data-md-state",t)}function An(e){e.removeAttribute("data-md-state")}function Ln(e,t){e.placeholder=t}function kn(e){e.placeholder=G("search.placeholder")}function Cn(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Cn(e,r)}function D(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="boolean"?o.setAttribute(n,t[n]):t[n]&&o.setAttribute(n,"");for(let n of r)Cn(o,n);return o}function Hn(e,t){let r=t;if(e.length>r){for(;e[r]!==" "&&--r>0;);return`${e.substring(0,r)}...`}return e}function Kt(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function jn(e,t){switch(t){case 0:e.textContent=G("search.result.none");break;case 1:e.textContent=G("search.result.one");break;default:e.textContent=G("search.result.other",Kt(t))}}function Fn(e){e.textContent=G("search.result.placeholder")}function In(e,t){e.appendChild(t)}function Rn(e){e.innerHTML=""}function Pn(e,t){e.style.top=`${t}px`}function $n(e){e.style.top=""}function Vn(e,t){let r=e.firstElementChild;r.style.height=`${t-2*r.offsetTop}px`}function Wn(e){let t=e.firstElementChild;t.style.height=""}function Un(e,t){e.lastElementChild.appendChild(t)}function Dn(e,t){e.lastElementChild.setAttribute("data-md-state",t)}function Nn(e,t){e.setAttribute("data-md-state",t)}function Mr(e){e.removeAttribute("data-md-state")}function zn(e,t){e.setAttribute("data-md-state",t)}function Ar(e){e.removeAttribute("data-md-state")}function qn(e){return D("button",{class:"md-clipboard md-icon",title:G("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}var Re;(function(r){r[r.TEASER=1]="TEASER",r[r.PARENT=2]="PARENT"})(Re||(Re={}));function Lr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(a=>!e.terms[a]).map(a=>[D("del",null,a)," "]).flat().slice(0,-1),i=e.location;return D("a",{href:i,class:"md-search-result__link",tabIndex:-1},D("article",{class:["md-search-result__article",...r?["md-search-result__article--document"]:[]].join(" "),"data-md-score":e.score.toFixed(2)},r>0&&D("div",{class:"md-search-result__icon md-icon"}),D("h1",{class:"md-search-result__title"},e.title),o>0&&e.text.length>0&&D("p",{class:"md-search-result__teaser"},Hn(e.text,320)),o>0&&n.length>0&&D("p",{class:"md-search-result__terms"},G("search.result.term.missing"),": ",n)))}function Qn(e){let t=e[0].score,r=[...e],o=r.findIndex(l=>!l.location.includes("#")),[n]=r.splice(o,1),i=r.findIndex(l=>l.score<t);i===-1&&(i=r.length);let a=r.slice(0,i),s=r.slice(i),c=[Lr(n,2|+(!o&&i===0)),...a.map(l=>Lr(l,1)),...s.length?[D("details",{class:"md-search-result__more"},D("summary",{tabIndex:-1},s.length>0&&s.length===1?G("search.result.more.one"):G("search.result.more.other",s.length)),s.map(l=>Lr(l,1)))]:[]];return D("li",{class:"md-search-result__item"},c)}function Kn(e){return D("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>D("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?Kt(r):r)))}function Bn(e){return D("div",{class:"md-typeset__scrollwrap"},D("div",{class:"md-typeset__table"},e))}function _a(e){let t=se(),r=new URL(`${e.version}/`,t.base);return D("li",{class:"md-version__item"},D("a",{href:r.toString(),class:"md-version__link"},e.title))}function Jn(e){let t=se(),[,r]=t.base.match(/([^/]+)\/?$/),o=e.find(({version:n,aliases:i})=>n===r||i.includes(r))||e[0];return D("div",{class:"md-version"},D("button",{class:"md-version__current"},o.title),D("ul",{class:"md-version__list"},e.map(_a)))}var Ma=0;function Aa(e,{viewport$:t}){let r=j(e).pipe(w(o=>{let n=o.closest("[data-tabs]");return n instanceof HTMLElement?R(...Q("input",n).map(i=>O(i,"change"))):Z}));return R(t.pipe(U("size")),r).pipe(f(()=>{let o=Le(e);return{scroll:Ut(e).width>o.width}}),U("scroll"))}function Gn(e,t){let r=new M;if(r.pipe(be(Je("(hover)"))).subscribe(([{scroll:o},n])=>{o&&n?dn(e):hn(e)}),Yn.default.isSupported()){let o=e.closest("pre");o.id=`__code_${Ma++}`,o.insertBefore(qn(o.id),e)}return Aa(e,t).pipe(C(r),P(()=>r.complete()),f(o=>V({ref:e},o)))}function La(e,{target$:t,print$:r}){return t.pipe(f(o=>o.closest("details:not([open])")),L(o=>e===o),ct(r),oe(e))}function Xn(e,t){let r=new M;return r.subscribe(()=>{e.setAttribute("open",""),e.scrollIntoView()}),La(e,t).pipe(C(r),P(()=>r.complete()),oe({ref:e}))}var Zn=Be("table");function ei(e){return Fe(e,Zn),Fe(Zn,Bn(e)),j({ref:e})}function ti(e,{target$:t,viewport$:r,print$:o}){return R(...Q("pre > code",e).map(n=>Gn(n,{viewport$:r})),...Q("table:not([class])",e).map(n=>ei(n)),...Q("details",e).map(n=>Xn(n,{target$:t,print$:o})))}function ka(e,{alert$:t}){return t.pipe(w(r=>R(j(!0),j(!1).pipe(Ee(2e3))).pipe(f(o=>({message:r,open:o})))))}function ri(e,t){let r=new M;return r.pipe(J(B)).subscribe(({message:o,open:n})=>{wn(e,o),n?En(e,"open"):On(e)}),ka(e,t).pipe(C(r),P(()=>r.complete()),f(o=>V({ref:e},o)))}function Ca({viewport$:e}){if(!Qt("header.autohide"))return j(!1);let t=e.pipe(f(({offset:{y:n}})=>n),he(2,1),f(([n,i])=>[n<i,i]),U(0)),r=Y([e,t]).pipe(L(([{offset:n},[,i]])=>Math.abs(i-n.y)>100),f(([,[n]])=>n),z()),o=Nt("search");return Y([e,o]).pipe(f(([{offset:n},i])=>n.y>400&&!i),z(),w(n=>n?r:j(!1)),W(!1))}function oi(e,t){return we(()=>{let r=getComputedStyle(e);return j(r.position==="sticky"||r.position==="-webkit-sticky")}).pipe(Vt(ke(e),Ca(t)),f(([r,{height:o},n])=>({height:r?o:0,sticky:r,hidden:n})),z((r,o)=>r.sticky===o.sticky&&r.height===o.height&&r.hidden===o.hidden),re(1))}function ni(e,{header$:t,main$:r}){let o=new M;return o.pipe(U("active"),Vt(t),J(B)).subscribe(([{active:n},{hidden:i}])=>{n?Tn(e,i?"hidden":"shadow"):_n(e)}),r.subscribe(n=>o.next(n)),t.pipe(f(n=>V({ref:e},n)))}function Ha(e,{viewport$:t,header$:r}){return qt(e,{header$:r,viewport$:t}).pipe(f(({offset:{y:o}})=>{let{height:n}=Le(e);return{active:o>=n}}),U("active"))}function ii(e,t){let r=new M;r.pipe(J(B)).subscribe(({active:n})=>{n?Mn(e,"active"):An(e)});let o=ae("article h1");return typeof o=="undefined"?Z:Ha(o,t).pipe(C(r),P(()=>r.complete()),f(n=>V({ref:e},n)))}function ai(e,{viewport$:t,header$:r}){let o=r.pipe(f(({height:i})=>i),z()),n=o.pipe(w(()=>ke(e).pipe(f(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),U("bottom"))));return Y([o,n,t]).pipe(f(([i,{top:a,bottom:s},{offset:{y:c},size:{height:l}}])=>(l=Math.max(0,l-Math.max(0,a-c,i)-Math.max(0,l+c-s)),{offset:a-i,height:l,active:a-i<=c})),z((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function ja(e){let t=localStorage.getItem(__prefix("__palette")),r=JSON.parse(t)||{index:e.findIndex(n=>matchMedia(n.getAttribute("data-md-color-media")).matches)},o=j(...e).pipe(te(n=>O(n,"change").pipe(oe(n))),W(e[Math.max(0,r.index)]),f(n=>({index:e.indexOf(n),color:{scheme:n.getAttribute("data-md-color-scheme"),primary:n.getAttribute("data-md-color-primary"),accent:n.getAttribute("data-md-color-accent")}})),re(1));return o.subscribe(n=>{localStorage.setItem(__prefix("__palette"),JSON.stringify(n))}),o}function si(e){let t=new M;t.subscribe(o=>{for(let[n,i]of Object.entries(o.color))typeof i=="string"&&document.body.setAttribute(`data-md-color-${n}`,i);for(let n=0;n<r.length;n++){let i=r[n].nextElementSibling;i instanceof HTMLElement&&(i.hidden=o.index!==n)}});let r=Q("input",e);return ja(r).pipe(C(t),P(()=>t.complete()),f(o=>V({ref:e},o)))}var kr=Ze(_r());function ci({alert$:e}){kr.default.isSupported()&&new T(t=>{new kr.default("[data-clipboard-target], [data-clipboard-text]").on("success",r=>t.next(r))}).subscribe(()=>e.next(G("clipboard.copied")))}function Fa(e){if(e.length<2)return e;let[t,r]=e.sort((i,a)=>i.length-a.length).map(i=>i.replace(/[^/]+$/,"")),o=0;if(t===r)o=t.length;else for(;t.charCodeAt(o)===r.charCodeAt(o);)o++;let n=se();return e.map(i=>i.replace(t.slice(0,o),`${n.base}/`))}function li({document$:e,location$:t,viewport$:r}){let o=se();if(location.protocol==="file:")return;"scrollRestoration"in history&&(history.scrollRestoration="manual",O(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}));let n=ae("link[rel=icon]");typeof n!="undefined"&&(n.href=n.href);let i=sn(`${o.base}/sitemap.xml`).pipe(f(l=>Fa(Q("loc",l).map(u=>u.textContent))),w(l=>O(document.body,"click").pipe(L(u=>!u.metaKey&&!u.ctrlKey),w(u=>{if(u.target instanceof Element){let m=u.target.closest("a");if(m&&!m.target&&l.includes(m.href))return u.preventDefault(),j({url:new URL(m.href)})}return Z}))),ne()),a=O(window,"popstate").pipe(L(l=>l.state!==null),f(l=>({url:new URL(location.href),offset:l.state})),ne());R(i,a).pipe(z((l,u)=>l.url.href===u.url.href),f(({url:l})=>l)).subscribe(t);let s=t.pipe(U("pathname"),w(l=>zt(l.href).pipe(qe(()=>(en(l),Z)))),ne());i.pipe(Ke(s)).subscribe(({url:l})=>{history.pushState({},"",`${l}`)});let c=new DOMParser;s.pipe(w(l=>l.text()),f(l=>c.parseFromString(l,"text/html"))).subscribe(e),R(i,a).pipe(Ke(e)).subscribe(({url:l,offset:u})=>{l.hash&&!u?on(l.hash):Or(u||{y:0})}),e.pipe(Wt(1)).subscribe(l=>{for(let u of["title","link[rel=canonical]","meta[name=author]","meta[name=description]","[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=logo], .md-logo","[data-md-component=skip]"]){let m=ae(u),p=ae(u,l);typeof m!="undefined"&&typeof p!="undefined"&&Fe(m,p)}}),e.pipe(Wt(1),f(()=>Ce("container")),w(l=>j(...Q("script",l))),fr(l=>{let u=Be("script");if(l.src){for(let m of l.getAttributeNames())u.setAttribute(m,l.getAttribute(m));return Fe(l,u),new T(m=>{u.onload=()=>m.complete()})}else return u.textContent=l.textContent,Fe(l,u),de})).subscribe(),r.pipe(vr(i),mr(250),U("offset")).subscribe(({offset:l})=>{history.replaceState(l,"")}),R(i,a).pipe(he(2,1),L(([l,u])=>l.url.pathname===u.url.pathname),f(([,l])=>l)).subscribe(({offset:l})=>{Or(l||{y:0})})}var Pa=Ze(pi());function fi(e){return e.split(/"([^"]+)"/g).map((t,r)=>r&1?t.replace(/^\b|^(?![^\x00-\x7F]|$)|\s+/g," +"):t).join("").replace(/"|(?:^|\s+)[*+\-:^~]+(?=\s+|$)/g,"").trim()}var Oe;(function(n){n[n.SETUP=0]="SETUP",n[n.READY=1]="READY",n[n.QUERY=2]="QUERY",n[n.RESULT=3]="RESULT"})(Oe||(Oe={}));function mi(e){return e.type===1}function di(e){return e.type===2}function Bt(e){return e.type===3}function $a({config:e,docs:t,index:r}){e.lang.length===1&&e.lang[0]==="en"&&(e.lang=[G("search.config.lang")]),e.separator==="[\\s\\-]+"&&(e.separator=G("search.config.separator"));let o=G("search.config.pipeline").split(/\s*,\s*/).filter(Boolean);return{config:e,docs:t,index:r,pipeline:o}}function hi(e,t){let r=se(),o=new Worker(e),n=new M,i=mn(o,{tx$:n}).pipe(f(a=>{if(Bt(a))for(let s of a.data)for(let c of s)c.location=`${r.base}/${c.location}`;return a}),ne());return ve(t).pipe(f(a=>({type:Oe.SETUP,data:$a(a)}))).subscribe(n.next.bind(n)),{tx$:n,rx$:i}}function bi(){let e=se();ge(new URL("versions.json",e.base)).subscribe(t=>{fe(".md-header__topic").appendChild(Jn(t))})}function Va(e){let t=(__search==null?void 0:__search.transform)||fi,r=Qo(e),o=R(O(e,"keyup"),O(e,"focus").pipe(Ee(1))).pipe(f(()=>t(e.value)),z());return Y([o,r]).pipe(f(([n,i])=>({value:n,focus:i})))}function vi(e,{tx$:t}){let r=new M;return r.pipe(U("value"),f(({value:o})=>({type:Oe.QUERY,data:o}))).subscribe(t.next.bind(t)),r.pipe(U("focus")).subscribe(({focus:o})=>{o?(Ie("search",o),Ln(e,"")):kn(e)}),O(e.form,"reset").pipe(gr(r.pipe(hr(1)))).subscribe(()=>Ae(e)),Va(e).pipe(C(r),P(()=>r.complete()),f(o=>V({ref:e},o)))}function xi(e,{rx$:t},{query$:r}){let o=new M,n=Jo(e.parentElement).pipe(L(Boolean)),i=fe(":scope > :first-child",e);o.pipe(J(B),be(r)).subscribe(([{data:c},{value:l}])=>{l?jn(i,c.length):Fn(i)});let a=fe(":scope > :last-child",e);return o.pipe(J(B),C(()=>Rn(a)),w(({data:c})=>R(j(...c.slice(0,10)),j(...c.slice(10)).pipe(he(4),wr(n),w(([l])=>j(...l)))))).subscribe(c=>{In(a,Qn(c))}),t.pipe(L(Bt),f(({data:c})=>({data:c})),W({data:[]})).pipe(C(o),P(()=>o.complete()),f(c=>V({ref:e},c)))}function gi(e,{index$:t,keyboard$:r}){let o=se(),n=hi(o.search,t),i=Ce("search-query",e),a=Ce("search-result",e),{tx$:s,rx$:c}=n;s.pipe(L(di),Ke(c.pipe(L(mi))),Qe(1)).subscribe(s.next.bind(s)),r.pipe(L(({mode:u})=>u==="search")).subscribe(u=>{let m=je();switch(u.type){case"Enter":m===i&&u.claim();break;case"Escape":case"Tab":Ie("search",!1),Ae(i,!1);break;case"ArrowUp":case"ArrowDown":if(typeof m=="undefined")Ae(i);else{let p=[i,...Q(":not(details) > [href], summary, details[open] [href]",a)],h=Math.max(0,(Math.max(0,p.indexOf(m))+p.length+(u.type==="ArrowUp"?-1:1))%p.length);Ae(p[h])}u.claim();break;default:i!==je()&&Ae(i)}}),r.pipe(L(({mode:u})=>u==="global")).subscribe(u=>{switch(u.type){case"f":case"s":case"/":Ae(i),Yo(i),u.claim();break}});let l=vi(i,n);return R(l,xi(a,n,{query$:l}))}function Wa(e,{viewport$:t,main$:r}){let o=e.parentElement.offsetTop-e.parentElement.parentElement.offsetTop;return Y([r,t]).pipe(f(([{offset:n,height:i},{offset:{y:a}}])=>(i=i+Math.min(o,Math.max(0,a-n))-o,{height:i,locked:a>=n+o})),z((n,i)=>n.height===i.height&&n.locked===i.locked))}function Cr(e,o){var n=o,{header$:t}=n,r=$r(n,["header$"]);let i=new M;return i.pipe(J(B),be(t)).subscribe({next([{height:a},{height:s}]){Vn(e,a),Pn(e,s)},complete(){$n(e),Wn(e)}}),Wa(e,r).pipe(C(i),P(()=>i.complete()),f(a=>V({ref:e},a)))}function yi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return st(ge(`${r}/releases/latest`).pipe(f(o=>({version:o.tag_name})),He({})),ge(r).pipe(f(o=>({stars:o.stargazers_count,forks:o.forks_count})),He({}))).pipe(f(([o,n])=>V(V({},o),n)))}else{let r=`https://api.github.com/repos/${e}`;return ge(r).pipe(f(o=>({repositories:o.public_repos})),He({}))}}function Si(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return ge(r).pipe(f(({star_count:o,forks_count:n})=>({stars:o,forks:n})),He({}))}function wi(e){let[t]=e.match(/(git(?:hub|lab))/i)||[];switch(t.toLowerCase()){case"github":let[,r,o]=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);return yi(r,o);case"gitlab":let[,n,i]=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i);return Si(n,i);default:return Z}}var Ua;function Da(e){return Ua||(Ua=we(()=>{let t=sessionStorage.getItem(__prefix("__source"));if(t)return j(JSON.parse(t));{let r=wi(e.href);return r.subscribe(o=>{try{sessionStorage.setItem(__prefix("__source"),JSON.stringify(o))}catch(n){}}),r}}).pipe(qe(()=>Z),L(t=>Object.keys(t).length>0),f(t=>({facts:t})),re(1)))}function Ei(e){let t=new M;return t.subscribe(({facts:r})=>{Un(e,Kn(r)),Dn(e,"done")}),Da(e).pipe(C(t),P(()=>t.complete()),f(r=>V({ref:e},r)))}function Na(e,{viewport$:t,header$:r}){return ke(document.body).pipe(w(()=>qt(e,{header$:r,viewport$:t})),f(({offset:{y:o}})=>({hidden:o>=10})),U("hidden"))}function Oi(e,t){let r=new M;return r.pipe(J(B)).subscribe({next({hidden:o}){o?Nn(e,"hidden"):Mr(e)},complete(){Mr(e)}}),Na(e,t).pipe(C(r),P(()=>r.complete()),f(o=>V({ref:e},o)))}function za(e,{viewport$:t,header$:r}){let o=new Map;for(let a of e){let s=decodeURIComponent(a.hash.substring(1)),c=ae(`[id="${s}"]`);typeof c!="undefined"&&o.set(a,c)}let n=r.pipe(f(a=>24+a.height));return ke(document.body).pipe(U("height"),f(()=>{let a=[];return[...o].reduce((s,[c,l])=>{for(;a.length&&o.get(a[a.length-1]).tagName>=l.tagName;)a.pop();let u=l.offsetTop;for(;!u&&l.parentElement;)l=l.parentElement,u=l.offsetTop;return s.set([...a=[...a,c]].reverse(),u)},new Map)}),f(a=>new Map([...a].sort(([,s],[,c])=>s-c))),w(a=>Y([n,t]).pipe(br(([s,c],[l,{offset:{y:u}}])=>{for(;c.length;){let[,m]=c[0];if(m-l<u)s=[...s,c.shift()];else break}for(;s.length;){let[,m]=s[s.length-1];if(m-l>=u)c=[s.pop(),...c];else break}return[s,c]},[[],[...a]]),z((s,c)=>s[0]===c[0]&&s[1]===c[1])))).pipe(f(([a,s])=>({prev:a.map(([c])=>c),next:s.map(([c])=>c)})),W({prev:[],next:[]}),he(2,1),f(([a,s])=>a.prev.length<s.prev.length?{prev:s.prev.slice(Math.max(0,a.prev.length-1),s.prev.length),next:[]}:{prev:s.prev.slice(-1),next:s.next.slice(0,s.next.length-a.next.length)}))}function Ti(e,t){let r=new M;r.pipe(J(B)).subscribe(({prev:n,next:i})=>{for(let[a]of i)Sn(a),gn(a);for(let[a,[s]]of n.entries())yn(s,a===n.length-1),xn(s,"blur")});let o=Q("[href^=\\#]",e);return za(o,t).pipe(C(r),P(()=>r.complete()),f(n=>V({ref:e},n)))}function qa(e,{viewport$:t,main$:r}){let o=t.pipe(f(({offset:{y:i}})=>i),he(2,1),f(([i,a])=>i>a),z()),n=r.pipe(U("active"));return Y([n,o]).pipe(f(([{active:i},a])=>({hidden:!(i&&a)})),z((i,a)=>i.hidden===a.hidden))}function _i(e,t){let r=new M;return r.pipe(J(B)).subscribe({next({hidden:o}){o?zn(e,"hidden"):Ar(e)},complete(){Ar(e)}}),qa(e,t).pipe(C(r),P(()=>r.complete()),f(o=>V({ref:e},o)))}function Mi({document$:e,tablet$:t}){e.pipe(w(()=>j(...Q("[data-md-state=indeterminate]"))),C(r=>{r.indeterminate=!0,r.checked=!1}),te(r=>O(r,"change").pipe(yr(()=>r.hasAttribute("data-md-state")),oe(r))),be(t)).subscribe(([r,o])=>{r.removeAttribute("data-md-state"),o&&(r.checked=!1)})}function Qa(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ai({document$:e}){e.pipe(w(()=>j(...Q("[data-md-scrollfix]"))),C(t=>t.removeAttribute("data-md-scrollfix")),L(Qa),te(t=>O(t,"touchstart").pipe(oe(t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Li({viewport$:e,tablet$:t}){Y([Nt("search"),t]).pipe(f(([r,o])=>r&&!o),w(r=>j(r).pipe(Ee(r?400:100),J(B))),be(e)).subscribe(([r,{offset:{y:o}}])=>{r?bn(document.body,o):vn(document.body)})}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var Ge=qo(),Hr=tn(),jr=nn(),Fr=Xo(),ue=fn(),Jt=Je("(min-width: 960px)"),ki=Je("(min-width: 1220px)"),Ci=an(),Hi=se(),Ka=document.forms.namedItem("search")?(__search==null?void 0:__search.index)||ge(`${Hi.base}/search/search_index.json`):Z,Ir=new M;ci({alert$:Ir});Qt("navigation.instant")&&li({document$:Ge,location$:Hr,viewport$:ue});var ji;((ji=Hi.version)==null?void 0:ji.provider)==="mike"&&bi();R(Hr,jr).pipe(Ee(125)).subscribe(()=>{Ie("drawer",!1),Ie("search",!1)});Fr.pipe(L(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ae("[href][rel=prev]");typeof t!="undefined"&&t.click();break;case"n":case".":let r=ae("[href][rel=next]");typeof r!="undefined"&&r.click();break}});Mi({document$:Ge,tablet$:Jt});Ai({document$:Ge});Li({viewport$:ue,tablet$:Jt});var Pe=oi(Ce("header"),{viewport$:ue}),Yt=Ge.pipe(f(()=>Ce("main")),w(e=>ai(e,{viewport$:ue,header$:Pe})),re(1)),Ba=R(...me("dialog").map(e=>ri(e,{alert$:Ir})),...me("header").map(e=>ni(e,{viewport$:ue,header$:Pe,main$:Yt})),...me("palette").map(e=>si(e)),...me("search").map(e=>gi(e,{index$:Ka,keyboard$:Fr})),...me("source").map(e=>Ei(e))),Ja=we(()=>R(...me("content").map(e=>ti(e,{target$:jr,viewport$:ue,print$:Ci})),...me("header-title").map(e=>ii(e,{viewport$:ue,header$:Pe})),...me("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Er(ki,()=>Cr(e,{viewport$:ue,header$:Pe,main$:Yt})):Er(Jt,()=>Cr(e,{viewport$:ue,header$:Pe,main$:Yt}))),...me("tabs").map(e=>Oi(e,{viewport$:ue,header$:Pe})),...me("toc").map(e=>Ti(e,{viewport$:ue,header$:Pe})),...me("top").map(e=>_i(e,{viewport$:ue,main$:Yt})))),Fi=Ge.pipe(w(()=>Ja),ct(Ba),re(1));Fi.subscribe();window.document$=Ge;window.location$=Hr;window.target$=jr;window.keyboard$=Fr;window.viewport$=ue;window.tablet$=Jt;window.screen$=ki;window.print$=Ci;window.alert$=Ir;window.component$=Fi;})();
/*!
 * clipboard.js v2.0.8
 * https://clipboardjs.com/
 *
 * Licensed MIT © Zeno Rocha
 */
/*!
 * escape-html
 * Copyright(c) 2012-2013 TJ Holowaychuk
 * Copyright(c) 2015 Andreas Lubbe
 * Copyright(c) 2015 Tiancheng "Timothy" Gu
 * MIT Licensed
 */
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
//# sourceMappingURL=bundle.1d3bfcf1.min.js.map

